[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=java\n*.css linguist-language=java\n"
  },
  {
    "path": ".gitignore",
    "content": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n.sts4-cache\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\n/nbproject/private/\n/build/\n/nbbuild/\n/dist/\n/nbdist/\n/.nb-gradle/"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 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 General Public License is a free, copyleft license for\nsoftware and other kinds of works.\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,\nthe GNU General Public License is 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.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\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  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\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 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. Use with the GNU Affero General Public License.\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 Affero 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 special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe 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 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 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 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 General Public License as published by\n    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 General Public License for more details.\n\n    You should have received a copy of the GNU 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 the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\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 GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "![newbee-logo](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/newbee-logo.png?x-oss-process=image/resize,h_240,w_480)\n\n![Build Status](https://img.shields.io/badge/build-passing-green.svg)\n![Version 1.0.0](https://img.shields.io/badge/version-1.0.0-yellow.svg)\n[![License](https://img.shields.io/badge/license-GPL3.0-blue.svg)](https://github.com/newbee-ltd/newbee-mall/blob/master/LICENSE)\n\nnewbee-mall 项目是一套电商系统，包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统，基于 Spring Boot 及相关技术栈开发。 前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。 后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。\n\n当前分支的 Spring Boot 版本为 2.7.5，想要学习和使用其它版本可以直接点击下方的分支名称跳转至对应的仓库分支中。\n\n| 分支名称                                                    | Spring Boot Version |\n| ------------------------------------------------------------ | ------------------- |\n| [spring-boot-2.3.7](https://github.com/newbee-ltd/newbee-mall/tree/spring-boot-2.3.7) | 2.3.7-RELEASE       |\n| [spring-boot-2.6.x](https://github.com/newbee-ltd/newbee-mall/tree/spring-boot-2.6.x) | 2.6.3               |\n| [main](https://github.com/newbee-ltd/newbee-mall)            | 2.7.5               |\n| [spring-boot-3.x](https://github.com/newbee-ltd/newbee-mall/tree/spring-boot-3.x) | 3.1.0               |\n\n新蜂商城线上预览地址：[http://mall.newbee.ltd](http://mall.newbee.ltd?from=github)，账号可自行注册。\n\n**坚持不易，如果觉得项目还不错的话可以给项目一个 Star 吧，也是对我自 2019 年开始一直更新这个项目的一种鼓励啦，谢谢各位的支持。**\n\n![newbee-mall-info](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/store/newbee-mall-star.png)\n\n- newbee-mall 对新手开发者十分友好，无需复杂的操作步骤，**仅需 2 秒就可以启动这个完整的商城项目；**\n- newbee-mall **也是一个企业级别的 Spring Boot 大型项目，对于各个阶段的 Java 开发者都是极佳的选择；**\n- 你可以把它作为 Spring Boot 技术栈的综合实践项目，**newbee-mall 足够符合要求，且代码开源、功能完备、流程完整、页面交互美观；**\n- 技术栈新颖且知识点丰富，学习后可以提升大家对于知识的理解和掌握，**可以进一步提升你的市场竞争力；**\n- 对于部分求职中的 Java 开发者，**你也可以将该项目放入求职简历中以丰富你的工作履历；** \n- **newbee-mall 还有一些不完善的地方，鄙人才疏学浅，望见谅；** \n- **有任何问题都可以反馈给我，我会尽量完善该项目。** \n\n![](https://raw.githubusercontent.com/newbee-ltd/newbee-mall-vue-app/master/static-files/newbee-mall.png)\n\n## newbee-mall （新蜂商城）系列项目概览\n\n![newbee-mall-course-2022](https://github.com/newbee-ltd/newbee-mall-cloud/raw/main/static-files/newbee-mall-course-2022.png)\n\n| 项目名称             | 仓库地址                                                     | 备注                                                         |\n| :------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |\n| newbee-mall          | [newbee-mall in GitHub](https://github.com/newbee-ltd/newbee-mall)<br>[newbee-mall in Gitee](https://gitee.com/newbee-ltd/newbee-mall) | 初始版本、Spring Boot、Thymeleaf、MyBatis、MySQL             |\n| newbee-mall-plus     | [newbee-mall-plus in GitHub](https://github.com/newbee-ltd/newbee-mall-plus)<br/>[newbee-mall-plus in Gitee](https://gitee.com/newbee-ltd/newbee-mall-plus) | 升级版本、优惠券、秒杀、支付、Spring Boot、Thymeleaf、MyBatis、MySQL、Redis |\n| newbee-mall-cloud    | [newbee-mall-cloud in GitHub](https://github.com/newbee-ltd/newbee-mall-cloud)<br/>[newbee-mall-cloud in Gitee](https://gitee.com/newbee-ltd/newbee-mall-cloud) | 微服务版本、分布式事务、Spring Cloud Alibaba、Nacos、Sentinel、OpenFeign、Seata |\n| newbee-mall-api      | [newbee-mall-api in GitHub](https://github.com/newbee-ltd/newbee-mall-api)<br/>[newbee-mall-api in Gitee](https://gitee.com/newbee-ltd/newbee-mall-api) | 前后端分离、Spring Boot、MyBatis、Swagger、MySQL             |\n| newbee-mall-api-go   | [newbee-mall-api-go in GitHub](https://github.com/newbee-ltd/newbee-mall-api-go)<br/>[newbee-mall-api-go in Gitee](https://gitee.com/newbee-ltd/newbee-mall-api-go) | 前后端分离、Go、Gin、MySQL                                   |\n| newbee-mall-vue-app  | [newbee-mall-vue-app in GitHub](https://github.com/newbee-ltd/newbee-mall-vue-app)<br/>[newbee-mall-vue-app in Gitee](https://gitee.com/newbee-ltd/newbee-mall-vue-app) | 前后端分离、Vue2、Vant                                    |\n| newbee-mall-vue3-app | [newbee-mall-vue3-app in GitHub](https://github.com/newbee-ltd/newbee-mall-vue3-app)<br/>[newbee-mall-vue3-app in Gitee](https://gitee.com/newbee-ltd/newbee-mall-vue3-app) | 前后端分离、Vue3、Vue-Router4、Vuex4、Vant3      |\n| vue3-admin           | [vue3-admin in GitHub](https://github.com/newbee-ltd/vue3-admin)<br/>[vue3-admin in Gitee](https://gitee.com/newbee-ltd/vue3-admin) | 前后端分离、Vue3、Element-Plus、Vue-Router4、Vite      |\n\n> 更多 Spring Boot 实战项目可以关注十三的另一个代码仓库 [spring-boot-projects](https://github.com/ZHENFENG13/spring-boot-projects)，该仓库中主要是 Spring Boot 的入门学习教程以及一些常用的 Spring Boot 实战项目教程，包括 Spring Boot 使用的各种示例代码，同时也包括一些实战项目的项目源码和效果展示，实战项目包括基本的 web 开发以及目前大家普遍使用的前后端分离实践项目等，后续会根据大家的反馈继续增加一些实战项目源码，摆脱各种 hello world 入门案例的束缚，真正的掌握 Spring Boot 开发。\n\n关注公众号：**程序员十三**，回复\"勾搭\"进群交流。\n\n![wx-gzh](https://newbee-mall.oss-cn-beijing.aliyuncs.com/wx-gzh/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%8D%81%E4%B8%89-%E5%85%AC%E4%BC%97%E5%8F%B7.png)\n\n## 项目演示\n\n- [视频1：商城项目总览](https://edu.csdn.net/course/play/26258/326466)\n- [视频2：商城系统介绍](https://edu.csdn.net/course/play/26258/326467)\n- [视频3：商城后台管理系统介绍](https://edu.csdn.net/course/play/26258/328801)\n\n## 开发及部署文档\n\n- [**Spring Boot 大型线上商城项目实战教程**](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [项目须知和课程约定](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [2021年12月小册全新优化升级](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [技术选型之 Spring Boot](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [前期准备工作及基础环境搭建](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 项目初体验--项目搭建及启动](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 之 Web 开发讲解](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Thymeleaf 模板引擎技术介绍及整合](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Thymeleaf 语法详解及编码实践](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 实践之数据库操作](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 实践之整合 Mybatis 操作数据库](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [项目初体验：启动和使用新蜂商城](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城功能模块和流程设计详解](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [前端页面设计及技术选型](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [页面布局制作及跳转逻辑实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 实现验证码功能](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城后台管理系统登录功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [登陆拦截器设置并完善身份验证](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [通用分页功能设计与开发实践](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [jqGrid 插件整合制作分页效果](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 实践之文件上传处理-1](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot 实践之文件上传处理-2](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城轮播图管理模块开发](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城分类管理模块开发-1](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城分类管理模块开发-2](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城商品类目三级联动功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [富文本编辑器 wangEditor 介绍及整合详解](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城商品编辑页面制作](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城商品添加功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城商品管理模块功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城首页制作-1](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城首页制作-2](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城首页模块配置及功能完善](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城会员的注册/登录功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城搜索商品功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城购物车功能实现](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城订单确认页和订单生成功能实践](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城个人订单列表和订单详情页制作](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城订单流程功能完善](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [课程总结及展望](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [Spring Boot中的事务处理](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [新蜂商城错误页面制作](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n- [常见问题汇总讲解](https://juejin.cn/book/6844733814074245133?suid=1996368849416216&source=android)\n\n## 联系作者\n\n> 大家有任何问题或者建议都可以在 [issues](https://github.com/newbee-ltd/newbee-mall/issues) 中反馈给我，我会慢慢完善这个项目。\n\n- 我的邮箱：2449207463@qq.com\n- QQ技术交流群：791509631 784785001\n\n> newbee-mall 在 GitHub 和国内的码云都创建了代码仓库，如果有人访问 GitHub 比较慢的话，建议在 Gitee 上查看该项目，两个仓库会保持同步更新。\n\n- [newbee-mall in GitHub](https://github.com/newbee-ltd/newbee-mall)\n- [newbee-mall in Gitee](https://gitee.com/newbee-ltd/newbee-mall)\n![newbee-mall-info](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/store/newbee-mall-info-3.png)\n\n## 软件著作权\n\n>本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n\n![](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/store/newbee-mall-copyright.png)\n\n## 页面展示\n\n以下为商城项目的部分页面，由于篇幅所限，无法一一列举，重要节点及重要功能的页面都已整理在下方。\n\n### 商城页面预览\n\n- 商城首页 1\n\n\t![index](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/index-01-2023.gif)\n\n- 商城首页 2\n\n\t![index](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/index-02-2023.png)\n\n- 商品搜索\n\n\t![search](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/search-2023.png)\n\n- 购物车\n\n\t![cart](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/cart-2023.png)\n\t\n- 订单结算\n\n\t![settle](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/settle-2023.png)\n\t\t\t\n- 订单列表\n\n\t![orders](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/orders-2023.png)\t\n\t\n- 支付页面\n\n\t![settle](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/wx-pay.png)\n\n\n### 后台管理页面\n\n- 登录页\n\n\t![login](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/manage-login.png)\n\n- 轮播图管理\n\n\t![carousel](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/manage-carousel-2023.png)\n\t\n- 新品上线\n\n    ![config](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/manage-index-config-2023.png)\n\n- 分类管理\n\n\t![category](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/manage-category.png)\n\n- 商品管理\n\n\t![goods](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/manage-goods-2023.png)\n\n- 商品编辑\n\n\t![edit](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/goods-edit-2023.png)\n\n- 订单管理\n\n\t![order](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/product/manage-order-2023.png)\n\n![newbee-mall-info](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/store/newbee-mall-info-3.png)\n\n## 感谢\n\n- [spring-projects](https://github.com/spring-projects/spring-boot)\n- [thymeleaf](https://github.com/thymeleaf/thymeleaf)\n- [mybatis](https://github.com/mybatis/mybatis-3)\n- [ColorlibHQ](https://github.com/ColorlibHQ/AdminLTE)\n- [tonytomov](https://github.com/tonytomov/jqGrid)\n- [sweetalert2](https://github.com/sweetalert2/sweetalert2)\n- [skytotwo](https://github.com/skytotwo/Alipay-WeChat-HTML)\n- [hutool](https://github.com/dromara/hutool)\n- [wangeditor-team](https://github.com/wangeditor-team/wangEditor)\n- [VincentGarreau](https://github.com/VincentGarreau/particles.js)\n- [Vue](https://github.com/vuejs/vue)\n- [Vant](https://github.com/youzan/vant)\n"
  },
  {
    "path": "docs/API.md",
    "content": "# newbee-mall API 接口文档\n\n## 文档说明\n\n本文档描述了 newbee-mall 商城系统的主要 API 接口，包括前台商城接口和后台管理接口。\n\n**基础信息**\n- 基础URL: http://localhost:28089\n- 编码格式: UTF-8\n- 响应格式: JSON / HTML (Thymeleaf 模板)\n- Session 管理: 基于 Cookie 的 Session 机制\n\n---\n\n## 目录\n\n- [前台商城接口](#前台商城接口)\n  - [首页相关](#首页相关)\n  - [商品相关](#商品相关)\n  - [购物车相关](#购物车相关)\n  - [订单相关](#订单相关)\n  - [用户相关](#用户相关)\n- [后台管理接口](#后台管理接口)\n  - [管理员登录](#管理员登录)\n  - [轮播图管理](#轮播图管理)\n  - [商品管理](#商品管理)\n  - [分类管理](#分类管理)\n  - [订单管理](#订单管理)\n  - [会员管理](#会员管理)\n- [公共接口](#公共接口)\n\n---\n\n## 前台商城接口\n\n### 首页相关\n\n#### 1. 获取商城首页\n\n**接口地址**: `GET /` 或 `GET /index` 或 `GET /index.html`\n\n**接口描述**: 获取商城首页数据，包括轮播图、分类、热销商品、新品、推荐商品\n\n**请求参数**: 无\n\n**响应数据**:\n```html\n返回 Thymeleaf 模板渲染的 HTML 页面\n```\n\n**页面数据**:\n- `categories`: 商品分类列表\n- `carousels`: 轮播图列表（最多5个）\n- `hotGoodses`: 热销商品列表（最多5个）\n- `newGoodses`: 新品列表（最多5个）\n- `recommendGoodses`: 推荐商品列表（最多10个）\n\n---\n\n### 商品相关\n\n#### 2. 商品搜索\n\n**接口地址**: `GET /search`\n\n**接口描述**: 搜索商品列表\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| keyword | String | 否 | 搜索关键词 |\n| goodsCategoryId | Long | 否 | 商品分类ID |\n| orderBy | String | 否 | 排序方式（new:新品, price:价格） |\n| page | Integer | 否 | 页码，默认1 |\n\n**响应数据**:\n```html\n返回商品列表页面\n```\n\n#### 3. 商品详情\n\n**接口地址**: `GET /goods/detail/{goodsId}`\n\n**接口描述**: 获取商品详细信息\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| goodsId | Long | 是 | 商品ID（路径参数） |\n\n**响应数据**:\n```html\n返回商品详情页面\n```\n\n---\n\n### 购物车相关\n\n#### 4. 查看购物车\n\n**接口地址**: `GET /shop-cart`\n\n**接口描述**: 查看当前用户的购物车\n\n**请求参数**: 无（需要登录）\n\n**响应数据**:\n```html\n返回购物车页面\n```\n\n#### 5. 添加商品到购物车\n\n**接口地址**: `POST /shop-cart`\n\n**接口描述**: 将商品添加到购物车\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| goodsId | Long | 是 | 商品ID |\n| goodsCount | Integer | 是 | 商品数量 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": null\n}\n```\n\n#### 6. 更新购物车商品数量\n\n**接口地址**: `PUT /shop-cart`\n\n**接口描述**: 更新购物车中商品的数量\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| cartItemId | Long | 是 | 购物车项ID |\n| goodsCount | Integer | 是 | 新的商品数量 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\"\n}\n```\n\n#### 7. 删除购物车商品\n\n**接口地址**: `DELETE /shop-cart/{cartItemId}`\n\n**接口描述**: 从购物车中删除商品\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| cartItemId | Long | 是 | 购物车项ID（路径参数） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\"\n}\n```\n\n---\n\n### 订单相关\n\n#### 8. 订单结算页面\n\n**接口地址**: `GET /shop-cart/settle`\n\n**接口描述**: 获取订单结算页面\n\n**请求参数**: 无（需要登录）\n\n**响应数据**:\n```html\n返回订单结算页面\n```\n\n#### 9. 生成订单\n\n**接口地址**: `POST /saveOrder`\n\n**接口描述**: 提交订单\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| addressId | Long | 是 | 收货地址ID |\n| cartItemIds | String | 是 | 购物车项ID列表（逗号分隔） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": \"订单号\"\n}\n```\n\n#### 10. 我的订单列表\n\n**接口地址**: `GET /orders`\n\n**接口描述**: 查看当前用户的订单列表\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| page | Integer | 否 | 页码，默认1 |\n| status | String | 否 | 订单状态 |\n\n**响应数据**:\n```html\n返回订单列表页面\n```\n\n#### 11. 订单详情\n\n**接口地址**: `GET /orders/{orderNo}`\n\n**接口描述**: 查看订单详细信息\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| orderNo | String | 是 | 订单号（路径参数） |\n\n**响应数据**:\n```html\n返回订单详情页面\n```\n\n#### 12. 取消订单\n\n**接口地址**: `PUT /orders/{orderNo}/cancel`\n\n**接口描述**: 取消订单\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| orderNo | String | 是 | 订单号（路径参数） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\"\n}\n```\n\n#### 13. 确认收货\n\n**接口地址**: `PUT /orders/{orderNo}/finish`\n\n**接口描述**: 确认收货\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| orderNo | String | 是 | 订单号（路径参数） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\"\n}\n```\n\n---\n\n### 用户相关\n\n#### 14. 用户注册\n\n**接口地址**: `POST /register`\n\n**接口描述**: 用户注册\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| loginName | String | 是 | 登录名 |\n| password | String | 是 | 密码 |\n| verifyCode | String | 是 | 验证码 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"注册成功\"\n}\n```\n\n#### 15. 用户登录\n\n**接口地址**: `POST /login`\n\n**接口描述**: 用户登录\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| loginName | String | 是 | 登录名 |\n| password | String | 是 | 密码 |\n| verifyCode | String | 是 | 验证码 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"登录成功\"\n}\n```\n\n#### 16. 用户登出\n\n**接口地址**: `POST /logout`\n\n**接口描述**: 用户退出登录\n\n**请求参数**: 无\n\n**响应数据**:\n```html\n跳转到登录页面\n```\n\n#### 17. 个人信息\n\n**接口地址**: `GET /personal`\n\n**接口描述**: 查看个人信息\n\n**请求参数**: 无（需要登录）\n\n**响应数据**:\n```html\n返回个人中心页面\n```\n\n#### 18. 修改个人信息\n\n**接口地址**: `POST /personal/updateInfo`\n\n**接口描述**: 修改个人信息\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| nickName | String | 是 | 昵称 |\n| introduceSign | String | 否 | 个性签名 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"修改成功\"\n}\n```\n\n---\n\n## 后台管理接口\n\n### 管理员登录\n\n#### 19. 管理员登录页面\n\n**接口地址**: `GET /admin/login`\n\n**接口描述**: 获取管理员登录页面\n\n**请求参数**: 无\n\n**响应数据**:\n```html\n返回管理员登录页面\n```\n\n#### 20. 管理员登录\n\n**接口地址**: `POST /admin/login`\n\n**接口描述**: 管理员登录验证\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| userName | String | 是 | 用户名 |\n| password | String | 是 | 密码 |\n| verifyCode | String | 是 | 验证码 |\n\n**响应数据**:\n```html\n登录成功：跳转到管理后台首页\n登录失败：返回登录页面并显示错误信息\n```\n\n#### 21. 管理员登出\n\n**接口地址**: `GET /admin/logout`\n\n**接口描述**: 管理员退出登录\n\n**请求参数**: 无\n\n**响应数据**:\n```html\n跳转到登录页面\n```\n\n#### 22. 管理员个人资料\n\n**接口地址**: `GET /admin/profile`\n\n**接口描述**: 查看管理员个人资料\n\n**请求参数**: 无（需要登录）\n\n**响应数据**:\n```html\n返回个人资料页面\n```\n\n#### 23. 修改管理员密码\n\n**接口地址**: `POST /admin/profile/password`\n\n**接口描述**: 修改管理员密码\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| originalPassword | String | 是 | 原密码 |\n| newPassword | String | 是 | 新密码 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"修改成功\"\n}\n```\n\n---\n\n### 轮播图管理\n\n#### 24. 轮播图列表\n\n**接口地址**: `GET /admin/carousels`\n\n**接口描述**: 获取轮播图列表（分页）\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| page | Integer | 否 | 页码，默认1 |\n| limit | Integer | 否 | 每页数量，默认10 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {\n    \"totalCount\": 100,\n    \"currPage\": 1,\n    \"list\": [...]\n  }\n}\n```\n\n#### 25. 添加轮播图\n\n**接口地址**: `POST /admin/carousels/save`\n\n**接口描述**: 添加新的轮播图\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| carouselUrl | String | 是 | 图片URL |\n| redirectUrl | String | 是 | 跳转URL |\n| carouselRank | Integer | 是 | 排序值 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"保存成功\"\n}\n```\n\n#### 26. 修改轮播图\n\n**接口地址**: `POST /admin/carousels/update`\n\n**接口描述**: 修改轮播图信息\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| carouselId | Integer | 是 | 轮播图ID |\n| carouselUrl | String | 是 | 图片URL |\n| redirectUrl | String | 是 | 跳转URL |\n| carouselRank | Integer | 是 | 排序值 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"修改成功\"\n}\n```\n\n#### 27. 删除轮播图\n\n**接口地址**: `POST /admin/carousels/delete`\n\n**接口描述**: 删除轮播图\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| ids | Integer[] | 是 | 轮播图ID数组 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"删除成功\"\n}\n```\n\n---\n\n### 商品管理\n\n#### 28. 商品列表\n\n**接口地址**: `GET /admin/goods/list`\n\n**接口描述**: 获取商品列表（分页）\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| page | Integer | 否 | 页码，默认1 |\n| limit | Integer | 否 | 每页数量，默认10 |\n| goodsName | String | 否 | 商品名称（模糊查询） |\n| goodsSellStatus | Integer | 否 | 上架状态 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {\n    \"totalCount\": 100,\n    \"currPage\": 1,\n    \"list\": [...]\n  }\n}\n```\n\n#### 29. 添加商品\n\n**接口地址**: `POST /admin/goods/save`\n\n**接口描述**: 添加新商品\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| goodsName | String | 是 | 商品名称 |\n| goodsIntro | String | 是 | 商品简介 |\n| goodsCategoryId | Long | 是 | 分类ID |\n| goodsCoverImg | String | 是 | 封面图 |\n| originalPrice | Integer | 是 | 原价 |\n| sellingPrice | Integer | 是 | 售价 |\n| stockNum | Integer | 是 | 库存 |\n| tag | String | 否 | 标签 |\n| goodsSellStatus | Byte | 是 | 上架状态 |\n| goodsDetailContent | String | 是 | 商品详情（富文本） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"保存成功\"\n}\n```\n\n#### 30. 修改商品\n\n**接口地址**: `POST /admin/goods/update`\n\n**接口描述**: 修改商品信息\n\n**请求参数**: 同添加商品，需额外传递 `goodsId`\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"修改成功\"\n}\n```\n\n#### 31. 上架/下架商品\n\n**接口地址**: `POST /admin/goods/status/{sellStatus}`\n\n**接口描述**: 批量修改商品上架状态\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| sellStatus | Integer | 是 | 状态值（路径参数，0下架，1上架） |\n| ids | Long[] | 是 | 商品ID数组 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"修改成功\"\n}\n```\n\n---\n\n### 分类管理\n\n#### 32. 分类列表\n\n**接口地址**: `GET /admin/categories/list`\n\n**接口描述**: 获取分类列表（分页）\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| page | Integer | 否 | 页码，默认1 |\n| limit | Integer | 否 | 每页数量，默认10 |\n| categoryLevel | Integer | 否 | 分类级别（1/2/3） |\n| parentId | Long | 否 | 父分类ID |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {\n    \"totalCount\": 100,\n    \"currPage\": 1,\n    \"list\": [...]\n  }\n}\n```\n\n#### 33. 添加分类\n\n**接口地址**: `POST /admin/categories/save`\n\n**接口描述**: 添加商品分类\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| categoryLevel | Byte | 是 | 分类级别 |\n| categoryName | String | 是 | 分类名称 |\n| parentId | Long | 是 | 父分类ID |\n| categoryRank | Integer | 是 | 排序值 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"保存成功\"\n}\n```\n\n#### 34. 获取分类详情\n\n**接口地址**: `GET /admin/categories/info/{id}`\n\n**接口描述**: 获取分类详细信息\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| id | Long | 是 | 分类ID（路径参数） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {...}\n}\n```\n\n---\n\n### 订单管理\n\n#### 35. 订单列表\n\n**接口地址**: `GET /admin/orders/list`\n\n**接口描述**: 获取订单列表（分页）\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| page | Integer | 否 | 页码，默认1 |\n| limit | Integer | 否 | 每页数量，默认10 |\n| orderNo | String | 否 | 订单号 |\n| orderStatus | Integer | 否 | 订单状态 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {\n    \"totalCount\": 100,\n    \"currPage\": 1,\n    \"list\": [...]\n  }\n}\n```\n\n#### 36. 订单详情\n\n**接口地址**: `GET /admin/orders/detail/{orderId}`\n\n**接口描述**: 查看订单详细信息\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| orderId | Long | 是 | 订单ID（路径参数） |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {...}\n}\n```\n\n#### 37. 配货\n\n**接口地址**: `POST /admin/orders/checkDone`\n\n**接口描述**: 订单配货\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| ids | Long[] | 是 | 订单ID数组 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"配货成功\"\n}\n```\n\n#### 38. 出库\n\n**接口地址**: `POST /admin/orders/checkOut`\n\n**接口描述**: 订单出库\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| ids | Long[] | 是 | 订单ID数组 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"出库成功\"\n}\n```\n\n#### 39. 关闭订单\n\n**接口地址**: `POST /admin/orders/close`\n\n**接口描述**: 关闭订单\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| ids | Long[] | 是 | 订单ID数组 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"关闭成功\"\n}\n```\n\n---\n\n### 会员管理\n\n#### 40. 会员列表\n\n**接口地址**: `GET /admin/users/list`\n\n**接口描述**: 获取会员列表（分页）\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| page | Integer | 否 | 页码，默认1 |\n| limit | Integer | 否 | 每页数量，默认10 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"success\",\n  \"data\": {\n    \"totalCount\": 100,\n    \"currPage\": 1,\n    \"list\": [...]\n  }\n}\n```\n\n#### 41. 禁用会员\n\n**接口地址**: `POST /admin/users/lock/{lockStatus}`\n\n**接口描述**: 批量禁用/解禁会员\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| lockStatus | Integer | 是 | 状态值（路径参数，0正常，1锁定） |\n| ids | Long[] | 是 | 用户ID数组 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"修改成功\"\n}\n```\n\n---\n\n## 公共接口\n\n#### 42. 获取验证码\n\n**接口地址**: `GET /common/kaptcha`\n\n**接口描述**: 生成验证码图片\n\n**请求参数**: 无\n\n**响应数据**:\n```\n图片流（image/jpeg）\n```\n\n#### 43. 文件上传\n\n**接口地址**: `POST /admin/upload/file`\n\n**接口描述**: 上传文件（图片）\n\n**请求参数**:\n\n| 参数名 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| file | MultipartFile | 是 | 文件对象 |\n\n**响应数据**:\n```json\n{\n  \"resultCode\": 200,\n  \"message\": \"上传成功\",\n  \"data\": \"文件访问路径\"\n}\n```\n\n---\n\n## 状态码说明\n\n### 通用状态码\n\n| 状态码 | 说明 |\n|--------|------|\n| 200 | 成功 |\n| 500 | 服务器内部错误 |\n\n### 业务状态码\n\n| 状态码 | 说明 |\n|--------|------|\n| SUCCESS | 成功 |\n| ERROR | 失败 |\n| DB_ERROR | 数据库异常 |\n| PARAMS_ERROR | 参数异常 |\n| NOT_LOGIN_ERROR | 未登录 |\n| DATA_NOT_EXIST | 数据不存在 |\n| GOODS_SAVE_ERROR | 商品保存失败 |\n| GOODS_UPDATE_ERROR | 商品更新失败 |\n| ORDER_NOT_EXIST_ERROR | 订单不存在 |\n| NULL_ADDRESS_ERROR | 地址为空 |\n| LOGIN_ERROR | 登录失败 |\n| NOT_SALE_GOODS | 商品已下架 |\n\n---\n\n## 数据模型\n\n### 商品对象 (Goods)\n\n```json\n{\n  \"goodsId\": 1,\n  \"goodsName\": \"商品名称\",\n  \"goodsIntro\": \"商品简介\",\n  \"goodsCategoryId\": 100,\n  \"goodsCoverImg\": \"/upload/xxx.jpg\",\n  \"goodsDetailContent\": \"商品详情HTML\",\n  \"originalPrice\": 100,\n  \"sellingPrice\": 80,\n  \"stockNum\": 999,\n  \"tag\": \"热销\",\n  \"goodsSellStatus\": 0,\n  \"createTime\": \"2023-01-01 12:00:00\",\n  \"updateTime\": \"2023-01-01 12:00:00\"\n}\n```\n\n### 订单对象 (Order)\n\n```json\n{\n  \"orderId\": 1,\n  \"orderNo\": \"202301010001\",\n  \"userId\": 1,\n  \"totalPrice\": 100,\n  \"payStatus\": 1,\n  \"payType\": 1,\n  \"payTime\": \"2023-01-01 12:00:00\",\n  \"orderStatus\": 1,\n  \"extraInfo\": \"\",\n  \"isDeleted\": 0,\n  \"createTime\": \"2023-01-01 12:00:00\",\n  \"updateTime\": \"2023-01-01 12:00:00\"\n}\n```\n\n### 用户对象 (User)\n\n```json\n{\n  \"userId\": 1,\n  \"nickName\": \"用户昵称\",\n  \"loginName\": \"登录名\",\n  \"passwordMd5\": \"MD5加密密码\",\n  \"introduceSign\": \"个性签名\",\n  \"isDeleted\": 0,\n  \"lockedFlag\": 0,\n  \"createTime\": \"2023-01-01 12:00:00\"\n}\n```\n\n---\n\n## 注意事项\n\n1. **认证机制**: 所有需要登录的接口都需要携带有效的 Session Cookie\n2. **参数校验**: 所有接口都会进行参数校验，参数不合法会返回相应错误信息\n3. **跨域访问**: 如果前后端分离部署，需要配置 CORS\n4. **文件上传**: 支持的文件格式为 jpg、png、jpeg、gif，大小限制请查看配置\n5. **分页参数**: 默认每页10条，最大不超过100条\n\n---\n\n**文档版本**: v1.0.0\n**最后更新**: 2025-10-23\n**维护者**: newbee-mall 开发团队\n"
  },
  {
    "path": "docs/DEVELOPMENT.md",
    "content": "# newbee-mall 开发指南\n\n## 目录\n\n- [项目介绍](#项目介绍)\n- [技术栈](#技术栈)\n- [项目结构](#项目结构)\n- [开发环境搭建](#开发环境搭建)\n- [快速开始](#快速开始)\n- [开发规范](#开发规范)\n- [核心功能实现](#核心功能实现)\n- [常用开发任务](#常用开发任务)\n- [测试指南](#测试指南)\n- [部署指南](#部署指南)\n\n---\n\n## 项目介绍\n\nnewbee-mall 是一个基于 Spring Boot 的电商系统，包含前台商城和后台管理两个部分。\n\n**项目特点**:\n- 代码结构清晰，易于理解和学习\n- 功能完善，包含电商系统的核心功能\n- 技术栈主流，适合学习和实践\n- 开箱即用，2秒即可启动\n\n**主要功能模块**:\n\n**前台商城**:\n- 首页展示（轮播图、分类、商品推荐）\n- 商品搜索与展示\n- 购物车管理\n- 订单流程（下单、支付、查看）\n- 用户中心（个人信息、订单管理）\n\n**后台管理**:\n- 管理员登录与权限控制\n- 轮播图管理\n- 商品分类管理\n- 商品管理\n- 订单管理\n- 会员管理\n\n---\n\n## 技术栈\n\n### 后端技术\n\n| 技术 | 版本 | 说明 |\n|------|------|------|\n| Spring Boot | 2.6.3 | 核心框架 |\n| Spring MVC | - | MVC 框架 |\n| MyBatis | 2.2.2 | ORM 框架 |\n| Thymeleaf | - | 模板引擎 |\n| MySQL | 5.7+ | 数据库 |\n| Hutool | 5.7.22 | Java 工具库 |\n| Maven | 3.x | 项目构建工具 |\n\n### 前端技术\n\n| 技术 | 说明 |\n|------|------|\n| Thymeleaf | 服务端模板引擎 |\n| jQuery | JavaScript 库 |\n| Bootstrap | UI 框架 |\n| AdminLTE | 后台管理模板 |\n| jqGrid | 数据表格插件 |\n| wangEditor | 富文本编辑器 |\n| SweetAlert | 弹窗组件 |\n\n---\n\n## 项目结构\n\n```\nnewbee-mall/\n├── src/\n│   ├── main/\n│   │   ├── java/\n│   │   │   └── ltd/newbee/mall/\n│   │   │       ├── common/              # 公共常量和枚举\n│   │   │       │   ├── Constants.java\n│   │   │       │   ├── ServiceResultEnum.java\n│   │   │       │   └── ...\n│   │   │       ├── config/              # 配置类\n│   │   │       │   └── WebMvcConfig.java\n│   │   │       ├── controller/          # 控制器层\n│   │   │       │   ├── admin/           # 后台管理控制器\n│   │   │       │   ├── mall/            # 前台商城控制器\n│   │   │       │   ├── common/          # 公共控制器\n│   │   │       │   └── vo/              # 视图对象\n│   │   │       ├── dao/                 # 数据访问层\n│   │   │       │   ├── AdminUserMapper.java\n│   │   │       │   ├── NewBeeMallGoodsMapper.java\n│   │   │       │   └── ...\n│   │   │       ├── entity/              # 实体类\n│   │   │       │   ├── AdminUser.java\n│   │   │       │   ├── NewBeeMallGoods.java\n│   │   │       │   └── ...\n│   │   │       ├── interceptor/         # 拦截器\n│   │   │       │   ├── AdminLoginInterceptor.java\n│   │   │       │   └── NewBeeMallLoginInterceptor.java\n│   │   │       ├── service/             # 服务层接口\n│   │   │       │   ├── AdminUserService.java\n│   │   │       │   └── ...\n│   │   │       │   └── impl/            # 服务层实现\n│   │   │       │       ├── AdminUserServiceImpl.java\n│   │   │       │       └── ...\n│   │   │       ├── util/                # 工具类\n│   │   │       │   ├── MD5Util.java\n│   │   │       │   ├── Result.java\n│   │   │       │   └── ...\n│   │   │       └── NewBeeMallApplication.java  # 启动类\n│   │   └── resources/\n│   │       ├── mapper/                  # MyBatis XML 映射文件\n│   │       │   ├── AdminUserMapper.xml\n│   │       │   └── ...\n│   │       ├── static/                  # 静态资源\n│   │       │   ├── admin/               # 后台静态资源\n│   │       │   └── mall/                # 前台静态资源\n│   │       ├── templates/               # Thymeleaf 模板\n│   │       │   ├── admin/               # 后台页面\n│   │       │   └── mall/                # 前台页面\n│   │       └── application.properties   # 配置文件\n│   └── test/                            # 测试代码\n├── docs/                                # 项目文档\n├── pom.xml                              # Maven 配置\n└── README.md                            # 项目说明\n```\n\n---\n\n## 开发环境搭建\n\n### 1. 安装必要软件\n\n#### 1.1 安装 JDK\n\n下载并安装 JDK 1.8 或以上版本，配置环境变量。\n\n验证安装:\n```bash\njava -version\n```\n\n#### 1.2 安装 Maven\n\n下载并安装 Maven 3.x，配置环境变量。\n\n验证安装:\n```bash\nmvn -version\n```\n\n推荐配置阿里云镜像（修改 `settings.xml`）:\n```xml\n<mirror>\n  <id>aliyun</id>\n  <mirrorOf>central</mirrorOf>\n  <name>Aliyun Maven</name>\n  <url>https://maven.aliyun.com/repository/public</url>\n</mirror>\n```\n\n#### 1.3 安装 MySQL\n\n下载并安装 MySQL 5.7 或以上版本。\n\n创建数据库:\n```sql\nCREATE DATABASE newbee_mall_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n```\n\n#### 1.4 安装 IDE\n\n推荐使用 IntelliJ IDEA 或 Eclipse。\n\n### 2. 克隆项目\n\n```bash\ngit clone https://github.com/newbee-ltd/newbee-mall.git\ncd newbee-mall\n```\n\n### 3. 导入数据库\n\n执行项目中的 SQL 脚本（通常在 `sql` 或 `database` 目录）:\n```bash\nmysql -u root -p newbee_mall_db < newbee_mall_schema.sql\nmysql -u root -p newbee_mall_db < newbee_mall_data.sql\n```\n\n### 4. 配置项目\n\n修改 `src/main/resources/application.properties`:\n```properties\n# 数据库配置\nspring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true\nspring.datasource.username=root\nspring.datasource.password=你的密码\n\n# 服务器端口\nserver.port=28089\n```\n\n---\n\n## 快速开始\n\n### 方式一: IDEA 启动\n\n1. 用 IDEA 打开项目\n2. 等待 Maven 依赖下载完成\n3. 找到 `NewBeeMallApplication.java`\n4. 右键选择 `Run 'NewBeeMallApplication'`\n\n### 方式二: Maven 启动\n\n```bash\nmvn clean install\nmvn spring-boot:run\n```\n\n### 方式三: 命令行启动\n\n```bash\nmvn clean package\ncd target\njava -jar newbee-mall-1.0.0-SNAPSHOT.jar\n```\n\n### 访问项目\n\n- 前台商城: http://localhost:28089\n- 后台管理: http://localhost:28089/admin/login\n\n---\n\n## 开发规范\n\n### 1. 代码规范\n\n#### 1.1 命名规范\n\n- **类名**: 使用大驼峰命名法（PascalCase）\n  ```java\n  public class NewBeeMallGoods { }\n  ```\n\n- **方法名**: 使用小驼峰命名法（camelCase）\n  ```java\n  public void saveGoods() { }\n  ```\n\n- **常量**: 使用全大写，单词间用下划线分隔\n  ```java\n  public static final int MAX_GOODS_COUNT = 100;\n  ```\n\n- **包名**: 全小写，使用点分隔\n  ```java\n  package ltd.newbee.mall.service;\n  ```\n\n#### 1.2 注释规范\n\n- 类和接口必须添加注释\n- 公共方法必须添加注释\n- 复杂逻辑必须添加行内注释\n\n```java\n/**\n * 商品服务接口\n *\n * @author 13\n */\npublic interface NewBeeMallGoodsService {\n    /**\n     * 保存商品\n     *\n     * @param goods 商品对象\n     * @return 保存结果\n     */\n    Boolean saveGoods(NewBeeMallGoods goods);\n}\n```\n\n#### 1.3 代码格式\n\n- 使用4个空格缩进（不使用 Tab）\n- 左大括号不换行\n- if/for/while 等语句必须使用大括号\n- 一行代码不超过120个字符\n\n### 2. 分层规范\n\n#### 2.1 Controller 层\n\n- 只负责请求接收和响应\n- 不包含业务逻辑\n- 调用 Service 层完成业务处理\n- 进行参数校验\n\n```java\n@Controller\npublic class GoodsController {\n\n    @Resource\n    private NewBeeMallGoodsService goodsService;\n\n    @GetMapping(\"/goods/detail/{goodsId}\")\n    public String goodsDetail(@PathVariable Long goodsId, HttpServletRequest request) {\n        // 参数校验\n        if (goodsId < 1) {\n            return \"error/error_5xx\";\n        }\n\n        // 调用 Service\n        NewBeeMallGoodsDetailVO goodsDetail = goodsService.getGoodsDetail(goodsId);\n\n        // 设置返回数据\n        request.setAttribute(\"goodsDetail\", goodsDetail);\n        return \"mall/detail\";\n    }\n}\n```\n\n#### 2.2 Service 层\n\n- 包含业务逻辑\n- 事务控制在此层\n- 调用 DAO 层操作数据库\n\n```java\n@Service\npublic class NewBeeMallGoodsServiceImpl implements NewBeeMallGoodsService {\n\n    @Resource\n    private NewBeeMallGoodsMapper goodsMapper;\n\n    @Override\n    @Transactional\n    public Boolean saveGoods(NewBeeMallGoods goods) {\n        // 业务逻辑处理\n        if (goods == null) {\n            return false;\n        }\n\n        // 调用 DAO\n        return goodsMapper.insertSelective(goods) > 0;\n    }\n}\n```\n\n#### 2.3 DAO 层\n\n- 只负责数据库操作\n- 不包含业务逻辑\n- 使用 MyBatis 接口和 XML 映射\n\n```java\npublic interface NewBeeMallGoodsMapper {\n    int insertSelective(NewBeeMallGoods record);\n\n    NewBeeMallGoods selectByPrimaryKey(Long goodsId);\n\n    int updateByPrimaryKeySelective(NewBeeMallGoods record);\n}\n```\n\n### 3. 异常处理\n\n- 使用统一的异常处理机制\n- 自定义业务异常\n\n```java\npublic class NewBeeMallException extends RuntimeException {\n    public NewBeeMallException(String message) {\n        super(message);\n    }\n\n    public static void fail(String message) {\n        throw new NewBeeMallException(message);\n    }\n}\n```\n\n### 4. 返回结果规范\n\n- 使用统一的返回对象 `Result`\n- 使用枚举定义返回码和消息\n\n```java\nResult result = Result.success();\nResult result = Result.error(\"操作失败\");\n```\n\n---\n\n## 核心功能实现\n\n### 1. 用户登录功能\n\n#### 1.1 前台用户登录\n\n**流程**:\n1. 用户输入用户名、密码、验证码\n2. Controller 接收参数并校验\n3. Service 验证用户名和密码（MD5）\n4. 登录成功后将用户信息存入 Session\n5. 返回登录结果\n\n**代码示例**:\n\n```java\n@PostMapping(\"/login\")\n@ResponseBody\npublic Result login(@RequestParam(\"loginName\") String loginName,\n                    @RequestParam(\"password\") String password,\n                    HttpSession session) {\n    // 参数校验\n    if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) {\n        return Result.error(\"参数不能为空\");\n    }\n\n    // 调用 Service 验证\n    String loginResult = newBeeMallUserService.login(loginName, password, session);\n\n    if (ServiceResultEnum.SUCCESS.getResult().equals(loginResult)) {\n        return Result.success();\n    }\n    return Result.error(loginResult);\n}\n```\n\n#### 1.2 登录拦截器\n\n**作用**: 拦截需要登录才能访问的请求\n\n```java\n@Component\npublic class NewBeeMallLoginInterceptor implements HandlerInterceptor {\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n        HttpSession session = request.getSession();\n        Object user = session.getAttribute(\"mallUser\");\n\n        if (user == null) {\n            response.sendRedirect(\"/login\");\n            return false;\n        }\n        return true;\n    }\n}\n```\n\n**配置拦截器**:\n\n```java\n@Configuration\npublic class WebMvcConfig implements WebMvcConfigurer {\n\n    @Resource\n    private NewBeeMallLoginInterceptor loginInterceptor;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(loginInterceptor)\n                .addPathPatterns(\"/personal/**\")\n                .addPathPatterns(\"/shop-cart/**\")\n                .addPathPatterns(\"/orders/**\")\n                .excludePathPatterns(\"/login\")\n                .excludePathPatterns(\"/register\");\n    }\n}\n```\n\n### 2. 购物车功能\n\n#### 2.1 添加商品到购物车\n\n```java\n@PostMapping(\"/shop-cart\")\n@ResponseBody\npublic Result saveShoppingCartItem(@RequestBody NewBeeMallShoppingCartItem shoppingCartItem,\n                                   HttpSession session) {\n    // 获取当前登录用户\n    NewBeeMallUserVO user = (NewBeeMallUserVO) session.getAttribute(\"mallUser\");\n    shoppingCartItem.setUserId(user.getUserId());\n\n    // 调用 Service 保存\n    String saveResult = newBeeMallShoppingCartService.saveNewBeeMallCartItem(shoppingCartItem);\n\n    if (ServiceResultEnum.SUCCESS.getResult().equals(saveResult)) {\n        return Result.success();\n    }\n    return Result.error(saveResult);\n}\n```\n\n#### 2.2 购物车列表查询\n\n```java\n@GetMapping(\"/shop-cart\")\npublic String cartListPage(HttpServletRequest request, HttpSession session) {\n    NewBeeMallUserVO user = (NewBeeMallUserVO) session.getAttribute(\"mallUser\");\n\n    // 查询购物车列表\n    List<NewBeeMallShoppingCartItemVO> myShoppingCartItems =\n        newBeeMallShoppingCartService.getMyShoppingCartItems(user.getUserId());\n\n    request.setAttribute(\"cartItems\", myShoppingCartItems);\n    return \"mall/cart\";\n}\n```\n\n### 3. 订单功能\n\n#### 3.1 生成订单\n\n```java\n@PostMapping(\"/saveOrder\")\n@ResponseBody\n@Transactional\npublic Result saveOrder(@RequestParam Long addressId,\n                        @RequestParam String cartItemIds,\n                        HttpSession session) {\n    // 获取当前用户\n    NewBeeMallUserVO user = (NewBeeMallUserVO) session.getAttribute(\"mallUser\");\n\n    // 购物车项 ID 转换\n    List<Long> itemIdList = Arrays.stream(cartItemIds.split(\",\"))\n                                  .map(Long::parseLong)\n                                  .collect(Collectors.toList());\n\n    // 生成订单\n    String saveOrderResult = newBeeMallOrderService.saveOrder(user.getUserId(), addressId, itemIdList);\n\n    if (ServiceResultEnum.SUCCESS.getResult().equals(saveOrderResult)) {\n        return Result.success();\n    }\n    return Result.error(saveOrderResult);\n}\n```\n\n#### 3.2 订单状态流转\n\n订单状态定义:\n- 0: 待支付\n- 1: 已支付\n- 2: 配货中\n- 3: 出库成功\n- 4: 交易成功\n- -1: 手动关闭\n- -2: 超时关闭\n- -3: 商家关闭\n\n### 4. 文件上传功能\n\n```java\n@PostMapping(\"/admin/upload/file\")\n@ResponseBody\npublic Result upload(@RequestParam(\"file\") MultipartFile file) {\n    // 文件名校验\n    String fileName = file.getOriginalFilename();\n    String suffixName = fileName.substring(fileName.lastIndexOf(\".\"));\n\n    // 生成新文件名\n    String newFileName = UUID.randomUUID().toString() + suffixName;\n\n    // 保存文件\n    File destFile = new File(uploadPath + newFileName);\n    file.transferTo(destFile);\n\n    // 返回文件访问路径\n    return Result.success(newFileName);\n}\n```\n\n### 5. 分页功能\n\n```java\n@GetMapping(\"/admin/goods/list\")\n@ResponseBody\npublic Result list(@RequestParam Map<String, Object> params) {\n    PageQueryUtil pageUtil = new PageQueryUtil(params);\n\n    // 查询分页数据\n    PageResult pageResult = newBeeMallGoodsService.getNewBeeMallGoodsPage(pageUtil);\n\n    return Result.success(pageResult);\n}\n```\n\n---\n\n## 常用开发任务\n\n### 1. 添加新的页面\n\n#### 1.1 创建 Controller\n\n```java\n@Controller\n@RequestMapping(\"/demo\")\npublic class DemoController {\n\n    @GetMapping(\"/index\")\n    public String index() {\n        return \"mall/demo/index\";\n    }\n}\n```\n\n#### 1.2 创建模板文件\n\n在 `src/main/resources/templates/mall/demo/` 目录下创建 `index.html`\n\n#### 1.3 添加静态资源\n\n在 `src/main/resources/static/mall/` 目录下添加 CSS、JS 文件\n\n### 2. 添加新的 API 接口\n\n#### 2.1 创建实体类\n\n```java\npublic class Demo {\n    private Long id;\n    private String name;\n    // getter/setter\n}\n```\n\n#### 2.2 创建 Mapper 接口\n\n```java\npublic interface DemoMapper {\n    List<Demo> selectList();\n    int insert(Demo demo);\n}\n```\n\n#### 2.3 创建 Mapper XML\n\n```xml\n<mapper namespace=\"ltd.newbee.mall.dao.DemoMapper\">\n    <select id=\"selectList\" resultType=\"ltd.newbee.mall.entity.Demo\">\n        SELECT * FROM tb_demo\n    </select>\n</mapper>\n```\n\n#### 2.4 创建 Service\n\n```java\npublic interface DemoService {\n    List<Demo> getList();\n}\n\n@Service\npublic class DemoServiceImpl implements DemoService {\n    @Resource\n    private DemoMapper demoMapper;\n\n    @Override\n    public List<Demo> getList() {\n        return demoMapper.selectList();\n    }\n}\n```\n\n#### 2.5 创建 Controller\n\n```java\n@RestController\n@RequestMapping(\"/api/demo\")\npublic class DemoController {\n\n    @Resource\n    private DemoService demoService;\n\n    @GetMapping(\"/list\")\n    public Result list() {\n        return Result.success(demoService.getList());\n    }\n}\n```\n\n### 3. 添加定时任务\n\n```java\n@Component\n@EnableScheduling\npublic class ScheduledTask {\n\n    @Scheduled(cron = \"0 0 2 * * ?\")\n    public void task() {\n        // 定时任务逻辑\n    }\n}\n```\n\n### 4. 添加拦截器\n\n```java\n@Component\npublic class CustomInterceptor implements HandlerInterceptor {\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {\n        // 前置处理\n        return true;\n    }\n}\n```\n\n---\n\n## 测试指南\n\n### 1. 单元测试\n\n```java\n@SpringBootTest\npublic class GoodsServiceTest {\n\n    @Resource\n    private NewBeeMallGoodsService goodsService;\n\n    @Test\n    public void testGetGoodsDetail() {\n        NewBeeMallGoodsDetailVO goodsDetail = goodsService.getGoodsDetail(1L);\n        assertNotNull(goodsDetail);\n    }\n}\n```\n\n### 2. 接口测试\n\n使用 Postman 或其他工具测试 API 接口。\n\n### 3. 功能测试\n\n手动测试各个功能模块是否正常运行。\n\n---\n\n## 部署指南\n\n### 1. 打包项目\n\n```bash\nmvn clean package -DskipTests\n```\n\n### 2. 服务器环境准备\n\n- 安装 JDK 1.8+\n- 安装 MySQL 5.7+\n- 导入数据库\n\n### 3. 上传并运行\n\n```bash\n# 上传 jar 包\nscp target/newbee-mall-1.0.0-SNAPSHOT.jar user@server:/app/\n\n# SSH 登录服务器\nssh user@server\n\n# 运行项目\nnohup java -jar /app/newbee-mall-1.0.0-SNAPSHOT.jar --spring.profiles.active=prod > /app/logs/app.log 2>&1 &\n```\n\n### 4. 配置 Nginx 反向代理\n\n```nginx\nserver {\n    listen 80;\n    server_name your-domain.com;\n\n    location / {\n        proxy_pass http://localhost:28089;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    }\n}\n```\n\n### 5. 配置 HTTPS\n\n使用 Let's Encrypt 获取免费 SSL 证书。\n\n---\n\n## 常见问题\n\n详见 [FAQ 文档](./FAQ.md)\n\n---\n\n## 参考资料\n\n- [Spring Boot 官方文档](https://spring.io/projects/spring-boot)\n- [MyBatis 官方文档](https://mybatis.org/mybatis-3/)\n- [Thymeleaf 官方文档](https://www.thymeleaf.org/)\n\n---\n\n**文档版本**: v1.0.0\n**最后更新**: 2025-10-23\n**维护者**: newbee-mall 开发团队\n"
  },
  {
    "path": "docs/FAQ.md",
    "content": "# newbee-mall 常见问题 FAQ\n\n## 目录\n- [环境配置相关](#环境配置相关)\n- [项目启动相关](#项目启动相关)\n- [功能使用相关](#功能使用相关)\n- [开发调试相关](#开发调试相关)\n- [部署运维相关](#部署运维相关)\n\n---\n\n## 环境配置相关\n\n### Q1: 项目需要什么样的开发环境？\n**A:** newbee-mall 项目的基本环境要求如下：\n- JDK 1.8 或以上版本\n- Maven 3.x\n- MySQL 5.7 或以上版本\n- IDE：推荐使用 IntelliJ IDEA 或 Eclipse\n\n### Q2: 如何配置数据库连接？\n**A:** 数据库配置位于 `src/main/resources/application.properties` 文件中：\n```properties\nspring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db\nspring.datasource.username=root\nspring.datasource.password=123456\n```\n请根据实际情况修改数据库地址、用户名和密码。\n\n### Q3: 数据库脚本在哪里？\n**A:** 数据库初始化脚本通常位于项目的 `sql` 或 `database` 目录中。首次运行前需要先执行 SQL 脚本创建数据库和表结构。\n\n### Q4: Maven 依赖下载失败怎么办？\n**A:** 可以尝试以下方法：\n1. 检查网络连接\n2. 更换 Maven 镜像源（推荐使用阿里云镜像）\n3. 清理本地仓库缓存：`mvn clean`\n4. 重新下载依赖：`mvn dependency:resolve`\n\n---\n\n## 项目启动相关\n\n### Q5: 如何启动项目？\n**A:** 有以下几种方式：\n1. **IDEA 启动**：直接运行 `NewBeeMallApplication` 主类\n2. **Maven 启动**：执行 `mvn spring-boot:run`\n3. **命令行启动**：先打包 `mvn clean package`，然后运行 `java -jar target/newbee-mall-1.0.0-SNAPSHOT.jar`\n\n### Q6: 项目默认端口是多少？\n**A:** 默认端口是 **28089**，可在 `application.properties` 中修改：\n```properties\nserver.port=28089\n```\n\n### Q7: 启动后如何访问？\n**A:**\n- **前台商城**：http://localhost:28089\n- **后台管理**：http://localhost:28089/admin/login\n- 默认管理员账号需要查看数据库或初始化脚本\n\n### Q8: 启动时报错 \"端口被占用\" 怎么办？\n**A:** 可以：\n1. 修改 `application.properties` 中的端口号\n2. 或者关闭占用该端口的程序\n3. Windows: `netstat -ano | findstr 28089` 查找进程并关闭\n4. Linux/Mac: `lsof -i:28089` 查找进程并关闭\n\n### Q9: 启动时报错 \"数据库连接失败\"？\n**A:** 请检查：\n1. MySQL 服务是否已启动\n2. 数据库名、用户名、密码是否正确\n3. 数据库是否已创建并执行了初始化脚本\n4. 防火墙是否阻止了数据库连接\n\n---\n\n## 功能使用相关\n\n### Q10: 如何注册用户？\n**A:** 在商城首页点击注册按钮，填写用户名、密码等信息即可注册。\n\n### Q11: 管理员默认账号是什么？\n**A:** 默认管理员账号信息需要查看数据库初始化脚本中的 `tb_newbee_mall_admin_user` 表。通常为：\n- 用户名：admin\n- 密码：123456（MD5加密后存储）\n\n### Q12: 如何添加商品？\n**A:**\n1. 登录后台管理系统\n2. 进入\"商品管理\"模块\n3. 点击\"添加商品\"按钮\n4. 填写商品信息（名称、价格、库存、分类等）\n5. 上传商品图片\n6. 保存商品\n\n### Q13: 购物车数据存储在哪里？\n**A:** 购物车数据存储在数据库的 `tb_newbee_mall_shopping_cart_item` 表中，与用户ID关联。\n\n### Q14: 订单状态有哪些？\n**A:** 订单状态包括：\n- 待支付\n- 已支付\n- 配货中\n- 出库成功\n- 交易成功\n- 订单关闭\n具体状态值定义在 `OrderStatusEnum` 枚举类中。\n\n### Q15: 如何处理订单？\n**A:** 在后台管理系统的\"订单管理\"模块中：\n1. 查看订单列表\n2. 点击订单详情查看订单信息\n3. 根据订单状态进行相应操作（配货、出库、关闭等）\n\n---\n\n## 开发调试相关\n\n### Q16: 如何开启热部署？\n**A:** 已配置 Thymeleaf 模板缓存为 false：\n```properties\nspring.thymeleaf.cache=false\n```\n对于 Java 代码修改，建议安装 spring-boot-devtools 依赖。\n\n### Q17: 日志文件在哪里？\n**A:** 项目使用 Spring Boot 默认的日志配置，日志输出到控制台。如需输出到文件，可在 `application.properties` 中配置：\n```properties\nlogging.file.path=logs\nlogging.level.ltd.newbee.mall=DEBUG\n```\n\n### Q18: 如何调试 MyBatis SQL？\n**A:** 在 `application.properties` 中添加：\n```properties\nlogging.level.ltd.newbee.mall.dao=DEBUG\nmybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl\n```\n\n### Q19: 前端静态资源在哪里？\n**A:** 静态资源位于：\n- CSS/JS：`src/main/resources/static/`\n- Thymeleaf 模板：`src/main/resources/templates/`\n\n### Q20: 如何自定义错误页面？\n**A:** 在 `src/main/resources/templates/error/` 目录下创建对应的错误页面，如 `404.html`、`500.html`。\n\n---\n\n## 部署运维相关\n\n### Q21: 如何打包部署？\n**A:**\n1. 执行 `mvn clean package` 打包\n2. 在 `target` 目录下生成 jar 包\n3. 上传到服务器\n4. 执行 `java -jar newbee-mall-1.0.0-SNAPSHOT.jar` 运行\n\n### Q22: 如何配置生产环境数据库？\n**A:** 建议使用 Spring Profile 配置：\n1. 创建 `application-prod.properties`\n2. 配置生产环境数据库信息\n3. 启动时指定 profile：`java -jar app.jar --spring.profiles.active=prod`\n\n### Q23: 如何后台运行服务？\n**A:** Linux 环境下：\n```bash\nnohup java -jar newbee-mall-1.0.0-SNAPSHOT.jar > output.log 2>&1 &\n```\n\n### Q24: 上传文件大小限制如何配置？\n**A:** 在 `application.properties` 中添加：\n```properties\nspring.servlet.multipart.max-file-size=10MB\nspring.servlet.multipart.max-request-size=100MB\n```\n\n### Q25: Session 超时时间如何设置？\n**A:** 在 `application.properties` 中配置：\n```properties\nserver.servlet.session.timeout=30m\n```\n\n### Q26: 如何配置反向代理（Nginx）？\n**A:** Nginx 配置示例：\n```nginx\nserver {\n    listen 80;\n    server_name your-domain.com;\n\n    location / {\n        proxy_pass http://localhost:28089;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n```\n\n---\n\n## 性能优化相关\n\n### Q27: 如何优化数据库查询性能？\n**A:**\n1. 为常用查询字段添加索引\n2. 使用分页查询避免一次性加载大量数据\n3. 合理使用缓存（如 Redis）\n4. 优化 SQL 语句，避免 N+1 查询\n\n### Q28: 如何添加缓存？\n**A:** 可以集成 Redis：\n1. 添加 spring-boot-starter-data-redis 依赖\n2. 配置 Redis 连接信息\n3. 使用 @Cacheable 注解标注需要缓存的方法\n\n### Q29: 如何监控应用状态？\n**A:** 可以集成 Spring Boot Actuator：\n1. 添加 spring-boot-starter-actuator 依赖\n2. 配置端点访问权限\n3. 访问 `/actuator/health` 查看健康状态\n\n---\n\n## 安全相关\n\n### Q30: 密码是如何加密的？\n**A:** 项目使用 MD5 加密存储密码，相关代码在 `MD5Util` 工具类中。建议生产环境使用更安全的加密方式如 BCrypt。\n\n### Q31: 如何防止 SQL 注入？\n**A:** 项目使用 MyBatis 的参数绑定（PreparedStatement），可以有效防止 SQL 注入。\n\n### Q32: Session 安全如何保障？\n**A:**\n1. 设置合理的 Session 超时时间\n2. 使用 HTTPS 传输\n3. 关键操作添加二次验证\n4. 登录拦截器验证用户身份\n\n---\n\n## 常见错误排查\n\n### Q33: 验证码显示不出来？\n**A:**\n1. 检查 hutool-captcha 依赖是否正确引入\n2. 检查浏览器是否禁用了图片加载\n3. 查看控制台是否有报错信息\n\n### Q34: 文件上传失败？\n**A:**\n1. 检查上传文件大小是否超过限制\n2. 检查上传目录是否存在且有写权限\n3. 查看日志获取详细错误信息\n\n### Q35: 分页查询数据不准确？\n**A:**\n1. 检查分页参数是否正确传递\n2. 检查 SQL 中的 LIMIT 和 OFFSET 是否正确\n3. 验证总数查询是否与分页查询条件一致\n\n---\n\n## 更多帮助\n\n如果以上 FAQ 没有解决您的问题，可以通过以下方式获取帮助：\n\n- **GitHub Issues**: https://github.com/newbee-ltd/newbee-mall/issues\n- **QQ 交流群**: 796794009、719099151\n- **邮箱**: 2449207463@qq.com\n- **掘金小册**: https://juejin.cn/book/6844733814074245133\n\n---\n\n**最后更新时间**: 2025-10-23\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--  @author 13\n      @qq交流群 796794009\n      @email 2449207463@qq.com\n      @link https://github.com/newbee-ltd -->\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <packaging>jar</packaging>\n    <groupId>ltd.newbee.mall</groupId>\n    <artifactId>newbee-mall</artifactId>\n    <version>1.0.0-SNAPSHOT</version>\n    <name>newbee-mall</name>\n    <description>newbee-mall是一套电商系统，包括基础版本(Spring Boot+Thymeleaf)、前后端分离版本(Spring Boot+Vue 3+Element-Plus+Vue-Router 4+Vuex 4+Vant 3) 、秒杀版本、Go语言版本、微服务版本(Spring Cloud Alibaba+Nacos+Sentinel+Seata+Spring Cloud Gateway+OpenFeign)。 前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。 后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。</description>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.7.5</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <mybatis.start.version>2.2.2</mybatis.start.version>\n        <hutool-captcha.version>5.8.7</hutool-captcha.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.session</groupId>\n            <artifactId>spring-session-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n            <version>${mybatis.start.version}</version>\n        </dependency>\n        <!-- 验证码 -->\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-captcha</artifactId>\n            <version>${hutool-captcha.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n    <!--  @author 13\n          @qq交流群 796794009\n          @email 2449207463@qq.com\n          @link https://github.com/newbee-ltd\n    -->\n</project>\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/NewBeeMallApplication.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@MapperScan(\"ltd.newbee.mall.dao\")\n@SpringBootApplication\npublic class NewBeeMallApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(NewBeeMallApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/Constants.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n * @apiNote 常量配置\n */\npublic class Constants {\n    //public final static String FILE_UPLOAD_DIC = \"/opt/image/upload/\";//上传文件的默认url前缀，根据部署设置自行修改\n    public final static String FILE_UPLOAD_DIC = \"D:\\\\upload\\\\\";//上传文件的默认url前缀，根据部署设置自行修改\n\n    public final static int INDEX_CAROUSEL_NUMBER = 5;//首页轮播图数量(可根据自身需求修改)\n\n    public final static int INDEX_CATEGORY_NUMBER = 10;//首页一级分类的最大数量\n\n    public final static int SEARCH_CATEGORY_NUMBER = 8;//搜索页一级分类的最大数量\n\n    public final static int INDEX_GOODS_HOT_NUMBER = 4;//首页热卖商品数量\n    public final static int INDEX_GOODS_NEW_NUMBER = 5;//首页新品数量\n    public final static int INDEX_GOODS_RECOMMOND_NUMBER = 10;//首页推荐商品数量\n\n    public final static int SHOPPING_CART_ITEM_TOTAL_NUMBER = 13;//购物车中商品的最大数量(可根据自身需求修改)\n\n    public final static int SHOPPING_CART_ITEM_LIMIT_NUMBER = 5;//购物车中单个商品的最大购买数量(可根据自身需求修改)\n\n    public final static String MALL_VERIFY_CODE_KEY = \"mallVerifyCode\";//验证码key\n\n    public final static String MALL_USER_SESSION_KEY = \"newBeeMallUser\";//session中user的key\n\n    public final static int GOODS_SEARCH_PAGE_LIMIT = 10;//搜索分页的默认条数(每页10条)\n\n    public final static int ORDER_SEARCH_PAGE_LIMIT = 3;//我的订单列表分页的默认条数(每页3条)\n\n    public final static int SELL_STATUS_UP = 0;//商品上架状态\n    public final static int SELL_STATUS_DOWN = 1;//商品下架状态\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/IndexConfigTypeEnum.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n * @apiNote 首页配置项 1-搜索框热搜 2-搜索下拉框热搜 3-(首页)热销商品 4-(首页)新品上线 5-(首页)为你推荐\n */\npublic enum IndexConfigTypeEnum {\n\n    DEFAULT(0, \"DEFAULT\"),\n    INDEX_SEARCH_HOTS(1, \"INDEX_SEARCH_HOTS\"),\n    INDEX_SEARCH_DOWN_HOTS(2, \"INDEX_SEARCH_DOWN_HOTS\"),\n    INDEX_GOODS_HOT(3, \"INDEX_GOODS_HOTS\"),\n    INDEX_GOODS_NEW(4, \"INDEX_GOODS_NEW\"),\n    INDEX_GOODS_RECOMMOND(5, \"INDEX_GOODS_RECOMMOND\");\n\n    private int type;\n\n    private String name;\n\n    IndexConfigTypeEnum(int type, String name) {\n        this.type = type;\n        this.name = name;\n    }\n\n    public static IndexConfigTypeEnum getIndexConfigTypeEnumByType(int type) {\n        for (IndexConfigTypeEnum indexConfigTypeEnum : IndexConfigTypeEnum.values()) {\n            if (indexConfigTypeEnum.getType() == type) {\n                return indexConfigTypeEnum;\n            }\n        }\n        return DEFAULT;\n    }\n\n    public int getType() {\n        return type;\n    }\n\n    public void setType(int type) {\n        this.type = type;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/NewBeeMallCategoryLevelEnum.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n * @apiNote 分类级别\n */\npublic enum NewBeeMallCategoryLevelEnum {\n\n    DEFAULT(0, \"ERROR\"),\n    LEVEL_ONE(1, \"一级分类\"),\n    LEVEL_TWO(2, \"二级分类\"),\n    LEVEL_THREE(3, \"三级分类\");\n\n    private int level;\n\n    private String name;\n\n    NewBeeMallCategoryLevelEnum(int level, String name) {\n        this.level = level;\n        this.name = name;\n    }\n\n    public static NewBeeMallCategoryLevelEnum getNewBeeMallOrderStatusEnumByLevel(int level) {\n        for (NewBeeMallCategoryLevelEnum newBeeMallCategoryLevelEnum : NewBeeMallCategoryLevelEnum.values()) {\n            if (newBeeMallCategoryLevelEnum.getLevel() == level) {\n                return newBeeMallCategoryLevelEnum;\n            }\n        }\n        return DEFAULT;\n    }\n\n    public int getLevel() {\n        return level;\n    }\n\n    public void setLevel(int level) {\n        this.level = level;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/NewBeeMallException.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\npublic class NewBeeMallException extends RuntimeException {\n\n    public NewBeeMallException() {\n    }\n\n    public NewBeeMallException(String message) {\n        super(message);\n    }\n\n    /**\n     * 丢出一个异常\n     *\n     * @param message\n     */\n    public static void fail(String message) {\n        throw new NewBeeMallException(message);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/NewBeeMallOrderStatusEnum.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n * @apiNote 订单状态:0.待支付 1.已支付 2.配货完成 3:出库成功 4.交易成功 -1.手动关闭 -2.超时关闭 -3.商家关闭\n */\npublic enum NewBeeMallOrderStatusEnum {\n\n    DEFAULT(-9, \"ERROR\"),\n    ORDER_PRE_PAY(0, \"待支付\"),\n    ORDER_PAID(1, \"已支付\"),\n    ORDER_PACKAGED(2, \"配货完成\"),\n    ORDER_EXPRESS(3, \"出库成功\"),\n    ORDER_SUCCESS(4, \"交易成功\"),\n    ORDER_CLOSED_BY_MALLUSER(-1, \"手动关闭\"),\n    ORDER_CLOSED_BY_EXPIRED(-2, \"超时关闭\"),\n    ORDER_CLOSED_BY_JUDGE(-3, \"商家关闭\");\n\n    private int orderStatus;\n\n    private String name;\n\n    NewBeeMallOrderStatusEnum(int orderStatus, String name) {\n        this.orderStatus = orderStatus;\n        this.name = name;\n    }\n\n    public static NewBeeMallOrderStatusEnum getNewBeeMallOrderStatusEnumByStatus(int orderStatus) {\n        for (NewBeeMallOrderStatusEnum newBeeMallOrderStatusEnum : NewBeeMallOrderStatusEnum.values()) {\n            if (newBeeMallOrderStatusEnum.getOrderStatus() == orderStatus) {\n                return newBeeMallOrderStatusEnum;\n            }\n        }\n        return DEFAULT;\n    }\n\n    public int getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(int orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/PayStatusEnum.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n * @apiNote 订单状态:0.支付中 1.支付成功 -1.支付失败\n */\npublic enum PayStatusEnum {\n\n    DEFAULT(-1, \"支付失败\"),\n    PAY_ING(0, \"支付中\"),\n    PAY_SUCCESS(1, \"支付成功\");\n\n    private int payStatus;\n\n    private String name;\n\n    PayStatusEnum(int payStatus, String name) {\n        this.payStatus = payStatus;\n        this.name = name;\n    }\n\n    public static PayStatusEnum getPayStatusEnumByStatus(int payStatus) {\n        for (PayStatusEnum payStatusEnum : PayStatusEnum.values()) {\n            if (payStatusEnum.getPayStatus() == payStatus) {\n                return payStatusEnum;\n            }\n        }\n        return DEFAULT;\n    }\n\n    public int getPayStatus() {\n        return payStatus;\n    }\n\n    public void setPayStatus(int payStatus) {\n        this.payStatus = payStatus;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/PayTypeEnum.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n * @apiNote 订单状态:0.无 1.支付宝 2.微信支付\n */\npublic enum PayTypeEnum {\n\n    DEFAULT(-1, \"ERROR\"),\n    NOT_PAY(0, \"无\"),\n    ALI_PAY(1, \"支付宝\"),\n    WEIXIN_PAY(2, \"微信支付\");\n\n    private int payType;\n\n    private String name;\n\n    PayTypeEnum(int payType, String name) {\n        this.payType = payType;\n        this.name = name;\n    }\n\n    public static PayTypeEnum getPayTypeEnumByType(int payType) {\n        for (PayTypeEnum payTypeEnum : PayTypeEnum.values()) {\n            if (payTypeEnum.getPayType() == payType) {\n                return payTypeEnum;\n            }\n        }\n        return DEFAULT;\n    }\n\n    public int getPayType() {\n        return payType;\n    }\n\n    public void setPayType(int payType) {\n        this.payType = payType;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/common/ServiceResultEnum.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.common;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic enum ServiceResultEnum {\n    ERROR(\"error\"),\n\n    SUCCESS(\"success\"),\n\n    DATA_NOT_EXIST(\"未查询到记录！\"),\n\n    SAME_CATEGORY_EXIST(\"已存在同级同名的分类！\"),\n\n    SAME_LOGIN_NAME_EXIST(\"用户名已存在！\"),\n\n    LOGIN_NAME_NULL(\"请输入登录名！\"),\n\n    LOGIN_PASSWORD_NULL(\"请输入密码！\"),\n\n    LOGIN_VERIFY_CODE_NULL(\"请输入验证码！\"),\n\n    LOGIN_VERIFY_CODE_ERROR(\"验证码错误！\"),\n\n    SAME_INDEX_CONFIG_EXIST(\"已存在相同的首页配置项！\"),\n\n    GOODS_CATEGORY_ERROR(\"分类数据异常！\"),\n\n    SAME_GOODS_EXIST(\"已存在相同的商品信息！\"),\n\n    GOODS_NOT_EXIST(\"商品不存在！\"),\n\n    GOODS_PUT_DOWN(\"商品已下架！\"),\n\n    SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR(\"超出单个商品的最大购买数量！\"),\n\n    SHOPPING_CART_ITEM_TOTAL_NUMBER_ERROR(\"超出购物车最大容量！\"),\n\n    LOGIN_ERROR(\"登录失败！\"),\n\n    LOGIN_USER_LOCKED(\"用户已被禁止登录！\"),\n\n    ORDER_NOT_EXIST_ERROR(\"订单不存在！\"),\n\n    ORDER_ITEM_NOT_EXIST_ERROR(\"订单项不存在！\"),\n\n    NULL_ADDRESS_ERROR(\"地址不能为空！\"),\n\n    ORDER_PRICE_ERROR(\"订单价格异常！\"),\n\n    ORDER_GENERATE_ERROR(\"生成订单异常！\"),\n\n    SHOPPING_ITEM_ERROR(\"购物车数据异常！\"),\n\n    SHOPPING_ITEM_COUNT_ERROR(\"库存不足！\"),\n\n    ORDER_STATUS_ERROR(\"订单状态异常！\"),\n\n    CLOSE_ORDER_ERROR(\"关闭订单失败！\"),\n\n    OPERATE_ERROR(\"操作失败！\"),\n\n    NO_PERMISSION_ERROR(\"无权限！\"),\n\n    DB_ERROR(\"database error\");\n\n    private String result;\n\n    ServiceResultEnum(String result) {\n        this.result = result;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.config;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.interceptor.AdminLoginInterceptor;\nimport ltd.newbee.mall.interceptor.NewBeeMallCartNumberInterceptor;\nimport ltd.newbee.mall.interceptor.NewBeeMallLoginInterceptor;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\n@Configuration\npublic class NeeBeeMallWebMvcConfigurer implements WebMvcConfigurer {\n\n    @Autowired\n    private AdminLoginInterceptor adminLoginInterceptor;\n    @Autowired\n    private NewBeeMallLoginInterceptor newBeeMallLoginInterceptor;\n    @Autowired\n    private NewBeeMallCartNumberInterceptor newBeeMallCartNumberInterceptor;\n\n    public void addInterceptors(InterceptorRegistry registry) {\n        // 添加一个拦截器，拦截以/admin为前缀的url路径（后台登陆拦截）\n        registry.addInterceptor(adminLoginInterceptor)\n                .addPathPatterns(\"/admin/**\")\n                .excludePathPatterns(\"/admin/login\")\n                .excludePathPatterns(\"/admin/dist/**\")\n                .excludePathPatterns(\"/admin/plugins/**\");\n        // 购物车中的数量统一处理\n        registry.addInterceptor(newBeeMallCartNumberInterceptor)\n                .excludePathPatterns(\"/admin/**\")\n                .excludePathPatterns(\"/register\")\n                .excludePathPatterns(\"/login\")\n                .excludePathPatterns(\"/logout\");\n        // 商城页面登陆拦截\n        registry.addInterceptor(newBeeMallLoginInterceptor)\n                .excludePathPatterns(\"/admin/**\")\n                .excludePathPatterns(\"/register\")\n                .excludePathPatterns(\"/login\")\n                .excludePathPatterns(\"/logout\")\n                .addPathPatterns(\"/goods/detail/**\")\n                .addPathPatterns(\"/shop-cart\")\n                .addPathPatterns(\"/shop-cart/**\")\n                .addPathPatterns(\"/saveOrder\")\n                .addPathPatterns(\"/orders\")\n                .addPathPatterns(\"/orders/**\")            \n                .addPathPatterns(\"/personal\")\n                .addPathPatterns(\"/personal/updateInfo\")\n                .addPathPatterns(\"/selectPayType\")\n                .addPathPatterns(\"/payPage\");\n    }\n\n    public void addResourceHandlers(ResourceHandlerRegistry registry) {\n        registry.addResourceHandler(\"/upload/**\").addResourceLocations(\"file:\" + Constants.FILE_UPLOAD_DIC);\n        registry.addResourceHandler(\"/goods-img/**\").addResourceLocations(\"file:\" + Constants.FILE_UPLOAD_DIC);\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/AdminController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport cn.hutool.captcha.ShearCaptcha;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.entity.AdminUser;\nimport ltd.newbee.mall.service.AdminUserService;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpSession;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class AdminController {\n\n    @Resource\n    private AdminUserService adminUserService;\n\n    @GetMapping({\"/login\"})\n    public String login() {\n        return \"admin/login\";\n    }\n\n    @GetMapping({\"/test\"})\n    public String test() {\n        return \"admin/test\";\n    }\n\n\n    @GetMapping({\"\", \"/\", \"/index\", \"/index.html\"})\n    public String index(HttpServletRequest request) {\n        request.setAttribute(\"path\", \"index\");\n        return \"admin/index\";\n    }\n\n    @PostMapping(value = \"/login\")\n    public String login(@RequestParam(\"userName\") String userName,\n                        @RequestParam(\"password\") String password,\n                        @RequestParam(\"verifyCode\") String verifyCode,\n                        HttpSession session) {\n        if (!StringUtils.hasText(verifyCode)) {\n            session.setAttribute(\"errorMsg\", \"验证码不能为空\");\n            return \"admin/login\";\n        }\n        if (!StringUtils.hasText(userName) || !StringUtils.hasText(password)) {\n            session.setAttribute(\"errorMsg\", \"用户名或密码不能为空\");\n            return \"admin/login\";\n        }\n        ShearCaptcha shearCaptcha = (ShearCaptcha) session.getAttribute(\"verifyCode\");\n        if (shearCaptcha == null || !shearCaptcha.verify(verifyCode)) {\n            session.setAttribute(\"errorMsg\", \"验证码错误\");\n            return \"admin/login\";\n        }\n        AdminUser adminUser = adminUserService.login(userName, password);\n        if (adminUser != null) {\n            session.setAttribute(\"loginUser\", adminUser.getNickName());\n            session.setAttribute(\"loginUserId\", adminUser.getAdminUserId());\n            //session过期时间设置为7200秒 即两小时\n            //session.setMaxInactiveInterval(60 * 60 * 2);\n            return \"redirect:/admin/index\";\n        } else {\n            session.setAttribute(\"errorMsg\", \"登录失败\");\n            return \"admin/login\";\n        }\n    }\n\n    @GetMapping(\"/profile\")\n    public String profile(HttpServletRequest request) {\n        Integer loginUserId = (int) request.getSession().getAttribute(\"loginUserId\");\n        AdminUser adminUser = adminUserService.getUserDetailById(loginUserId);\n        if (adminUser == null) {\n            return \"admin/login\";\n        }\n        request.setAttribute(\"path\", \"profile\");\n        request.setAttribute(\"loginUserName\", adminUser.getLoginUserName());\n        request.setAttribute(\"nickName\", adminUser.getNickName());\n        return \"admin/profile\";\n    }\n\n    @PostMapping(\"/profile/password\")\n    @ResponseBody\n    public String passwordUpdate(HttpServletRequest request, @RequestParam(\"originalPassword\") String originalPassword,\n                                 @RequestParam(\"newPassword\") String newPassword) {\n        if (!StringUtils.hasText(originalPassword) || !StringUtils.hasText(newPassword)) {\n            return \"参数不能为空\";\n        }\n        Integer loginUserId = (int) request.getSession().getAttribute(\"loginUserId\");\n        if (adminUserService.updatePassword(loginUserId, originalPassword, newPassword)) {\n            //修改成功后清空session中的数据，前端控制跳转至登录页\n            request.getSession().removeAttribute(\"loginUserId\");\n            request.getSession().removeAttribute(\"loginUser\");\n            request.getSession().removeAttribute(\"errorMsg\");\n            return ServiceResultEnum.SUCCESS.getResult();\n        } else {\n            return \"修改失败\";\n        }\n    }\n\n    @PostMapping(\"/profile/name\")\n    @ResponseBody\n    public String nameUpdate(HttpServletRequest request, @RequestParam(\"loginUserName\") String loginUserName,\n                             @RequestParam(\"nickName\") String nickName) {\n        if (!StringUtils.hasText(loginUserName) || !StringUtils.hasText(nickName)) {\n            return \"参数不能为空\";\n        }\n        Integer loginUserId = (int) request.getSession().getAttribute(\"loginUserId\");\n        if (adminUserService.updateName(loginUserId, loginUserName, nickName)) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        } else {\n            return \"修改失败\";\n        }\n    }\n\n    @GetMapping(\"/logout\")\n    public String logout(HttpServletRequest request) {\n        request.getSession().removeAttribute(\"loginUserId\");\n        request.getSession().removeAttribute(\"loginUser\");\n        request.getSession().removeAttribute(\"errorMsg\");\n        return \"admin/login\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallCarouselController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.entity.Carousel;\nimport ltd.newbee.mall.service.NewBeeMallCarouselService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class NewBeeMallCarouselController {\n\n    @Resource\n    NewBeeMallCarouselService newBeeMallCarouselService;\n\n    @GetMapping(\"/carousels\")\n    public String carouselPage(HttpServletRequest request) {\n        request.setAttribute(\"path\", \"newbee_mall_carousel\");\n        return \"admin/newbee_mall_carousel\";\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/carousels/list\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result list(@RequestParam Map<String, Object> params) {\n        if (ObjectUtils.isEmpty(params.get(\"page\")) || ObjectUtils.isEmpty(params.get(\"limit\"))) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        return ResultGenerator.genSuccessResult(newBeeMallCarouselService.getCarouselPage(pageUtil));\n    }\n\n    /**\n     * 添加\n     */\n    @RequestMapping(value = \"/carousels/save\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result save(@RequestBody Carousel carousel) {\n        if (!StringUtils.hasText(carousel.getCarouselUrl())\n                || Objects.isNull(carousel.getCarouselRank())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallCarouselService.saveCarousel(carousel);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n\n    /**\n     * 修改\n     */\n    @RequestMapping(value = \"/carousels/update\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result update(@RequestBody Carousel carousel) {\n        if (Objects.isNull(carousel.getCarouselId())\n                || !StringUtils.hasText(carousel.getCarouselUrl())\n                || Objects.isNull(carousel.getCarouselRank())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallCarouselService.updateCarousel(carousel);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 详情\n     */\n    @GetMapping(\"/carousels/info/{id}\")\n    @ResponseBody\n    public Result info(@PathVariable(\"id\") Integer id) {\n        Carousel carousel = newBeeMallCarouselService.getCarouselById(id);\n        if (carousel == null) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.DATA_NOT_EXIST.getResult());\n        }\n        return ResultGenerator.genSuccessResult(carousel);\n    }\n\n    /**\n     * 删除\n     */\n    @RequestMapping(value = \"/carousels/delete\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result delete(@RequestBody Integer[] ids) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        if (newBeeMallCarouselService.deleteBatch(ids)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(\"删除失败\");\n        }\n    }\n\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallGoodsCategoryController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport ltd.newbee.mall.common.NewBeeMallCategoryLevelEnum;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.entity.GoodsCategory;\nimport ltd.newbee.mall.service.NewBeeMallCategoryService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.*;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class NewBeeMallGoodsCategoryController {\n\n    @Resource\n    private NewBeeMallCategoryService newBeeMallCategoryService;\n\n    @GetMapping(\"/categories\")\n    public String categoriesPage(HttpServletRequest request, @RequestParam(\"categoryLevel\") Byte categoryLevel, @RequestParam(\"parentId\") Long parentId, @RequestParam(\"backParentId\") Long backParentId) {\n        if (categoryLevel == null || categoryLevel < 1 || categoryLevel > 3) {\n            NewBeeMallException.fail(\"参数异常\");\n        }\n        request.setAttribute(\"path\", \"newbee_mall_category\");\n        request.setAttribute(\"parentId\", parentId);\n        request.setAttribute(\"backParentId\", backParentId);\n        request.setAttribute(\"categoryLevel\", categoryLevel);\n        return \"admin/newbee_mall_category\";\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/categories/list\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result list(@RequestParam Map<String, Object> params) {\n        if (ObjectUtils.isEmpty(params.get(\"page\")) || ObjectUtils.isEmpty(params.get(\"limit\")) || ObjectUtils.isEmpty(params.get(\"categoryLevel\")) || ObjectUtils.isEmpty(params.get(\"parentId\"))) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        return ResultGenerator.genSuccessResult(newBeeMallCategoryService.getCategorisPage(pageUtil));\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/categories/listForSelect\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result listForSelect(@RequestParam(\"categoryId\") Long categoryId) {\n        if (categoryId == null || categoryId < 1) {\n            return ResultGenerator.genFailResult(\"缺少参数！\");\n        }\n        GoodsCategory category = newBeeMallCategoryService.getGoodsCategoryById(categoryId);\n        //既不是一级分类也不是二级分类则为不返回数据\n        if (category == null || category.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        Map categoryResult = new HashMap(4);\n        if (category.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel()) {\n            //如果是一级分类则返回当前一级分类下的所有二级分类，以及二级分类列表中第一条数据下的所有三级分类列表\n            //查询一级分类列表中第一个实体的所有二级分类\n            List<GoodsCategory> secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(categoryId), NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel());\n            if (!CollectionUtils.isEmpty(secondLevelCategories)) {\n                //查询二级分类列表中第一个实体的所有三级分类\n                List<GoodsCategory> thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(secondLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel());\n                categoryResult.put(\"secondLevelCategories\", secondLevelCategories);\n                categoryResult.put(\"thirdLevelCategories\", thirdLevelCategories);\n            }\n        }\n        if (category.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel()) {\n            //如果是二级分类则返回当前分类下的所有三级分类列表\n            List<GoodsCategory> thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(categoryId), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel());\n            categoryResult.put(\"thirdLevelCategories\", thirdLevelCategories);\n        }\n        return ResultGenerator.genSuccessResult(categoryResult);\n    }\n\n    /**\n     * 添加\n     */\n    @RequestMapping(value = \"/categories/save\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result save(@RequestBody GoodsCategory goodsCategory) {\n        if (Objects.isNull(goodsCategory.getCategoryLevel())\n                || !StringUtils.hasText(goodsCategory.getCategoryName())\n                || Objects.isNull(goodsCategory.getParentId())\n                || Objects.isNull(goodsCategory.getCategoryRank())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallCategoryService.saveCategory(goodsCategory);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n\n    /**\n     * 修改\n     */\n    @RequestMapping(value = \"/categories/update\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result update(@RequestBody GoodsCategory goodsCategory) {\n        if (Objects.isNull(goodsCategory.getCategoryId())\n                || Objects.isNull(goodsCategory.getCategoryLevel())\n                || !StringUtils.hasText(goodsCategory.getCategoryName())\n                || Objects.isNull(goodsCategory.getParentId())\n                || Objects.isNull(goodsCategory.getCategoryRank())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallCategoryService.updateGoodsCategory(goodsCategory);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 详情\n     */\n    @GetMapping(\"/categories/info/{id}\")\n    @ResponseBody\n    public Result info(@PathVariable(\"id\") Long id) {\n        GoodsCategory goodsCategory = newBeeMallCategoryService.getGoodsCategoryById(id);\n        if (goodsCategory == null) {\n            return ResultGenerator.genFailResult(\"未查询到数据\");\n        }\n        return ResultGenerator.genSuccessResult(goodsCategory);\n    }\n\n    /**\n     * 分类删除\n     */\n    @RequestMapping(value = \"/categories/delete\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result delete(@RequestBody Integer[] ids) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        if (newBeeMallCategoryService.deleteBatch(ids)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(\"删除失败\");\n        }\n    }\n\n\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallGoodsController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.NewBeeMallCategoryLevelEnum;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.entity.GoodsCategory;\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.service.NewBeeMallCategoryService;\nimport ltd.newbee.mall.service.NewBeeMallGoodsService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class NewBeeMallGoodsController {\n\n    @Resource\n    private NewBeeMallGoodsService newBeeMallGoodsService;\n    @Resource\n    private NewBeeMallCategoryService newBeeMallCategoryService;\n\n    @GetMapping(\"/goods\")\n    public String goodsPage(HttpServletRequest request) {\n        request.setAttribute(\"path\", \"newbee_mall_goods\");\n        return \"admin/newbee_mall_goods\";\n    }\n\n    @GetMapping(\"/goods/edit\")\n    public String edit(HttpServletRequest request) {\n        request.setAttribute(\"path\", \"edit\");\n        //查询所有的一级分类\n        List<GoodsCategory> firstLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(0L), NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel());\n        if (!CollectionUtils.isEmpty(firstLevelCategories)) {\n            //查询一级分类列表中第一个实体的所有二级分类\n            List<GoodsCategory> secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(firstLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel());\n            if (!CollectionUtils.isEmpty(secondLevelCategories)) {\n                //查询二级分类列表中第一个实体的所有三级分类\n                List<GoodsCategory> thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(secondLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel());\n                request.setAttribute(\"firstLevelCategories\", firstLevelCategories);\n                request.setAttribute(\"secondLevelCategories\", secondLevelCategories);\n                request.setAttribute(\"thirdLevelCategories\", thirdLevelCategories);\n                request.setAttribute(\"path\", \"goods-edit\");\n                return \"admin/newbee_mall_goods_edit\";\n            }\n        }\n        NewBeeMallException.fail(\"分类数据不完善\");\n        return null;\n    }\n\n    @GetMapping(\"/goods/edit/{goodsId}\")\n    public String edit(HttpServletRequest request, @PathVariable(\"goodsId\") Long goodsId) {\n        request.setAttribute(\"path\", \"edit\");\n        NewBeeMallGoods newBeeMallGoods = newBeeMallGoodsService.getNewBeeMallGoodsById(goodsId);\n        if (newBeeMallGoods.getGoodsCategoryId() > 0) {\n            if (newBeeMallGoods.getGoodsCategoryId() != null || newBeeMallGoods.getGoodsCategoryId() > 0) {\n                //有分类字段则查询相关分类数据返回给前端以供分类的三级联动显示\n                GoodsCategory currentGoodsCategory = newBeeMallCategoryService.getGoodsCategoryById(newBeeMallGoods.getGoodsCategoryId());\n                //商品表中存储的分类id字段为三级分类的id，不为三级分类则是错误数据\n                if (currentGoodsCategory != null && currentGoodsCategory.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) {\n                    //查询所有的一级分类\n                    List<GoodsCategory> firstLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(0L), NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel());\n                    //根据parentId查询当前parentId下所有的三级分类\n                    List<GoodsCategory> thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(currentGoodsCategory.getParentId()), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel());\n                    //查询当前三级分类的父级二级分类\n                    GoodsCategory secondCategory = newBeeMallCategoryService.getGoodsCategoryById(currentGoodsCategory.getParentId());\n                    if (secondCategory != null) {\n                        //根据parentId查询当前parentId下所有的二级分类\n                        List<GoodsCategory> secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(secondCategory.getParentId()), NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel());\n                        //查询当前二级分类的父级一级分类\n                        GoodsCategory firstCategory = newBeeMallCategoryService.getGoodsCategoryById(secondCategory.getParentId());\n                        if (firstCategory != null) {\n                            //所有分类数据都得到之后放到request对象中供前端读取\n                            request.setAttribute(\"firstLevelCategories\", firstLevelCategories);\n                            request.setAttribute(\"secondLevelCategories\", secondLevelCategories);\n                            request.setAttribute(\"thirdLevelCategories\", thirdLevelCategories);\n                            request.setAttribute(\"firstLevelCategoryId\", firstCategory.getCategoryId());\n                            request.setAttribute(\"secondLevelCategoryId\", secondCategory.getCategoryId());\n                            request.setAttribute(\"thirdLevelCategoryId\", currentGoodsCategory.getCategoryId());\n                        }\n                    }\n                }\n            }\n        }\n        if (newBeeMallGoods.getGoodsCategoryId() == 0) {\n            //查询所有的一级分类\n            List<GoodsCategory> firstLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(0L), NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel());\n            if (!CollectionUtils.isEmpty(firstLevelCategories)) {\n                //查询一级分类列表中第一个实体的所有二级分类\n                List<GoodsCategory> secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(firstLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel());\n                if (!CollectionUtils.isEmpty(secondLevelCategories)) {\n                    //查询二级分类列表中第一个实体的所有三级分类\n                    List<GoodsCategory> thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(secondLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel());\n                    request.setAttribute(\"firstLevelCategories\", firstLevelCategories);\n                    request.setAttribute(\"secondLevelCategories\", secondLevelCategories);\n                    request.setAttribute(\"thirdLevelCategories\", thirdLevelCategories);\n                }\n            }\n        }\n        request.setAttribute(\"goods\", newBeeMallGoods);\n        request.setAttribute(\"path\", \"goods-edit\");\n        return \"admin/newbee_mall_goods_edit\";\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/goods/list\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result list(@RequestParam Map<String, Object> params) {\n        if (ObjectUtils.isEmpty(params.get(\"page\")) || ObjectUtils.isEmpty(params.get(\"limit\"))) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        return ResultGenerator.genSuccessResult(newBeeMallGoodsService.getNewBeeMallGoodsPage(pageUtil));\n    }\n\n    /**\n     * 添加\n     */\n    @RequestMapping(value = \"/goods/save\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result save(@RequestBody NewBeeMallGoods newBeeMallGoods) {\n        if (!StringUtils.hasText(newBeeMallGoods.getGoodsName())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsIntro())\n                || !StringUtils.hasText(newBeeMallGoods.getTag())\n                || Objects.isNull(newBeeMallGoods.getOriginalPrice())\n                || Objects.isNull(newBeeMallGoods.getGoodsCategoryId())\n                || Objects.isNull(newBeeMallGoods.getSellingPrice())\n                || Objects.isNull(newBeeMallGoods.getStockNum())\n                || Objects.isNull(newBeeMallGoods.getGoodsSellStatus())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsCoverImg())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsDetailContent())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallGoodsService.saveNewBeeMallGoods(newBeeMallGoods);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n\n    /**\n     * 修改\n     */\n    @RequestMapping(value = \"/goods/update\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result update(@RequestBody NewBeeMallGoods newBeeMallGoods) {\n        if (Objects.isNull(newBeeMallGoods.getGoodsId())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsName())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsIntro())\n                || !StringUtils.hasText(newBeeMallGoods.getTag())\n                || Objects.isNull(newBeeMallGoods.getOriginalPrice())\n                || Objects.isNull(newBeeMallGoods.getSellingPrice())\n                || Objects.isNull(newBeeMallGoods.getGoodsCategoryId())\n                || Objects.isNull(newBeeMallGoods.getStockNum())\n                || Objects.isNull(newBeeMallGoods.getGoodsSellStatus())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsCoverImg())\n                || !StringUtils.hasText(newBeeMallGoods.getGoodsDetailContent())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallGoodsService.updateNewBeeMallGoods(newBeeMallGoods);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 详情\n     */\n    @GetMapping(\"/goods/info/{id}\")\n    @ResponseBody\n    public Result info(@PathVariable(\"id\") Long id) {\n        NewBeeMallGoods goods = newBeeMallGoodsService.getNewBeeMallGoodsById(id);\n        return ResultGenerator.genSuccessResult(goods);\n    }\n\n    /**\n     * 批量修改销售状态\n     */\n    @RequestMapping(value = \"/goods/status/{sellStatus}\", method = RequestMethod.PUT)\n    @ResponseBody\n    public Result delete(@RequestBody Long[] ids, @PathVariable(\"sellStatus\") int sellStatus) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        if (sellStatus != Constants.SELL_STATUS_UP && sellStatus != Constants.SELL_STATUS_DOWN) {\n            return ResultGenerator.genFailResult(\"状态异常！\");\n        }\n        if (newBeeMallGoodsService.batchUpdateSellStatus(ids, sellStatus)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(\"修改失败\");\n        }\n    }\n\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallGoodsIndexConfigController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport ltd.newbee.mall.common.IndexConfigTypeEnum;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.entity.IndexConfig;\nimport ltd.newbee.mall.service.NewBeeMallIndexConfigService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class NewBeeMallGoodsIndexConfigController {\n\n    @Resource\n    private NewBeeMallIndexConfigService newBeeMallIndexConfigService;\n\n    @GetMapping(\"/indexConfigs\")\n    public String indexConfigsPage(HttpServletRequest request, @RequestParam(\"configType\") int configType) {\n        IndexConfigTypeEnum indexConfigTypeEnum = IndexConfigTypeEnum.getIndexConfigTypeEnumByType(configType);\n        if (indexConfigTypeEnum.equals(IndexConfigTypeEnum.DEFAULT)) {\n            NewBeeMallException.fail(\"参数异常\");\n        }\n\n        request.setAttribute(\"path\", indexConfigTypeEnum.getName());\n        request.setAttribute(\"configType\", configType);\n        return \"admin/newbee_mall_index_config\";\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/indexConfigs/list\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result list(@RequestParam Map<String, Object> params) {\n        if (ObjectUtils.isEmpty(params.get(\"page\")) || ObjectUtils.isEmpty(params.get(\"limit\"))) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        return ResultGenerator.genSuccessResult(newBeeMallIndexConfigService.getConfigsPage(pageUtil));\n    }\n\n    /**\n     * 添加\n     */\n    @RequestMapping(value = \"/indexConfigs/save\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result save(@RequestBody IndexConfig indexConfig) {\n        if (Objects.isNull(indexConfig.getConfigType())\n                || !StringUtils.hasText(indexConfig.getConfigName())\n                || Objects.isNull(indexConfig.getConfigRank())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallIndexConfigService.saveIndexConfig(indexConfig);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n\n    /**\n     * 修改\n     */\n    @RequestMapping(value = \"/indexConfigs/update\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result update(@RequestBody IndexConfig indexConfig) {\n        if (Objects.isNull(indexConfig.getConfigType())\n                || Objects.isNull(indexConfig.getConfigId())\n                || !StringUtils.hasText(indexConfig.getConfigName())\n                || Objects.isNull(indexConfig.getConfigRank())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallIndexConfigService.updateIndexConfig(indexConfig);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 详情\n     */\n    @GetMapping(\"/indexConfigs/info/{id}\")\n    @ResponseBody\n    public Result info(@PathVariable(\"id\") Long id) {\n        IndexConfig config = newBeeMallIndexConfigService.getIndexConfigById(id);\n        if (config == null) {\n            return ResultGenerator.genFailResult(\"未查询到数据\");\n        }\n        return ResultGenerator.genSuccessResult(config);\n    }\n\n    /**\n     * 删除\n     */\n    @RequestMapping(value = \"/indexConfigs/delete\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result delete(@RequestBody Long[] ids) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        if (newBeeMallIndexConfigService.deleteBatch(ids)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(\"删除失败\");\n        }\n    }\n\n\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallOrderController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallOrderItemVO;\nimport ltd.newbee.mall.entity.NewBeeMallOrder;\nimport ltd.newbee.mall.service.NewBeeMallOrderService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class NewBeeMallOrderController {\n\n    @Resource\n    private NewBeeMallOrderService newBeeMallOrderService;\n\n    @GetMapping(\"/orders\")\n    public String ordersPage(HttpServletRequest request) {\n        request.setAttribute(\"path\", \"orders\");\n        return \"admin/newbee_mall_order\";\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/orders/list\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result list(@RequestParam Map<String, Object> params) {\n        if (ObjectUtils.isEmpty(params.get(\"page\")) || ObjectUtils.isEmpty(params.get(\"limit\"))) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        return ResultGenerator.genSuccessResult(newBeeMallOrderService.getNewBeeMallOrdersPage(pageUtil));\n    }\n\n    /**\n     * 修改\n     */\n    @RequestMapping(value = \"/orders/update\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result update(@RequestBody NewBeeMallOrder newBeeMallOrder) {\n        if (Objects.isNull(newBeeMallOrder.getTotalPrice())\n                || Objects.isNull(newBeeMallOrder.getOrderId())\n                || newBeeMallOrder.getOrderId() < 1\n                || newBeeMallOrder.getTotalPrice() < 1\n                || !StringUtils.hasText(newBeeMallOrder.getUserAddress())) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallOrderService.updateOrderInfo(newBeeMallOrder);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 详情\n     */\n    @GetMapping(\"/order-items/{id}\")\n    @ResponseBody\n    public Result info(@PathVariable(\"id\") Long id) {\n        List<NewBeeMallOrderItemVO> orderItems = newBeeMallOrderService.getOrderItems(id);\n        if (!CollectionUtils.isEmpty(orderItems)) {\n            return ResultGenerator.genSuccessResult(orderItems);\n        }\n        return ResultGenerator.genFailResult(ServiceResultEnum.DATA_NOT_EXIST.getResult());\n    }\n\n    /**\n     * 配货\n     */\n    @RequestMapping(value = \"/orders/checkDone\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result checkDone(@RequestBody Long[] ids) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallOrderService.checkDone(ids);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 出库\n     */\n    @RequestMapping(value = \"/orders/checkOut\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result checkOut(@RequestBody Long[] ids) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallOrderService.checkOut(ids);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n    /**\n     * 关闭订单\n     */\n    @RequestMapping(value = \"/orders/close\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result closeOrder(@RequestBody Long[] ids) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        String result = newBeeMallOrderService.closeOrder(ids);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(result);\n        }\n    }\n\n\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallUserController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.admin;\n\nimport ltd.newbee.mall.service.NewBeeMallUserService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class NewBeeMallUserController {\n\n    @Resource\n    private NewBeeMallUserService newBeeMallUserService;\n\n    @GetMapping(\"/users\")\n    public String usersPage(HttpServletRequest request) {\n        request.setAttribute(\"path\", \"users\");\n        return \"admin/newbee_mall_user\";\n    }\n\n    /**\n     * 列表\n     */\n    @RequestMapping(value = \"/users/list\", method = RequestMethod.GET)\n    @ResponseBody\n    public Result list(@RequestParam Map<String, Object> params) {\n        if (ObjectUtils.isEmpty(params.get(\"page\")) || ObjectUtils.isEmpty(params.get(\"limit\"))) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        return ResultGenerator.genSuccessResult(newBeeMallUserService.getNewBeeMallUsersPage(pageUtil));\n    }\n\n    /**\n     * 用户禁用与解除禁用(0-未锁定 1-已锁定)\n     */\n    @RequestMapping(value = \"/users/lock/{lockStatus}\", method = RequestMethod.POST)\n    @ResponseBody\n    public Result delete(@RequestBody Integer[] ids, @PathVariable int lockStatus) {\n        if (ids.length < 1) {\n            return ResultGenerator.genFailResult(\"参数异常！\");\n        }\n        if (lockStatus != 0 && lockStatus != 1) {\n            return ResultGenerator.genFailResult(\"操作非法！\");\n        }\n        if (newBeeMallUserService.lockUsers(ids, lockStatus)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(\"禁用失败\");\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/common/CommonController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.common;\n\nimport cn.hutool.captcha.CaptchaUtil;\nimport cn.hutool.captcha.ShearCaptcha;\nimport ltd.newbee.mall.common.Constants;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\npublic class CommonController {\n\n    @GetMapping(\"/common/kaptcha\")\n    public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {\n        httpServletResponse.setHeader(\"Cache-Control\", \"no-store\");\n        httpServletResponse.setHeader(\"Pragma\", \"no-cache\");\n        httpServletResponse.setDateHeader(\"Expires\", 0);\n        httpServletResponse.setContentType(\"image/png\");\n\n        ShearCaptcha shearCaptcha= CaptchaUtil.createShearCaptcha(150, 30, 4, 2);\n\n        // 验证码存入session\n        httpServletRequest.getSession().setAttribute(\"verifyCode\", shearCaptcha);\n\n        // 输出图片流\n        shearCaptcha.write(httpServletResponse.getOutputStream());\n    }\n\n    @GetMapping(\"/common/mall/kaptcha\")\n    public void mallKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {\n        httpServletResponse.setHeader(\"Cache-Control\", \"no-store\");\n        httpServletResponse.setHeader(\"Pragma\", \"no-cache\");\n        httpServletResponse.setDateHeader(\"Expires\", 0);\n        httpServletResponse.setContentType(\"image/png\");\n\n        ShearCaptcha shearCaptcha= CaptchaUtil.createShearCaptcha(110, 40, 4, 2);\n\n        // 验证码存入session\n        httpServletRequest.getSession().setAttribute(Constants.MALL_VERIFY_CODE_KEY, shearCaptcha);\n\n        // 输出图片流\n        shearCaptcha.write(httpServletResponse.getOutputStream());\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/common/ErrorPageController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.common;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;\nimport org.springframework.boot.web.servlet.error.ErrorAttributes;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n@Controller\npublic class ErrorPageController implements ErrorViewResolver {\n\n    private static ErrorPageController errorPageController;\n\n    @Autowired\n    private ErrorAttributes errorAttributes;\n\n    public ErrorPageController(ErrorAttributes errorAttributes) {\n        this.errorAttributes = errorAttributes;\n    }\n\n    public ErrorPageController() {\n        if (errorPageController == null) {\n            errorPageController = new ErrorPageController(errorAttributes);\n        }\n    }\n\n    @Override\n    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {\n        if (HttpStatus.BAD_REQUEST == status) {\n            return new ModelAndView(\"error/error_400\");\n        } else if (HttpStatus.NOT_FOUND == status) {\n            return new ModelAndView(\"error/error_404\");\n        } else {\n            return new ModelAndView(\"error/error_5xx\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/common/NewBeeMallExceptionHandler.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.common;\n\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.util.Result;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * newbee-mall全局异常处理\n */\n@RestControllerAdvice\npublic class NewBeeMallExceptionHandler {\n\n    @ExceptionHandler(Exception.class)\n    public Object handleException(Exception e, HttpServletRequest req) {\n        Result result = new Result();\n        result.setResultCode(500);\n        //区分是否为自定义异常\n        if (e instanceof NewBeeMallException) {\n            result.setMessage(e.getMessage());\n        } else {\n            e.printStackTrace();\n            result.setMessage(\"未知异常\");\n        }\n        //检查请求是否为ajax, 如果是 ajax 请求则返回 Result json串, 如果不是 ajax 请求则返回 error 视图\n        String contentTypeHeader = req.getHeader(\"Content-Type\");\n        String acceptHeader = req.getHeader(\"Accept\");\n        String xRequestedWith = req.getHeader(\"X-Requested-With\");\n        if ((contentTypeHeader != null && contentTypeHeader.contains(\"application/json\"))\n                || (acceptHeader != null && acceptHeader.contains(\"application/json\"))\n                || \"XMLHttpRequest\".equalsIgnoreCase(xRequestedWith)) {\n            return result;\n        } else {\n            ModelAndView modelAndView = new ModelAndView();\n            modelAndView.addObject(\"message\", e.getMessage());\n            modelAndView.addObject(\"url\", req.getRequestURL());\n            modelAndView.addObject(\"stackTrace\", e.getStackTrace());\n            modelAndView.addObject(\"author\", \"十三\");\n            modelAndView.addObject(\"ltd\", \"新蜂商城\");\n            modelAndView.setViewName(\"error/error\");\n            return modelAndView;\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/common/UploadController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.common;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.util.NewBeeMallUtils;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.multipart.support.StandardServletMultipartResolver;\n\nimport javax.imageio.ImageIO;\nimport javax.servlet.http.HttpServletRequest;\nimport java.awt.image.BufferedImage;\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.text.SimpleDateFormat;\nimport java.util.*;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Controller\n@RequestMapping(\"/admin\")\npublic class UploadController {\n\n    @Autowired\n    private StandardServletMultipartResolver standardServletMultipartResolver;\n\n    @PostMapping({\"/upload/file\"})\n    @ResponseBody\n    public Result upload(HttpServletRequest httpServletRequest, @RequestParam(\"file\") MultipartFile file) throws URISyntaxException, IOException {\n        String fileName = file.getOriginalFilename();\n        BufferedImage bufferedImage = ImageIO.read(file.getInputStream());\n        if (bufferedImage == null) {\n            return ResultGenerator.genFailResult(\"请上传图片类型的文件\");\n        }\n        String suffixName = fileName.substring(fileName.lastIndexOf(\".\"));\n        //生成文件名称通用方法\n        SimpleDateFormat sdf = new SimpleDateFormat(\"yyyyMMdd_HHmmss\");\n        Random r = new Random();\n        StringBuilder tempName = new StringBuilder();\n        tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);\n        String newFileName = tempName.toString();\n        File fileDirectory = new File(Constants.FILE_UPLOAD_DIC);\n        //创建文件\n        File destFile = new File(Constants.FILE_UPLOAD_DIC + newFileName);\n        try {\n            if (!fileDirectory.exists()) {\n                if (!fileDirectory.mkdir()) {\n                    throw new IOException(\"文件夹创建失败,路径为：\" + fileDirectory);\n                }\n            }\n            file.transferTo(destFile);\n            Result resultSuccess = ResultGenerator.genSuccessResult();\n            resultSuccess.setData(NewBeeMallUtils.getHost(new URI(httpServletRequest.getRequestURL() + \"\")) + \"/upload/\" + newFileName);\n            return resultSuccess;\n        } catch (IOException e) {\n            e.printStackTrace();\n            return ResultGenerator.genFailResult(\"文件上传失败\");\n        }\n    }\n\n    @PostMapping({\"/upload/files\"})\n    @ResponseBody\n    public Result uploadV2(HttpServletRequest httpServletRequest) throws URISyntaxException, IOException {\n        List<MultipartFile> multipartFiles = new ArrayList<>(8);\n        if (standardServletMultipartResolver.isMultipart(httpServletRequest)) {\n            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) httpServletRequest;\n            Iterator<String> iter = multiRequest.getFileNames();\n            int total = 0;\n            while (iter.hasNext()) {\n                if (total > 5) {\n                    return ResultGenerator.genFailResult(\"最多上传5张图片\");\n                }\n                total += 1;\n                MultipartFile file = multiRequest.getFile(iter.next());\n                BufferedImage bufferedImage = ImageIO.read(file.getInputStream());\n                // 只处理图片类型的文件\n                if (bufferedImage != null) {\n                    multipartFiles.add(file);\n                }\n            }\n        }\n        if (CollectionUtils.isEmpty(multipartFiles)) {\n            return ResultGenerator.genFailResult(\"请选择图片类型的文件上传\");\n        }\n        if (multipartFiles != null && multipartFiles.size() > 5) {\n            return ResultGenerator.genFailResult(\"最多上传5张图片\");\n        }\n        List<String> fileNames = new ArrayList(multipartFiles.size());\n        for (int i = 0; i < multipartFiles.size(); i++) {\n            String fileName = multipartFiles.get(i).getOriginalFilename();\n            String suffixName = fileName.substring(fileName.lastIndexOf(\".\"));\n            //生成文件名称通用方法\n            SimpleDateFormat sdf = new SimpleDateFormat(\"yyyyMMdd_HHmmss\");\n            Random r = new Random();\n            StringBuilder tempName = new StringBuilder();\n            tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);\n            String newFileName = tempName.toString();\n            File fileDirectory = new File(Constants.FILE_UPLOAD_DIC);\n            //创建文件\n            File destFile = new File(Constants.FILE_UPLOAD_DIC + newFileName);\n            try {\n                if (!fileDirectory.exists()) {\n                    if (!fileDirectory.mkdir()) {\n                        throw new IOException(\"文件夹创建失败,路径为：\" + fileDirectory);\n                    }\n                }\n                multipartFiles.get(i).transferTo(destFile);\n                fileNames.add(NewBeeMallUtils.getHost(new URI(httpServletRequest.getRequestURL() + \"\")) + \"/upload/\" + newFileName);\n            } catch (IOException e) {\n                e.printStackTrace();\n                return ResultGenerator.genFailResult(\"文件上传失败\");\n            }\n        }\n        Result resultSuccess = ResultGenerator.genSuccessResult();\n        resultSuccess.setData(fileNames);\n        return resultSuccess;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/mall/GoodsController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.mall;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallGoodsDetailVO;\nimport ltd.newbee.mall.controller.vo.SearchPageCategoryVO;\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.service.NewBeeMallCategoryService;\nimport ltd.newbee.mall.service.NewBeeMallGoodsService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Map;\n\n@Controller\npublic class GoodsController {\n\n    @Resource\n    private NewBeeMallGoodsService newBeeMallGoodsService;\n    @Resource\n    private NewBeeMallCategoryService newBeeMallCategoryService;\n\n    @GetMapping({\"/search\", \"/search.html\"})\n    public String searchPage(@RequestParam Map<String, Object> params, HttpServletRequest request) {\n        if (ObjectUtils.isEmpty(params.get(\"page\"))) {\n            params.put(\"page\", 1);\n        }\n        params.put(\"limit\", Constants.GOODS_SEARCH_PAGE_LIMIT);\n        //封装分类数据\n        if (params.containsKey(\"goodsCategoryId\") && StringUtils.hasText(params.get(\"goodsCategoryId\") + \"\")) {\n            Long categoryId = Long.valueOf(params.get(\"goodsCategoryId\") + \"\");\n            SearchPageCategoryVO searchPageCategoryVO = newBeeMallCategoryService.getCategoriesForSearch(categoryId);\n            if (searchPageCategoryVO != null) {\n                request.setAttribute(\"goodsCategoryId\", categoryId);\n                request.setAttribute(\"searchPageCategoryVO\", searchPageCategoryVO);\n            }\n        }\n        //封装参数供前端回显\n        if (params.containsKey(\"orderBy\") && StringUtils.hasText(params.get(\"orderBy\") + \"\")) {\n            request.setAttribute(\"orderBy\", params.get(\"orderBy\") + \"\");\n        }\n        String keyword = \"\";\n        //对keyword做过滤 去掉空格\n        if (params.containsKey(\"keyword\") && StringUtils.hasText((params.get(\"keyword\") + \"\").trim())) {\n            keyword = params.get(\"keyword\") + \"\";\n        }\n        request.setAttribute(\"keyword\", keyword);\n        params.put(\"keyword\", keyword);\n        //搜索上架状态下的商品\n        params.put(\"goodsSellStatus\", Constants.SELL_STATUS_UP);\n        //封装商品数据\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        request.setAttribute(\"pageResult\", newBeeMallGoodsService.searchNewBeeMallGoods(pageUtil));\n        return \"mall/search\";\n    }\n\n    @GetMapping(\"/goods/detail/{goodsId}\")\n    public String detailPage(@PathVariable(\"goodsId\") Long goodsId, HttpServletRequest request) {\n        if (goodsId < 1) {\n            NewBeeMallException.fail(\"参数异常\");\n        }\n        NewBeeMallGoods goods = newBeeMallGoodsService.getNewBeeMallGoodsById(goodsId);\n        if (Constants.SELL_STATUS_UP != goods.getGoodsSellStatus()) {\n            NewBeeMallException.fail(ServiceResultEnum.GOODS_PUT_DOWN.getResult());\n        }\n        NewBeeMallGoodsDetailVO goodsDetailVO = new NewBeeMallGoodsDetailVO();\n        BeanUtil.copyProperties(goods, goodsDetailVO);\n        goodsDetailVO.setGoodsCarouselList(goods.getGoodsCarousel().split(\",\"));\n        request.setAttribute(\"goodsDetail\", goodsDetailVO);\n        return \"mall/detail\";\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/mall/IndexController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.mall;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.IndexConfigTypeEnum;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexCarouselVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexCategoryVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexConfigGoodsVO;\nimport ltd.newbee.mall.service.NewBeeMallCarouselService;\nimport ltd.newbee.mall.service.NewBeeMallCategoryService;\nimport ltd.newbee.mall.service.NewBeeMallIndexConfigService;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.bind.annotation.GetMapping;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.List;\n\n@Controller\npublic class IndexController {\n\n    @Resource\n    private NewBeeMallCarouselService newBeeMallCarouselService;\n\n    @Resource\n    private NewBeeMallIndexConfigService newBeeMallIndexConfigService;\n\n    @Resource\n    private NewBeeMallCategoryService newBeeMallCategoryService;\n\n    @GetMapping({\"/index\", \"/\", \"/index.html\"})\n    public String indexPage(HttpServletRequest request) {\n        List<NewBeeMallIndexCategoryVO> categories = newBeeMallCategoryService.getCategoriesForIndex();\n        if (CollectionUtils.isEmpty(categories)) {\n            NewBeeMallException.fail(\"分类数据不完善\");\n        }\n        List<NewBeeMallIndexCarouselVO> carousels = newBeeMallCarouselService.getCarouselsForIndex(Constants.INDEX_CAROUSEL_NUMBER);\n        List<NewBeeMallIndexConfigGoodsVO> hotGoodses = newBeeMallIndexConfigService.getConfigGoodsesForIndex(IndexConfigTypeEnum.INDEX_GOODS_HOT.getType(), Constants.INDEX_GOODS_HOT_NUMBER);\n        List<NewBeeMallIndexConfigGoodsVO> newGoodses = newBeeMallIndexConfigService.getConfigGoodsesForIndex(IndexConfigTypeEnum.INDEX_GOODS_NEW.getType(), Constants.INDEX_GOODS_NEW_NUMBER);\n        List<NewBeeMallIndexConfigGoodsVO> recommendGoodses = newBeeMallIndexConfigService.getConfigGoodsesForIndex(IndexConfigTypeEnum.INDEX_GOODS_RECOMMOND.getType(), Constants.INDEX_GOODS_RECOMMOND_NUMBER);\n        request.setAttribute(\"categories\", categories);//分类数据\n        request.setAttribute(\"carousels\", carousels);//轮播图\n        request.setAttribute(\"hotGoodses\", hotGoodses);//热销商品\n        request.setAttribute(\"newGoodses\", newGoodses);//新品\n        request.setAttribute(\"recommendGoodses\", recommendGoodses);//推荐商品\n        return \"mall/index\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/mall/OrderController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.mall;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.NewBeeMallOrderStatusEnum;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallOrderDetailVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallShoppingCartItemVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.entity.NewBeeMallOrder;\nimport ltd.newbee.mall.service.NewBeeMallOrderService;\nimport ltd.newbee.mall.service.NewBeeMallShoppingCartService;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpSession;\nimport java.util.List;\nimport java.util.Map;\n\n@Controller\npublic class OrderController {\n\n    @Resource\n    private NewBeeMallShoppingCartService newBeeMallShoppingCartService;\n    @Resource\n    private NewBeeMallOrderService newBeeMallOrderService;\n\n    @GetMapping(\"/orders/{orderNo}\")\n    public String orderDetailPage(HttpServletRequest request, @PathVariable(\"orderNo\") String orderNo, HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        NewBeeMallOrderDetailVO orderDetailVO = newBeeMallOrderService.getOrderDetailByOrderNo(orderNo, user.getUserId());\n        request.setAttribute(\"orderDetailVO\", orderDetailVO);\n        return \"mall/order-detail\";\n    }\n\n    @GetMapping(\"/orders\")\n    public String orderListPage(@RequestParam Map<String, Object> params, HttpServletRequest request, HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        params.put(\"userId\", user.getUserId());\n        if (ObjectUtils.isEmpty(params.get(\"page\"))) {\n            params.put(\"page\", 1);\n        }\n        params.put(\"limit\", Constants.ORDER_SEARCH_PAGE_LIMIT);\n        //封装我的订单数据\n        PageQueryUtil pageUtil = new PageQueryUtil(params);\n        request.setAttribute(\"orderPageResult\", newBeeMallOrderService.getMyOrders(pageUtil));\n        request.setAttribute(\"path\", \"orders\");\n        return \"mall/my-orders\";\n    }\n\n    @GetMapping(\"/saveOrder\")\n    public String saveOrder(HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        List<NewBeeMallShoppingCartItemVO> myShoppingCartItems = newBeeMallShoppingCartService.getMyShoppingCartItems(user.getUserId());\n        if (!StringUtils.hasText(user.getAddress().trim())) {\n            //无收货地址\n            NewBeeMallException.fail(ServiceResultEnum.NULL_ADDRESS_ERROR.getResult());\n        }\n        if (CollectionUtils.isEmpty(myShoppingCartItems)) {\n            //购物车中无数据则跳转至错误页\n            NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult());\n        }\n        //保存订单并返回订单号\n        String saveOrderResult = newBeeMallOrderService.saveOrder(user, myShoppingCartItems);\n        //跳转到订单详情页\n        return \"redirect:/orders/\" + saveOrderResult;\n    }\n\n    @PutMapping(\"/orders/{orderNo}/cancel\")\n    @ResponseBody\n    public Result cancelOrder(@PathVariable(\"orderNo\") String orderNo, HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        String cancelOrderResult = newBeeMallOrderService.cancelOrder(orderNo, user.getUserId());\n        if (ServiceResultEnum.SUCCESS.getResult().equals(cancelOrderResult)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(cancelOrderResult);\n        }\n    }\n\n    @PutMapping(\"/orders/{orderNo}/finish\")\n    @ResponseBody\n    public Result finishOrder(@PathVariable(\"orderNo\") String orderNo, HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        String finishOrderResult = newBeeMallOrderService.finishOrder(orderNo, user.getUserId());\n        if (ServiceResultEnum.SUCCESS.getResult().equals(finishOrderResult)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(finishOrderResult);\n        }\n    }\n\n    @GetMapping(\"/selectPayType\")\n    public String selectPayType(HttpServletRequest request, @RequestParam(\"orderNo\") String orderNo, HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderService.getNewBeeMallOrderByOrderNo(orderNo);\n        //判断订单userId\n        if (!user.getUserId().equals(newBeeMallOrder.getUserId())) {\n            NewBeeMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult());\n        }\n        //判断订单状态\n        if (newBeeMallOrder.getOrderStatus().intValue() != NewBeeMallOrderStatusEnum.ORDER_PRE_PAY.getOrderStatus()) {\n            NewBeeMallException.fail(ServiceResultEnum.ORDER_STATUS_ERROR.getResult());\n        }\n        request.setAttribute(\"orderNo\", orderNo);\n        request.setAttribute(\"totalPrice\", newBeeMallOrder.getTotalPrice());\n        return \"mall/pay-select\";\n    }\n\n    @GetMapping(\"/payPage\")\n    public String payOrder(HttpServletRequest request, @RequestParam(\"orderNo\") String orderNo, HttpSession httpSession, @RequestParam(\"payType\") int payType) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderService.getNewBeeMallOrderByOrderNo(orderNo);\n        //判断订单userId\n        if (!user.getUserId().equals(newBeeMallOrder.getUserId())) {\n            NewBeeMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult());\n        }\n        //判断订单状态\n        if (newBeeMallOrder.getOrderStatus().intValue() != NewBeeMallOrderStatusEnum.ORDER_PRE_PAY.getOrderStatus()) {\n            NewBeeMallException.fail(ServiceResultEnum.ORDER_STATUS_ERROR.getResult());\n        }\n        request.setAttribute(\"orderNo\", orderNo);\n        request.setAttribute(\"totalPrice\", newBeeMallOrder.getTotalPrice());\n        if (payType == 1) {\n            return \"mall/alipay\";\n        } else {\n            return \"mall/wxpay\";\n        }\n    }\n\n    @GetMapping(\"/paySuccess\")\n    @ResponseBody\n    public Result paySuccess(@RequestParam(\"orderNo\") String orderNo, @RequestParam(\"payType\") int payType) {\n        String payResult = newBeeMallOrderService.paySuccess(orderNo, payType);\n        if (ServiceResultEnum.SUCCESS.getResult().equals(payResult)) {\n            return ResultGenerator.genSuccessResult();\n        } else {\n            return ResultGenerator.genFailResult(payResult);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/mall/PersonalController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.mall;\n\nimport cn.hutool.captcha.ShearCaptcha;\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.entity.MallUser;\nimport ltd.newbee.mall.service.NewBeeMallUserService;\nimport ltd.newbee.mall.util.MD5Util;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpSession;\n\n@Controller\npublic class PersonalController {\n\n    @Resource\n    private NewBeeMallUserService newBeeMallUserService;\n\n    @GetMapping(\"/personal\")\n    public String personalPage(HttpServletRequest request,\n                               HttpSession httpSession) {\n        request.setAttribute(\"path\", \"personal\");\n        return \"mall/personal\";\n    }\n\n    @GetMapping(\"/logout\")\n    public String logout(HttpSession httpSession) {\n        httpSession.removeAttribute(Constants.MALL_USER_SESSION_KEY);\n        return \"mall/login\";\n    }\n\n    @GetMapping({\"/login\", \"login.html\"})\n    public String loginPage() {\n        return \"mall/login\";\n    }\n\n    @GetMapping({\"/register\", \"register.html\"})\n    public String registerPage() {\n        return \"mall/register\";\n    }\n\n    @GetMapping(\"/personal/addresses\")\n    public String addressesPage() {\n        return \"mall/addresses\";\n    }\n\n    @PostMapping(\"/login\")\n    @ResponseBody\n    public Result login(@RequestParam(\"loginName\") String loginName,\n                        @RequestParam(\"verifyCode\") String verifyCode,\n                        @RequestParam(\"password\") String password,\n                        HttpSession httpSession) {\n        if (!StringUtils.hasText(loginName)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_NAME_NULL.getResult());\n        }\n        if (!StringUtils.hasText(password)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_PASSWORD_NULL.getResult());\n        }\n        if (!StringUtils.hasText(verifyCode)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_VERIFY_CODE_NULL.getResult());\n        }\n        ShearCaptcha shearCaptcha = (ShearCaptcha) httpSession.getAttribute(Constants.MALL_VERIFY_CODE_KEY);\n\n        if (shearCaptcha == null || !shearCaptcha.verify(verifyCode)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_VERIFY_CODE_ERROR.getResult());\n        }\n        String loginResult = newBeeMallUserService.login(loginName, MD5Util.MD5Encode(password, \"UTF-8\"), httpSession);\n        //登录成功\n        if (ServiceResultEnum.SUCCESS.getResult().equals(loginResult)) {\n            //删除session中的verifyCode\n            httpSession.removeAttribute(Constants.MALL_VERIFY_CODE_KEY);\n            return ResultGenerator.genSuccessResult();\n        }\n        //登录失败\n        return ResultGenerator.genFailResult(loginResult);\n    }\n\n    @PostMapping(\"/register\")\n    @ResponseBody\n    public Result register(@RequestParam(\"loginName\") String loginName,\n                           @RequestParam(\"verifyCode\") String verifyCode,\n                           @RequestParam(\"password\") String password,\n                           HttpSession httpSession) {\n        if (!StringUtils.hasText(loginName)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_NAME_NULL.getResult());\n        }\n        if (!StringUtils.hasText(password)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_PASSWORD_NULL.getResult());\n        }\n        if (!StringUtils.hasText(verifyCode)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_VERIFY_CODE_NULL.getResult());\n        }\n        ShearCaptcha shearCaptcha = (ShearCaptcha) httpSession.getAttribute(Constants.MALL_VERIFY_CODE_KEY);\n        if (shearCaptcha == null || !shearCaptcha.verify(verifyCode)) {\n            return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_VERIFY_CODE_ERROR.getResult());\n        }\n        String registerResult = newBeeMallUserService.register(loginName, password);\n        //注册成功\n        if (ServiceResultEnum.SUCCESS.getResult().equals(registerResult)) {\n            //删除session中的verifyCode\n            httpSession.removeAttribute(Constants.MALL_VERIFY_CODE_KEY);\n            return ResultGenerator.genSuccessResult();\n        }\n        //注册失败\n        return ResultGenerator.genFailResult(registerResult);\n    }\n\n    @PostMapping(\"/personal/updateInfo\")\n    @ResponseBody\n    public Result updateInfo(@RequestBody MallUser mallUser, HttpSession httpSession) {\n        NewBeeMallUserVO mallUserTemp = newBeeMallUserService.updateUserInfo(mallUser, httpSession);\n        if (mallUserTemp == null) {\n            Result result = ResultGenerator.genFailResult(\"修改失败\");\n            return result;\n        } else {\n            //返回成功\n            Result result = ResultGenerator.genSuccessResult();\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/mall/ShoppingCartController.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.mall;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallShoppingCartItemVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.entity.NewBeeMallShoppingCartItem;\nimport ltd.newbee.mall.service.NewBeeMallShoppingCartService;\nimport ltd.newbee.mall.util.Result;\nimport ltd.newbee.mall.util.ResultGenerator;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpSession;\nimport java.util.List;\n\n@Controller\npublic class ShoppingCartController {\n\n    @Resource\n    private NewBeeMallShoppingCartService newBeeMallShoppingCartService;\n\n    @GetMapping(\"/shop-cart\")\n    public String cartListPage(HttpServletRequest request,\n                               HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        int itemsTotal = 0;\n        int priceTotal = 0;\n        List<NewBeeMallShoppingCartItemVO> myShoppingCartItems = newBeeMallShoppingCartService.getMyShoppingCartItems(user.getUserId());\n        if (!CollectionUtils.isEmpty(myShoppingCartItems)) {\n            //购物项总数\n            itemsTotal = myShoppingCartItems.stream().mapToInt(NewBeeMallShoppingCartItemVO::getGoodsCount).sum();\n            if (itemsTotal < 1) {\n                NewBeeMallException.fail(\"购物项不能为空\");\n            }\n            //总价\n            for (NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO : myShoppingCartItems) {\n                priceTotal += newBeeMallShoppingCartItemVO.getGoodsCount() * newBeeMallShoppingCartItemVO.getSellingPrice();\n            }\n            if (priceTotal < 1) {\n                NewBeeMallException.fail(\"购物项价格异常\");\n            }\n        }\n        request.setAttribute(\"itemsTotal\", itemsTotal);\n        request.setAttribute(\"priceTotal\", priceTotal);\n        request.setAttribute(\"myShoppingCartItems\", myShoppingCartItems);\n        return \"mall/cart\";\n    }\n\n    @PostMapping(\"/shop-cart\")\n    @ResponseBody\n    public Result saveNewBeeMallShoppingCartItem(@RequestBody NewBeeMallShoppingCartItem newBeeMallShoppingCartItem,\n                                                 HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        newBeeMallShoppingCartItem.setUserId(user.getUserId());\n        String saveResult = newBeeMallShoppingCartService.saveNewBeeMallCartItem(newBeeMallShoppingCartItem);\n        //添加成功\n        if (ServiceResultEnum.SUCCESS.getResult().equals(saveResult)) {\n            return ResultGenerator.genSuccessResult();\n        }\n        //添加失败\n        return ResultGenerator.genFailResult(saveResult);\n    }\n\n    @PutMapping(\"/shop-cart\")\n    @ResponseBody\n    public Result updateNewBeeMallShoppingCartItem(@RequestBody NewBeeMallShoppingCartItem newBeeMallShoppingCartItem,\n                                                   HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        newBeeMallShoppingCartItem.setUserId(user.getUserId());\n        String updateResult = newBeeMallShoppingCartService.updateNewBeeMallCartItem(newBeeMallShoppingCartItem);\n        //修改成功\n        if (ServiceResultEnum.SUCCESS.getResult().equals(updateResult)) {\n            return ResultGenerator.genSuccessResult();\n        }\n        //修改失败\n        return ResultGenerator.genFailResult(updateResult);\n    }\n\n    @DeleteMapping(\"/shop-cart/{newBeeMallShoppingCartItemId}\")\n    @ResponseBody\n    public Result updateNewBeeMallShoppingCartItem(@PathVariable(\"newBeeMallShoppingCartItemId\") Long newBeeMallShoppingCartItemId,\n                                                   HttpSession httpSession) {\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        Boolean deleteResult = newBeeMallShoppingCartService.deleteById(newBeeMallShoppingCartItemId,user.getUserId());\n        //删除成功\n        if (deleteResult) {\n            return ResultGenerator.genSuccessResult();\n        }\n        //删除失败\n        return ResultGenerator.genFailResult(ServiceResultEnum.OPERATE_ERROR.getResult());\n    }\n\n    @GetMapping(\"/shop-cart/settle\")\n    public String settlePage(HttpServletRequest request,\n                             HttpSession httpSession) {\n        int priceTotal = 0;\n        NewBeeMallUserVO user = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        List<NewBeeMallShoppingCartItemVO> myShoppingCartItems = newBeeMallShoppingCartService.getMyShoppingCartItems(user.getUserId());\n        if (CollectionUtils.isEmpty(myShoppingCartItems)) {\n            //无数据则不跳转至结算页\n            return \"/shop-cart\";\n        } else {\n            //总价\n            for (NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO : myShoppingCartItems) {\n                priceTotal += newBeeMallShoppingCartItemVO.getGoodsCount() * newBeeMallShoppingCartItemVO.getSellingPrice();\n            }\n            if (priceTotal < 1) {\n                NewBeeMallException.fail(\"购物项价格异常\");\n            }\n        }\n        request.setAttribute(\"priceTotal\", priceTotal);\n        request.setAttribute(\"myShoppingCartItems\", myShoppingCartItems);\n        return \"mall/order-settle\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallGoodsDetailVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 商品详情页VO\n */\npublic class NewBeeMallGoodsDetailVO implements Serializable {\n\n    private Long goodsId;\n\n    private String goodsName;\n\n    private String goodsIntro;\n\n    private String goodsCoverImg;\n\n    private String[] goodsCarouselList;\n\n    private Integer sellingPrice;\n\n    private Integer originalPrice;\n\n    private String goodsDetailContent;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName;\n    }\n\n    public String getGoodsIntro() {\n        return goodsIntro;\n    }\n\n    public void setGoodsIntro(String goodsIntro) {\n        this.goodsIntro = goodsIntro;\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg;\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n\n    public Integer getOriginalPrice() {\n        return originalPrice;\n    }\n\n    public void setOriginalPrice(Integer originalPrice) {\n        this.originalPrice = originalPrice;\n    }\n\n    public String getGoodsDetailContent() {\n        return goodsDetailContent;\n    }\n\n    public void setGoodsDetailContent(String goodsDetailContent) {\n        this.goodsDetailContent = goodsDetailContent;\n    }\n\n    public String[] getGoodsCarouselList() {\n        return goodsCarouselList;\n    }\n\n    public void setGoodsCarouselList(String[] goodsCarouselList) {\n        this.goodsCarouselList = goodsCarouselList;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallIndexCarouselVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\n/**\n * 首页轮播图VO\n */\npublic class NewBeeMallIndexCarouselVO implements Serializable {\n\n    private String carouselUrl;\n\n    private String redirectUrl;\n\n    public String getCarouselUrl() {\n        return carouselUrl;\n    }\n\n    public void setCarouselUrl(String carouselUrl) {\n        this.carouselUrl = carouselUrl;\n    }\n\n    public String getRedirectUrl() {\n        return redirectUrl;\n    }\n\n    public void setRedirectUrl(String redirectUrl) {\n        this.redirectUrl = redirectUrl;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallIndexCategoryVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 首页分类数据VO\n */\npublic class NewBeeMallIndexCategoryVO implements Serializable {\n\n    private Long categoryId;\n\n    private Byte categoryLevel;\n\n    private String categoryName;\n\n    private List<SecondLevelCategoryVO> secondLevelCategoryVOS;\n\n    public Long getCategoryId() {\n        return categoryId;\n    }\n\n    public void setCategoryId(Long categoryId) {\n        this.categoryId = categoryId;\n    }\n\n    public Byte getCategoryLevel() {\n        return categoryLevel;\n    }\n\n    public void setCategoryLevel(Byte categoryLevel) {\n        this.categoryLevel = categoryLevel;\n    }\n\n    public String getCategoryName() {\n        return categoryName;\n    }\n\n    public void setCategoryName(String categoryName) {\n        this.categoryName = categoryName;\n    }\n\n    public List<SecondLevelCategoryVO> getSecondLevelCategoryVOS() {\n        return secondLevelCategoryVOS;\n    }\n\n    public void setSecondLevelCategoryVOS(List<SecondLevelCategoryVO> secondLevelCategoryVOS) {\n        this.secondLevelCategoryVOS = secondLevelCategoryVOS;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallIndexConfigGoodsVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\n/**\n * 首页配置商品VO\n */\npublic class NewBeeMallIndexConfigGoodsVO implements Serializable {\n\n    private Long goodsId;\n\n    private String goodsName;\n\n    private String goodsIntro;\n\n    private String goodsCoverImg;\n\n    private Integer sellingPrice;\n\n    private String tag;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName;\n    }\n\n    public String getGoodsIntro() {\n        return goodsIntro;\n    }\n\n    public void setGoodsIntro(String goodsIntro) {\n        this.goodsIntro = goodsIntro;\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg;\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallOrderDetailVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * 订单详情页页面VO\n */\npublic class NewBeeMallOrderDetailVO implements Serializable {\n\n    private String orderNo;\n\n    private Integer totalPrice;\n\n    private Byte payStatus;\n\n    private String payStatusString;\n\n    private Byte payType;\n\n    private String payTypeString;\n\n    private Date payTime;\n\n    private Byte orderStatus;\n\n    private String orderStatusString;\n\n    private String userAddress;\n\n    private Date createTime;\n\n    private List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS;\n\n    public String getOrderNo() {\n        return orderNo;\n    }\n\n    public void setOrderNo(String orderNo) {\n        this.orderNo = orderNo;\n    }\n\n    public Integer getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(Integer totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public Byte getPayStatus() {\n        return payStatus;\n    }\n\n    public void setPayStatus(Byte payStatus) {\n        this.payStatus = payStatus;\n    }\n\n    public Byte getPayType() {\n        return payType;\n    }\n\n    public void setPayType(Byte payType) {\n        this.payType = payType;\n    }\n\n    public Date getPayTime() {\n        return payTime;\n    }\n\n    public void setPayTime(Date payTime) {\n        this.payTime = payTime;\n    }\n\n    public Byte getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(Byte orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n\n    public String getUserAddress() {\n        return userAddress;\n    }\n\n    public void setUserAddress(String userAddress) {\n        this.userAddress = userAddress;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public String getPayStatusString() {\n        return payStatusString;\n    }\n\n    public void setPayStatusString(String payStatusString) {\n        this.payStatusString = payStatusString;\n    }\n\n    public String getPayTypeString() {\n        return payTypeString;\n    }\n\n    public void setPayTypeString(String payTypeString) {\n        this.payTypeString = payTypeString;\n    }\n\n    public String getOrderStatusString() {\n        return orderStatusString;\n    }\n\n    public void setOrderStatusString(String orderStatusString) {\n        this.orderStatusString = orderStatusString;\n    }\n\n    public List<NewBeeMallOrderItemVO> getNewBeeMallOrderItemVOS() {\n        return newBeeMallOrderItemVOS;\n    }\n\n    public void setNewBeeMallOrderItemVOS(List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS) {\n        this.newBeeMallOrderItemVOS = newBeeMallOrderItemVOS;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallOrderItemVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\n/**\n * 订单详情页页面订单项VO\n */\npublic class NewBeeMallOrderItemVO implements Serializable {\n\n    private Long goodsId;\n\n    private Integer goodsCount;\n\n    private String goodsName;\n\n    private String goodsCoverImg;\n\n    private Integer sellingPrice;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName;\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg;\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n\n    public Integer getGoodsCount() {\n        return goodsCount;\n    }\n\n    public void setGoodsCount(Integer goodsCount) {\n        this.goodsCount = goodsCount;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallOrderListVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * 订单列表页面VO\n */\npublic class NewBeeMallOrderListVO implements Serializable {\n\n    private Long orderId;\n\n    private String orderNo;\n\n    private Integer totalPrice;\n\n    private Byte payType;\n\n    private Byte orderStatus;\n\n    private String orderStatusString;\n\n    private String userAddress;\n\n    private Date createTime;\n\n    private List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS;\n\n    public Long getOrderId() {\n        return orderId;\n    }\n\n    public void setOrderId(Long orderId) {\n        this.orderId = orderId;\n    }\n\n    public String getOrderNo() {\n        return orderNo;\n    }\n\n    public void setOrderNo(String orderNo) {\n        this.orderNo = orderNo;\n    }\n\n    public Integer getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(Integer totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public Byte getPayType() {\n        return payType;\n    }\n\n    public void setPayType(Byte payType) {\n        this.payType = payType;\n    }\n\n    public Byte getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(Byte orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n\n    public String getOrderStatusString() {\n        return orderStatusString;\n    }\n\n    public void setOrderStatusString(String orderStatusString) {\n        this.orderStatusString = orderStatusString;\n    }\n\n    public String getUserAddress() {\n        return userAddress;\n    }\n\n    public void setUserAddress(String userAddress) {\n        this.userAddress = userAddress;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public List<NewBeeMallOrderItemVO> getNewBeeMallOrderItemVOS() {\n        return newBeeMallOrderItemVOS;\n    }\n\n    public void setNewBeeMallOrderItemVOS(List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS) {\n        this.newBeeMallOrderItemVOS = newBeeMallOrderItemVOS;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallSearchGoodsVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\n/**\n * 搜索列表页商品VO\n */\npublic class NewBeeMallSearchGoodsVO implements Serializable {\n\n    private Long goodsId;\n\n    private String goodsName;\n\n    private String goodsIntro;\n\n    private String goodsCoverImg;\n\n    private Integer sellingPrice;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName;\n    }\n\n    public String getGoodsIntro() {\n        return goodsIntro;\n    }\n\n    public void setGoodsIntro(String goodsIntro) {\n        this.goodsIntro = goodsIntro;\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg;\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallShoppingCartItemVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\n/**\n * 购物车页面购物项VO\n */\npublic class NewBeeMallShoppingCartItemVO implements Serializable {\n\n    private Long cartItemId;\n\n    private Long goodsId;\n\n    private Integer goodsCount;\n\n    private String goodsName;\n\n    private String goodsCoverImg;\n\n    private Integer sellingPrice;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName;\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg;\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n\n    public Long getCartItemId() {\n        return cartItemId;\n    }\n\n    public void setCartItemId(Long cartItemId) {\n        this.cartItemId = cartItemId;\n    }\n\n    public Integer getGoodsCount() {\n        return goodsCount;\n    }\n\n    public void setGoodsCount(Integer goodsCount) {\n        this.goodsCount = goodsCount;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/NewBeeMallUserVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\npublic class NewBeeMallUserVO implements Serializable {\n\n    private Long userId;\n\n    private String nickName;\n\n    private String loginName;\n\n    private String introduceSign;\n\n    private String address;\n\n    private int shopCartItemCount;\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName;\n    }\n\n    public String getLoginName() {\n        return loginName;\n    }\n\n    public void setLoginName(String loginName) {\n        this.loginName = loginName;\n    }\n\n    public String getIntroduceSign() {\n        return introduceSign;\n    }\n\n    public void setIntroduceSign(String introduceSign) {\n        this.introduceSign = introduceSign;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public int getShopCartItemCount() {\n        return shopCartItemCount;\n    }\n\n    public void setShopCartItemCount(int shopCartItemCount) {\n        this.shopCartItemCount = shopCartItemCount;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/SearchPageCategoryVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport ltd.newbee.mall.entity.GoodsCategory;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 搜索页面分类数据VO\n */\npublic class SearchPageCategoryVO implements Serializable {\n\n    private String firstLevelCategoryName;\n\n    private List<GoodsCategory> secondLevelCategoryList;\n\n    private String secondLevelCategoryName;\n\n    private List<GoodsCategory> thirdLevelCategoryList;\n\n    private String currentCategoryName;\n\n    public String getFirstLevelCategoryName() {\n        return firstLevelCategoryName;\n    }\n\n    public void setFirstLevelCategoryName(String firstLevelCategoryName) {\n        this.firstLevelCategoryName = firstLevelCategoryName;\n    }\n\n    public List<GoodsCategory> getSecondLevelCategoryList() {\n        return secondLevelCategoryList;\n    }\n\n    public void setSecondLevelCategoryList(List<GoodsCategory> secondLevelCategoryList) {\n        this.secondLevelCategoryList = secondLevelCategoryList;\n    }\n\n    public String getSecondLevelCategoryName() {\n        return secondLevelCategoryName;\n    }\n\n    public void setSecondLevelCategoryName(String secondLevelCategoryName) {\n        this.secondLevelCategoryName = secondLevelCategoryName;\n    }\n\n    public List<GoodsCategory> getThirdLevelCategoryList() {\n        return thirdLevelCategoryList;\n    }\n\n    public void setThirdLevelCategoryList(List<GoodsCategory> thirdLevelCategoryList) {\n        this.thirdLevelCategoryList = thirdLevelCategoryList;\n    }\n\n    public String getCurrentCategoryName() {\n        return currentCategoryName;\n    }\n\n    public void setCurrentCategoryName(String currentCategoryName) {\n        this.currentCategoryName = currentCategoryName;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/SecondLevelCategoryVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 首页分类数据VO(第二级)\n */\npublic class SecondLevelCategoryVO implements Serializable {\n\n    private Long categoryId;\n\n    private Long parentId;\n\n    private Byte categoryLevel;\n\n    private String categoryName;\n\n    private List<ThirdLevelCategoryVO> thirdLevelCategoryVOS;\n\n    public Long getCategoryId() {\n        return categoryId;\n    }\n\n    public void setCategoryId(Long categoryId) {\n        this.categoryId = categoryId;\n    }\n\n    public Byte getCategoryLevel() {\n        return categoryLevel;\n    }\n\n    public void setCategoryLevel(Byte categoryLevel) {\n        this.categoryLevel = categoryLevel;\n    }\n\n    public String getCategoryName() {\n        return categoryName;\n    }\n\n    public void setCategoryName(String categoryName) {\n        this.categoryName = categoryName;\n    }\n\n    public List<ThirdLevelCategoryVO> getThirdLevelCategoryVOS() {\n        return thirdLevelCategoryVOS;\n    }\n\n    public void setThirdLevelCategoryVOS(List<ThirdLevelCategoryVO> thirdLevelCategoryVOS) {\n        this.thirdLevelCategoryVOS = thirdLevelCategoryVOS;\n    }\n\n    public Long getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(Long parentId) {\n        this.parentId = parentId;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/controller/vo/ThirdLevelCategoryVO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.controller.vo;\n\nimport java.io.Serializable;\n\n/**\n * 首页分类数据VO(第三级)\n */\npublic class ThirdLevelCategoryVO implements Serializable {\n\n    private Long categoryId;\n\n    private Byte categoryLevel;\n\n    private String categoryName;\n\n    public Long getCategoryId() {\n        return categoryId;\n    }\n\n    public void setCategoryId(Long categoryId) {\n        this.categoryId = categoryId;\n    }\n\n    public Byte getCategoryLevel() {\n        return categoryLevel;\n    }\n\n    public void setCategoryLevel(Byte categoryLevel) {\n        this.categoryLevel = categoryLevel;\n    }\n\n    public String getCategoryName() {\n        return categoryName;\n    }\n\n    public void setCategoryName(String categoryName) {\n        this.categoryName = categoryName;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/AdminUserMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.AdminUser;\nimport org.apache.ibatis.annotations.Param;\n\npublic interface AdminUserMapper {\n    int insert(AdminUser record);\n\n    int insertSelective(AdminUser record);\n\n    /**\n     * 登陆方法\n     *\n     * @param userName\n     * @param password\n     * @return\n     */\n    AdminUser login(@Param(\"userName\") String userName, @Param(\"password\") String password);\n\n    AdminUser selectByPrimaryKey(Integer adminUserId);\n\n    int updateByPrimaryKeySelective(AdminUser record);\n\n    int updateByPrimaryKey(AdminUser record);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/CarouselMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.Carousel;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface CarouselMapper {\n    int deleteByPrimaryKey(Integer carouselId);\n\n    int insert(Carousel record);\n\n    int insertSelective(Carousel record);\n\n    Carousel selectByPrimaryKey(Integer carouselId);\n\n    int updateByPrimaryKeySelective(Carousel record);\n\n    int updateByPrimaryKey(Carousel record);\n\n    List<Carousel> findCarouselList(PageQueryUtil pageUtil);\n\n    int getTotalCarousels(PageQueryUtil pageUtil);\n\n    int deleteBatch(Integer[] ids);\n\n    List<Carousel> findCarouselsByNum(@Param(\"number\") int number);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/GoodsCategoryMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.GoodsCategory;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface GoodsCategoryMapper {\n    int deleteByPrimaryKey(Long categoryId);\n\n    int insert(GoodsCategory record);\n\n    int insertSelective(GoodsCategory record);\n\n    GoodsCategory selectByPrimaryKey(Long categoryId);\n\n    GoodsCategory selectByLevelAndName(@Param(\"categoryLevel\") Byte categoryLevel, @Param(\"categoryName\") String categoryName);\n\n    int updateByPrimaryKeySelective(GoodsCategory record);\n\n    int updateByPrimaryKey(GoodsCategory record);\n\n    List<GoodsCategory> findGoodsCategoryList(PageQueryUtil pageUtil);\n\n    int getTotalGoodsCategories(PageQueryUtil pageUtil);\n\n    int deleteBatch(Integer[] ids);\n\n    List<GoodsCategory> selectByLevelAndParentIdsAndNumber(@Param(\"parentIds\") List<Long> parentIds, @Param(\"categoryLevel\") int categoryLevel, @Param(\"number\") int number);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/IndexConfigMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.IndexConfig;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface IndexConfigMapper {\n    int deleteByPrimaryKey(Long configId);\n\n    int insert(IndexConfig record);\n\n    int insertSelective(IndexConfig record);\n\n    IndexConfig selectByPrimaryKey(Long configId);\n\n    IndexConfig selectByTypeAndGoodsId(@Param(\"configType\") int configType, @Param(\"goodsId\") Long goodsId);\n\n    int updateByPrimaryKeySelective(IndexConfig record);\n\n    int updateByPrimaryKey(IndexConfig record);\n\n    List<IndexConfig> findIndexConfigList(PageQueryUtil pageUtil);\n\n    int getTotalIndexConfigs(PageQueryUtil pageUtil);\n\n    int deleteBatch(Long[] ids);\n\n    List<IndexConfig> findIndexConfigsByTypeAndNum(@Param(\"configType\") int configType, @Param(\"number\") int number);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/MallUserMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.MallUser;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface MallUserMapper {\n    int deleteByPrimaryKey(Long userId);\n\n    int insert(MallUser record);\n\n    int insertSelective(MallUser record);\n\n    MallUser selectByPrimaryKey(Long userId);\n\n    MallUser selectByLoginName(String loginName);\n\n    MallUser selectByLoginNameAndPasswd(@Param(\"loginName\") String loginName, @Param(\"password\") String password);\n\n    int updateByPrimaryKeySelective(MallUser record);\n\n    int updateByPrimaryKey(MallUser record);\n\n    List<MallUser> findMallUserList(PageQueryUtil pageUtil);\n\n    int getTotalMallUsers(PageQueryUtil pageUtil);\n\n    int lockUserBatch(@Param(\"ids\") Integer[] ids, @Param(\"lockStatus\") int lockStatus);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/NewBeeMallGoodsMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.entity.StockNumDTO;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface NewBeeMallGoodsMapper {\n    int deleteByPrimaryKey(Long goodsId);\n\n    int insert(NewBeeMallGoods record);\n\n    int insertSelective(NewBeeMallGoods record);\n\n    NewBeeMallGoods selectByPrimaryKey(Long goodsId);\n\n    NewBeeMallGoods selectByCategoryIdAndName(@Param(\"goodsName\") String goodsName, @Param(\"goodsCategoryId\") Long goodsCategoryId);\n\n    int updateByPrimaryKeySelective(NewBeeMallGoods record);\n\n    int updateByPrimaryKeyWithBLOBs(NewBeeMallGoods record);\n\n    int updateByPrimaryKey(NewBeeMallGoods record);\n\n    List<NewBeeMallGoods> findNewBeeMallGoodsList(PageQueryUtil pageUtil);\n\n    int getTotalNewBeeMallGoods(PageQueryUtil pageUtil);\n\n    List<NewBeeMallGoods> selectByPrimaryKeys(List<Long> goodsIds);\n\n    List<NewBeeMallGoods> findNewBeeMallGoodsListBySearch(PageQueryUtil pageUtil);\n\n    int getTotalNewBeeMallGoodsBySearch(PageQueryUtil pageUtil);\n\n    int batchInsert(@Param(\"newBeeMallGoodsList\") List<NewBeeMallGoods> newBeeMallGoodsList);\n\n    int updateStockNum(@Param(\"stockNumDTOS\") List<StockNumDTO> stockNumDTOS);\n\n    int recoverStockNum(@Param(\"stockNumDTOS\") List<StockNumDTO> stockNumDTOS);\n\n    int batchUpdateSellStatus(@Param(\"orderIds\")Long[] orderIds,@Param(\"sellStatus\") int sellStatus);\n\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/NewBeeMallOrderItemMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.NewBeeMallOrderItem;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface NewBeeMallOrderItemMapper {\n    int deleteByPrimaryKey(Long orderItemId);\n\n    int insert(NewBeeMallOrderItem record);\n\n    int insertSelective(NewBeeMallOrderItem record);\n\n    NewBeeMallOrderItem selectByPrimaryKey(Long orderItemId);\n\n    /**\n     * 根据订单id获取订单项列表\n     *\n     * @param orderId\n     * @return\n     */\n    List<NewBeeMallOrderItem> selectByOrderId(Long orderId);\n\n    /**\n     * 根据订单ids获取订单项列表\n     *\n     * @param orderIds\n     * @return\n     */\n    List<NewBeeMallOrderItem> selectByOrderIds(@Param(\"orderIds\") List<Long> orderIds);\n\n    /**\n     * 批量insert订单项数据\n     *\n     * @param orderItems\n     * @return\n     */\n    int insertBatch(@Param(\"orderItems\") List<NewBeeMallOrderItem> orderItems);\n\n    int updateByPrimaryKeySelective(NewBeeMallOrderItem record);\n\n    int updateByPrimaryKey(NewBeeMallOrderItem record);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/NewBeeMallOrderMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.NewBeeMallOrder;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface NewBeeMallOrderMapper {\n    int deleteByPrimaryKey(Long orderId);\n\n    int insert(NewBeeMallOrder record);\n\n    int insertSelective(NewBeeMallOrder record);\n\n    NewBeeMallOrder selectByPrimaryKey(Long orderId);\n\n    NewBeeMallOrder selectByOrderNo(String orderNo);\n\n    int updateByPrimaryKeySelective(NewBeeMallOrder record);\n\n    int updateByPrimaryKey(NewBeeMallOrder record);\n\n    List<NewBeeMallOrder> findNewBeeMallOrderList(PageQueryUtil pageUtil);\n\n    int getTotalNewBeeMallOrders(PageQueryUtil pageUtil);\n\n    List<NewBeeMallOrder> selectByPrimaryKeys(@Param(\"orderIds\") List<Long> orderIds);\n\n    int checkOut(@Param(\"orderIds\") List<Long> orderIds);\n\n    int closeOrder(@Param(\"orderIds\") List<Long> orderIds, @Param(\"orderStatus\") int orderStatus);\n\n    int checkDone(@Param(\"orderIds\") List<Long> asList);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/dao/NewBeeMallShoppingCartItemMapper.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.dao;\n\nimport ltd.newbee.mall.entity.NewBeeMallShoppingCartItem;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\npublic interface NewBeeMallShoppingCartItemMapper {\n    int deleteByPrimaryKey(Long cartItemId);\n\n    int insert(NewBeeMallShoppingCartItem record);\n\n    int insertSelective(NewBeeMallShoppingCartItem record);\n\n    NewBeeMallShoppingCartItem selectByPrimaryKey(Long cartItemId);\n\n    NewBeeMallShoppingCartItem selectByUserIdAndGoodsId(@Param(\"newBeeMallUserId\") Long newBeeMallUserId, @Param(\"goodsId\") Long goodsId);\n\n    List<NewBeeMallShoppingCartItem> selectByUserId(@Param(\"newBeeMallUserId\") Long newBeeMallUserId, @Param(\"number\") int number);\n\n    int selectCountByUserId(Long newBeeMallUserId);\n\n    int updateByPrimaryKeySelective(NewBeeMallShoppingCartItem record);\n\n    int updateByPrimaryKey(NewBeeMallShoppingCartItem record);\n\n    int deleteBatch(List<Long> ids);\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/AdminUser.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\npublic class AdminUser {\n    private Integer adminUserId;\n\n    private String loginUserName;\n\n    private String loginPassword;\n\n    private String nickName;\n\n    private Byte locked;\n\n    public Integer getAdminUserId() {\n        return adminUserId;\n    }\n\n    public void setAdminUserId(Integer adminUserId) {\n        this.adminUserId = adminUserId;\n    }\n\n    public String getLoginUserName() {\n        return loginUserName;\n    }\n\n    public void setLoginUserName(String loginUserName) {\n        this.loginUserName = loginUserName == null ? null : loginUserName.trim();\n    }\n\n    public String getLoginPassword() {\n        return loginPassword;\n    }\n\n    public void setLoginPassword(String loginPassword) {\n        this.loginPassword = loginPassword == null ? null : loginPassword.trim();\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName == null ? null : nickName.trim();\n    }\n\n    public Byte getLocked() {\n        return locked;\n    }\n\n    public void setLocked(Byte locked) {\n        this.locked = locked;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", adminUserId=\").append(adminUserId);\n        sb.append(\", loginUserName=\").append(loginUserName);\n        sb.append(\", loginPassword=\").append(loginPassword);\n        sb.append(\", nickName=\").append(nickName);\n        sb.append(\", locked=\").append(locked);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/Carousel.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.util.Date;\n\npublic class Carousel {\n    private Integer carouselId;\n\n    private String carouselUrl;\n\n    private String redirectUrl;\n\n    private Integer carouselRank;\n\n    private Byte isDeleted;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n\n    private Integer createUser;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date updateTime;\n\n    private Integer updateUser;\n\n    public Integer getCarouselId() {\n        return carouselId;\n    }\n\n    public void setCarouselId(Integer carouselId) {\n        this.carouselId = carouselId;\n    }\n\n    public String getCarouselUrl() {\n        return carouselUrl;\n    }\n\n    public void setCarouselUrl(String carouselUrl) {\n        this.carouselUrl = carouselUrl == null ? null : carouselUrl.trim();\n    }\n\n    public String getRedirectUrl() {\n        return redirectUrl;\n    }\n\n    public void setRedirectUrl(String redirectUrl) {\n        this.redirectUrl = redirectUrl == null ? null : redirectUrl.trim();\n    }\n\n    public Integer getCarouselRank() {\n        return carouselRank;\n    }\n\n    public void setCarouselRank(Integer carouselRank) {\n        this.carouselRank = carouselRank;\n    }\n\n    public Byte getIsDeleted() {\n        return isDeleted;\n    }\n\n    public void setIsDeleted(Byte isDeleted) {\n        this.isDeleted = isDeleted;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Integer getCreateUser() {\n        return createUser;\n    }\n\n    public void setCreateUser(Integer createUser) {\n        this.createUser = createUser;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public Integer getUpdateUser() {\n        return updateUser;\n    }\n\n    public void setUpdateUser(Integer updateUser) {\n        this.updateUser = updateUser;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", carouselId=\").append(carouselId);\n        sb.append(\", carouselUrl=\").append(carouselUrl);\n        sb.append(\", redirectUrl=\").append(redirectUrl);\n        sb.append(\", carouselRank=\").append(carouselRank);\n        sb.append(\", isDeleted=\").append(isDeleted);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", createUser=\").append(createUser);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", updateUser=\").append(updateUser);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/GoodsCategory.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.util.Date;\n\npublic class GoodsCategory {\n    private Long categoryId;\n\n    private Byte categoryLevel;\n\n    private Long parentId;\n\n    private String categoryName;\n\n    private Integer categoryRank;\n\n    private Byte isDeleted;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n\n    private Integer createUser;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date updateTime;\n\n    private Integer updateUser;\n\n    public Long getCategoryId() {\n        return categoryId;\n    }\n\n    public void setCategoryId(Long categoryId) {\n        this.categoryId = categoryId;\n    }\n\n    public Byte getCategoryLevel() {\n        return categoryLevel;\n    }\n\n    public void setCategoryLevel(Byte categoryLevel) {\n        this.categoryLevel = categoryLevel;\n    }\n\n    public Long getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(Long parentId) {\n        this.parentId = parentId;\n    }\n\n    public String getCategoryName() {\n        return categoryName;\n    }\n\n    public void setCategoryName(String categoryName) {\n        this.categoryName = categoryName == null ? null : categoryName.trim();\n    }\n\n    public Integer getCategoryRank() {\n        return categoryRank;\n    }\n\n    public void setCategoryRank(Integer categoryRank) {\n        this.categoryRank = categoryRank;\n    }\n\n    public Byte getIsDeleted() {\n        return isDeleted;\n    }\n\n    public void setIsDeleted(Byte isDeleted) {\n        this.isDeleted = isDeleted;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Integer getCreateUser() {\n        return createUser;\n    }\n\n    public void setCreateUser(Integer createUser) {\n        this.createUser = createUser;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public Integer getUpdateUser() {\n        return updateUser;\n    }\n\n    public void setUpdateUser(Integer updateUser) {\n        this.updateUser = updateUser;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", categoryId=\").append(categoryId);\n        sb.append(\", categoryLevel=\").append(categoryLevel);\n        sb.append(\", parentId=\").append(parentId);\n        sb.append(\", categoryName=\").append(categoryName);\n        sb.append(\", categoryRank=\").append(categoryRank);\n        sb.append(\", isDeleted=\").append(isDeleted);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", createUser=\").append(createUser);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", updateUser=\").append(updateUser);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/IndexConfig.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.util.Date;\n\npublic class IndexConfig {\n    private Long configId;\n\n    private String configName;\n\n    private Byte configType;\n\n    private Long goodsId;\n\n    private String redirectUrl;\n\n    private Integer configRank;\n\n    private Byte isDeleted;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n\n    private Integer createUser;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date updateTime;\n\n    private Integer updateUser;\n\n    public Long getConfigId() {\n        return configId;\n    }\n\n    public void setConfigId(Long configId) {\n        this.configId = configId;\n    }\n\n    public String getConfigName() {\n        return configName;\n    }\n\n    public void setConfigName(String configName) {\n        this.configName = configName == null ? null : configName.trim();\n    }\n\n    public Byte getConfigType() {\n        return configType;\n    }\n\n    public void setConfigType(Byte configType) {\n        this.configType = configType;\n    }\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getRedirectUrl() {\n        return redirectUrl;\n    }\n\n    public void setRedirectUrl(String redirectUrl) {\n        this.redirectUrl = redirectUrl == null ? null : redirectUrl.trim();\n    }\n\n    public Integer getConfigRank() {\n        return configRank;\n    }\n\n    public void setConfigRank(Integer configRank) {\n        this.configRank = configRank;\n    }\n\n    public Byte getIsDeleted() {\n        return isDeleted;\n    }\n\n    public void setIsDeleted(Byte isDeleted) {\n        this.isDeleted = isDeleted;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Integer getCreateUser() {\n        return createUser;\n    }\n\n    public void setCreateUser(Integer createUser) {\n        this.createUser = createUser;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public Integer getUpdateUser() {\n        return updateUser;\n    }\n\n    public void setUpdateUser(Integer updateUser) {\n        this.updateUser = updateUser;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", configId=\").append(configId);\n        sb.append(\", configName=\").append(configName);\n        sb.append(\", configType=\").append(configType);\n        sb.append(\", goodsId=\").append(goodsId);\n        sb.append(\", redirectUrl=\").append(redirectUrl);\n        sb.append(\", configRank=\").append(configRank);\n        sb.append(\", isDeleted=\").append(isDeleted);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", createUser=\").append(createUser);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", updateUser=\").append(updateUser);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/MallUser.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.util.Date;\n\npublic class MallUser {\n    private Long userId;\n\n    private String nickName;\n\n    private String loginName;\n\n    private String passwordMd5;\n\n    private String introduceSign;\n\n    private String address;\n\n    private Byte isDeleted;\n\n    private Byte lockedFlag;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public String getNickName() {\n        return nickName;\n    }\n\n    public void setNickName(String nickName) {\n        this.nickName = nickName == null ? null : nickName.trim();\n    }\n\n    public String getLoginName() {\n        return loginName;\n    }\n\n    public void setLoginName(String loginName) {\n        this.loginName = loginName == null ? null : loginName.trim();\n    }\n\n    public String getPasswordMd5() {\n        return passwordMd5;\n    }\n\n    public void setPasswordMd5(String passwordMd5) {\n        this.passwordMd5 = passwordMd5 == null ? null : passwordMd5.trim();\n    }\n\n    public String getIntroduceSign() {\n        return introduceSign;\n    }\n\n    public void setIntroduceSign(String introduceSign) {\n        this.introduceSign = introduceSign == null ? null : introduceSign.trim();\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public Byte getIsDeleted() {\n        return isDeleted;\n    }\n\n    public void setIsDeleted(Byte isDeleted) {\n        this.isDeleted = isDeleted;\n    }\n\n    public Byte getLockedFlag() {\n        return lockedFlag;\n    }\n\n    public void setLockedFlag(Byte lockedFlag) {\n        this.lockedFlag = lockedFlag;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", userId=\").append(userId);\n        sb.append(\", nickName=\").append(nickName);\n        sb.append(\", loginName=\").append(loginName);\n        sb.append(\", passwordMd5=\").append(passwordMd5);\n        sb.append(\", introduceSign=\").append(introduceSign);\n        sb.append(\", address=\").append(address);\n        sb.append(\", isDeleted=\").append(isDeleted);\n        sb.append(\", lockedFlag=\").append(lockedFlag);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/NewBeeMallGoods.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.util.Date;\n\npublic class NewBeeMallGoods {\n    private Long goodsId;\n\n    private String goodsName;\n\n    private String goodsIntro;\n\n    private Long goodsCategoryId;\n\n    private String goodsCoverImg;\n\n    private String goodsCarousel;\n\n    private Integer originalPrice;\n\n    private Integer sellingPrice;\n\n    private Integer stockNum;\n\n    private String tag;\n\n    private Byte goodsSellStatus;\n\n    private Integer createUser;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n\n    private Integer updateUser;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date updateTime;\n\n    private String goodsDetailContent;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName == null ? null : goodsName.trim();\n    }\n\n    public String getGoodsIntro() {\n        return goodsIntro;\n    }\n\n    public void setGoodsIntro(String goodsIntro) {\n        this.goodsIntro = goodsIntro == null ? null : goodsIntro.trim();\n    }\n\n    public Long getGoodsCategoryId() {\n        return goodsCategoryId;\n    }\n\n    public void setGoodsCategoryId(Long goodsCategoryId) {\n        this.goodsCategoryId = goodsCategoryId;\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg == null ? null : goodsCoverImg.trim();\n    }\n\n    public String getGoodsCarousel() {\n        return goodsCarousel;\n    }\n\n    public void setGoodsCarousel(String goodsCarousel) {\n        this.goodsCarousel = goodsCarousel == null ? null : goodsCarousel.trim();\n    }\n\n    public Integer getOriginalPrice() {\n        return originalPrice;\n    }\n\n    public void setOriginalPrice(Integer originalPrice) {\n        this.originalPrice = originalPrice;\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n\n    public Integer getStockNum() {\n        return stockNum;\n    }\n\n    public void setStockNum(Integer stockNum) {\n        this.stockNum = stockNum;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public void setTag(String tag) {\n        this.tag = tag == null ? null : tag.trim();\n    }\n\n    public Byte getGoodsSellStatus() {\n        return goodsSellStatus;\n    }\n\n    public void setGoodsSellStatus(Byte goodsSellStatus) {\n        this.goodsSellStatus = goodsSellStatus;\n    }\n\n    public Integer getCreateUser() {\n        return createUser;\n    }\n\n    public void setCreateUser(Integer createUser) {\n        this.createUser = createUser;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Integer getUpdateUser() {\n        return updateUser;\n    }\n\n    public void setUpdateUser(Integer updateUser) {\n        this.updateUser = updateUser;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public String getGoodsDetailContent() {\n        return goodsDetailContent;\n    }\n\n    public void setGoodsDetailContent(String goodsDetailContent) {\n        this.goodsDetailContent = goodsDetailContent == null ? null : goodsDetailContent.trim();\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", goodsId=\").append(goodsId);\n        sb.append(\", goodsName=\").append(goodsName);\n        sb.append(\", goodsIntro=\").append(goodsIntro);\n        sb.append(\", goodsCoverImg=\").append(goodsCoverImg);\n        sb.append(\", goodsCarousel=\").append(goodsCarousel);\n        sb.append(\", originalPrice=\").append(originalPrice);\n        sb.append(\", sellingPrice=\").append(sellingPrice);\n        sb.append(\", stockNum=\").append(stockNum);\n        sb.append(\", tag=\").append(tag);\n        sb.append(\", goodsSellStatus=\").append(goodsSellStatus);\n        sb.append(\", createUser=\").append(createUser);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateUser=\").append(updateUser);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", goodsDetailContent=\").append(goodsDetailContent);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/NewBeeMallOrder.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.util.Date;\n\npublic class NewBeeMallOrder {\n    private Long orderId;\n\n    private String orderNo;\n\n    private Long userId;\n\n    private Integer totalPrice;\n\n    private Byte payStatus;\n\n    private Byte payType;\n\n    private Date payTime;\n\n    private Byte orderStatus;\n\n    private String extraInfo;\n\n    private String userAddress;\n\n    private Byte isDeleted;\n\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date updateTime;\n\n    public Long getOrderId() {\n        return orderId;\n    }\n\n    public void setOrderId(Long orderId) {\n        this.orderId = orderId;\n    }\n\n    public String getOrderNo() {\n        return orderNo;\n    }\n\n    public void setOrderNo(String orderNo) {\n        this.orderNo = orderNo == null ? null : orderNo.trim();\n    }\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public Integer getTotalPrice() {\n        return totalPrice;\n    }\n\n    public void setTotalPrice(Integer totalPrice) {\n        this.totalPrice = totalPrice;\n    }\n\n    public Byte getPayStatus() {\n        return payStatus;\n    }\n\n    public void setPayStatus(Byte payStatus) {\n        this.payStatus = payStatus;\n    }\n\n    public Byte getPayType() {\n        return payType;\n    }\n\n    public void setPayType(Byte payType) {\n        this.payType = payType;\n    }\n\n    public Date getPayTime() {\n        return payTime;\n    }\n\n    public void setPayTime(Date payTime) {\n        this.payTime = payTime;\n    }\n\n    public Byte getOrderStatus() {\n        return orderStatus;\n    }\n\n    public void setOrderStatus(Byte orderStatus) {\n        this.orderStatus = orderStatus;\n    }\n\n    public String getExtraInfo() {\n        return extraInfo;\n    }\n\n    public void setExtraInfo(String extraInfo) {\n        this.extraInfo = extraInfo == null ? null : extraInfo.trim();\n    }\n\n    public String getUserAddress() {\n        return userAddress;\n    }\n\n    public void setUserAddress(String userAddress) {\n        this.userAddress = userAddress == null ? null : userAddress.trim();\n    }\n\n    public Byte getIsDeleted() {\n        return isDeleted;\n    }\n\n    public void setIsDeleted(Byte isDeleted) {\n        this.isDeleted = isDeleted;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", orderId=\").append(orderId);\n        sb.append(\", orderNo=\").append(orderNo);\n        sb.append(\", userId=\").append(userId);\n        sb.append(\", totalPrice=\").append(totalPrice);\n        sb.append(\", payStatus=\").append(payStatus);\n        sb.append(\", payType=\").append(payType);\n        sb.append(\", payTime=\").append(payTime);\n        sb.append(\", orderStatus=\").append(orderStatus);\n        sb.append(\", extraInfo=\").append(extraInfo);\n        sb.append(\", userAddress=\").append(userAddress);\n        sb.append(\", isDeleted=\").append(isDeleted);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/NewBeeMallOrderItem.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport java.util.Date;\n\npublic class NewBeeMallOrderItem {\n    private Long orderItemId;\n\n    private Long orderId;\n\n    private Long goodsId;\n\n    private String goodsName;\n\n    private String goodsCoverImg;\n\n    private Integer sellingPrice;\n\n    private Integer goodsCount;\n\n    private Date createTime;\n\n    public Long getOrderItemId() {\n        return orderItemId;\n    }\n\n    public void setOrderItemId(Long orderItemId) {\n        this.orderItemId = orderItemId;\n    }\n\n    public Long getOrderId() {\n        return orderId;\n    }\n\n    public void setOrderId(Long orderId) {\n        this.orderId = orderId;\n    }\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public String getGoodsName() {\n        return goodsName;\n    }\n\n    public void setGoodsName(String goodsName) {\n        this.goodsName = goodsName == null ? null : goodsName.trim();\n    }\n\n    public String getGoodsCoverImg() {\n        return goodsCoverImg;\n    }\n\n    public void setGoodsCoverImg(String goodsCoverImg) {\n        this.goodsCoverImg = goodsCoverImg == null ? null : goodsCoverImg.trim();\n    }\n\n    public Integer getSellingPrice() {\n        return sellingPrice;\n    }\n\n    public void setSellingPrice(Integer sellingPrice) {\n        this.sellingPrice = sellingPrice;\n    }\n\n    public Integer getGoodsCount() {\n        return goodsCount;\n    }\n\n    public void setGoodsCount(Integer goodsCount) {\n        this.goodsCount = goodsCount;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", orderItemId=\").append(orderItemId);\n        sb.append(\", orderId=\").append(orderId);\n        sb.append(\", goodsId=\").append(goodsId);\n        sb.append(\", goodsName=\").append(goodsName);\n        sb.append(\", goodsCoverImg=\").append(goodsCoverImg);\n        sb.append(\", sellingPrice=\").append(sellingPrice);\n        sb.append(\", goodsCount=\").append(goodsCount);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/NewBeeMallShoppingCartItem.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\nimport java.util.Date;\n\npublic class NewBeeMallShoppingCartItem {\n    private Long cartItemId;\n\n    private Long userId;\n\n    private Long goodsId;\n\n    private Integer goodsCount;\n\n    private Byte isDeleted;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    public Long getCartItemId() {\n        return cartItemId;\n    }\n\n    public void setCartItemId(Long cartItemId) {\n        this.cartItemId = cartItemId;\n    }\n\n    public Long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Long userId) {\n        this.userId = userId;\n    }\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public Integer getGoodsCount() {\n        return goodsCount;\n    }\n\n    public void setGoodsCount(Integer goodsCount) {\n        this.goodsCount = goodsCount;\n    }\n\n    public Byte getIsDeleted() {\n        return isDeleted;\n    }\n\n    public void setIsDeleted(Byte isDeleted) {\n        this.isDeleted = isDeleted;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", cartItemId=\").append(cartItemId);\n        sb.append(\", userId=\").append(userId);\n        sb.append(\", goodsId=\").append(goodsId);\n        sb.append(\", goodsCount=\").append(goodsCount);\n        sb.append(\", isDeleted=\").append(isDeleted);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/entity/StockNumDTO.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.entity;\n\n/**\n * 库存修改所需实体\n */\npublic class StockNumDTO {\n    private Long goodsId;\n\n    private Integer goodsCount;\n\n    public Long getGoodsId() {\n        return goodsId;\n    }\n\n    public void setGoodsId(Long goodsId) {\n        this.goodsId = goodsId;\n    }\n\n    public Integer getGoodsCount() {\n        return goodsCount;\n    }\n\n    public void setGoodsCount(Integer goodsCount) {\n        this.goodsCount = goodsCount;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/interceptor/AdminLoginInterceptor.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.interceptor;\n\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 后台系统身份验证拦截器\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Component\npublic class AdminLoginInterceptor implements HandlerInterceptor {\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {\n        String requestServletPath = request.getServletPath();\n        if (requestServletPath.startsWith(\"/admin\") && null == request.getSession().getAttribute(\"loginUser\")) {\n            request.getSession().setAttribute(\"errorMsg\", \"请登陆\");\n            response.sendRedirect(request.getContextPath() + \"/admin/login\");\n            return false;\n        } else {\n            request.getSession().removeAttribute(\"errorMsg\");\n            return true;\n        }\n    }\n\n    @Override\n    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/interceptor/NewBeeMallCartNumberInterceptor.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.interceptor;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.dao.NewBeeMallShoppingCartItemMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * newbee-mall购物车数量处理\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Component\npublic class NewBeeMallCartNumberInterceptor implements HandlerInterceptor {\n\n    @Autowired\n    private NewBeeMallShoppingCartItemMapper newBeeMallShoppingCartItemMapper;\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {\n        //购物车中的数量会更改，但是在这些接口中并没有对session中的数据做修改，这里统一处理一下\n        if (null != request.getSession() && null != request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY)) {\n            //如果当前为登陆状态，就查询数据库并设置购物车中的数量值\n            NewBeeMallUserVO newBeeMallUserVO = (NewBeeMallUserVO) request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY);\n            //设置购物车中的数量\n            newBeeMallUserVO.setShopCartItemCount(newBeeMallShoppingCartItemMapper.selectCountByUserId(newBeeMallUserVO.getUserId()));\n            request.getSession().setAttribute(Constants.MALL_USER_SESSION_KEY, newBeeMallUserVO);\n        }\n        return true;\n    }\n\n    @Override\n    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/interceptor/NewBeeMallLoginInterceptor.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.interceptor;\n\nimport ltd.newbee.mall.common.Constants;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * newbee-mall系统身份验证拦截器\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\n@Component\npublic class NewBeeMallLoginInterceptor implements HandlerInterceptor {\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {\n        if (null == request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY)) {\n            response.sendRedirect(request.getContextPath() + \"/login\");\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    @Override\n    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/AdminUserService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.entity.AdminUser;\n\npublic interface AdminUserService {\n\n    AdminUser login(String userName, String password);\n\n    /**\n     * 获取用户信息\n     *\n     * @param loginUserId\n     * @return\n     */\n    AdminUser getUserDetailById(Integer loginUserId);\n\n    /**\n     * 修改当前登录用户的密码\n     *\n     * @param loginUserId\n     * @param originalPassword\n     * @param newPassword\n     * @return\n     */\n    Boolean updatePassword(Integer loginUserId, String originalPassword, String newPassword);\n\n    /**\n     * 修改当前登录用户的名称信息\n     *\n     * @param loginUserId\n     * @param loginUserName\n     * @param nickName\n     * @return\n     */\n    Boolean updateName(Integer loginUserId, String loginUserName, String nickName);\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallCarouselService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexCarouselVO;\nimport ltd.newbee.mall.entity.Carousel;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\n\nimport java.util.List;\n\npublic interface NewBeeMallCarouselService {\n    /**\n     * 后台分页\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getCarouselPage(PageQueryUtil pageUtil);\n\n    String saveCarousel(Carousel carousel);\n\n    String updateCarousel(Carousel carousel);\n\n    Carousel getCarouselById(Integer id);\n\n    Boolean deleteBatch(Integer[] ids);\n\n    /**\n     * 返回固定数量的轮播图对象(首页调用)\n     *\n     * @param number\n     * @return\n     */\n    List<NewBeeMallIndexCarouselVO> getCarouselsForIndex(int number);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallCategoryService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexCategoryVO;\nimport ltd.newbee.mall.controller.vo.SearchPageCategoryVO;\nimport ltd.newbee.mall.entity.GoodsCategory;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\n\nimport java.util.List;\n\npublic interface NewBeeMallCategoryService {\n    /**\n     * 后台分页\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getCategorisPage(PageQueryUtil pageUtil);\n\n    String saveCategory(GoodsCategory goodsCategory);\n\n    String updateGoodsCategory(GoodsCategory goodsCategory);\n\n    GoodsCategory getGoodsCategoryById(Long id);\n\n    Boolean deleteBatch(Integer[] ids);\n\n    /**\n     * 返回分类数据(首页调用)\n     *\n     * @return\n     */\n    List<NewBeeMallIndexCategoryVO> getCategoriesForIndex();\n\n    /**\n     * 返回分类数据(搜索页调用)\n     *\n     * @param categoryId\n     * @return\n     */\n    SearchPageCategoryVO getCategoriesForSearch(Long categoryId);\n\n    /**\n     * 根据parentId和level获取分类列表\n     *\n     * @param parentIds\n     * @param categoryLevel\n     * @return\n     */\n    List<GoodsCategory> selectByLevelAndParentIdsAndNumber(List<Long> parentIds, int categoryLevel);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallGoodsService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\n\nimport java.util.List;\n\npublic interface NewBeeMallGoodsService {\n    /**\n     * 后台分页\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getNewBeeMallGoodsPage(PageQueryUtil pageUtil);\n\n    /**\n     * 添加商品\n     *\n     * @param goods\n     * @return\n     */\n    String saveNewBeeMallGoods(NewBeeMallGoods goods);\n\n    /**\n     * 批量新增商品数据\n     *\n     * @param newBeeMallGoodsList\n     * @return\n     */\n    void batchSaveNewBeeMallGoods(List<NewBeeMallGoods> newBeeMallGoodsList);\n\n    /**\n     * 修改商品信息\n     *\n     * @param goods\n     * @return\n     */\n    String updateNewBeeMallGoods(NewBeeMallGoods goods);\n\n    /**\n     * 获取商品详情\n     *\n     * @param id\n     * @return\n     */\n    NewBeeMallGoods getNewBeeMallGoodsById(Long id);\n\n    /**\n     * 批量修改销售状态(上架下架)\n     *\n     * @param ids\n     * @return\n     */\n    Boolean batchUpdateSellStatus(Long[] ids,int sellStatus);\n\n    /**\n     * 商品搜索\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult searchNewBeeMallGoods(PageQueryUtil pageUtil);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallIndexConfigService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexConfigGoodsVO;\nimport ltd.newbee.mall.entity.IndexConfig;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\n\nimport java.util.List;\n\npublic interface NewBeeMallIndexConfigService {\n    /**\n     * 后台分页\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getConfigsPage(PageQueryUtil pageUtil);\n\n    String saveIndexConfig(IndexConfig indexConfig);\n\n    String updateIndexConfig(IndexConfig indexConfig);\n\n    IndexConfig getIndexConfigById(Long id);\n\n    /**\n     * 返回固定数量的首页配置商品对象(首页调用)\n     *\n     * @param number\n     * @return\n     */\n    List<NewBeeMallIndexConfigGoodsVO> getConfigGoodsesForIndex(int configType, int number);\n\n    Boolean deleteBatch(Long[] ids);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallOrderService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.controller.vo.NewBeeMallOrderDetailVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallOrderItemVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallShoppingCartItemVO;\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.entity.NewBeeMallOrder;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\n\nimport java.util.List;\n\npublic interface NewBeeMallOrderService {\n    /**\n     * 后台分页\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getNewBeeMallOrdersPage(PageQueryUtil pageUtil);\n\n    /**\n     * 订单信息修改\n     *\n     * @param newBeeMallOrder\n     * @return\n     */\n    String updateOrderInfo(NewBeeMallOrder newBeeMallOrder);\n\n    /**\n     * 配货\n     *\n     * @param ids\n     * @return\n     */\n    String checkDone(Long[] ids);\n\n    /**\n     * 出库\n     *\n     * @param ids\n     * @return\n     */\n    String checkOut(Long[] ids);\n\n    /**\n     * 关闭订单\n     *\n     * @param ids\n     * @return\n     */\n    String closeOrder(Long[] ids);\n\n    /**\n     * 保存订单\n     *\n     * @param user\n     * @param myShoppingCartItems\n     * @return\n     */\n    String saveOrder(NewBeeMallUserVO user, List<NewBeeMallShoppingCartItemVO> myShoppingCartItems);\n\n    /**\n     * 获取订单详情\n     *\n     * @param orderNo\n     * @param userId\n     * @return\n     */\n    NewBeeMallOrderDetailVO getOrderDetailByOrderNo(String orderNo, Long userId);\n\n    /**\n     * 获取订单详情\n     *\n     * @param orderNo\n     * @return\n     */\n    NewBeeMallOrder getNewBeeMallOrderByOrderNo(String orderNo);\n\n    /**\n     * 我的订单列表\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getMyOrders(PageQueryUtil pageUtil);\n\n    /**\n     * 手动取消订单\n     *\n     * @param orderNo\n     * @param userId\n     * @return\n     */\n    String cancelOrder(String orderNo, Long userId);\n\n    /**\n     * 确认收货\n     *\n     * @param orderNo\n     * @param userId\n     * @return\n     */\n    String finishOrder(String orderNo, Long userId);\n\n    String paySuccess(String orderNo, int payType);\n\n    List<NewBeeMallOrderItemVO> getOrderItems(Long id);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallShoppingCartService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.controller.vo.NewBeeMallShoppingCartItemVO;\nimport ltd.newbee.mall.entity.NewBeeMallShoppingCartItem;\n\nimport java.util.List;\n\npublic interface NewBeeMallShoppingCartService {\n\n    /**\n     * 保存商品至购物车中\n     *\n     * @param newBeeMallShoppingCartItem\n     * @return\n     */\n    String saveNewBeeMallCartItem(NewBeeMallShoppingCartItem newBeeMallShoppingCartItem);\n\n    /**\n     * 修改购物车中的属性\n     *\n     * @param newBeeMallShoppingCartItem\n     * @return\n     */\n    String updateNewBeeMallCartItem(NewBeeMallShoppingCartItem newBeeMallShoppingCartItem);\n\n    /**\n     * 获取购物项详情\n     *\n     * @param newBeeMallShoppingCartItemId\n     * @return\n     */\n    NewBeeMallShoppingCartItem getNewBeeMallCartItemById(Long newBeeMallShoppingCartItemId);\n\n    /**\n     * 删除购物车中的商品\n     *\n     *\n     * @param shoppingCartItemId\n     * @param userId\n     * @return\n     */\n    Boolean deleteById(Long shoppingCartItemId, Long userId);\n\n    /**\n     * 获取我的购物车中的列表数据\n     *\n     * @param newBeeMallUserId\n     * @return\n     */\n    List<NewBeeMallShoppingCartItemVO> getMyShoppingCartItems(Long newBeeMallUserId);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/NewBeeMallUserService.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service;\n\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.entity.MallUser;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\n\nimport javax.servlet.http.HttpSession;\n\npublic interface NewBeeMallUserService {\n    /**\n     * 后台分页\n     *\n     * @param pageUtil\n     * @return\n     */\n    PageResult getNewBeeMallUsersPage(PageQueryUtil pageUtil);\n\n    /**\n     * 用户注册\n     *\n     * @param loginName\n     * @param password\n     * @return\n     */\n    String register(String loginName, String password);\n\n    /**\n     * 登录\n     *\n     * @param loginName\n     * @param passwordMD5\n     * @param httpSession\n     * @return\n     */\n    String login(String loginName, String passwordMD5, HttpSession httpSession);\n\n    /**\n     * 用户信息修改并返回最新的用户信息\n     *\n     * @param mallUser\n     * @return\n     */\n    NewBeeMallUserVO updateUserInfo(MallUser mallUser, HttpSession httpSession);\n\n    /**\n     * 用户禁用与解除禁用(0-未锁定 1-已锁定)\n     *\n     * @param ids\n     * @param lockStatus\n     * @return\n     */\n    Boolean lockUsers(Integer[] ids, int lockStatus);\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/AdminUserServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.entity.AdminUser;\nimport ltd.newbee.mall.dao.AdminUserMapper;\nimport ltd.newbee.mall.service.AdminUserService;\nimport ltd.newbee.mall.util.MD5Util;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n@Service\npublic class AdminUserServiceImpl implements AdminUserService {\n\n    @Resource\n    private AdminUserMapper adminUserMapper;\n\n    @Override\n    public AdminUser login(String userName, String password) {\n        String passwordMd5 = MD5Util.MD5Encode(password, \"UTF-8\");\n        return adminUserMapper.login(userName, passwordMd5);\n    }\n\n    @Override\n    public AdminUser getUserDetailById(Integer loginUserId) {\n        return adminUserMapper.selectByPrimaryKey(loginUserId);\n    }\n\n    @Override\n    public Boolean updatePassword(Integer loginUserId, String originalPassword, String newPassword) {\n        AdminUser adminUser = adminUserMapper.selectByPrimaryKey(loginUserId);\n        //当前用户非空才可以进行更改\n        if (adminUser != null) {\n            String originalPasswordMd5 = MD5Util.MD5Encode(originalPassword, \"UTF-8\");\n            String newPasswordMd5 = MD5Util.MD5Encode(newPassword, \"UTF-8\");\n            //比较原密码是否正确\n            if (originalPasswordMd5.equals(adminUser.getLoginPassword())) {\n                //设置新密码并修改\n                adminUser.setLoginPassword(newPasswordMd5);\n                if (adminUserMapper.updateByPrimaryKeySelective(adminUser) > 0) {\n                    //修改成功则返回true\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    @Override\n    public Boolean updateName(Integer loginUserId, String loginUserName, String nickName) {\n        AdminUser adminUser = adminUserMapper.selectByPrimaryKey(loginUserId);\n        //当前用户非空才可以进行更改\n        if (adminUser != null) {\n            //设置新名称并修改\n            adminUser.setLoginUserName(loginUserName);\n            adminUser.setNickName(nickName);\n            if (adminUserMapper.updateByPrimaryKeySelective(adminUser) > 0) {\n                //修改成功则返回true\n                return true;\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallCarouselServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexCarouselVO;\nimport ltd.newbee.mall.dao.CarouselMapper;\nimport ltd.newbee.mall.entity.Carousel;\nimport ltd.newbee.mall.service.NewBeeMallCarouselService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n@Service\npublic class NewBeeMallCarouselServiceImpl implements NewBeeMallCarouselService {\n\n    @Autowired\n    private CarouselMapper carouselMapper;\n\n    @Override\n    public PageResult getCarouselPage(PageQueryUtil pageUtil) {\n        List<Carousel> carousels = carouselMapper.findCarouselList(pageUtil);\n        int total = carouselMapper.getTotalCarousels(pageUtil);\n        PageResult pageResult = new PageResult(carousels, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    public String saveCarousel(Carousel carousel) {\n        if (carouselMapper.insertSelective(carousel) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public String updateCarousel(Carousel carousel) {\n        Carousel temp = carouselMapper.selectByPrimaryKey(carousel.getCarouselId());\n        if (temp == null) {\n            return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n        }\n        temp.setCarouselRank(carousel.getCarouselRank());\n        temp.setRedirectUrl(carousel.getRedirectUrl());\n        temp.setCarouselUrl(carousel.getCarouselUrl());\n        temp.setUpdateTime(new Date());\n        if (carouselMapper.updateByPrimaryKeySelective(temp) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public Carousel getCarouselById(Integer id) {\n        return carouselMapper.selectByPrimaryKey(id);\n    }\n\n    @Override\n    public Boolean deleteBatch(Integer[] ids) {\n        if (ids.length < 1) {\n            return false;\n        }\n        //删除数据\n        return carouselMapper.deleteBatch(ids) > 0;\n    }\n\n    @Override\n    public List<NewBeeMallIndexCarouselVO> getCarouselsForIndex(int number) {\n        List<NewBeeMallIndexCarouselVO> newBeeMallIndexCarouselVOS = new ArrayList<>(number);\n        List<Carousel> carousels = carouselMapper.findCarouselsByNum(number);\n        if (!CollectionUtils.isEmpty(carousels)) {\n            newBeeMallIndexCarouselVOS = BeanUtil.copyList(carousels, NewBeeMallIndexCarouselVO.class);\n        }\n        return newBeeMallIndexCarouselVOS;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallCategoryServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.NewBeeMallCategoryLevelEnum;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexCategoryVO;\nimport ltd.newbee.mall.controller.vo.SearchPageCategoryVO;\nimport ltd.newbee.mall.controller.vo.SecondLevelCategoryVO;\nimport ltd.newbee.mall.controller.vo.ThirdLevelCategoryVO;\nimport ltd.newbee.mall.dao.GoodsCategoryMapper;\nimport ltd.newbee.mall.entity.GoodsCategory;\nimport ltd.newbee.mall.service.NewBeeMallCategoryService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\nimport static java.util.stream.Collectors.groupingBy;\n\n@Service\npublic class NewBeeMallCategoryServiceImpl implements NewBeeMallCategoryService {\n\n    @Autowired\n    private GoodsCategoryMapper goodsCategoryMapper;\n\n    @Override\n    public PageResult getCategorisPage(PageQueryUtil pageUtil) {\n        List<GoodsCategory> goodsCategories = goodsCategoryMapper.findGoodsCategoryList(pageUtil);\n        int total = goodsCategoryMapper.getTotalGoodsCategories(pageUtil);\n        PageResult pageResult = new PageResult(goodsCategories, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    public String saveCategory(GoodsCategory goodsCategory) {\n        GoodsCategory temp = goodsCategoryMapper.selectByLevelAndName(goodsCategory.getCategoryLevel(), goodsCategory.getCategoryName());\n        if (temp != null) {\n            return ServiceResultEnum.SAME_CATEGORY_EXIST.getResult();\n        }\n        if (goodsCategoryMapper.insertSelective(goodsCategory) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public String updateGoodsCategory(GoodsCategory goodsCategory) {\n        GoodsCategory temp = goodsCategoryMapper.selectByPrimaryKey(goodsCategory.getCategoryId());\n        if (temp == null) {\n            return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n        }\n        GoodsCategory temp2 = goodsCategoryMapper.selectByLevelAndName(goodsCategory.getCategoryLevel(), goodsCategory.getCategoryName());\n        if (temp2 != null && !temp2.getCategoryId().equals(goodsCategory.getCategoryId())) {\n            //同名且不同id 不能继续修改\n            return ServiceResultEnum.SAME_CATEGORY_EXIST.getResult();\n        }\n        goodsCategory.setUpdateTime(new Date());\n        if (goodsCategoryMapper.updateByPrimaryKeySelective(goodsCategory) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public GoodsCategory getGoodsCategoryById(Long id) {\n        return goodsCategoryMapper.selectByPrimaryKey(id);\n    }\n\n    @Override\n    public Boolean deleteBatch(Integer[] ids) {\n        if (ids.length < 1) {\n            return false;\n        }\n        //删除分类数据\n        return goodsCategoryMapper.deleteBatch(ids) > 0;\n    }\n\n    @Override\n    public List<NewBeeMallIndexCategoryVO> getCategoriesForIndex() {\n        List<NewBeeMallIndexCategoryVO> newBeeMallIndexCategoryVOS = new ArrayList<>();\n        //获取一级分类的固定数量的数据\n        List<GoodsCategory> firstLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(Collections.singletonList(0L), NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel(), Constants.INDEX_CATEGORY_NUMBER);\n        if (!CollectionUtils.isEmpty(firstLevelCategories)) {\n            List<Long> firstLevelCategoryIds = firstLevelCategories.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toList());\n            //获取二级分类的数据\n            List<GoodsCategory> secondLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(firstLevelCategoryIds, NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel(), 0);\n            if (!CollectionUtils.isEmpty(secondLevelCategories)) {\n                List<Long> secondLevelCategoryIds = secondLevelCategories.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toList());\n                //获取三级分类的数据\n                List<GoodsCategory> thirdLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(secondLevelCategoryIds, NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel(), 0);\n                if (!CollectionUtils.isEmpty(thirdLevelCategories)) {\n                    //根据 parentId 将 thirdLevelCategories 分组\n                    Map<Long, List<GoodsCategory>> thirdLevelCategoryMap = thirdLevelCategories.stream().collect(groupingBy(GoodsCategory::getParentId));\n                    List<SecondLevelCategoryVO> secondLevelCategoryVOS = new ArrayList<>();\n                    //处理二级分类\n                    for (GoodsCategory secondLevelCategory : secondLevelCategories) {\n                        SecondLevelCategoryVO secondLevelCategoryVO = new SecondLevelCategoryVO();\n                        BeanUtil.copyProperties(secondLevelCategory, secondLevelCategoryVO);\n                        //如果该二级分类下有数据则放入 secondLevelCategoryVOS 对象中\n                        if (thirdLevelCategoryMap.containsKey(secondLevelCategory.getCategoryId())) {\n                            //根据二级分类的id取出thirdLevelCategoryMap分组中的三级分类list\n                            List<GoodsCategory> tempGoodsCategories = thirdLevelCategoryMap.get(secondLevelCategory.getCategoryId());\n                            secondLevelCategoryVO.setThirdLevelCategoryVOS((BeanUtil.copyList(tempGoodsCategories, ThirdLevelCategoryVO.class)));\n                            secondLevelCategoryVOS.add(secondLevelCategoryVO);\n                        }\n                    }\n                    //处理一级分类\n                    if (!CollectionUtils.isEmpty(secondLevelCategoryVOS)) {\n                        //根据 parentId 将 thirdLevelCategories 分组\n                        Map<Long, List<SecondLevelCategoryVO>> secondLevelCategoryVOMap = secondLevelCategoryVOS.stream().collect(groupingBy(SecondLevelCategoryVO::getParentId));\n                        for (GoodsCategory firstCategory : firstLevelCategories) {\n                            NewBeeMallIndexCategoryVO newBeeMallIndexCategoryVO = new NewBeeMallIndexCategoryVO();\n                            BeanUtil.copyProperties(firstCategory, newBeeMallIndexCategoryVO);\n                            //如果该一级分类下有数据则放入 newBeeMallIndexCategoryVOS 对象中\n                            if (secondLevelCategoryVOMap.containsKey(firstCategory.getCategoryId())) {\n                                //根据一级分类的id取出secondLevelCategoryVOMap分组中的二级级分类list\n                                List<SecondLevelCategoryVO> tempGoodsCategories = secondLevelCategoryVOMap.get(firstCategory.getCategoryId());\n                                newBeeMallIndexCategoryVO.setSecondLevelCategoryVOS(tempGoodsCategories);\n                                newBeeMallIndexCategoryVOS.add(newBeeMallIndexCategoryVO);\n                            }\n                        }\n                    }\n                }\n            }\n            return newBeeMallIndexCategoryVOS;\n        } else {\n            return null;\n        }\n    }\n\n    @Override\n    public SearchPageCategoryVO getCategoriesForSearch(Long categoryId) {\n        SearchPageCategoryVO searchPageCategoryVO = new SearchPageCategoryVO();\n        GoodsCategory thirdLevelGoodsCategory = goodsCategoryMapper.selectByPrimaryKey(categoryId);\n        if (thirdLevelGoodsCategory != null && thirdLevelGoodsCategory.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) {\n            //获取当前三级分类的二级分类\n            GoodsCategory secondLevelGoodsCategory = goodsCategoryMapper.selectByPrimaryKey(thirdLevelGoodsCategory.getParentId());\n            if (secondLevelGoodsCategory != null && secondLevelGoodsCategory.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel()) {\n                //获取当前二级分类下的三级分类List\n                List<GoodsCategory> thirdLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(Collections.singletonList(secondLevelGoodsCategory.getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel(), Constants.SEARCH_CATEGORY_NUMBER);\n                searchPageCategoryVO.setCurrentCategoryName(thirdLevelGoodsCategory.getCategoryName());\n                searchPageCategoryVO.setSecondLevelCategoryName(secondLevelGoodsCategory.getCategoryName());\n                searchPageCategoryVO.setThirdLevelCategoryList(thirdLevelCategories);\n                return searchPageCategoryVO;\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public List<GoodsCategory> selectByLevelAndParentIdsAndNumber(List<Long> parentIds, int categoryLevel) {\n        return goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(parentIds, categoryLevel, 0);//0代表查询所有\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallGoodsServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.NewBeeMallCategoryLevelEnum;\nimport ltd.newbee.mall.common.NewBeeMallException;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallSearchGoodsVO;\nimport ltd.newbee.mall.dao.GoodsCategoryMapper;\nimport ltd.newbee.mall.dao.NewBeeMallGoodsMapper;\nimport ltd.newbee.mall.entity.GoodsCategory;\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.service.NewBeeMallGoodsService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport ltd.newbee.mall.util.NewBeeMallUtils;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n@Service\npublic class NewBeeMallGoodsServiceImpl implements NewBeeMallGoodsService {\n\n    @Autowired\n    private NewBeeMallGoodsMapper goodsMapper;\n    @Autowired\n    private GoodsCategoryMapper goodsCategoryMapper;\n\n    @Override\n    public PageResult getNewBeeMallGoodsPage(PageQueryUtil pageUtil) {\n        List<NewBeeMallGoods> goodsList = goodsMapper.findNewBeeMallGoodsList(pageUtil);\n        int total = goodsMapper.getTotalNewBeeMallGoods(pageUtil);\n        PageResult pageResult = new PageResult(goodsList, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    public String saveNewBeeMallGoods(NewBeeMallGoods goods) {\n        GoodsCategory goodsCategory = goodsCategoryMapper.selectByPrimaryKey(goods.getGoodsCategoryId());\n        // 分类不存在或者不是三级分类，则该参数字段异常\n        if (goodsCategory == null || goodsCategory.getCategoryLevel().intValue() != NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) {\n            return ServiceResultEnum.GOODS_CATEGORY_ERROR.getResult();\n        }\n        if (goodsMapper.selectByCategoryIdAndName(goods.getGoodsName(), goods.getGoodsCategoryId()) != null) {\n            return ServiceResultEnum.SAME_GOODS_EXIST.getResult();\n        }\n        goods.setGoodsName(NewBeeMallUtils.cleanString(goods.getGoodsName()));\n        goods.setGoodsIntro(NewBeeMallUtils.cleanString(goods.getGoodsIntro()));\n        goods.setTag(NewBeeMallUtils.cleanString(goods.getTag()));\n        if (goodsMapper.insertSelective(goods) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public void batchSaveNewBeeMallGoods(List<NewBeeMallGoods> newBeeMallGoodsList) {\n        if (!CollectionUtils.isEmpty(newBeeMallGoodsList)) {\n            goodsMapper.batchInsert(newBeeMallGoodsList);\n        }\n    }\n\n    @Override\n    public String updateNewBeeMallGoods(NewBeeMallGoods goods) {\n        GoodsCategory goodsCategory = goodsCategoryMapper.selectByPrimaryKey(goods.getGoodsCategoryId());\n        // 分类不存在或者不是三级分类，则该参数字段异常\n        if (goodsCategory == null || goodsCategory.getCategoryLevel().intValue() != NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) {\n            return ServiceResultEnum.GOODS_CATEGORY_ERROR.getResult();\n        }\n        NewBeeMallGoods temp = goodsMapper.selectByPrimaryKey(goods.getGoodsId());\n        if (temp == null) {\n            return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n        }\n        NewBeeMallGoods temp2 = goodsMapper.selectByCategoryIdAndName(goods.getGoodsName(), goods.getGoodsCategoryId());\n        if (temp2 != null && !temp2.getGoodsId().equals(goods.getGoodsId())) {\n            //name和分类id相同且不同id 不能继续修改\n            return ServiceResultEnum.SAME_GOODS_EXIST.getResult();\n        }\n        goods.setGoodsName(NewBeeMallUtils.cleanString(goods.getGoodsName()));\n        goods.setGoodsIntro(NewBeeMallUtils.cleanString(goods.getGoodsIntro()));\n        goods.setTag(NewBeeMallUtils.cleanString(goods.getTag()));\n        goods.setUpdateTime(new Date());\n        if (goodsMapper.updateByPrimaryKeySelective(goods) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public NewBeeMallGoods getNewBeeMallGoodsById(Long id) {\n        NewBeeMallGoods newBeeMallGoods = goodsMapper.selectByPrimaryKey(id);\n        if (newBeeMallGoods == null) {\n            NewBeeMallException.fail(ServiceResultEnum.GOODS_NOT_EXIST.getResult());\n        }\n        return newBeeMallGoods;\n    }\n\n    @Override\n    public Boolean batchUpdateSellStatus(Long[] ids, int sellStatus) {\n        return goodsMapper.batchUpdateSellStatus(ids, sellStatus) > 0;\n    }\n\n    @Override\n    public PageResult searchNewBeeMallGoods(PageQueryUtil pageUtil) {\n        List<NewBeeMallGoods> goodsList = goodsMapper.findNewBeeMallGoodsListBySearch(pageUtil);\n        int total = goodsMapper.getTotalNewBeeMallGoodsBySearch(pageUtil);\n        List<NewBeeMallSearchGoodsVO> newBeeMallSearchGoodsVOS = new ArrayList<>();\n        if (!CollectionUtils.isEmpty(goodsList)) {\n            newBeeMallSearchGoodsVOS = BeanUtil.copyList(goodsList, NewBeeMallSearchGoodsVO.class);\n            for (NewBeeMallSearchGoodsVO newBeeMallSearchGoodsVO : newBeeMallSearchGoodsVOS) {\n                String goodsName = newBeeMallSearchGoodsVO.getGoodsName();\n                String goodsIntro = newBeeMallSearchGoodsVO.getGoodsIntro();\n                // 字符串过长导致文字超出的问题\n                if (goodsName.length() > 28) {\n                    goodsName = goodsName.substring(0, 28) + \"...\";\n                    newBeeMallSearchGoodsVO.setGoodsName(goodsName);\n                }\n                if (goodsIntro.length() > 30) {\n                    goodsIntro = goodsIntro.substring(0, 30) + \"...\";\n                    newBeeMallSearchGoodsVO.setGoodsIntro(goodsIntro);\n                }\n            }\n        }\n        PageResult pageResult = new PageResult(newBeeMallSearchGoodsVOS, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallIndexConfigServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallIndexConfigGoodsVO;\nimport ltd.newbee.mall.dao.IndexConfigMapper;\nimport ltd.newbee.mall.dao.NewBeeMallGoodsMapper;\nimport ltd.newbee.mall.entity.IndexConfig;\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.service.NewBeeMallIndexConfigService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Service\npublic class NewBeeMallIndexConfigServiceImpl implements NewBeeMallIndexConfigService {\n\n    @Autowired\n    private IndexConfigMapper indexConfigMapper;\n\n    @Autowired\n    private NewBeeMallGoodsMapper goodsMapper;\n\n    @Override\n    public PageResult getConfigsPage(PageQueryUtil pageUtil) {\n        List<IndexConfig> indexConfigs = indexConfigMapper.findIndexConfigList(pageUtil);\n        int total = indexConfigMapper.getTotalIndexConfigs(pageUtil);\n        PageResult pageResult = new PageResult(indexConfigs, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    public String saveIndexConfig(IndexConfig indexConfig) {\n        if (goodsMapper.selectByPrimaryKey(indexConfig.getGoodsId()) == null) {\n            return ServiceResultEnum.GOODS_NOT_EXIST.getResult();\n        }\n        if (indexConfigMapper.selectByTypeAndGoodsId(indexConfig.getConfigType(), indexConfig.getGoodsId()) != null) {\n            return ServiceResultEnum.SAME_INDEX_CONFIG_EXIST.getResult();\n        }\n        if (indexConfigMapper.insertSelective(indexConfig) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public String updateIndexConfig(IndexConfig indexConfig) {\n        if (goodsMapper.selectByPrimaryKey(indexConfig.getGoodsId()) == null) {\n            return ServiceResultEnum.GOODS_NOT_EXIST.getResult();\n        }\n        IndexConfig temp = indexConfigMapper.selectByPrimaryKey(indexConfig.getConfigId());\n        if (temp == null) {\n            return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n        }\n        IndexConfig temp2 = indexConfigMapper.selectByTypeAndGoodsId(indexConfig.getConfigType(), indexConfig.getGoodsId());\n        if (temp2 != null && !temp2.getConfigId().equals(indexConfig.getConfigId())) {\n            //goodsId相同且不同id 不能继续修改\n            return ServiceResultEnum.SAME_INDEX_CONFIG_EXIST.getResult();\n        }\n        indexConfig.setUpdateTime(new Date());\n        if (indexConfigMapper.updateByPrimaryKeySelective(indexConfig) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public IndexConfig getIndexConfigById(Long id) {\n        return null;\n    }\n\n    @Override\n    public List<NewBeeMallIndexConfigGoodsVO> getConfigGoodsesForIndex(int configType, int number) {\n        List<NewBeeMallIndexConfigGoodsVO> newBeeMallIndexConfigGoodsVOS = new ArrayList<>(number);\n        List<IndexConfig> indexConfigs = indexConfigMapper.findIndexConfigsByTypeAndNum(configType, number);\n        if (!CollectionUtils.isEmpty(indexConfigs)) {\n            //取出所有的goodsId\n            List<Long> goodsIds = indexConfigs.stream().map(IndexConfig::getGoodsId).collect(Collectors.toList());\n            List<NewBeeMallGoods> newBeeMallGoods = goodsMapper.selectByPrimaryKeys(goodsIds);\n            newBeeMallIndexConfigGoodsVOS = BeanUtil.copyList(newBeeMallGoods, NewBeeMallIndexConfigGoodsVO.class);\n            for (NewBeeMallIndexConfigGoodsVO newBeeMallIndexConfigGoodsVO : newBeeMallIndexConfigGoodsVOS) {\n                String goodsName = newBeeMallIndexConfigGoodsVO.getGoodsName();\n                String goodsIntro = newBeeMallIndexConfigGoodsVO.getGoodsIntro();\n                // 字符串过长导致文字超出的问题\n                if (goodsName.length() > 30) {\n                    goodsName = goodsName.substring(0, 30) + \"...\";\n                    newBeeMallIndexConfigGoodsVO.setGoodsName(goodsName);\n                }\n                if (goodsIntro.length() > 22) {\n                    goodsIntro = goodsIntro.substring(0, 22) + \"...\";\n                    newBeeMallIndexConfigGoodsVO.setGoodsIntro(goodsIntro);\n                }\n            }\n        }\n        return newBeeMallIndexConfigGoodsVOS;\n    }\n\n    @Override\n    public Boolean deleteBatch(Long[] ids) {\n        if (ids.length < 1) {\n            return false;\n        }\n        //删除数据\n        return indexConfigMapper.deleteBatch(ids) > 0;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallOrderServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.*;\nimport ltd.newbee.mall.controller.vo.*;\nimport ltd.newbee.mall.dao.NewBeeMallGoodsMapper;\nimport ltd.newbee.mall.dao.NewBeeMallOrderItemMapper;\nimport ltd.newbee.mall.dao.NewBeeMallOrderMapper;\nimport ltd.newbee.mall.dao.NewBeeMallShoppingCartItemMapper;\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.entity.NewBeeMallOrder;\nimport ltd.newbee.mall.entity.NewBeeMallOrderItem;\nimport ltd.newbee.mall.entity.StockNumDTO;\nimport ltd.newbee.mall.service.NewBeeMallOrderService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport ltd.newbee.mall.util.NumberUtil;\nimport ltd.newbee.mall.util.PageQueryUtil;\nimport ltd.newbee.mall.util.PageResult;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.StringUtils;\n\nimport java.util.*;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\n\nimport static java.util.stream.Collectors.groupingBy;\n\n@Service\npublic class NewBeeMallOrderServiceImpl implements NewBeeMallOrderService {\n\n    @Autowired\n    private NewBeeMallOrderMapper newBeeMallOrderMapper;\n    @Autowired\n    private NewBeeMallOrderItemMapper newBeeMallOrderItemMapper;\n    @Autowired\n    private NewBeeMallShoppingCartItemMapper newBeeMallShoppingCartItemMapper;\n    @Autowired\n    private NewBeeMallGoodsMapper newBeeMallGoodsMapper;\n\n    @Override\n    public PageResult getNewBeeMallOrdersPage(PageQueryUtil pageUtil) {\n        List<NewBeeMallOrder> newBeeMallOrders = newBeeMallOrderMapper.findNewBeeMallOrderList(pageUtil);\n        int total = newBeeMallOrderMapper.getTotalNewBeeMallOrders(pageUtil);\n        PageResult pageResult = new PageResult(newBeeMallOrders, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    @Transactional\n    public String updateOrderInfo(NewBeeMallOrder newBeeMallOrder) {\n        NewBeeMallOrder temp = newBeeMallOrderMapper.selectByPrimaryKey(newBeeMallOrder.getOrderId());\n        //不为空且orderStatus>=0且状态为出库之前可以修改部分信息\n        if (temp != null && temp.getOrderStatus() >= 0 && temp.getOrderStatus() < 3) {\n            temp.setTotalPrice(newBeeMallOrder.getTotalPrice());\n            temp.setUserAddress(newBeeMallOrder.getUserAddress());\n            temp.setUpdateTime(new Date());\n            if (newBeeMallOrderMapper.updateByPrimaryKeySelective(temp) > 0) {\n                return ServiceResultEnum.SUCCESS.getResult();\n            }\n            return ServiceResultEnum.DB_ERROR.getResult();\n        }\n        return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n    }\n\n    @Override\n    @Transactional\n    public String checkDone(Long[] ids) {\n        //查询所有的订单 判断状态 修改状态和更新时间\n        List<NewBeeMallOrder> orders = newBeeMallOrderMapper.selectByPrimaryKeys(Arrays.asList(ids));\n        String errorOrderNos = \"\";\n        if (!CollectionUtils.isEmpty(orders)) {\n            for (NewBeeMallOrder newBeeMallOrder : orders) {\n                if (newBeeMallOrder.getIsDeleted() == 1) {\n                    errorOrderNos += newBeeMallOrder.getOrderNo() + \" \";\n                    continue;\n                }\n                if (newBeeMallOrder.getOrderStatus() != 1) {\n                    errorOrderNos += newBeeMallOrder.getOrderNo() + \" \";\n                }\n            }\n            if (!StringUtils.hasText(errorOrderNos)) {\n                //订单状态正常 可以执行配货完成操作 修改订单状态和更新时间\n                if (newBeeMallOrderMapper.checkDone(Arrays.asList(ids)) > 0) {\n                    return ServiceResultEnum.SUCCESS.getResult();\n                } else {\n                    return ServiceResultEnum.DB_ERROR.getResult();\n                }\n            } else {\n                //订单此时不可执行出库操作\n                if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) {\n                    return errorOrderNos + \"订单的状态不是支付成功无法执行出库操作\";\n                } else {\n                    return \"你选择了太多状态不是支付成功的订单，无法执行配货完成操作\";\n                }\n            }\n        }\n        //未查询到数据 返回错误提示\n        return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n    }\n\n    @Override\n    @Transactional\n    public String checkOut(Long[] ids) {\n        //查询所有的订单 判断状态 修改状态和更新时间\n        List<NewBeeMallOrder> orders = newBeeMallOrderMapper.selectByPrimaryKeys(Arrays.asList(ids));\n        String errorOrderNos = \"\";\n        if (!CollectionUtils.isEmpty(orders)) {\n            for (NewBeeMallOrder newBeeMallOrder : orders) {\n                if (newBeeMallOrder.getIsDeleted() == 1) {\n                    errorOrderNos += newBeeMallOrder.getOrderNo() + \" \";\n                    continue;\n                }\n                if (newBeeMallOrder.getOrderStatus() != 1 && newBeeMallOrder.getOrderStatus() != 2) {\n                    errorOrderNos += newBeeMallOrder.getOrderNo() + \" \";\n                }\n            }\n            if (!StringUtils.hasText(errorOrderNos)) {\n                //订单状态正常 可以执行出库操作 修改订单状态和更新时间\n                if (newBeeMallOrderMapper.checkOut(Arrays.asList(ids)) > 0) {\n                    return ServiceResultEnum.SUCCESS.getResult();\n                } else {\n                    return ServiceResultEnum.DB_ERROR.getResult();\n                }\n            } else {\n                //订单此时不可执行出库操作\n                if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) {\n                    return errorOrderNos + \"订单的状态不是支付成功或配货完成无法执行出库操作\";\n                } else {\n                    return \"你选择了太多状态不是支付成功或配货完成的订单，无法执行出库操作\";\n                }\n            }\n        }\n        //未查询到数据 返回错误提示\n        return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n    }\n\n    @Override\n    @Transactional\n    public String closeOrder(Long[] ids) {\n        //查询所有的订单 判断状态 修改状态和更新时间\n        List<NewBeeMallOrder> orders = newBeeMallOrderMapper.selectByPrimaryKeys(Arrays.asList(ids));\n        String errorOrderNos = \"\";\n        if (!CollectionUtils.isEmpty(orders)) {\n            for (NewBeeMallOrder newBeeMallOrder : orders) {\n                // isDeleted=1 一定为已关闭订单\n                if (newBeeMallOrder.getIsDeleted() == 1) {\n                    errorOrderNos += newBeeMallOrder.getOrderNo() + \" \";\n                    continue;\n                }\n                //已关闭或者已完成无法关闭订单\n                if (newBeeMallOrder.getOrderStatus() == 4 || newBeeMallOrder.getOrderStatus() < 0) {\n                    errorOrderNos += newBeeMallOrder.getOrderNo() + \" \";\n                }\n            }\n            if (!StringUtils.hasText(errorOrderNos)) {\n                //订单状态正常 可以执行关闭操作 修改订单状态和更新时间&&恢复库存\n                if (newBeeMallOrderMapper.closeOrder(Arrays.asList(ids), NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_JUDGE.getOrderStatus()) > 0 && recoverStockNum(Arrays.asList(ids))) {\n                    return ServiceResultEnum.SUCCESS.getResult();\n                } else {\n                    return ServiceResultEnum.DB_ERROR.getResult();\n                }\n            } else {\n                //订单此时不可执行关闭操作\n                if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) {\n                    return errorOrderNos + \"订单不能执行关闭操作\";\n                } else {\n                    return \"你选择的订单不能执行关闭操作\";\n                }\n            }\n        }\n        //未查询到数据 返回错误提示\n        return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n    }\n\n    @Override\n    @Transactional\n    public String saveOrder(NewBeeMallUserVO user, List<NewBeeMallShoppingCartItemVO> myShoppingCartItems) {\n        List<Long> itemIdList = myShoppingCartItems.stream().map(NewBeeMallShoppingCartItemVO::getCartItemId).collect(Collectors.toList());\n        List<Long> goodsIds = myShoppingCartItems.stream().map(NewBeeMallShoppingCartItemVO::getGoodsId).collect(Collectors.toList());\n        List<NewBeeMallGoods> newBeeMallGoods = newBeeMallGoodsMapper.selectByPrimaryKeys(goodsIds);\n        //检查是否包含已下架商品\n        List<NewBeeMallGoods> goodsListNotSelling = newBeeMallGoods.stream()\n                .filter(newBeeMallGoodsTemp -> newBeeMallGoodsTemp.getGoodsSellStatus() != Constants.SELL_STATUS_UP)\n                .collect(Collectors.toList());\n        if (!CollectionUtils.isEmpty(goodsListNotSelling)) {\n            //goodsListNotSelling 对象非空则表示有下架商品\n            NewBeeMallException.fail(goodsListNotSelling.get(0).getGoodsName() + \"已下架，无法生成订单\");\n        }\n        Map<Long, NewBeeMallGoods> newBeeMallGoodsMap = newBeeMallGoods.stream().collect(Collectors.toMap(NewBeeMallGoods::getGoodsId, Function.identity(), (entity1, entity2) -> entity1));\n        //判断商品库存\n        for (NewBeeMallShoppingCartItemVO shoppingCartItemVO : myShoppingCartItems) {\n            //查出的商品中不存在购物车中的这条关联商品数据，直接返回错误提醒\n            if (!newBeeMallGoodsMap.containsKey(shoppingCartItemVO.getGoodsId())) {\n                NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult());\n            }\n            //存在数量大于库存的情况，直接返回错误提醒\n            if (shoppingCartItemVO.getGoodsCount() > newBeeMallGoodsMap.get(shoppingCartItemVO.getGoodsId()).getStockNum()) {\n                NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult());\n            }\n        }\n        //删除购物项\n        if (!CollectionUtils.isEmpty(itemIdList) && !CollectionUtils.isEmpty(goodsIds) && !CollectionUtils.isEmpty(newBeeMallGoods)) {\n            if (newBeeMallShoppingCartItemMapper.deleteBatch(itemIdList) > 0) {\n                List<StockNumDTO> stockNumDTOS = BeanUtil.copyList(myShoppingCartItems, StockNumDTO.class);\n                int updateStockNumResult = newBeeMallGoodsMapper.updateStockNum(stockNumDTOS);\n                if (updateStockNumResult < 1) {\n                    NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult());\n                }\n                //生成订单号\n                String orderNo = NumberUtil.genOrderNo();\n                int priceTotal = 0;\n                //保存订单\n                NewBeeMallOrder newBeeMallOrder = new NewBeeMallOrder();\n                newBeeMallOrder.setOrderNo(orderNo);\n                newBeeMallOrder.setUserId(user.getUserId());\n                newBeeMallOrder.setUserAddress(user.getAddress());\n                //总价\n                for (NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO : myShoppingCartItems) {\n                    priceTotal += newBeeMallShoppingCartItemVO.getGoodsCount() * newBeeMallShoppingCartItemVO.getSellingPrice();\n                }\n                if (priceTotal < 1) {\n                    NewBeeMallException.fail(ServiceResultEnum.ORDER_PRICE_ERROR.getResult());\n                }\n                newBeeMallOrder.setTotalPrice(priceTotal);\n                //订单body字段，用来作为生成支付单描述信息，暂时未接入第三方支付接口，故该字段暂时设为空字符串\n                String extraInfo = \"\";\n                newBeeMallOrder.setExtraInfo(extraInfo);\n                //生成订单项并保存订单项纪录\n                if (newBeeMallOrderMapper.insertSelective(newBeeMallOrder) > 0) {\n                    //生成所有的订单项快照，并保存至数据库\n                    List<NewBeeMallOrderItem> newBeeMallOrderItems = new ArrayList<>();\n                    for (NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO : myShoppingCartItems) {\n                        NewBeeMallOrderItem newBeeMallOrderItem = new NewBeeMallOrderItem();\n                        //使用BeanUtil工具类将newBeeMallShoppingCartItemVO中的属性复制到newBeeMallOrderItem对象中\n                        BeanUtil.copyProperties(newBeeMallShoppingCartItemVO, newBeeMallOrderItem);\n                        //NewBeeMallOrderMapper文件insert()方法中使用了useGeneratedKeys因此orderId可以获取到\n                        newBeeMallOrderItem.setOrderId(newBeeMallOrder.getOrderId());\n                        newBeeMallOrderItems.add(newBeeMallOrderItem);\n                    }\n                    //保存至数据库\n                    if (newBeeMallOrderItemMapper.insertBatch(newBeeMallOrderItems) > 0) {\n                        //所有操作成功后，将订单号返回，以供Controller方法跳转到订单详情\n                        return orderNo;\n                    }\n                    NewBeeMallException.fail(ServiceResultEnum.ORDER_PRICE_ERROR.getResult());\n                }\n                NewBeeMallException.fail(ServiceResultEnum.DB_ERROR.getResult());\n            }\n            NewBeeMallException.fail(ServiceResultEnum.DB_ERROR.getResult());\n        }\n        NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult());\n        return ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult();\n    }\n\n    @Override\n    public NewBeeMallOrderDetailVO getOrderDetailByOrderNo(String orderNo, Long userId) {\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo);\n        if (newBeeMallOrder == null) {\n            NewBeeMallException.fail(ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult());\n        }\n        //验证是否是当前userId下的订单，否则报错\n        if (!userId.equals(newBeeMallOrder.getUserId())) {\n            NewBeeMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult());\n        }\n        List<NewBeeMallOrderItem> orderItems = newBeeMallOrderItemMapper.selectByOrderId(newBeeMallOrder.getOrderId());\n        //获取订单项数据\n        if (CollectionUtils.isEmpty(orderItems)) {\n            NewBeeMallException.fail(ServiceResultEnum.ORDER_ITEM_NOT_EXIST_ERROR.getResult());\n        }\n        List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS = BeanUtil.copyList(orderItems, NewBeeMallOrderItemVO.class);\n        NewBeeMallOrderDetailVO newBeeMallOrderDetailVO = new NewBeeMallOrderDetailVO();\n        BeanUtil.copyProperties(newBeeMallOrder, newBeeMallOrderDetailVO);\n        newBeeMallOrderDetailVO.setOrderStatusString(NewBeeMallOrderStatusEnum.getNewBeeMallOrderStatusEnumByStatus(newBeeMallOrderDetailVO.getOrderStatus()).getName());\n        newBeeMallOrderDetailVO.setPayTypeString(PayTypeEnum.getPayTypeEnumByType(newBeeMallOrderDetailVO.getPayType()).getName());\n        newBeeMallOrderDetailVO.setNewBeeMallOrderItemVOS(newBeeMallOrderItemVOS);\n        return newBeeMallOrderDetailVO;\n    }\n\n    @Override\n    public NewBeeMallOrder getNewBeeMallOrderByOrderNo(String orderNo) {\n        return newBeeMallOrderMapper.selectByOrderNo(orderNo);\n    }\n\n    @Override\n    public PageResult getMyOrders(PageQueryUtil pageUtil) {\n        int total = newBeeMallOrderMapper.getTotalNewBeeMallOrders(pageUtil);\n        List<NewBeeMallOrder> newBeeMallOrders = newBeeMallOrderMapper.findNewBeeMallOrderList(pageUtil);\n        List<NewBeeMallOrderListVO> orderListVOS = new ArrayList<>();\n        if (total > 0) {\n            //数据转换 将实体类转成vo\n            orderListVOS = BeanUtil.copyList(newBeeMallOrders, NewBeeMallOrderListVO.class);\n            //设置订单状态中文显示值\n            for (NewBeeMallOrderListVO newBeeMallOrderListVO : orderListVOS) {\n                newBeeMallOrderListVO.setOrderStatusString(NewBeeMallOrderStatusEnum.getNewBeeMallOrderStatusEnumByStatus(newBeeMallOrderListVO.getOrderStatus()).getName());\n            }\n            List<Long> orderIds = newBeeMallOrders.stream().map(NewBeeMallOrder::getOrderId).collect(Collectors.toList());\n            if (!CollectionUtils.isEmpty(orderIds)) {\n                List<NewBeeMallOrderItem> orderItems = newBeeMallOrderItemMapper.selectByOrderIds(orderIds);\n                Map<Long, List<NewBeeMallOrderItem>> itemByOrderIdMap = orderItems.stream().collect(groupingBy(NewBeeMallOrderItem::getOrderId));\n                for (NewBeeMallOrderListVO newBeeMallOrderListVO : orderListVOS) {\n                    //封装每个订单列表对象的订单项数据\n                    if (itemByOrderIdMap.containsKey(newBeeMallOrderListVO.getOrderId())) {\n                        List<NewBeeMallOrderItem> orderItemListTemp = itemByOrderIdMap.get(newBeeMallOrderListVO.getOrderId());\n                        //将NewBeeMallOrderItem对象列表转换成NewBeeMallOrderItemVO对象列表\n                        List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS = BeanUtil.copyList(orderItemListTemp, NewBeeMallOrderItemVO.class);\n                        newBeeMallOrderListVO.setNewBeeMallOrderItemVOS(newBeeMallOrderItemVOS);\n                    }\n                }\n            }\n        }\n        PageResult pageResult = new PageResult(orderListVOS, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    @Transactional\n    public String cancelOrder(String orderNo, Long userId) {\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo);\n        if (newBeeMallOrder != null) {\n            //验证是否是当前userId下的订单，否则报错\n            if (!userId.equals(newBeeMallOrder.getUserId())) {\n                NewBeeMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult());\n            }\n            //订单状态判断\n            if (newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_SUCCESS.getOrderStatus()\n                    || newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_MALLUSER.getOrderStatus()\n                    || newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_EXPIRED.getOrderStatus()\n                    || newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_JUDGE.getOrderStatus()) {\n                return ServiceResultEnum.ORDER_STATUS_ERROR.getResult();\n            }\n            //修改订单状态&&恢复库存\n            if (newBeeMallOrderMapper.closeOrder(Collections.singletonList(newBeeMallOrder.getOrderId()), NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_MALLUSER.getOrderStatus()) > 0 && recoverStockNum(Collections.singletonList(newBeeMallOrder.getOrderId()))) {\n                return ServiceResultEnum.SUCCESS.getResult();\n            } else {\n                return ServiceResultEnum.DB_ERROR.getResult();\n            }\n        }\n        return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult();\n    }\n\n    @Override\n    public String finishOrder(String orderNo, Long userId) {\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo);\n        if (newBeeMallOrder != null) {\n            //验证是否是当前userId下的订单，否则报错\n            if (!userId.equals(newBeeMallOrder.getUserId())) {\n                return ServiceResultEnum.NO_PERMISSION_ERROR.getResult();\n            }\n            //订单状态判断 非出库状态下不进行修改操作\n            if (newBeeMallOrder.getOrderStatus().intValue() != NewBeeMallOrderStatusEnum.ORDER_EXPRESS.getOrderStatus()) {\n                return ServiceResultEnum.ORDER_STATUS_ERROR.getResult();\n            }\n            newBeeMallOrder.setOrderStatus((byte) NewBeeMallOrderStatusEnum.ORDER_SUCCESS.getOrderStatus());\n            newBeeMallOrder.setUpdateTime(new Date());\n            if (newBeeMallOrderMapper.updateByPrimaryKeySelective(newBeeMallOrder) > 0) {\n                return ServiceResultEnum.SUCCESS.getResult();\n            } else {\n                return ServiceResultEnum.DB_ERROR.getResult();\n            }\n        }\n        return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult();\n    }\n\n    @Override\n    public String paySuccess(String orderNo, int payType) {\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo);\n        if (newBeeMallOrder != null) {\n            //订单状态判断 非待支付状态下不进行修改操作\n            if (newBeeMallOrder.getOrderStatus().intValue() != NewBeeMallOrderStatusEnum.ORDER_PRE_PAY.getOrderStatus()) {\n                return ServiceResultEnum.ORDER_STATUS_ERROR.getResult();\n            }\n            newBeeMallOrder.setOrderStatus((byte) NewBeeMallOrderStatusEnum.ORDER_PAID.getOrderStatus());\n            newBeeMallOrder.setPayType((byte) payType);\n            newBeeMallOrder.setPayStatus((byte) PayStatusEnum.PAY_SUCCESS.getPayStatus());\n            newBeeMallOrder.setPayTime(new Date());\n            newBeeMallOrder.setUpdateTime(new Date());\n            if (newBeeMallOrderMapper.updateByPrimaryKeySelective(newBeeMallOrder) > 0) {\n                return ServiceResultEnum.SUCCESS.getResult();\n            } else {\n                return ServiceResultEnum.DB_ERROR.getResult();\n            }\n        }\n        return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult();\n    }\n\n    @Override\n    public List<NewBeeMallOrderItemVO> getOrderItems(Long id) {\n        NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByPrimaryKey(id);\n        if (newBeeMallOrder != null) {\n            List<NewBeeMallOrderItem> orderItems = newBeeMallOrderItemMapper.selectByOrderId(newBeeMallOrder.getOrderId());\n            //获取订单项数据\n            if (!CollectionUtils.isEmpty(orderItems)) {\n                List<NewBeeMallOrderItemVO> newBeeMallOrderItemVOS = BeanUtil.copyList(orderItems, NewBeeMallOrderItemVO.class);\n                return newBeeMallOrderItemVOS;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 恢复库存\n     * @param orderIds\n     * @return\n     */\n    public Boolean recoverStockNum(List<Long> orderIds) {\n        //查询对应的订单项\n        List<NewBeeMallOrderItem> newBeeMallOrderItems = newBeeMallOrderItemMapper.selectByOrderIds(orderIds);\n        //获取对应的商品id和商品数量并赋值到StockNumDTO对象中\n        List<StockNumDTO> stockNumDTOS = BeanUtil.copyList(newBeeMallOrderItems, StockNumDTO.class);\n        //执行恢复库存的操作\n        int updateStockNumResult = newBeeMallGoodsMapper.recoverStockNum(stockNumDTOS);\n        if (updateStockNumResult < 1) {\n            NewBeeMallException.fail(ServiceResultEnum.CLOSE_ORDER_ERROR.getResult());\n            return false;\n        } else {\n            return true;\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallShoppingCartServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallShoppingCartItemVO;\nimport ltd.newbee.mall.dao.NewBeeMallGoodsMapper;\nimport ltd.newbee.mall.dao.NewBeeMallShoppingCartItemMapper;\nimport ltd.newbee.mall.entity.NewBeeMallGoods;\nimport ltd.newbee.mall.entity.NewBeeMallShoppingCartItem;\nimport ltd.newbee.mall.service.NewBeeMallShoppingCartService;\nimport ltd.newbee.mall.util.BeanUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.*;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\n\n@Service\npublic class NewBeeMallShoppingCartServiceImpl implements NewBeeMallShoppingCartService {\n\n    @Autowired\n    private NewBeeMallShoppingCartItemMapper newBeeMallShoppingCartItemMapper;\n\n    @Autowired\n    private NewBeeMallGoodsMapper newBeeMallGoodsMapper;\n\n    @Override\n    public String saveNewBeeMallCartItem(NewBeeMallShoppingCartItem newBeeMallShoppingCartItem) {\n        NewBeeMallShoppingCartItem temp = newBeeMallShoppingCartItemMapper.selectByUserIdAndGoodsId(newBeeMallShoppingCartItem.getUserId(), newBeeMallShoppingCartItem.getGoodsId());\n        if (temp != null) {\n            //已存在则修改该记录\n            temp.setGoodsCount(newBeeMallShoppingCartItem.getGoodsCount());\n            return updateNewBeeMallCartItem(temp);\n        }\n        NewBeeMallGoods newBeeMallGoods = newBeeMallGoodsMapper.selectByPrimaryKey(newBeeMallShoppingCartItem.getGoodsId());\n        //商品为空\n        if (newBeeMallGoods == null) {\n            return ServiceResultEnum.GOODS_NOT_EXIST.getResult();\n        }\n        int totalItem = newBeeMallShoppingCartItemMapper.selectCountByUserId(newBeeMallShoppingCartItem.getUserId()) + 1;\n        //超出单个商品的最大数量\n        if (newBeeMallShoppingCartItem.getGoodsCount() > Constants.SHOPPING_CART_ITEM_LIMIT_NUMBER) {\n            return ServiceResultEnum.SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR.getResult();\n        }\n        //超出最大数量\n        if (totalItem > Constants.SHOPPING_CART_ITEM_TOTAL_NUMBER) {\n            return ServiceResultEnum.SHOPPING_CART_ITEM_TOTAL_NUMBER_ERROR.getResult();\n        }\n        //保存记录\n        if (newBeeMallShoppingCartItemMapper.insertSelective(newBeeMallShoppingCartItem) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public String updateNewBeeMallCartItem(NewBeeMallShoppingCartItem newBeeMallShoppingCartItem) {\n        NewBeeMallShoppingCartItem newBeeMallShoppingCartItemUpdate = newBeeMallShoppingCartItemMapper.selectByPrimaryKey(newBeeMallShoppingCartItem.getCartItemId());\n        if (newBeeMallShoppingCartItemUpdate == null) {\n            return ServiceResultEnum.DATA_NOT_EXIST.getResult();\n        }\n        //超出单个商品的最大数量\n        if (newBeeMallShoppingCartItem.getGoodsCount() > Constants.SHOPPING_CART_ITEM_LIMIT_NUMBER) {\n            return ServiceResultEnum.SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR.getResult();\n        }\n        //当前登录账号的userId与待修改的cartItem中userId不同，返回错误\n        if (!newBeeMallShoppingCartItemUpdate.getUserId().equals(newBeeMallShoppingCartItem.getUserId())) {\n            return ServiceResultEnum.NO_PERMISSION_ERROR.getResult();\n        }\n        //数值相同，则不执行数据操作\n        if (newBeeMallShoppingCartItem.getGoodsCount().equals(newBeeMallShoppingCartItemUpdate.getGoodsCount())) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        newBeeMallShoppingCartItemUpdate.setGoodsCount(newBeeMallShoppingCartItem.getGoodsCount());\n        newBeeMallShoppingCartItemUpdate.setUpdateTime(new Date());\n        //修改记录\n        if (newBeeMallShoppingCartItemMapper.updateByPrimaryKeySelective(newBeeMallShoppingCartItemUpdate) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public NewBeeMallShoppingCartItem getNewBeeMallCartItemById(Long newBeeMallShoppingCartItemId) {\n        return newBeeMallShoppingCartItemMapper.selectByPrimaryKey(newBeeMallShoppingCartItemId);\n    }\n\n    @Override\n    public Boolean deleteById(Long shoppingCartItemId, Long userId) {\n        NewBeeMallShoppingCartItem newBeeMallShoppingCartItem = newBeeMallShoppingCartItemMapper.selectByPrimaryKey(shoppingCartItemId);\n        if (newBeeMallShoppingCartItem == null) {\n            return false;\n        }\n        //userId不同不能删除\n        if (!userId.equals(newBeeMallShoppingCartItem.getUserId())) {\n            return false;\n        }\n        return newBeeMallShoppingCartItemMapper.deleteByPrimaryKey(shoppingCartItemId) > 0;\n    }\n\n    @Override\n    public List<NewBeeMallShoppingCartItemVO> getMyShoppingCartItems(Long newBeeMallUserId) {\n        List<NewBeeMallShoppingCartItemVO> newBeeMallShoppingCartItemVOS = new ArrayList<>();\n        List<NewBeeMallShoppingCartItem> newBeeMallShoppingCartItems = newBeeMallShoppingCartItemMapper.selectByUserId(newBeeMallUserId, Constants.SHOPPING_CART_ITEM_TOTAL_NUMBER);\n        if (!CollectionUtils.isEmpty(newBeeMallShoppingCartItems)) {\n            //查询商品信息并做数据转换\n            List<Long> newBeeMallGoodsIds = newBeeMallShoppingCartItems.stream().map(NewBeeMallShoppingCartItem::getGoodsId).collect(Collectors.toList());\n            List<NewBeeMallGoods> newBeeMallGoods = newBeeMallGoodsMapper.selectByPrimaryKeys(newBeeMallGoodsIds);\n            Map<Long, NewBeeMallGoods> newBeeMallGoodsMap = new HashMap<>();\n            if (!CollectionUtils.isEmpty(newBeeMallGoods)) {\n                newBeeMallGoodsMap = newBeeMallGoods.stream().collect(Collectors.toMap(NewBeeMallGoods::getGoodsId, Function.identity(), (entity1, entity2) -> entity1));\n            }\n            for (NewBeeMallShoppingCartItem newBeeMallShoppingCartItem : newBeeMallShoppingCartItems) {\n                NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO = new NewBeeMallShoppingCartItemVO();\n                BeanUtil.copyProperties(newBeeMallShoppingCartItem, newBeeMallShoppingCartItemVO);\n                if (newBeeMallGoodsMap.containsKey(newBeeMallShoppingCartItem.getGoodsId())) {\n                    NewBeeMallGoods newBeeMallGoodsTemp = newBeeMallGoodsMap.get(newBeeMallShoppingCartItem.getGoodsId());\n                    newBeeMallShoppingCartItemVO.setGoodsCoverImg(newBeeMallGoodsTemp.getGoodsCoverImg());\n                    String goodsName = newBeeMallGoodsTemp.getGoodsName();\n                    // 字符串过长导致文字超出的问题\n                    if (goodsName.length() > 28) {\n                        goodsName = goodsName.substring(0, 28) + \"...\";\n                    }\n                    newBeeMallShoppingCartItemVO.setGoodsName(goodsName);\n                    newBeeMallShoppingCartItemVO.setSellingPrice(newBeeMallGoodsTemp.getSellingPrice());\n                    newBeeMallShoppingCartItemVOS.add(newBeeMallShoppingCartItemVO);\n                }\n            }\n        }\n        return newBeeMallShoppingCartItemVOS;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/service/impl/NewBeeMallUserServiceImpl.java",
    "content": "/**\n * 严肃声明：\n * 开源版本请务必保留此注释头信息，若删除我方将保留所有法律责任追究！\n * 本系统已申请软件著作权，受国家版权局知识产权以及国家计算机软件著作权保护！\n * 可正常分享和学习源码，不得用于违法犯罪活动，违者必究！\n * Copyright (c) 2019-2020 十三 all rights reserved.\n * 版权所有，侵权必究！\n */\npackage ltd.newbee.mall.service.impl;\n\nimport ltd.newbee.mall.common.Constants;\nimport ltd.newbee.mall.common.ServiceResultEnum;\nimport ltd.newbee.mall.controller.vo.NewBeeMallUserVO;\nimport ltd.newbee.mall.dao.MallUserMapper;\nimport ltd.newbee.mall.entity.MallUser;\nimport ltd.newbee.mall.service.NewBeeMallUserService;\nimport ltd.newbee.mall.util.*;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.StringUtils;\n\nimport javax.servlet.http.HttpSession;\nimport java.util.List;\n\n@Service\npublic class NewBeeMallUserServiceImpl implements NewBeeMallUserService {\n\n    @Autowired\n    private MallUserMapper mallUserMapper;\n\n    @Override\n    public PageResult getNewBeeMallUsersPage(PageQueryUtil pageUtil) {\n        List<MallUser> mallUsers = mallUserMapper.findMallUserList(pageUtil);\n        int total = mallUserMapper.getTotalMallUsers(pageUtil);\n        PageResult pageResult = new PageResult(mallUsers, total, pageUtil.getLimit(), pageUtil.getPage());\n        return pageResult;\n    }\n\n    @Override\n    public String register(String loginName, String password) {\n        if (mallUserMapper.selectByLoginName(loginName) != null) {\n            return ServiceResultEnum.SAME_LOGIN_NAME_EXIST.getResult();\n        }\n        MallUser registerUser = new MallUser();\n        registerUser.setLoginName(loginName);\n        registerUser.setNickName(loginName);\n        String passwordMD5 = MD5Util.MD5Encode(password, \"UTF-8\");\n        registerUser.setPasswordMd5(passwordMD5);\n        if (mallUserMapper.insertSelective(registerUser) > 0) {\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.DB_ERROR.getResult();\n    }\n\n    @Override\n    public String login(String loginName, String passwordMD5, HttpSession httpSession) {\n        MallUser user = mallUserMapper.selectByLoginNameAndPasswd(loginName, passwordMD5);\n        if (user != null && httpSession != null) {\n            if (user.getLockedFlag() == 1) {\n                return ServiceResultEnum.LOGIN_USER_LOCKED.getResult();\n            }\n            //昵称太长 影响页面展示\n            if (user.getNickName() != null && user.getNickName().length() > 7) {\n                String tempNickName = user.getNickName().substring(0, 7) + \"..\";\n                user.setNickName(tempNickName);\n            }\n            NewBeeMallUserVO newBeeMallUserVO = new NewBeeMallUserVO();\n            BeanUtil.copyProperties(user, newBeeMallUserVO);\n            //设置购物车中的数量\n            httpSession.setAttribute(Constants.MALL_USER_SESSION_KEY, newBeeMallUserVO);\n            return ServiceResultEnum.SUCCESS.getResult();\n        }\n        return ServiceResultEnum.LOGIN_ERROR.getResult();\n    }\n\n    @Override\n    public NewBeeMallUserVO updateUserInfo(MallUser mallUser, HttpSession httpSession) {\n        NewBeeMallUserVO userTemp = (NewBeeMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);\n        MallUser userFromDB = mallUserMapper.selectByPrimaryKey(userTemp.getUserId());\n        if (userFromDB != null) {\n            if (StringUtils.hasText(mallUser.getNickName())) {\n                userFromDB.setNickName(NewBeeMallUtils.cleanString(mallUser.getNickName()));\n            }\n            if (StringUtils.hasText(mallUser.getAddress())) {\n                userFromDB.setAddress(NewBeeMallUtils.cleanString(mallUser.getAddress()));\n            }\n            if (StringUtils.hasText(mallUser.getIntroduceSign())) {\n                userFromDB.setIntroduceSign(NewBeeMallUtils.cleanString(mallUser.getIntroduceSign()));\n            }\n            if (mallUserMapper.updateByPrimaryKeySelective(userFromDB) > 0) {\n                NewBeeMallUserVO newBeeMallUserVO = new NewBeeMallUserVO();\n                BeanUtil.copyProperties(userFromDB, newBeeMallUserVO);\n                httpSession.setAttribute(Constants.MALL_USER_SESSION_KEY, newBeeMallUserVO);\n                return newBeeMallUserVO;\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public Boolean lockUsers(Integer[] ids, int lockStatus) {\n        if (ids.length < 1) {\n            return false;\n        }\n        return mallUserMapper.lockUserBatch(ids, lockStatus) > 0;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/BeanUtil.java",
    "content": "package ltd.newbee.mall.util;\n\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.BeanWrapper;\nimport org.springframework.beans.BeanWrapperImpl;\nimport org.springframework.beans.PropertyAccessorFactory;\n\nimport java.beans.PropertyDescriptor;\nimport java.lang.reflect.Field;\nimport java.util.*;\n\npublic abstract class BeanUtil {\n\n    public static Object copyProperties(Object source, Object target, String... ignoreProperties) {\n        if (source == null) {\n            return target;\n        }\n        BeanUtils.copyProperties(source, target, ignoreProperties);\n        return target;\n    }\n\n    public static <T> List<T> copyList(List sources, Class<T> clazz) {\n        return copyList(sources, clazz, null);\n    }\n\n    public static <T> List<T> copyList(List sources, Class<T> clazz, Callback<T> callback) {\n        List<T> targetList = new ArrayList<>();\n        if (sources != null) {\n            try {\n                for (Object source : sources) {\n                    T target = clazz.newInstance();\n                    copyProperties(source, target);\n                    if (callback != null) {\n                        callback.set(source, target);\n                    }\n                    targetList.add(target);\n                }\n            } catch (InstantiationException e) {\n                e.printStackTrace();\n            } catch (IllegalAccessException e) {\n                e.printStackTrace();\n            }\n        }\n        return targetList;\n    }\n\n    public static Map<String, Object> toMap(Object bean, String... ignoreProperties) {\n        Map<String, Object> map = new LinkedHashMap<>();\n        List<String> ignoreList = new ArrayList<>(Arrays.asList(ignoreProperties));\n        ignoreList.add(\"class\");\n        BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean);\n        for (PropertyDescriptor pd : beanWrapper.getPropertyDescriptors()) {\n            if (!ignoreList.contains(pd.getName()) && beanWrapper.isReadableProperty(pd.getName())) {\n                Object propertyValue = beanWrapper.getPropertyValue(pd.getName());\n                map.put(pd.getName(), propertyValue);\n            }\n        }\n        return map;\n    }\n\n    public static <T> T toBean(Map<String, Object> map, Class<T> beanType) {\n        BeanWrapper beanWrapper = new BeanWrapperImpl(beanType);\n        map.forEach((key, value) -> {\n            if (beanWrapper.isWritableProperty(key)) {\n                beanWrapper.setPropertyValue(key, value);\n            }\n        });\n        return (T) beanWrapper.getWrappedInstance();\n    }\n\n    public static interface Callback<T> {\n        void set(Object source, T target);\n    }\n\n    //检查Pojo对象是否有null字段\n    public static boolean checkPojoNullField(Object o, Class<?> clz) {\n        try {\n            Field[] fields = clz.getDeclaredFields();\n            for (Field field : fields) {\n                field.setAccessible(true);\n                if (field.get(o) == null) {\n                    return false;\n                }\n            }\n            if (clz.getSuperclass() != Object.class) {\n                return checkPojoNullField(o, clz.getSuperclass());\n            }\n            return true;\n        } catch (IllegalAccessException e) {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/JsonUtil.java",
    "content": "package ltd.newbee.mall.util;\n\n\nimport java.io.IOException;\n\nimport com.fasterxml.jackson.core.JsonParseException;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.JsonMappingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\n/**\n * 操作json的封装方法\n * use:jackson\n */\npublic class JsonUtil {\n    /*\n     * 001.json转换成对象\n     * @param:传入对象，json字符串\n     * @return:Object\n     */\n    public static Object jsonToObj(Class objClass, String jsonStr) throws JsonParseException, JsonMappingException, IOException {\n        ObjectMapper mapper = new ObjectMapper();\n        return mapper.readValue(jsonStr, objClass);\n    }\n\n    /*\n     * 002.对象转换成json\n     * @param:传入对象\n     * @return:json字符串\n     */\n    public static String objToJson(Object obj) throws JsonProcessingException {\n        ObjectMapper mapper = new ObjectMapper();\n        return mapper.writeValueAsString(obj);\n    }\n}"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/MD5Util.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.security.MessageDigest;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class MD5Util {\n\n    private static String byteArrayToHexString(byte b[]) {\n        StringBuffer resultSb = new StringBuffer();\n        for (int i = 0; i < b.length; i++)\n            resultSb.append(byteToHexString(b[i]));\n\n        return resultSb.toString();\n    }\n\n    private static String byteToHexString(byte b) {\n        int n = b;\n        if (n < 0)\n            n += 256;\n        int d1 = n / 16;\n        int d2 = n % 16;\n        return hexDigits[d1] + hexDigits[d2];\n    }\n\n    public static String MD5Encode(String origin, String charsetname) {\n        String resultString = null;\n        try {\n            resultString = new String(origin);\n            MessageDigest md = MessageDigest.getInstance(\"MD5\");\n            if (charsetname == null || \"\".equals(charsetname))\n                resultString = byteArrayToHexString(md.digest(resultString\n                        .getBytes()));\n            else\n                resultString = byteArrayToHexString(md.digest(resultString\n                        .getBytes(charsetname)));\n        } catch (Exception exception) {\n        }\n        return resultString;\n    }\n\n    private static final String hexDigits[] = {\"0\", \"1\", \"2\", \"3\", \"4\", \"5\",\n            \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"};\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/NewBeeMallUtils.java",
    "content": "package ltd.newbee.mall.util;\n\nimport org.springframework.util.StringUtils;\n\nimport java.net.URI;\n\n/**\n * @author 13\n */\npublic class NewBeeMallUtils {\n\n    public static URI getHost(URI uri) {\n        URI effectiveURI = null;\n        try {\n            effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null);\n        } catch (Throwable var4) {\n            effectiveURI = null;\n        }\n        return effectiveURI;\n    }\n\n    public static String cleanString(String value) {\n        if (!StringUtils.hasText(value)) {\n            return \"\";\n        }\n        value = value.toLowerCase();\n        value = value.replaceAll(\"<\", \"& lt;\").replaceAll(\">\", \"& gt;\");\n        value = value.replaceAll(\"\\\\(\", \"& #40;\").replaceAll(\"\\\\)\", \"& #41;\");\n        value = value.replaceAll(\"'\", \"& #39;\");\n        value = value.replaceAll(\"onload\", \"0nl0ad\");\n        value = value.replaceAll(\"xml\", \"xm1\");\n        value = value.replaceAll(\"window\", \"wind0w\");\n        value = value.replaceAll(\"click\", \"cl1ck\");\n        value = value.replaceAll(\"var\", \"v0r\");\n        value = value.replaceAll(\"let\", \"1et\");\n        value = value.replaceAll(\"function\", \"functi0n\");\n        value = value.replaceAll(\"return\", \"retu1n\");\n        value = value.replaceAll(\"$\", \"\");\n        value = value.replaceAll(\"document\", \"d0cument\");\n        value = value.replaceAll(\"const\", \"c0nst\");\n        value = value.replaceAll(\"eval\\\\((.*)\\\\)\", \"\");\n        value = value.replaceAll(\"[\\\\\\\"\\\\\\'][\\\\s]*javascript:(.*)[\\\\\\\"\\\\\\']\", \"\\\"\\\"\");\n        value = value.replaceAll(\"script\", \"scr1pt\");\n        value = value.replaceAll(\"insert\", \"1nsert\");\n        value = value.replaceAll(\"drop\", \"dr0p\");\n        value = value.replaceAll(\"create\", \"cre0ate\");\n        value = value.replaceAll(\"update\", \"upd0ate\");\n        value = value.replaceAll(\"alter\", \"a1ter\");\n        value = value.replaceAll(\"from\", \"fr0m\");\n        value = value.replaceAll(\"where\", \"wh1re\");\n        value = value.replaceAll(\"database\", \"data1base\");\n        value = value.replaceAll(\"table\", \"tab1e\");\n        value = value.replaceAll(\"tb\", \"tb0\");\n        return value;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/NumberUtil.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class NumberUtil {\n\n    private NumberUtil() {\n    }\n\n\n    /**\n     * 判断是否为11位电话号码\n     *\n     * @param phone\n     * @return\n     */\n    public static boolean isPhone(String phone) {\n        Pattern pattern = Pattern.compile(\"^((13[0-9])|(14[5,7])|(15[^4,\\\\D])|(17[0-8])|(18[0-9]))\\\\d{8}$\");\n        Matcher matcher = pattern.matcher(phone);\n        return matcher.matches();\n    }\n\n    /**\n     * 生成指定长度的随机数\n     *\n     * @param length\n     * @return\n     */\n    public static int genRandomNum(int length) {\n        int num = 1;\n        double random = Math.random();\n        if (random < 0.1) {\n            random = random + 0.1;\n        }\n        for (int i = 0; i < length; i++) {\n            num = num * 10;\n        }\n        return (int) ((random * num));\n    }\n\n    /**\n     * 生成订单流水号\n     *\n     * @return\n     */\n    public static String genOrderNo() {\n        StringBuffer buffer = new StringBuffer(String.valueOf(System.currentTimeMillis()));\n        int num = genRandomNum(4);\n        buffer.append(num);\n        return buffer.toString();\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/PageQueryUtil.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * 分页查询参数\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class PageQueryUtil extends LinkedHashMap<String, Object> {\n    //当前页码\n    private int page;\n    //每页条数\n    private int limit;\n\n    public PageQueryUtil(Map<String, Object> params) {\n        this.putAll(params);\n\n        //分页参数\n        this.page = Integer.parseInt(params.get(\"page\").toString());\n        this.limit = Integer.parseInt(params.get(\"limit\").toString());\n        this.put(\"start\", (page - 1) * limit);\n        this.put(\"page\", page);\n        this.put(\"limit\", limit);\n    }\n\n\n    public int getPage() {\n        return page;\n    }\n\n    public void setPage(int page) {\n        this.page = page;\n    }\n\n    public int getLimit() {\n        return limit;\n    }\n\n    public void setLimit(int limit) {\n        this.limit = limit;\n    }\n\n    @Override\n    public String toString() {\n        return \"PageUtil{\" +\n                \"page=\" + page +\n                \", limit=\" + limit +\n                '}';\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/PageResult.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 分页工具类\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class PageResult implements Serializable {\n\n    //总记录数\n    private int totalCount;\n    //每页记录数\n    private int pageSize;\n    //总页数\n    private int totalPage;\n    //当前页数\n    private int currPage;\n    //列表数据\n    private List<?> list;\n\n    /**\n     * 分页\n     *\n     * @param list       列表数据\n     * @param totalCount 总记录数\n     * @param pageSize   每页记录数\n     * @param currPage   当前页数\n     */\n    public PageResult(List<?> list, int totalCount, int pageSize, int currPage) {\n        this.list = list;\n        this.totalCount = totalCount;\n        this.pageSize = pageSize;\n        this.currPage = currPage;\n        this.totalPage = (int) Math.ceil((double) totalCount / pageSize);\n    }\n\n    public int getTotalCount() {\n        return totalCount;\n    }\n\n    public void setTotalCount(int totalCount) {\n        this.totalCount = totalCount;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n\n    public int getTotalPage() {\n        return totalPage;\n    }\n\n    public void setTotalPage(int totalPage) {\n        this.totalPage = totalPage;\n    }\n\n    public int getCurrPage() {\n        return currPage;\n    }\n\n    public void setCurrPage(int currPage) {\n        this.currPage = currPage;\n    }\n\n    public List<?> getList() {\n        return list;\n    }\n\n    public void setList(List<?> list) {\n        this.list = list;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/PatternUtil.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * 正则工具类\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class PatternUtil {\n\n    /**\n     * 匹配邮箱正则\n     */\n    private static final Pattern VALID_EMAIL_ADDRESS_REGEX =\n            Pattern.compile(\"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\\\.[A-Z]{2,6}$\", Pattern.CASE_INSENSITIVE);\n\n    /**\n     * 验证只包含中英文和数字的字符串\n     *\n     * @param keyword\n     * @return\n     */\n    public static Boolean validKeyword(String keyword) {\n        String regex = \"^[a-zA-Z0-9\\u4E00-\\u9FA5]+$\";\n        Pattern pattern = Pattern.compile(regex);\n        Matcher match = pattern.matcher(keyword);\n        return match.matches();\n    }\n\n\n    /**\n     * 判断是否是邮箱\n     *\n     * @param emailStr\n     * @return\n     */\n    public static boolean isEmail(String emailStr) {\n        Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(emailStr);\n        return matcher.find();\n    }\n\n    /**\n     * 判断是否是网址\n     *\n     * @param urlString\n     * @return\n     */\n    public static boolean isURL(String urlString) {\n        String regex = \"^([hH][tT]{2}[pP]:/*|[hH][tT]{2}[pP][sS]:/*|[fF][tT][pP]:/*)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+(\\\\?{0,1}(([A-Za-z0-9-~]+\\\\={0,1})([A-Za-z0-9-~]*)\\\\&{0,1})*)$\";\n        Pattern pattern = Pattern.compile(regex);\n        if (pattern.matcher(urlString).matches()) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/Result.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.io.Serializable;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class Result<T> implements Serializable {\n    private static final long serialVersionUID = 1L;\n    private int resultCode;\n    private String message;\n    private T data;\n\n    public Result() {\n    }\n\n    public Result(int resultCode, String message) {\n        this.resultCode = resultCode;\n        this.message = message;\n    }\n\n    public int getResultCode() {\n        return resultCode;\n    }\n\n    public void setResultCode(int resultCode) {\n        this.resultCode = resultCode;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"Result{\" +\n                \"resultCode=\" + resultCode +\n                \", message='\" + message + '\\'' +\n                \", data=\" + data +\n                '}';\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/ResultGenerator.java",
    "content": "package ltd.newbee.mall.util;\n\nimport org.springframework.util.StringUtils;\n\n/**\n * 响应结果生成工具\n *\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class ResultGenerator {\n    private static final String DEFAULT_SUCCESS_MESSAGE = \"SUCCESS\";\n    private static final String DEFAULT_FAIL_MESSAGE = \"FAIL\";\n    private static final int RESULT_CODE_SUCCESS = 200;\n    private static final int RESULT_CODE_SERVER_ERROR = 500;\n\n    public static Result genSuccessResult() {\n        Result result = new Result();\n        result.setResultCode(RESULT_CODE_SUCCESS);\n        result.setMessage(DEFAULT_SUCCESS_MESSAGE);\n        return result;\n    }\n\n    public static Result genSuccessResult(String message) {\n        Result result = new Result();\n        result.setResultCode(RESULT_CODE_SUCCESS);\n        result.setMessage(message);\n        return result;\n    }\n\n    public static Result genSuccessResult(Object data) {\n        Result result = new Result();\n        result.setResultCode(RESULT_CODE_SUCCESS);\n        result.setMessage(DEFAULT_SUCCESS_MESSAGE);\n        result.setData(data);\n        return result;\n    }\n\n    public static Result genFailResult(String message) {\n        Result result = new Result();\n        result.setResultCode(RESULT_CODE_SERVER_ERROR);\n        if (!StringUtils.hasText(message)) {\n            result.setMessage(DEFAULT_FAIL_MESSAGE);\n        } else {\n            result.setMessage(message);\n        }\n        return result;\n    }\n\n    public static Result genErrorResult(int code, String message) {\n        Result result = new Result();\n        result.setResultCode(code);\n        result.setMessage(message);\n        return result;\n    }\n}\n"
  },
  {
    "path": "src/main/java/ltd/newbee/mall/util/SystemUtil.java",
    "content": "package ltd.newbee.mall.util;\n\nimport java.math.BigInteger;\nimport java.security.MessageDigest;\n\n/**\n * @author 13\n * @qq交流群 796794009\n * @email 2449207463@qq.com\n * @link https://github.com/newbee-ltd\n */\npublic class SystemUtil {\n\n    private SystemUtil() {\n    }\n\n\n    /**\n     * 登录或注册成功后,生成保持用户登录状态会话token值\n     *\n     * @param src:为用户最新一次登录时的now()+user.id+random(4)\n     * @return\n     */\n    public static String genToken(String src) {\n        if (null == src || \"\".equals(src)) {\n            return null;\n        }\n        try {\n            MessageDigest md = MessageDigest.getInstance(\"MD5\");\n            md.update(src.getBytes());\n            String result = new BigInteger(1, md.digest()).toString(16);\n            if (result.length() == 31) {\n                result = result + \"-\";\n            }\n            System.out.println(result);\n            return result;\n        } catch (Exception e) {\n            return null;\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/main/resources/application.properties",
    "content": "# author 13\n# qq-group 796794009\n# email 2449207463@qq.com\n# link https://github.com/newbee-ltd\n\nserver.port=28089\nspring.thymeleaf.cache=false\nspring.datasource.name=newbee-mall-datasource\nspring.datasource.driverClassName=com.mysql.cj.jdbc.Driver\nspring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true\nspring.datasource.username=root\nspring.datasource.password=123456\nspring.datasource.hikari.minimum-idle=5\nspring.datasource.hikari.maximum-pool-size=15\nspring.datasource.hikari.auto-commit=true\nspring.datasource.hikari.idle-timeout=10000\nspring.datasource.hikari.pool-name=hikariCP\nspring.datasource.hikari.max-lifetime=30000\nspring.datasource.hikari.connection-timeout=30000\nspring.datasource.hikari.connection-test-query=SELECT 1\n# mybatis config\nmybatis.mapper-locations=classpath:mapper/*Mapper.xml"
  },
  {
    "path": "src/main/resources/mapper/AdminUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.AdminUserMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.AdminUser\">\n    <id column=\"admin_user_id\" jdbcType=\"INTEGER\" property=\"adminUserId\" />\n    <result column=\"login_user_name\" jdbcType=\"VARCHAR\" property=\"loginUserName\" />\n    <result column=\"login_password\" jdbcType=\"VARCHAR\" property=\"loginPassword\" />\n    <result column=\"nick_name\" jdbcType=\"VARCHAR\" property=\"nickName\" />\n    <result column=\"locked\" jdbcType=\"TINYINT\" property=\"locked\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    admin_user_id, login_user_name, login_password, nick_name, locked\n  </sql>\n\n  <select id=\"login\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from tb_newbee_mall_admin_user\n    where login_user_name = #{userName,jdbcType=VARCHAR} AND login_password=#{password,jdbcType=VARCHAR} AND locked = 0\n  </select>\n\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from tb_newbee_mall_admin_user\n    where admin_user_id = #{adminUserId,jdbcType=INTEGER}\n  </select>\n  <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.AdminUser\">\n    insert into tb_newbee_mall_admin_user (admin_user_id, login_user_name, login_password,\n      nick_name, locked)\n    values (#{adminUserId,jdbcType=INTEGER}, #{loginUserName,jdbcType=VARCHAR}, #{loginPassword,jdbcType=VARCHAR},\n      #{nickName,jdbcType=VARCHAR}, #{locked,jdbcType=TINYINT})\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.AdminUser\">\n    insert into tb_newbee_mall_admin_user\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"adminUserId != null\">\n        admin_user_id,\n      </if>\n      <if test=\"loginUserName != null\">\n        login_user_name,\n      </if>\n      <if test=\"loginPassword != null\">\n        login_password,\n      </if>\n      <if test=\"nickName != null\">\n        nick_name,\n      </if>\n      <if test=\"locked != null\">\n        locked,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"adminUserId != null\">\n        #{adminUserId,jdbcType=INTEGER},\n      </if>\n      <if test=\"loginUserName != null\">\n        #{loginUserName,jdbcType=VARCHAR},\n      </if>\n      <if test=\"loginPassword != null\">\n        #{loginPassword,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nickName != null\">\n        #{nickName,jdbcType=VARCHAR},\n      </if>\n      <if test=\"locked != null\">\n        #{locked,jdbcType=TINYINT},\n      </if>\n    </trim>\n  </insert>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.AdminUser\">\n    update tb_newbee_mall_admin_user\n    <set>\n      <if test=\"loginUserName != null\">\n        login_user_name = #{loginUserName,jdbcType=VARCHAR},\n      </if>\n      <if test=\"loginPassword != null\">\n        login_password = #{loginPassword,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nickName != null\">\n        nick_name = #{nickName,jdbcType=VARCHAR},\n      </if>\n      <if test=\"locked != null\">\n        locked = #{locked,jdbcType=TINYINT},\n      </if>\n    </set>\n    where admin_user_id = #{adminUserId,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.AdminUser\">\n    update tb_newbee_mall_admin_user\n    set login_user_name = #{loginUserName,jdbcType=VARCHAR},\n      login_password = #{loginPassword,jdbcType=VARCHAR},\n      nick_name = #{nickName,jdbcType=VARCHAR},\n      locked = #{locked,jdbcType=TINYINT}\n    where admin_user_id = #{adminUserId,jdbcType=INTEGER}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/CarouselMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.CarouselMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.Carousel\">\n        <id column=\"carousel_id\" jdbcType=\"INTEGER\" property=\"carouselId\"/>\n        <result column=\"carousel_url\" jdbcType=\"VARCHAR\" property=\"carouselUrl\"/>\n        <result column=\"redirect_url\" jdbcType=\"VARCHAR\" property=\"redirectUrl\"/>\n        <result column=\"carousel_rank\" jdbcType=\"INTEGER\" property=\"carouselRank\"/>\n        <result column=\"is_deleted\" jdbcType=\"TINYINT\" property=\"isDeleted\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"create_user\" jdbcType=\"INTEGER\" property=\"createUser\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n        <result column=\"update_user\" jdbcType=\"INTEGER\" property=\"updateUser\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    carousel_id, carousel_url, redirect_url, carousel_rank, is_deleted, create_time, \n    create_user, update_time, update_user\n  </sql>\n    <select id=\"findCarouselList\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_carousel\n        where is_deleted = 0\n        order by carousel_rank desc\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n    <select id=\"getTotalCarousels\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_carousel\n        where is_deleted = 0\n    </select>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_carousel\n        where carousel_id = #{carouselId,jdbcType=INTEGER}\n    </select>\n    <select id=\"findCarouselsByNum\" parameterType=\"int\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_carousel\n        where is_deleted = 0\n        order by carousel_rank desc\n        limit #{number}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from tb_newbee_mall_carousel\n    where carousel_id = #{carouselId,jdbcType=INTEGER}\n  </delete>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.Carousel\">\n    insert into tb_newbee_mall_carousel (carousel_id, carousel_url, redirect_url, \n      carousel_rank, is_deleted, create_time, \n      create_user, update_time, update_user\n      )\n    values (#{carouselId,jdbcType=INTEGER}, #{carouselUrl,jdbcType=VARCHAR}, #{redirectUrl,jdbcType=VARCHAR}, \n      #{carouselRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, \n      #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.Carousel\">\n        insert into tb_newbee_mall_carousel\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"carouselId != null\">\n                carousel_id,\n            </if>\n            <if test=\"carouselUrl != null\">\n                carousel_url,\n            </if>\n            <if test=\"redirectUrl != null\">\n                redirect_url,\n            </if>\n            <if test=\"carouselRank != null\">\n                carousel_rank,\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"createUser != null\">\n                create_user,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"updateUser != null\">\n                update_user,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"carouselId != null\">\n                #{carouselId,jdbcType=INTEGER},\n            </if>\n            <if test=\"carouselUrl != null\">\n                #{carouselUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"redirectUrl != null\">\n                #{redirectUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"carouselRank != null\">\n                #{carouselRank,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"createUser != null\">\n                #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                #{updateUser,jdbcType=INTEGER},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.Carousel\">\n        update tb_newbee_mall_carousel\n        <set>\n            <if test=\"carouselUrl != null\">\n                carousel_url = #{carouselUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"redirectUrl != null\">\n                redirect_url = #{redirectUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"carouselRank != null\">\n                carousel_rank = #{carouselRank,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted = #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"createUser != null\">\n                create_user = #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                update_user = #{updateUser,jdbcType=INTEGER},\n            </if>\n        </set>\n        where carousel_id = #{carouselId,jdbcType=INTEGER}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.Carousel\">\n    update tb_newbee_mall_carousel\n    set carousel_url = #{carouselUrl,jdbcType=VARCHAR},\n      redirect_url = #{redirectUrl,jdbcType=VARCHAR},\n      carousel_rank = #{carouselRank,jdbcType=INTEGER},\n      is_deleted = #{isDeleted,jdbcType=TINYINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      create_user = #{createUser,jdbcType=INTEGER},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      update_user = #{updateUser,jdbcType=INTEGER}\n    where carousel_id = #{carouselId,jdbcType=INTEGER}\n  </update>\n    <update id=\"deleteBatch\">\n        update tb_newbee_mall_carousel\n        set is_deleted=1,update_time=now() where carousel_id in\n        <foreach item=\"id\" collection=\"array\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/GoodsCategoryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.GoodsCategoryMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.GoodsCategory\">\n        <id column=\"category_id\" jdbcType=\"BIGINT\" property=\"categoryId\"/>\n        <result column=\"category_level\" jdbcType=\"TINYINT\" property=\"categoryLevel\"/>\n        <result column=\"parent_id\" jdbcType=\"BIGINT\" property=\"parentId\"/>\n        <result column=\"category_name\" jdbcType=\"VARCHAR\" property=\"categoryName\"/>\n        <result column=\"category_rank\" jdbcType=\"INTEGER\" property=\"categoryRank\"/>\n        <result column=\"is_deleted\" jdbcType=\"TINYINT\" property=\"isDeleted\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"create_user\" jdbcType=\"INTEGER\" property=\"createUser\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n        <result column=\"update_user\" jdbcType=\"INTEGER\" property=\"updateUser\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    category_id, category_level, parent_id, category_name, category_rank, is_deleted, \n    create_time, create_user, update_time, update_user\n  </sql>\n    <select id=\"findGoodsCategoryList\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_category\n        <where>\n            <if test=\"categoryLevel!=null and categoryLevel!=''\">\n                and category_level = #{categoryLevel}\n            </if>\n            <if test=\"parentId!=null and parentId!=''\">\n                and parent_id = #{parentId}\n            </if>\n            and is_deleted = 0\n        </where>\n        order by category_rank desc\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n    <select id=\"getTotalGoodsCategories\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_goods_category\n        <where>\n            <if test=\"categoryLevel!=null and categoryLevel!=''\">\n                and category_level = #{categoryLevel}\n            </if>\n            <if test=\"parentId!=null and parentId!=''\">\n                and parent_id = #{parentId}\n            </if>\n            and is_deleted = 0\n        </where>\n    </select>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_category\n        where category_id = #{categoryId,jdbcType=BIGINT} and is_deleted=0\n    </select>\n    <select id=\"selectByLevelAndName\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_category\n        where category_name = #{categoryName,jdbcType=VARCHAR} and category_level = #{categoryLevel,jdbcType=TINYINT}\n        and is_deleted = 0 limit 1\n    </select>\n    <select id=\"selectByLevelAndParentIdsAndNumber\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_category\n        where parent_id in\n        <foreach item=\"parentId\" collection=\"parentIds\" open=\"(\" separator=\",\" close=\")\">\n            #{parentId,jdbcType=BIGINT}\n        </foreach>\n        and category_level = #{categoryLevel,jdbcType=TINYINT}\n        and is_deleted = 0\n        order by category_rank desc\n        <if test=\"number>0\">\n            limit #{number}\n        </if>\n    </select>\n    <update id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update tb_newbee_mall_goods_category set is_deleted=1\n    where category_id = #{categoryId,jdbcType=BIGINT} and is_deleted=0\n  </update>\n    <update id=\"deleteBatch\">\n        update tb_newbee_mall_goods_category\n        set is_deleted=1 where category_id in\n        <foreach item=\"id\" collection=\"array\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.GoodsCategory\">\n    insert into tb_newbee_mall_goods_category (category_id, category_level, parent_id, \n      category_name, category_rank, is_deleted, \n      create_time, create_user, update_time, \n      update_user)\n    values (#{categoryId,jdbcType=BIGINT}, #{categoryLevel,jdbcType=TINYINT}, #{parentId,jdbcType=BIGINT}, \n      #{categoryName,jdbcType=VARCHAR}, #{categoryRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, \n      #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, \n      #{updateUser,jdbcType=INTEGER})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.GoodsCategory\">\n        insert into tb_newbee_mall_goods_category\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"categoryId != null\">\n                category_id,\n            </if>\n            <if test=\"categoryLevel != null\">\n                category_level,\n            </if>\n            <if test=\"parentId != null\">\n                parent_id,\n            </if>\n            <if test=\"categoryName != null\">\n                category_name,\n            </if>\n            <if test=\"categoryRank != null\">\n                category_rank,\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"createUser != null\">\n                create_user,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"updateUser != null\">\n                update_user,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"categoryId != null\">\n                #{categoryId,jdbcType=BIGINT},\n            </if>\n            <if test=\"categoryLevel != null\">\n                #{categoryLevel,jdbcType=TINYINT},\n            </if>\n            <if test=\"parentId != null\">\n                #{parentId,jdbcType=BIGINT},\n            </if>\n            <if test=\"categoryName != null\">\n                #{categoryName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"categoryRank != null\">\n                #{categoryRank,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"createUser != null\">\n                #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                #{updateUser,jdbcType=INTEGER},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.GoodsCategory\">\n        update tb_newbee_mall_goods_category\n        <set>\n            <if test=\"categoryLevel != null\">\n                category_level = #{categoryLevel,jdbcType=TINYINT},\n            </if>\n            <if test=\"parentId != null\">\n                parent_id = #{parentId,jdbcType=BIGINT},\n            </if>\n            <if test=\"categoryName != null\">\n                category_name = #{categoryName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"categoryRank != null\">\n                category_rank = #{categoryRank,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted = #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"createUser != null\">\n                create_user = #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                update_user = #{updateUser,jdbcType=INTEGER},\n            </if>\n        </set>\n        where category_id = #{categoryId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.GoodsCategory\">\n    update tb_newbee_mall_goods_category\n    set category_level = #{categoryLevel,jdbcType=TINYINT},\n      parent_id = #{parentId,jdbcType=BIGINT},\n      category_name = #{categoryName,jdbcType=VARCHAR},\n      category_rank = #{categoryRank,jdbcType=INTEGER},\n      is_deleted = #{isDeleted,jdbcType=TINYINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      create_user = #{createUser,jdbcType=INTEGER},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      update_user = #{updateUser,jdbcType=INTEGER}\n    where category_id = #{categoryId,jdbcType=BIGINT}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/IndexConfigMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.IndexConfigMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.IndexConfig\">\n        <id column=\"config_id\" jdbcType=\"BIGINT\" property=\"configId\"/>\n        <result column=\"config_name\" jdbcType=\"VARCHAR\" property=\"configName\"/>\n        <result column=\"config_type\" jdbcType=\"TINYINT\" property=\"configType\"/>\n        <result column=\"goods_id\" jdbcType=\"BIGINT\" property=\"goodsId\"/>\n        <result column=\"redirect_url\" jdbcType=\"VARCHAR\" property=\"redirectUrl\"/>\n        <result column=\"config_rank\" jdbcType=\"INTEGER\" property=\"configRank\"/>\n        <result column=\"is_deleted\" jdbcType=\"TINYINT\" property=\"isDeleted\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"create_user\" jdbcType=\"INTEGER\" property=\"createUser\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n        <result column=\"update_user\" jdbcType=\"INTEGER\" property=\"updateUser\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    config_id, config_name, config_type, goods_id, redirect_url, config_rank, is_deleted, \n    create_time, create_user, update_time, update_user\n  </sql>\n\n    <select id=\"findIndexConfigList\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_index_config\n        <where>\n            <if test=\"configType!=null and configType!=''\">\n                and config_type = #{configType}\n            </if>\n            and is_deleted = 0\n        </where>\n        order by config_rank desc\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n    <select id=\"getTotalIndexConfigs\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_index_config\n        <where>\n            <if test=\"configType!=null and configType!=''\">\n                and config_type = #{configType}\n            </if>\n            and is_deleted = 0\n        </where>\n    </select>\n    <select id=\"findIndexConfigsByTypeAndNum\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_index_config\n        where config_type = #{configType} and is_deleted = 0\n        order by config_rank desc\n        limit #{number}\n    </select>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_index_config\n        where config_id = #{configId,jdbcType=BIGINT} and is_deleted=0\n    </select>\n    <select id=\"selectByTypeAndGoodsId\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_index_config\n        where config_type = #{configType,jdbcType=BIGINT} and goods_id=#{goodsId,jdbcType=BIGINT} and is_deleted=0 limit 1\n    </select>\n    <update id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update tb_newbee_mall_index_config set is_deleted=1\n    where config_id = #{configId,jdbcType=BIGINT} and is_deleted=0\n  </update>\n    <update id=\"deleteBatch\">\n        update tb_newbee_mall_index_config\n        set is_deleted=1,update_time=now() where is_deleted=0 and config_id in\n        <foreach item=\"id\" collection=\"array\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.IndexConfig\">\n    insert into tb_newbee_mall_index_config (config_id, config_name, config_type, \n      goods_id, redirect_url, config_rank, \n      is_deleted, create_time, create_user, \n      update_time, update_user)\n    values (#{configId,jdbcType=BIGINT}, #{configName,jdbcType=VARCHAR}, #{configType,jdbcType=TINYINT}, \n      #{goodsId,jdbcType=BIGINT}, #{redirectUrl,jdbcType=VARCHAR}, #{configRank,jdbcType=INTEGER}, \n      #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, \n      #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.IndexConfig\">\n        insert into tb_newbee_mall_index_config\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"configId != null\">\n                config_id,\n            </if>\n            <if test=\"configName != null\">\n                config_name,\n            </if>\n            <if test=\"configType != null\">\n                config_type,\n            </if>\n            <if test=\"goodsId != null\">\n                goods_id,\n            </if>\n            <if test=\"redirectUrl != null\">\n                redirect_url,\n            </if>\n            <if test=\"configRank != null\">\n                config_rank,\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"createUser != null\">\n                create_user,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"updateUser != null\">\n                update_user,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"configId != null\">\n                #{configId,jdbcType=BIGINT},\n            </if>\n            <if test=\"configName != null\">\n                #{configName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"configType != null\">\n                #{configType,jdbcType=TINYINT},\n            </if>\n            <if test=\"goodsId != null\">\n                #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"redirectUrl != null\">\n                #{redirectUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"configRank != null\">\n                #{configRank,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"createUser != null\">\n                #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                #{updateUser,jdbcType=INTEGER},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.IndexConfig\">\n        update tb_newbee_mall_index_config\n        <set>\n            <if test=\"configName != null\">\n                config_name = #{configName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"configType != null\">\n                config_type = #{configType,jdbcType=TINYINT},\n            </if>\n            <if test=\"goodsId != null\">\n                goods_id = #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"redirectUrl != null\">\n                redirect_url = #{redirectUrl,jdbcType=VARCHAR},\n            </if>\n            <if test=\"configRank != null\">\n                config_rank = #{configRank,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted = #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"createUser != null\">\n                create_user = #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                update_user = #{updateUser,jdbcType=INTEGER},\n            </if>\n        </set>\n        where config_id = #{configId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.IndexConfig\">\n    update tb_newbee_mall_index_config\n    set config_name = #{configName,jdbcType=VARCHAR},\n      config_type = #{configType,jdbcType=TINYINT},\n      goods_id = #{goodsId,jdbcType=BIGINT},\n      redirect_url = #{redirectUrl,jdbcType=VARCHAR},\n      config_rank = #{configRank,jdbcType=INTEGER},\n      is_deleted = #{isDeleted,jdbcType=TINYINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      create_user = #{createUser,jdbcType=INTEGER},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      update_user = #{updateUser,jdbcType=INTEGER}\n    where config_id = #{configId,jdbcType=BIGINT}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/MallUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.MallUserMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.MallUser\">\n        <id column=\"user_id\" jdbcType=\"BIGINT\" property=\"userId\"/>\n        <result column=\"nick_name\" jdbcType=\"VARCHAR\" property=\"nickName\"/>\n        <result column=\"login_name\" jdbcType=\"VARCHAR\" property=\"loginName\"/>\n        <result column=\"password_md5\" jdbcType=\"VARCHAR\" property=\"passwordMd5\"/>\n        <result column=\"introduce_sign\" jdbcType=\"VARCHAR\" property=\"introduceSign\"/>\n        <result column=\"address\" jdbcType=\"VARCHAR\" property=\"address\"/>\n        <result column=\"is_deleted\" jdbcType=\"TINYINT\" property=\"isDeleted\"/>\n        <result column=\"locked_flag\" jdbcType=\"TINYINT\" property=\"lockedFlag\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    user_id, nick_name, login_name, password_md5, introduce_sign, address, is_deleted, \n    locked_flag, create_time\n  </sql>\n\n    <select id=\"findMallUserList\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_user\n        where 1=1\n        <if test=\"loginName!=null and loginName!=''\">\n            and login_name = #{loginName}\n        </if>\n        order by create_time desc\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n\n    <select id=\"getTotalMallUsers\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_user\n        where 1=1\n        <if test=\"loginName!=null and loginName!=''\">\n            and login_name = #{loginName}\n        </if>\n    </select>\n\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_user\n        where user_id = #{userId,jdbcType=BIGINT} and is_deleted = 0\n    </select>\n    <select id=\"selectByLoginName\" parameterType=\"java.lang.String\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_user\n        where login_name = #{loginName} and is_deleted = 0\n    </select>\n    <select id=\"selectByLoginNameAndPasswd\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_user\n        where login_name = #{loginName} and password_md5 = #{password} and is_deleted = 0\n    </select>\n    <update id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update tb_newbee_mall_user set is_deleted = 1\n    where user_id = #{userId,jdbcType=BIGINT} and is_deleted = 0\n  </update>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.MallUser\">\n    insert into tb_newbee_mall_user (user_id, nick_name, login_name, \n      password_md5, introduce_sign, address, \n      is_deleted, locked_flag, create_time\n      )\n    values (#{userId,jdbcType=BIGINT}, #{nickName,jdbcType=VARCHAR}, #{loginName,jdbcType=VARCHAR}, \n      #{passwordMd5,jdbcType=VARCHAR}, #{introduceSign,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, \n      #{isDeleted,jdbcType=TINYINT}, #{lockedFlag,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.MallUser\">\n        insert into tb_newbee_mall_user\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"userId != null\">\n                user_id,\n            </if>\n            <if test=\"nickName != null\">\n                nick_name,\n            </if>\n            <if test=\"loginName != null\">\n                login_name,\n            </if>\n            <if test=\"passwordMd5 != null\">\n                password_md5,\n            </if>\n            <if test=\"introduceSign != null\">\n                introduce_sign,\n            </if>\n            <if test=\"address != null\">\n                address,\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted,\n            </if>\n            <if test=\"lockedFlag != null\">\n                locked_flag,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"userId != null\">\n                #{userId,jdbcType=BIGINT},\n            </if>\n            <if test=\"nickName != null\">\n                #{nickName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"loginName != null\">\n                #{loginName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"passwordMd5 != null\">\n                #{passwordMd5,jdbcType=VARCHAR},\n            </if>\n            <if test=\"introduceSign != null\">\n                #{introduceSign,jdbcType=VARCHAR},\n            </if>\n            <if test=\"address != null\">\n                #{address,jdbcType=VARCHAR},\n            </if>\n            <if test=\"isDeleted != null\">\n                #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"lockedFlag != null\">\n                #{lockedFlag,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.MallUser\">\n        update tb_newbee_mall_user\n        <set>\n            <if test=\"nickName != null\">\n                nick_name = #{nickName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"loginName != null\">\n                login_name = #{loginName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"passwordMd5 != null\">\n                password_md5 = #{passwordMd5,jdbcType=VARCHAR},\n            </if>\n            <if test=\"introduceSign != null\">\n                introduce_sign = #{introduceSign,jdbcType=VARCHAR},\n            </if>\n            <if test=\"address != null\">\n                address = #{address,jdbcType=VARCHAR},\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted = #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"lockedFlag != null\">\n                locked_flag = #{lockedFlag,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where user_id = #{userId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.MallUser\">\n    update tb_newbee_mall_user\n    set nick_name = #{nickName,jdbcType=VARCHAR},\n      login_name = #{loginName,jdbcType=VARCHAR},\n      password_md5 = #{passwordMd5,jdbcType=VARCHAR},\n      introduce_sign = #{introduceSign,jdbcType=VARCHAR},\n      address = #{address,jdbcType=VARCHAR},\n      is_deleted = #{isDeleted,jdbcType=TINYINT},\n      locked_flag = #{lockedFlag,jdbcType=TINYINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP}\n    where user_id = #{userId,jdbcType=BIGINT}\n  </update>\n    <update id=\"lockUserBatch\">\n        update tb_newbee_mall_user\n        set locked_flag=#{lockStatus} where user_id in\n        <foreach item=\"id\" collection=\"ids\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/NewBeeMallGoodsMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.NewBeeMallGoodsMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n        <id column=\"goods_id\" jdbcType=\"BIGINT\" property=\"goodsId\"/>\n        <result column=\"goods_name\" jdbcType=\"VARCHAR\" property=\"goodsName\"/>\n        <result column=\"goods_intro\" jdbcType=\"VARCHAR\" property=\"goodsIntro\"/>\n        <result column=\"goods_category_id\" jdbcType=\"BIGINT\" property=\"goodsCategoryId\"/>\n        <result column=\"goods_cover_img\" jdbcType=\"VARCHAR\" property=\"goodsCoverImg\"/>\n        <result column=\"goods_carousel\" jdbcType=\"VARCHAR\" property=\"goodsCarousel\"/>\n        <result column=\"original_price\" jdbcType=\"INTEGER\" property=\"originalPrice\"/>\n        <result column=\"selling_price\" jdbcType=\"INTEGER\" property=\"sellingPrice\"/>\n        <result column=\"stock_num\" jdbcType=\"INTEGER\" property=\"stockNum\"/>\n        <result column=\"tag\" jdbcType=\"VARCHAR\" property=\"tag\"/>\n        <result column=\"goods_sell_status\" jdbcType=\"TINYINT\" property=\"goodsSellStatus\"/>\n        <result column=\"create_user\" jdbcType=\"INTEGER\" property=\"createUser\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"update_user\" jdbcType=\"INTEGER\" property=\"updateUser\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <resultMap extends=\"BaseResultMap\" id=\"ResultMapWithBLOBs\" type=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n        <result column=\"goods_detail_content\" jdbcType=\"LONGVARCHAR\" property=\"goodsDetailContent\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    goods_id, goods_name, goods_intro,goods_category_id, goods_cover_img, goods_carousel, original_price,\n    selling_price, stock_num, tag, goods_sell_status, create_user, create_time, update_user, \n    update_time\n  </sql>\n    <sql id=\"Blob_Column_List\">\n    goods_detail_content\n  </sql>\n\n    <insert id=\"batchInsert\">\n        INSERT INTO tb_newbee_mall_goods_info(goods_name, goods_intro, goods_category_id,goods_cover_img,\n        goods_carousel,\n        goods_detail_content,original_price,\n        selling_price, stock_num)\n        VALUES\n        <foreach collection=\"newBeeMallGoodsList\" item=\"goods\" separator=\",\">\n            (#{goods.goodsName},#{goods.goodsIntro},#{goods.goodsCategoryId},#{goods.goodsCoverImg},#{goods.goodsCarousel},#{goods.goodsDetailContent},#{goods.originalPrice},#{goods.sellingPrice},#{goods.stockNum})\n        </foreach>\n    </insert>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"ResultMapWithBLOBs\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        ,\n        <include refid=\"Blob_Column_List\"/>\n        from tb_newbee_mall_goods_info\n        where goods_id = #{goodsId,jdbcType=BIGINT}\n    </select>\n    <select id=\"selectByCategoryIdAndName\" resultMap=\"ResultMapWithBLOBs\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        ,\n        <include refid=\"Blob_Column_List\"/>\n        from tb_newbee_mall_goods_info\n        where goods_name = #{goodsName,jdbcType=VARCHAR} and goods_category_id = #{goodsCategoryId,jdbcType=BIGINT}\n    </select>\n    <update id=\"updateStockNum\">\n        <foreach collection=\"stockNumDTOS\" item=\"stockNumDTO\">\n            update tb_newbee_mall_goods_info set stock_num = stock_num-#{stockNumDTO.goodsCount}\n            where goods_id = #{stockNumDTO.goodsId} and stock_num>=#{stockNumDTO.goodsCount} and goods_sell_status = 0;\n        </foreach>\n    </update>\n    <update id=\"recoverStockNum\">\n        <foreach collection=\"stockNumDTOS\" item=\"stockNumDTO\">\n            update tb_newbee_mall_goods_info set stock_num = stock_num+#{stockNumDTO.goodsCount}\n            where goods_id = #{stockNumDTO.goodsId} and stock_num>=#{stockNumDTO.goodsCount} and goods_sell_status = 0;\n        </foreach>\n    </update>\n    <update id=\"batchUpdateSellStatus\">\n        update tb_newbee_mall_goods_info\n        set goods_sell_status=#{sellStatus},update_time=now() where goods_id in\n        <foreach item=\"id\" collection=\"orderIds\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n    <select id=\"findNewBeeMallGoodsList\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_info\n        <where>\n            <if test=\"goodsName!=null and goodsName!=''\">\n                and goods_name like CONCAT('%','#{goodsName}','%')\n            </if>\n            <if test=\"goodsSellStatus!=null and goodsSellStatus!=''\">\n                and goods_sell_status = #{goodsSellStatus}\n            </if>\n            <if test=\"startTime != null and startTime.trim() != ''\">\n                and create_time &gt; #{startTime}\n            </if>\n            <if test=\"endTime != null and endTime.trim() != ''\">\n                and create_time &lt; #{endTime}\n            </if>\n        </where>\n        order by goods_id desc\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n\n    <select id=\"findNewBeeMallGoodsListBySearch\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_info\n        <where>\n            <if test=\"keyword!=null and keyword!=''\">\n                and (goods_name like CONCAT('%',#{keyword},'%') or goods_intro like CONCAT('%',#{keyword},'%'))\n            </if>\n            <if test=\"goodsCategoryId!=null and goodsCategoryId!=''\">\n                and goods_category_id = #{goodsCategoryId}\n            </if>\n            <if test=\"goodsSellStatus!=null\">\n                and goods_sell_status = #{goodsSellStatus}\n            </if>\n        </where>\n        <if test=\"orderBy!=null and orderBy!=''\">\n            <choose>\n                <when test=\"orderBy == 'new'\">\n                    <!-- 按照发布时间倒序排列 -->\n                    order by goods_id desc\n                </when>\n                <when test=\"orderBy == 'price'\">\n                    <!-- 按照售价从小到大排列 -->\n                    order by selling_price asc\n                </when>\n                <otherwise>\n                    <!-- 默认按照库存数量从大到小排列 -->\n                    order by stock_num desc\n                </otherwise>\n            </choose>\n        </if>\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n\n    <select id=\"getTotalNewBeeMallGoodsBySearch\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_goods_info\n        <where>\n            <if test=\"keyword!=null and keyword!=''\">\n                and (goods_name like CONCAT('%',#{keyword},'%') or goods_intro like CONCAT('%',#{keyword},'%'))\n            </if>\n            <if test=\"goodsCategoryId!=null and goodsCategoryId!=''\">\n                and goods_category_id = #{goodsCategoryId}\n            </if>\n            <if test=\"goodsSellStatus!=null\">\n                and goods_sell_status = #{goodsSellStatus}\n            </if>\n        </where>\n    </select>\n\n    <select id=\"selectByPrimaryKeys\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_goods_info\n        where goods_id in\n        <foreach item=\"id\" collection=\"list\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n        order by field(goods_id,\n        <foreach item=\"id\" collection=\"list\" separator=\",\">\n            #{id}\n        </foreach>\n        );\n    </select>\n    <select id=\"getTotalNewBeeMallGoods\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_goods_info\n        <where>\n            <if test=\"goodsName!=null and goodsName!=''\">\n                and goods_name like CONCAT('%','#{goodsName}','%')\n            </if>\n            <if test=\"goodsSellStatus!=null and goodsSellStatus!=''\">\n                and goods_sell_status = #{goodsSellStatus}\n            </if>\n            <if test=\"startTime != null and startTime.trim() != ''\">\n                and create_time &gt; #{startTime}\n            </if>\n            <if test=\"endTime != null and endTime.trim() != ''\">\n                and create_time &lt; #{endTime}\n            </if>\n        </where>\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from tb_newbee_mall_goods_info\n    where goods_id = #{goodsId,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n    insert into tb_newbee_mall_goods_info (goods_id, goods_name, goods_intro, \n      goods_cover_img, goods_carousel, original_price, \n      selling_price, stock_num, tag, \n      goods_sell_status, create_user, create_time, \n      update_user, update_time, goods_detail_content\n      )\n    values (#{goodsId,jdbcType=BIGINT}, #{goodsName,jdbcType=VARCHAR}, #{goodsIntro,jdbcType=VARCHAR}, \n      #{goodsCoverImg,jdbcType=VARCHAR}, #{goodsCarousel,jdbcType=VARCHAR}, #{originalPrice,jdbcType=INTEGER}, \n      #{sellingPrice,jdbcType=INTEGER}, #{stockNum,jdbcType=INTEGER}, #{tag,jdbcType=VARCHAR}, \n      #{goodsSellStatus,jdbcType=TINYINT}, #{createUser,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, \n      #{updateUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{goodsDetailContent,jdbcType=LONGVARCHAR}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n        insert into tb_newbee_mall_goods_info\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"goodsId != null\">\n                goods_id,\n            </if>\n            <if test=\"goodsName != null\">\n                goods_name,\n            </if>\n            <if test=\"goodsIntro != null\">\n                goods_intro,\n            </if>\n            <if test=\"goodsCategoryId != null\">\n                goods_category_id,\n            </if>\n            <if test=\"goodsCoverImg != null\">\n                goods_cover_img,\n            </if>\n            <if test=\"goodsCarousel != null\">\n                goods_carousel,\n            </if>\n            <if test=\"originalPrice != null\">\n                original_price,\n            </if>\n            <if test=\"sellingPrice != null\">\n                selling_price,\n            </if>\n            <if test=\"stockNum != null\">\n                stock_num,\n            </if>\n            <if test=\"tag != null\">\n                tag,\n            </if>\n            <if test=\"goodsSellStatus != null\">\n                goods_sell_status,\n            </if>\n            <if test=\"createUser != null\">\n                create_user,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateUser != null\">\n                update_user,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"goodsDetailContent != null\">\n                goods_detail_content,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"goodsId != null\">\n                #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsName != null\">\n                #{goodsName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsIntro != null\">\n                #{goodsIntro,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsIntro != null\">\n                #{goodsCategoryId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsCoverImg != null\">\n                #{goodsCoverImg,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsCarousel != null\">\n                #{goodsCarousel,jdbcType=VARCHAR},\n            </if>\n            <if test=\"originalPrice != null\">\n                #{originalPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"sellingPrice != null\">\n                #{sellingPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"stockNum != null\">\n                #{stockNum,jdbcType=INTEGER},\n            </if>\n            <if test=\"tag != null\">\n                #{tag,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsSellStatus != null\">\n                #{goodsSellStatus,jdbcType=TINYINT},\n            </if>\n            <if test=\"createUser != null\">\n                #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                #{updateUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"goodsDetailContent != null\">\n                #{goodsDetailContent,jdbcType=LONGVARCHAR},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n        update tb_newbee_mall_goods_info\n        <set>\n            <if test=\"goodsName != null\">\n                goods_name = #{goodsName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsIntro != null\">\n                goods_intro = #{goodsIntro,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsCategoryId != null\">\n                goods_category_id = #{goodsCategoryId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsCoverImg != null\">\n                goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsCarousel != null\">\n                goods_carousel = #{goodsCarousel,jdbcType=VARCHAR},\n            </if>\n            <if test=\"originalPrice != null\">\n                original_price = #{originalPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"sellingPrice != null\">\n                selling_price = #{sellingPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"stockNum != null\">\n                stock_num = #{stockNum,jdbcType=INTEGER},\n            </if>\n            <if test=\"tag != null\">\n                tag = #{tag,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsSellStatus != null\">\n                goods_sell_status = #{goodsSellStatus,jdbcType=TINYINT},\n            </if>\n            <if test=\"createUser != null\">\n                create_user = #{createUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateUser != null\">\n                update_user = #{updateUser,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"goodsDetailContent != null\">\n                goods_detail_content = #{goodsDetailContent,jdbcType=LONGVARCHAR},\n            </if>\n        </set>\n        where goods_id = #{goodsId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKeyWithBLOBs\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n    update tb_newbee_mall_goods_info\n    set goods_name = #{goodsName,jdbcType=VARCHAR},\n      goods_intro = #{goodsIntro,jdbcType=VARCHAR},\n      goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR},\n      goods_carousel = #{goodsCarousel,jdbcType=VARCHAR},\n      original_price = #{originalPrice,jdbcType=INTEGER},\n      selling_price = #{sellingPrice,jdbcType=INTEGER},\n      stock_num = #{stockNum,jdbcType=INTEGER},\n      tag = #{tag,jdbcType=VARCHAR},\n      goods_sell_status = #{goodsSellStatus,jdbcType=TINYINT},\n      create_user = #{createUser,jdbcType=INTEGER},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_user = #{updateUser,jdbcType=INTEGER},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      goods_detail_content = #{goodsDetailContent,jdbcType=LONGVARCHAR}\n    where goods_id = #{goodsId,jdbcType=BIGINT}\n  </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallGoods\">\n    update tb_newbee_mall_goods_info\n    set goods_name = #{goodsName,jdbcType=VARCHAR},\n      goods_intro = #{goodsIntro,jdbcType=VARCHAR},\n      goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR},\n      goods_carousel = #{goodsCarousel,jdbcType=VARCHAR},\n      original_price = #{originalPrice,jdbcType=INTEGER},\n      selling_price = #{sellingPrice,jdbcType=INTEGER},\n      stock_num = #{stockNum,jdbcType=INTEGER},\n      tag = #{tag,jdbcType=VARCHAR},\n      goods_sell_status = #{goodsSellStatus,jdbcType=TINYINT},\n      create_user = #{createUser,jdbcType=INTEGER},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_user = #{updateUser,jdbcType=INTEGER},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where goods_id = #{goodsId,jdbcType=BIGINT}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/NewBeeMallOrderItemMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.NewBeeMallOrderItemMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.NewBeeMallOrderItem\">\n        <id column=\"order_item_id\" jdbcType=\"BIGINT\" property=\"orderItemId\"/>\n        <result column=\"order_id\" jdbcType=\"BIGINT\" property=\"orderId\"/>\n        <result column=\"goods_id\" jdbcType=\"BIGINT\" property=\"goodsId\"/>\n        <result column=\"goods_name\" jdbcType=\"VARCHAR\" property=\"goodsName\"/>\n        <result column=\"goods_cover_img\" jdbcType=\"VARCHAR\" property=\"goodsCoverImg\"/>\n        <result column=\"selling_price\" jdbcType=\"INTEGER\" property=\"sellingPrice\"/>\n        <result column=\"goods_count\" jdbcType=\"INTEGER\" property=\"goodsCount\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    order_item_id, order_id, goods_id, goods_name, goods_cover_img, selling_price, goods_count, \n    create_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order_item\n        where order_item_id = #{orderItemId,jdbcType=BIGINT}\n    </select>\n    <select id=\"selectByOrderId\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order_item\n        where order_id = #{orderItemId,jdbcType=BIGINT}\n    </select>\n    <select id=\"selectByOrderIds\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order_item\n        where order_id\n        in\n        <foreach item=\"id\" collection=\"orderIds\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from tb_newbee_mall_order_item\n    where order_item_id = #{orderItemId,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insertBatch\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrderItem\">\n        insert into tb_newbee_mall_order_item (order_id, goods_id,\n        goods_name, goods_cover_img, selling_price,\n        goods_count)\n        values\n        <foreach collection=\"orderItems\" item=\"orderItem\" separator=\",\">\n            (#{orderItem.orderId,jdbcType=BIGINT}, #{orderItem.goodsId,jdbcType=BIGINT},\n            #{orderItem.goodsName,jdbcType=VARCHAR}, #{orderItem.goodsCoverImg,jdbcType=VARCHAR},\n            #{orderItem.sellingPrice,jdbcType=INTEGER},\n            #{orderItem.goodsCount,jdbcType=INTEGER})\n        </foreach>\n    </insert>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrderItem\">\n    insert into tb_newbee_mall_order_item (order_item_id, order_id, goods_id,\n      goods_name, goods_cover_img, selling_price,\n      goods_count, create_time)\n    values (#{orderItemId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT},\n      #{goodsName,jdbcType=VARCHAR}, #{goodsCoverImg,jdbcType=VARCHAR}, #{sellingPrice,jdbcType=INTEGER},\n      #{goodsCount,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrderItem\">\n        insert into tb_newbee_mall_order_item\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"orderItemId != null\">\n                order_item_id,\n            </if>\n            <if test=\"orderId != null\">\n                order_id,\n            </if>\n            <if test=\"goodsId != null\">\n                goods_id,\n            </if>\n            <if test=\"goodsName != null\">\n                goods_name,\n            </if>\n            <if test=\"goodsCoverImg != null\">\n                goods_cover_img,\n            </if>\n            <if test=\"sellingPrice != null\">\n                selling_price,\n            </if>\n            <if test=\"goodsCount != null\">\n                goods_count,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"orderItemId != null\">\n                #{orderItemId,jdbcType=BIGINT},\n            </if>\n            <if test=\"orderId != null\">\n                #{orderId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsId != null\">\n                #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsName != null\">\n                #{goodsName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsCoverImg != null\">\n                #{goodsCoverImg,jdbcType=VARCHAR},\n            </if>\n            <if test=\"sellingPrice != null\">\n                #{sellingPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"goodsCount != null\">\n                #{goodsCount,jdbcType=INTEGER},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrderItem\">\n        update tb_newbee_mall_order_item\n        <set>\n            <if test=\"orderId != null\">\n                order_id = #{orderId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsId != null\">\n                goods_id = #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsName != null\">\n                goods_name = #{goodsName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"goodsCoverImg != null\">\n                goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR},\n            </if>\n            <if test=\"sellingPrice != null\">\n                selling_price = #{sellingPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"goodsCount != null\">\n                goods_count = #{goodsCount,jdbcType=INTEGER},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where order_item_id = #{orderItemId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrderItem\">\n    update tb_newbee_mall_order_item\n    set order_id = #{orderId,jdbcType=BIGINT},\n      goods_id = #{goodsId,jdbcType=BIGINT},\n      goods_name = #{goodsName,jdbcType=VARCHAR},\n      goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR},\n      selling_price = #{sellingPrice,jdbcType=INTEGER},\n      goods_count = #{goodsCount,jdbcType=INTEGER},\n      create_time = #{createTime,jdbcType=TIMESTAMP}\n    where order_item_id = #{orderItemId,jdbcType=BIGINT}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/NewBeeMallOrderMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.NewBeeMallOrderMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.NewBeeMallOrder\">\n        <id column=\"order_id\" jdbcType=\"BIGINT\" property=\"orderId\"/>\n        <result column=\"order_no\" jdbcType=\"VARCHAR\" property=\"orderNo\"/>\n        <result column=\"user_id\" jdbcType=\"BIGINT\" property=\"userId\"/>\n        <result column=\"total_price\" jdbcType=\"INTEGER\" property=\"totalPrice\"/>\n        <result column=\"pay_status\" jdbcType=\"TINYINT\" property=\"payStatus\"/>\n        <result column=\"pay_type\" jdbcType=\"TINYINT\" property=\"payType\"/>\n        <result column=\"pay_time\" jdbcType=\"TIMESTAMP\" property=\"payTime\"/>\n        <result column=\"order_status\" jdbcType=\"TINYINT\" property=\"orderStatus\"/>\n        <result column=\"extra_info\" jdbcType=\"VARCHAR\" property=\"extraInfo\"/>\n        <result column=\"user_address\" jdbcType=\"VARCHAR\" property=\"userAddress\"/>\n        <result column=\"is_deleted\" jdbcType=\"TINYINT\" property=\"isDeleted\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    order_id, order_no, user_id, total_price, pay_status, pay_type, pay_time, order_status,\n    extra_info, user_name, user_phone, user_address, is_deleted, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order\n        where order_id = #{orderId,jdbcType=BIGINT}\n    </select>\n    <select id=\"selectByOrderNo\" parameterType=\"java.lang.String\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order\n        where order_no = #{orderNo,jdbcType=VARCHAR} and is_deleted=0 limit 1\n    </select>\n    <select id=\"selectByPrimaryKeys\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order\n        where order_id in\n        <foreach collection=\"orderIds\" item=\"item\" index=\"index\"\n                 open=\"(\" separator=\",\" close=\")\">#{item}\n        </foreach>\n    </select>\n    <select id=\"findNewBeeMallOrderList\" parameterType=\"Map\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_order\n        <where>\n            <if test=\"orderNo!=null and orderNo!=''\">\n                and order_no = #{orderNo}\n            </if>\n            <if test=\"userId!=null and userId!=''\">\n                and user_id = #{userId}\n            </if>\n            <if test=\"payType!=null and payType!=''\">\n                and pay_type = #{payType}\n            </if>\n            <if test=\"orderStatus!=null and orderStatus!=''\">\n                and order_status = #{orderStatus}\n            </if>\n            <if test=\"isDeleted!=null and isDeleted!=''\">\n                and is_deleted = #{isDeleted}\n            </if>\n            <if test=\"startTime != null and startTime.trim() != ''\">\n                and create_time &gt; #{startTime}\n            </if>\n            <if test=\"endTime != null and endTime.trim() != ''\">\n                and create_time &lt; #{endTime}\n            </if>\n        </where>\n        order by create_time desc\n        <if test=\"start!=null and limit!=null\">\n            limit #{start},#{limit}\n        </if>\n    </select>\n\n    <select id=\"getTotalNewBeeMallOrders\" parameterType=\"Map\" resultType=\"int\">\n        select count(*) from tb_newbee_mall_order\n        <where>\n            <if test=\"orderNo!=null and orderNo!=''\">\n                and order_no = #{orderNo}\n            </if>\n            <if test=\"userId!=null and userId!=''\">\n                and user_id = #{userId}\n            </if>\n            <if test=\"payType!=null and payType!=''\">\n                and pay_type = #{payType}\n            </if>\n            <if test=\"orderStatus!=null and orderStatus!=''\">\n                and order_status = #{orderStatus}\n            </if>\n            <if test=\"isDeleted!=null and isDeleted!=''\">\n                and is_deleted = #{isDeleted}\n            </if>\n            <if test=\"startTime != null and startTime.trim() != ''\">\n                and create_time &gt; #{startTime}\n            </if>\n            <if test=\"endTime != null and endTime.trim() != ''\">\n                and create_time &lt; #{endTime}\n            </if>\n        </where>\n    </select>\n    <update id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update tb_newbee_mall_order set is_deleted=1\n    where order_id = #{orderId,jdbcType=BIGINT} and is_deleted=0\n  </update>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrder\">\n    insert into tb_newbee_mall_order (order_id, order_no, user_id, \n      total_price, pay_status, pay_type, \n      pay_time, order_status, extra_info, \n      user_address,is_deleted, create_time, update_time\n      )\n    values (#{orderId,jdbcType=BIGINT}, #{orderNo,jdbcType=VARCHAR}, #{userId,jdbcType=BIGINT}, \n      #{totalPrice,jdbcType=INTEGER}, #{payStatus,jdbcType=TINYINT}, #{payType,jdbcType=TINYINT}, \n      #{payTime,jdbcType=TIMESTAMP}, #{orderStatus,jdbcType=TINYINT}, #{extraInfo,jdbcType=VARCHAR}, \n       #{userAddress,jdbcType=VARCHAR},#{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n    <insert id=\"insertSelective\" useGeneratedKeys=\"true\" keyProperty=\"orderId\"\n            parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrder\">\n        insert into tb_newbee_mall_order\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"orderId != null\">\n                order_id,\n            </if>\n            <if test=\"orderNo != null\">\n                order_no,\n            </if>\n            <if test=\"userId != null\">\n                user_id,\n            </if>\n            <if test=\"totalPrice != null\">\n                total_price,\n            </if>\n            <if test=\"payStatus != null\">\n                pay_status,\n            </if>\n            <if test=\"payType != null\">\n                pay_type,\n            </if>\n            <if test=\"payTime != null\">\n                pay_time,\n            </if>\n            <if test=\"orderStatus != null\">\n                order_status,\n            </if>\n            <if test=\"extraInfo != null\">\n                extra_info,\n            </if>\n            <if test=\"userAddress != null\">\n                user_address,\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"orderId != null\">\n                #{orderId,jdbcType=BIGINT},\n            </if>\n            <if test=\"orderNo != null\">\n                #{orderNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userId != null\">\n                #{userId,jdbcType=BIGINT},\n            </if>\n            <if test=\"totalPrice != null\">\n                #{totalPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"payStatus != null\">\n                #{payStatus,jdbcType=TINYINT},\n            </if>\n            <if test=\"payType != null\">\n                #{payType,jdbcType=TINYINT},\n            </if>\n            <if test=\"payTime != null\">\n                #{payTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"orderStatus != null\">\n                #{orderStatus,jdbcType=TINYINT},\n            </if>\n            <if test=\"extraInfo != null\">\n                #{extraInfo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userAddress != null\">\n                #{userAddress,jdbcType=VARCHAR},\n            </if>\n            <if test=\"isDeleted != null\">\n                #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"checkDone\">\n        update tb_newbee_mall_order\n        set order_status = 2,update_time = now()\n        where order_id in\n        <foreach collection=\"orderIds\" item=\"item\" index=\"index\"\n                 open=\"(\" separator=\",\" close=\")\">#{item}\n        </foreach>\n    </update>\n    <update id=\"checkOut\">\n        update tb_newbee_mall_order\n        set order_status = 3,update_time = now()\n        where order_id in\n        <foreach collection=\"orderIds\" item=\"item\" index=\"index\"\n                 open=\"(\" separator=\",\" close=\")\">#{item}\n        </foreach>\n    </update>\n    <update id=\"closeOrder\">\n        update tb_newbee_mall_order\n        set order_status = #{orderStatus},update_time = now()\n        where order_id in\n        <foreach collection=\"orderIds\" item=\"item\" index=\"index\"\n                 open=\"(\" separator=\",\" close=\")\">#{item}\n        </foreach>\n    </update>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrder\">\n        update tb_newbee_mall_order\n        <set>\n            <if test=\"orderNo != null\">\n                order_no = #{orderNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userId != null\">\n                user_id = #{userId,jdbcType=BIGINT},\n            </if>\n            <if test=\"totalPrice != null\">\n                total_price = #{totalPrice,jdbcType=INTEGER},\n            </if>\n            <if test=\"payStatus != null\">\n                pay_status = #{payStatus,jdbcType=TINYINT},\n            </if>\n            <if test=\"payType != null\">\n                pay_type = #{payType,jdbcType=TINYINT},\n            </if>\n            <if test=\"payTime != null\">\n                pay_time = #{payTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"orderStatus != null\">\n                order_status = #{orderStatus,jdbcType=TINYINT},\n            </if>\n            <if test=\"extraInfo != null\">\n                extra_info = #{extraInfo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"userAddress != null\">\n                user_address = #{userAddress,jdbcType=VARCHAR},\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted = #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where order_id = #{orderId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallOrder\">\n    update tb_newbee_mall_order\n    set order_no = #{orderNo,jdbcType=VARCHAR},\n      user_id = #{userId,jdbcType=BIGINT},\n      total_price = #{totalPrice,jdbcType=INTEGER},\n      pay_status = #{payStatus,jdbcType=TINYINT},\n      pay_type = #{payType,jdbcType=TINYINT},\n      pay_time = #{payTime,jdbcType=TIMESTAMP},\n      order_status = #{orderStatus,jdbcType=TINYINT},\n      extra_info = #{extraInfo,jdbcType=VARCHAR},\n      user_address = #{userAddress,jdbcType=VARCHAR},\n      is_deleted = #{isDeleted,jdbcType=TINYINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where order_id = #{orderId,jdbcType=BIGINT}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/mapper/NewBeeMallShoppingCartItemMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"ltd.newbee.mall.dao.NewBeeMallShoppingCartItemMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"ltd.newbee.mall.entity.NewBeeMallShoppingCartItem\">\n        <id column=\"cart_item_id\" jdbcType=\"BIGINT\" property=\"cartItemId\"/>\n        <result column=\"user_id\" jdbcType=\"BIGINT\" property=\"userId\"/>\n        <result column=\"goods_id\" jdbcType=\"BIGINT\" property=\"goodsId\"/>\n        <result column=\"goods_count\" jdbcType=\"INTEGER\" property=\"goodsCount\"/>\n        <result column=\"is_deleted\" jdbcType=\"TINYINT\" property=\"isDeleted\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    cart_item_id, user_id, goods_id, goods_count, is_deleted, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_shopping_cart_item\n        where cart_item_id = #{cartItemId,jdbcType=BIGINT} and is_deleted = 0\n    </select>\n    <select id=\"selectByUserIdAndGoodsId\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_shopping_cart_item\n        where user_id = #{newBeeMallUserId,jdbcType=BIGINT} and goods_id=#{goodsId,jdbcType=BIGINT} and is_deleted = 0\n        limit 1\n    </select>\n    <select id=\"selectByUserId\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from tb_newbee_mall_shopping_cart_item\n        where user_id = #{newBeeMallUserId,jdbcType=BIGINT} and is_deleted = 0\n        limit #{number}\n    </select>\n    <select id=\"selectCountByUserId\" resultType=\"int\">\n    select\n    count(*)\n    from tb_newbee_mall_shopping_cart_item\n    where user_id = #{newBeeMallUserId,jdbcType=BIGINT} and is_deleted = 0\n  </select>\n    <update id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update tb_newbee_mall_shopping_cart_item set is_deleted = 1\n    where cart_item_id = #{cartItemId,jdbcType=BIGINT} and is_deleted = 0\n  </update>\n    <update id=\"deleteBatch\">\n        update tb_newbee_mall_shopping_cart_item\n        set is_deleted=1 where cart_item_id in\n        <foreach item=\"id\" collection=\"list\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n    <insert id=\"insert\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallShoppingCartItem\">\n    insert into tb_newbee_mall_shopping_cart_item (cart_item_id, user_id, goods_id, \n      goods_count, is_deleted, create_time, \n      update_time)\n    values (#{cartItemId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT}, \n      #{goodsCount,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, \n      #{updateTime,jdbcType=TIMESTAMP})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallShoppingCartItem\">\n        insert into tb_newbee_mall_shopping_cart_item\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"cartItemId != null\">\n                cart_item_id,\n            </if>\n            <if test=\"userId != null\">\n                user_id,\n            </if>\n            <if test=\"goodsId != null\">\n                goods_id,\n            </if>\n            <if test=\"goodsCount != null\">\n                goods_count,\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"cartItemId != null\">\n                #{cartItemId,jdbcType=BIGINT},\n            </if>\n            <if test=\"userId != null\">\n                #{userId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsId != null\">\n                #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsCount != null\">\n                #{goodsCount,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallShoppingCartItem\">\n        update tb_newbee_mall_shopping_cart_item\n        <set>\n            <if test=\"userId != null\">\n                user_id = #{userId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsId != null\">\n                goods_id = #{goodsId,jdbcType=BIGINT},\n            </if>\n            <if test=\"goodsCount != null\">\n                goods_count = #{goodsCount,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDeleted != null\">\n                is_deleted = #{isDeleted,jdbcType=TINYINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where cart_item_id = #{cartItemId,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"ltd.newbee.mall.entity.NewBeeMallShoppingCartItem\">\n    update tb_newbee_mall_shopping_cart_item\n    set user_id = #{userId,jdbcType=BIGINT},\n      goods_id = #{goodsId,jdbcType=BIGINT},\n      goods_count = #{goodsCount,jdbcType=INTEGER},\n      is_deleted = #{isDeleted,jdbcType=TINYINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where cart_item_id = #{cartItemId,jdbcType=BIGINT}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/newbee_mall_schema.sql",
    "content": "-- ----------------------------\n-- Copyright (c) 2019-2020 十三 all rights reserved.\n-- ----------------------------\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_admin_user\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_admin_user`;\nCREATE TABLE `tb_newbee_mall_admin_user`  (\n  `admin_user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理员id',\n  `login_user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '管理员登陆名称',\n  `login_password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '管理员登陆密码',\n  `nick_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '管理员显示昵称',\n  `locked` tinyint(4) NULL DEFAULT 0 COMMENT '是否锁定 0未锁定 1已锁定无法登陆',\n  PRIMARY KEY (`admin_user_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_admin_user\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_admin_user` VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', '十三', 0);\nINSERT INTO `tb_newbee_mall_admin_user` VALUES (2, 'newbee-admin1', 'e10adc3949ba59abbe56e057f20f883e', '新蜂01', 0);\nINSERT INTO `tb_newbee_mall_admin_user` VALUES (3, 'newbee-admin2', 'e10adc3949ba59abbe56e057f20f883e', '新蜂02', 0);\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_carousel\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_carousel`;\nCREATE TABLE `tb_newbee_mall_carousel`  (\n  `carousel_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '首页轮播图主键id',\n  `carousel_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '轮播图',\n  `redirect_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '\\'##\\'' COMMENT '点击后的跳转地址(默认不跳转)',\n  `carousel_rank` int(11) NOT NULL DEFAULT 0 COMMENT '排序值(字段越大越靠前)',\n  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '删除标识字段(0-未删除 1-已删除)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `create_user` int(11) NOT NULL DEFAULT 0 COMMENT '创建者id',\n  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  `update_user` int(11) NOT NULL DEFAULT 0 COMMENT '修改者id',\n  PRIMARY KEY (`carousel_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_carousel\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_carousel` VALUES (2, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner1.png', 'https://juejin.im/book/5da2f9d4f265da5b81794d48/section/5da2f9d6f265da5b794f2189', 13, 0, '2019-11-29 00:00:00', 0, '2019-11-29 00:00:00', 0);\nINSERT INTO `tb_newbee_mall_carousel` VALUES (5, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner2.png', 'https://juejin.im/book/5da2f9d4f265da5b81794d48/section/5da2f9d6f265da5b794f2189', 0, 0, '2019-11-29 00:00:00', 0, '2019-11-29 00:00:00', 0);\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_goods_category\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_goods_category`;\nCREATE TABLE `tb_newbee_mall_goods_category`  (\n  `category_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',\n  `category_level` tinyint(4) NOT NULL DEFAULT 0 COMMENT '分类级别(1-一级分类 2-二级分类 3-三级分类)',\n  `parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '父分类id',\n  `category_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',\n  `category_rank` int(11) NOT NULL DEFAULT 0 COMMENT '排序值(字段越大越靠前)',\n  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '删除标识字段(0-未删除 1-已删除)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `create_user` int(11) NOT NULL DEFAULT 0 COMMENT '创建者id',\n  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  `update_user` int(11) NULL DEFAULT 0 COMMENT '修改者id',\n  PRIMARY KEY (`category_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 107 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_goods_category\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (15, 1, 0, '家电 数码 手机', 100, 0, '2019-09-11 18:45:40', 0, '2019-09-11 18:45:40', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (16, 1, 0, '女装 男装 穿搭', 99, 0, '2019-09-11 18:46:07', 0, '2019-09-11 18:46:07', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (17, 2, 15, '家电', 10, 0, '2019-09-11 18:46:32', 0, '2019-09-11 18:46:32', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (18, 2, 15, '数码', 9, 0, '2019-09-11 18:46:43', 0, '2019-09-11 18:46:43', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (19, 2, 15, '手机', 8, 0, '2019-09-11 18:46:52', 0, '2019-09-11 18:46:52', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (20, 3, 17, '生活电器', 0, 0, '2019-09-11 18:47:38', 0, '2019-09-11 18:47:38', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (21, 3, 17, '厨房电器', 0, 0, '2019-09-11 18:47:49', 0, '2019-09-11 18:47:49', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (22, 3, 17, '扫地机器人', 0, 0, '2019-09-11 18:47:58', 0, '2019-09-11 18:47:58', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (23, 3, 17, '吸尘器', 0, 0, '2019-09-11 18:48:06', 0, '2019-09-11 18:48:06', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (24, 3, 17, '取暖器', 0, 0, '2019-09-11 18:48:12', 0, '2019-09-11 18:48:12', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (25, 3, 17, '豆浆机', 0, 0, '2019-09-11 18:48:26', 0, '2019-09-11 18:48:26', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (26, 3, 17, '暖风机', 0, 0, '2019-09-11 18:48:40', 0, '2019-09-11 18:48:40', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (27, 3, 17, '加湿器', 0, 0, '2019-09-11 18:48:50', 0, '2019-09-11 18:48:50', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (28, 3, 17, '蓝牙音箱', 0, 0, '2019-09-11 18:48:57', 0, '2019-09-11 18:48:57', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (29, 3, 17, '烤箱', 0, 0, '2019-09-11 18:49:09', 0, '2019-09-11 18:49:09', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (30, 3, 17, '卷发器', 0, 0, '2019-09-11 18:49:19', 0, '2019-09-11 18:49:19', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (31, 3, 17, '空气净化器', 0, 0, '2019-09-11 18:49:30', 0, '2019-09-11 18:49:30', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (32, 3, 18, '游戏主机', 0, 0, '2019-09-11 18:49:50', 0, '2019-09-11 18:49:50', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (33, 3, 18, '数码精选', 0, 0, '2019-09-11 18:49:55', 0, '2019-09-11 18:49:55', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (34, 3, 18, '平板电脑', 0, 0, '2019-09-11 18:50:08', 0, '2019-09-11 18:50:08', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (35, 3, 18, '苹果 Apple', 0, 0, '2019-09-11 18:50:24', 0, '2019-09-11 18:50:24', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (36, 3, 18, '电脑主机', 0, 0, '2019-09-11 18:50:36', 0, '2019-09-11 18:50:36', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (37, 3, 18, '数码相机', 0, 0, '2019-09-11 18:50:57', 0, '2019-09-11 18:50:57', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (38, 3, 18, '电玩动漫', 0, 0, '2019-09-11 18:52:15', 0, '2019-09-11 18:52:15', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (39, 3, 18, '单反相机', 0, 0, '2019-09-11 18:52:26', 0, '2019-09-11 18:52:26', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (40, 3, 18, '键盘鼠标', 0, 0, '2019-09-11 18:52:46', 0, '2019-09-11 18:52:46', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (41, 3, 18, '无人机', 0, 0, '2019-09-11 18:53:01', 0, '2019-09-11 18:53:01', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (42, 3, 18, '二手电脑', 0, 0, '2019-09-11 18:53:08', 0, '2019-09-11 18:53:08', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (43, 3, 18, '二手手机', 0, 0, '2019-09-11 18:53:14', 0, '2019-09-11 18:53:14', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (44, 3, 19, 'iPhone 11', 89, 0, '2019-09-11 18:53:49', 0, '2019-09-11 18:54:38', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (45, 3, 19, '荣耀手机', 99, 0, '2019-09-11 18:53:59', 0, '2019-09-18 13:40:59', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (46, 3, 19, '华为手机', 98, 0, '2019-09-11 18:54:20', 0, '2019-09-18 13:40:51', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (47, 3, 19, 'iPhone', 88, 0, '2019-09-11 18:54:49', 0, '2019-09-18 13:40:32', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (48, 3, 19, '华为 Mate 20', 79, 0, '2019-09-11 18:55:03', 0, '2019-09-11 18:55:13', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (49, 3, 19, '华为 P30', 97, 0, '2019-09-11 18:55:22', 0, '2019-09-11 18:55:22', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (50, 3, 19, '华为 P30 Pro', 0, 1, '2019-09-11 18:55:32', 0, '2019-09-11 18:55:32', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (51, 3, 19, '小米手机', 0, 0, '2019-09-11 18:55:52', 0, '2019-09-11 18:55:52', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (52, 3, 19, '红米', 0, 0, '2019-09-11 18:55:58', 0, '2019-09-11 18:55:58', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (53, 3, 19, 'OPPO', 0, 0, '2019-09-11 18:56:06', 0, '2019-09-11 18:56:06', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (54, 3, 19, '一加', 0, 0, '2019-09-11 18:56:12', 0, '2019-09-11 18:56:12', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (55, 3, 19, '小米 MIX', 0, 0, '2019-09-11 18:56:37', 0, '2019-09-11 18:56:37', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (56, 3, 19, 'Reno', 0, 0, '2019-09-11 18:56:49', 0, '2019-09-11 18:56:49', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (57, 3, 19, 'vivo', 0, 0, '2019-09-11 18:57:01', 0, '2019-09-11 18:57:01', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (58, 3, 19, '手机以旧换新', 0, 0, '2019-09-11 18:57:09', 0, '2019-09-11 18:57:09', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (59, 1, 0, '运动 户外 乐器', 97, 0, '2019-09-12 00:08:46', 0, '2019-09-12 00:08:46', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (60, 1, 0, '游戏 动漫 影视', 96, 0, '2019-09-12 00:09:00', 0, '2019-09-12 00:09:00', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (61, 1, 0, '家具 家饰 家纺', 98, 0, '2019-09-12 00:09:27', 0, '2019-09-12 00:09:27', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (62, 1, 0, '美妆 清洁 宠物', 94, 0, '2019-09-12 00:09:51', 0, '2019-09-17 18:22:34', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (63, 1, 0, '工具 装修 建材', 93, 0, '2019-09-12 00:10:07', 0, '2019-09-12 00:10:07', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (64, 1, 0, '珠宝 金饰 眼镜', 92, 0, '2019-09-12 00:10:35', 0, '2019-09-12 00:16:30', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (65, 1, 0, '玩具 孕产 用品', 0, 0, '2019-09-12 00:11:17', 0, '2019-09-12 00:11:17', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (66, 1, 0, '鞋靴 箱包 配件', 91, 0, '2019-09-12 00:11:30', 0, '2019-09-12 00:11:30', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (67, 2, 16, '女装', 10, 0, '2019-09-12 00:15:19', 0, '2019-09-12 00:15:19', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (68, 2, 16, '男装', 9, 0, '2019-09-12 00:15:28', 0, '2019-09-12 00:15:28', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (69, 2, 16, '穿搭', 8, 0, '2019-09-12 00:15:35', 0, '2019-09-12 00:15:35', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (70, 2, 61, '家具', 10, 0, '2019-09-12 00:20:22', 0, '2019-09-12 00:20:22', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (71, 2, 61, '家饰', 9, 0, '2019-09-12 00:20:29', 0, '2019-09-12 00:20:29', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (72, 2, 61, '家纺', 8, 0, '2019-09-12 00:20:35', 0, '2019-09-12 00:20:35', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (73, 2, 59, '运动', 10, 0, '2019-09-12 00:20:49', 0, '2019-09-12 00:20:49', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (74, 2, 59, '户外', 9, 0, '2019-09-12 00:20:58', 0, '2019-09-12 00:20:58', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (75, 2, 59, '乐器', 8, 0, '2019-09-12 00:21:05', 0, '2019-09-12 00:21:05', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (76, 3, 67, '外套', 10, 0, '2019-09-12 00:21:55', 0, '2019-09-12 00:21:55', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (77, 3, 70, '沙发', 10, 0, '2019-09-12 00:22:21', 0, '2019-09-12 00:22:21', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (78, 3, 73, '跑鞋', 10, 0, '2019-09-12 00:22:42', 0, '2019-09-12 00:22:42', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (79, 2, 60, '游戏', 10, 0, '2019-09-12 00:23:13', 0, '2019-09-12 00:23:13', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (80, 2, 60, '动漫', 9, 0, '2019-09-12 00:23:21', 0, '2019-09-12 00:23:21', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (81, 2, 60, '影视', 8, 0, '2019-09-12 00:23:27', 0, '2019-09-12 00:23:27', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (82, 3, 79, 'LOL', 10, 0, '2019-09-12 00:23:44', 0, '2019-09-12 00:23:44', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (83, 2, 62, '美妆', 10, 0, '2019-09-12 00:23:58', 0, '2019-09-17 18:22:44', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (84, 2, 62, '宠物', 9, 0, '2019-09-12 00:24:07', 0, '2019-09-12 00:24:07', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (85, 2, 62, '清洁', 8, 0, '2019-09-12 00:24:15', 0, '2019-09-17 18:22:51', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (86, 3, 83, '口红', 10, 0, '2019-09-12 00:24:38', 0, '2019-09-17 18:23:08', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (87, 2, 63, '工具', 10, 0, '2019-09-12 00:24:56', 0, '2019-09-12 00:24:56', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (88, 2, 63, '装修', 9, 0, '2019-09-12 00:25:05', 0, '2019-09-12 00:25:05', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (89, 2, 63, '建材', 8, 0, '2019-09-12 00:25:12', 0, '2019-09-12 00:25:12', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (90, 3, 87, '转换器', 10, 0, '2019-09-12 00:25:45', 0, '2019-09-12 00:25:45', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (91, 2, 64, '珠宝', 10, 0, '2019-09-12 00:26:10', 0, '2019-09-12 00:26:10', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (92, 2, 64, '金饰', 9, 0, '2019-09-12 00:26:18', 0, '2019-09-12 00:26:18', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (93, 2, 64, '眼镜', 8, 0, '2019-09-12 00:26:25', 0, '2019-09-12 00:26:25', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (94, 3, 91, '钻石', 10, 0, '2019-09-12 00:26:40', 0, '2019-09-12 00:26:40', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (95, 2, 66, '鞋靴', 10, 0, '2019-09-12 00:27:09', 0, '2019-09-12 00:27:09', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (96, 2, 66, '箱包', 9, 0, '2019-09-12 00:27:17', 0, '2019-09-12 00:27:17', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (97, 2, 66, '配件', 8, 0, '2019-09-12 00:27:23', 0, '2019-09-12 00:27:23', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (98, 3, 95, '休闲鞋', 10, 0, '2019-09-12 00:27:48', 0, '2019-09-12 00:27:48', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (99, 3, 83, '气垫', 0, 0, '2019-09-17 18:24:23', 0, '2019-09-17 18:24:23', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (100, 3, 83, '美白', 0, 0, '2019-09-17 18:24:36', 0, '2019-09-17 18:24:36', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (101, 3, 83, '隔离霜', 0, 0, '2019-09-17 18:27:04', 0, '2019-09-17 18:27:04', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (102, 3, 83, '粉底', 0, 0, '2019-09-17 18:27:19', 0, '2019-09-17 18:27:19', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (103, 3, 83, '腮红', 0, 0, '2019-09-17 18:27:24', 0, '2019-09-17 18:27:24', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (104, 3, 83, '睫毛膏', 0, 0, '2019-09-17 18:27:47', 0, '2019-09-17 18:27:47', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (105, 3, 83, '香水', 0, 0, '2019-09-17 18:28:16', 0, '2019-09-17 18:28:16', 0);\nINSERT INTO `tb_newbee_mall_goods_category` VALUES (106, 3, 83, '面膜', 0, 0, '2019-09-17 18:28:21', 0, '2019-09-17 18:28:21', 0);\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_goods_info\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_goods_info`;\nCREATE TABLE `tb_newbee_mall_goods_info`  (\n  `goods_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品表主键id',\n  `goods_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '商品名',\n  `goods_intro` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '商品简介',\n  `goods_category_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '关联分类id',\n  `goods_cover_img` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/admin/dist/img/no-img.png' COMMENT '商品主图',\n  `goods_carousel` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/admin/dist/img/no-img.png' COMMENT '商品轮播图',\n  `goods_detail_content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品详情',\n  `original_price` int(11) NOT NULL DEFAULT 1 COMMENT '商品价格',\n  `selling_price` int(11) NOT NULL DEFAULT 1 COMMENT '商品实际售价',\n  `stock_num` int(11) NOT NULL DEFAULT 0 COMMENT '商品库存数量',\n  `tag` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '商品标签',\n  `goods_sell_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '商品上架状态 0-下架 1-上架',\n  `create_user` int(11) NOT NULL DEFAULT 0 COMMENT '添加者主键id',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '商品添加时间',\n  `update_user` int(11) NOT NULL DEFAULT 0 COMMENT '修改者主键id',\n  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '商品修改时间',\n  PRIMARY KEY (`goods_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 10896 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_goods_info\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_goods_info` (`goods_id`, `goods_name`, `goods_intro`, `goods_category_id`, `goods_cover_img`, `goods_carousel`, `goods_detail_content`, `original_price`, `selling_price`, `stock_num`, `tag`, `goods_sell_status`, `create_user`, `create_time`, `update_user`, `update_time`)\nVALUES\n\t(10003,'无印良品 MUJI 基础润肤化妆水','滋润型 400ml',0,'/goods-img/87446ec4-e534-4b49-9f7d-9bea34665284.jpg','/goods-img/87446ec4-e534-4b49-9f7d-9bea34665284.jpg','<p>商品介绍加载中...</p>',100,100,1000,'',1,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10004,'无印良品 MUJI 柔和洁面泡沫','120g',0,'/goods-img/45854bdd-2ca5-423c-a609-3d336d9322b4.jpg','/goods-img/45854bdd-2ca5-423c-a609-3d336d9322b4.jpg','<p>商品介绍加载中...</p>',45,45,999,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10005,'无印良品 MUJI 基础润肤乳液','高保湿型 200ml',0,'/goods-img/7614ce78-0ebc-4275-a7cc-d16ad5f5f6ed.jpg','/goods-img/7614ce78-0ebc-4275-a7cc-d16ad5f5f6ed.jpg','<p>商品介绍加载中...</p>',83,83,998,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10006,'无印良品 MUJI 基础润肤乳液','滋润型 400ml',0,'/goods-img/ef75879d-3d3e-4bab-888d-1e4036491e11.jpg','/goods-img/ef75879d-3d3e-4bab-888d-1e4036491e11.jpg','<p>商品介绍加载中...</p>',100,100,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10007,'无印良品 MUJI 基础润肤化妆水','高保湿型 400ml',0,'/goods-img/558422d1-640e-442d-a073-2b2bdd95c4ed.jpg','/goods-img/558422d1-640e-442d-a073-2b2bdd95c4ed.jpg','<p>商品介绍加载中...</p>',127,127,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10008,'无印良品 MUJI 基础润肤化妆水','清爽型 200ml',0,'/goods-img/89660409-78b7-4d47-ae12-f94b3ce9664b.png','/goods-img/89660409-78b7-4d47-ae12-f94b3ce9664b.png','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10009,'无印良品 MUJI 男式','无侧缝法兰绒 睡衣 海军蓝 L',0,'/goods-img/f172c500-21d0-42e3-95ce-aa9b84a2ef49.jpg','/goods-img/f172c500-21d0-42e3-95ce-aa9b84a2ef49.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10010,'无印良品 MUJI 基础润肤洁面泡沫','200ml',0,'/goods-img/f87bdee1-ed48-4b49-b701-cc44f26a2699.jpg','/goods-img/f87bdee1-ed48-4b49-b701-cc44f26a2699.jpg','<p>商品介绍加载中...</p>',83,83,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10011,'无印良品 MUJI 平衡高保湿化妆水','新蜂精选',0,'/goods-img/16230038-bf86-4d4e-a11f-954b9ee4bab2.jpg','/goods-img/16230038-bf86-4d4e-a11f-954b9ee4bab2.jpg','<p>商品介绍加载中...</p>',130,65,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10012,'无印良品 MUJI 凝胶墨水圆珠笔','蓝黑色',0,'/goods-img/a952ecce-32e7-474e-9c1b-943962e0a580.jpg','/goods-img/a952ecce-32e7-474e-9c1b-943962e0a580.jpg','<p>商品介绍加载中...</p>',8,5,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10013,'无印良品 MUJI 平衡保湿乳霜','50g',0,'/goods-img/904c8aa1-0257-49e8-ad89-f48d2462db21.jpg','/goods-img/904c8aa1-0257-49e8-ad89-f48d2462db21.jpg','<p>商品介绍加载中...</p>',130,65,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10014,'无印良品 MUJI 基础润肤乳液','清爽型 200ml',0,'/goods-img/d66b6e0e-48d4-4503-8dd6-43b3c71f52a4.png','/goods-img/d66b6e0e-48d4-4503-8dd6-43b3c71f52a4.png','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10015,'无印良品 MUJI 平衡洁面泡沫','100g',0,'/goods-img/d0d8f6d1-1f2d-49f8-9099-0cdd94833581.jpg','/goods-img/d0d8f6d1-1f2d-49f8-9099-0cdd94833581.jpg','<p>商品介绍加载中...</p>',85,42,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10016,'无印良品 MUJI 基础润肤乳液','滋润型 200ml',0,'/goods-img/e553f566-5dc4-4648-be58-fd7112a47b10.jpg','/goods-img/e553f566-5dc4-4648-be58-fd7112a47b10.jpg','<p>商品介绍加载中...</p>',61,61,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10017,'无印良品 MUJI 便携式香薰机','新蜂精选',0,'/goods-img/a9c0d929-6f0b-4bc7-819c-e5015f447a9e.jpg','/goods-img/a9c0d929-6f0b-4bc7-819c-e5015f447a9e.jpg','<p>商品介绍加载中...</p>',200,200,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10018,'无印良品 MUJI 女式','粗棉线条纹长袖T恤 白色*横条 L',0,'/goods-img/38d5f694-2236-415d-80c8-4a1695e92d4e.jpg','/goods-img/38d5f694-2236-415d-80c8-4a1695e92d4e.jpg','<p>商品介绍加载中...</p>',198,70,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10019,'无印良品（MUJI） 聚丙烯化妆盒 1/2','半透明约150x220x86mm',0,'/goods-img/f6832ed7-cb01-48ab-987f-cd437b21be80.jpg','/goods-img/f6832ed7-cb01-48ab-987f-cd437b21be80.jpg','<p>商品介绍加载中...</p>',30,30,1000,'',1,0,'2019-09-18 13:18:47',0,'2020-10-13 17:05:01'),\n\t(10020,'无印良品 MUJI 聚丙烯','笔盒 大/约184*64*25㎜',0,'/goods-img/6c7f7a0d-4d73-406e-adcc-6f666ce4e2c9.jpg','/goods-img/6c7f7a0d-4d73-406e-adcc-6f666ce4e2c9.jpg','<p>商品介绍加载中...</p>',18,18,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10021,'无印良品（MUJI） 无针订书机 其他','新蜂精选',0,'/goods-img/cf19de8b-e94e-4513-aecd-a0b5c976b738.jpg','/goods-img/cf19de8b-e94e-4513-aecd-a0b5c976b738.jpg','<p>商品介绍加载中...</p>',52,52,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10022,'无印良品 MUJI 塑料橡皮','黑色 小',0,'/goods-img/d4f3299d-d526-4a81-ae9f-3b53e735075e.jpg','/goods-img/d4f3299d-d526-4a81-ae9f-3b53e735075e.jpg','<p>商品介绍加载中...</p>',4,4,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10023,'无印良品 MUJI 大容量基础乳液/高保湿型','400ml',0,'/goods-img/ea92b50a-67ba-4279-a71a-4e52e6a3219c.jpg','/goods-img/ea92b50a-67ba-4279-a71a-4e52e6a3219c.jpg','<p>商品介绍加载中...</p>',140,140,1000,'',0,0,'2019-09-18 13:18:47',0,'2020-10-13 10:41:59'),\n\t(10024,'无印良品 MUJI 基础润肤化妆水','滋润型 400ml',0,'/goods-img/beb26b1b-7a73-48c2-a9f7-727ad92401f6.jpg','/goods-img/beb26b1b-7a73-48c2-a9f7-727ad92401f6.jpg','<p>商品介绍加载中...</p>',100,100,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10025,'无印良品 MUJI 柔和洁面泡沫','120g',0,'/goods-img/bf1dc4d1-acc2-40c8-8091-1c6f35988643.jpg','/goods-img/bf1dc4d1-acc2-40c8-8091-1c6f35988643.jpg','<p>商品介绍加载中...</p>',45,45,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10026,'无印良品 MUJI 基础润肤乳液','高保湿型 200ml',0,'/goods-img/4059caa9-e0b3-4ac3-a494-b9e4c47e0185.jpg','/goods-img/4059caa9-e0b3-4ac3-a494-b9e4c47e0185.jpg','<p>商品介绍加载中...</p>',83,83,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10027,'无印良品 MUJI 基础润肤乳液','滋润型 400ml',0,'/goods-img/a4a4c981-da0f-4228-bcc7-97d970dc619c.jpg','/goods-img/a4a4c981-da0f-4228-bcc7-97d970dc619c.jpg','<p>商品介绍加载中...</p>',100,100,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10028,'无印良品 MUJI 基础润肤化妆水','高保湿型 400ml',0,'/goods-img/98b5c5b5-cc75-4dfb-8ec4-0a7f42af6183.jpg','/goods-img/98b5c5b5-cc75-4dfb-8ec4-0a7f42af6183.jpg','<p>商品介绍加载中...</p>',127,127,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10029,'无印良品 MUJI 基础润肤化妆水','清爽型 200ml',0,'/goods-img/71d1f469-b77b-473a-a31a-78fc97859b3a.png','/goods-img/71d1f469-b77b-473a-a31a-78fc97859b3a.png','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10030,'无印良品 MUJI 男式','无侧缝法兰绒 睡衣 海军蓝 L',0,'/goods-img/68bfbfd9-bc28-429a-ab2c-7fa62205ed7e.jpg','/goods-img/68bfbfd9-bc28-429a-ab2c-7fa62205ed7e.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10031,'无印良品 MUJI 基础润肤洁面泡沫','200ml',0,'/goods-img/679eb5a8-7689-4620-b072-63daeb8eb73a.jpg','/goods-img/679eb5a8-7689-4620-b072-63daeb8eb73a.jpg','<p>商品介绍加载中...</p>',83,83,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10032,'无印良品 MUJI 平衡高保湿化妆水','新蜂精选',0,'/goods-img/eb13afc6-8898-4a50-9f93-06dd2593c313.jpg','/goods-img/eb13afc6-8898-4a50-9f93-06dd2593c313.jpg','<p>商品介绍加载中...</p>',130,65,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10033,'无印良品 MUJI 凝胶墨水圆珠笔','蓝黑色',0,'/goods-img/85a893fe-c971-4f0b-aa0f-4c24b65b1c75.jpg','/goods-img/85a893fe-c971-4f0b-aa0f-4c24b65b1c75.jpg','<p>商品介绍加载中...</p>',8,5,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10034,'无印良品 MUJI 平衡保湿乳霜','50g',0,'/goods-img/65aed381-cde0-44ed-b345-5ebf1d74a13b.jpg','/goods-img/65aed381-cde0-44ed-b345-5ebf1d74a13b.jpg','<p>商品介绍加载中...</p>',130,65,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10035,'无印良品 MUJI 基础润肤乳液','清爽型 200ml',0,'/goods-img/1e09e1ed-435b-4f08-84d0-d88308a315ee.png','/goods-img/1e09e1ed-435b-4f08-84d0-d88308a315ee.png','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10036,'无印良品 MUJI 平衡洁面泡沫','100g',0,'/goods-img/dbc2ea2a-ee03-4366-a35e-6ebe66d02399.jpg','/goods-img/dbc2ea2a-ee03-4366-a35e-6ebe66d02399.jpg','<p>商品介绍加载中...</p>',85,42,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10037,'无印良品 MUJI 基础润肤乳液','滋润型 200ml',0,'/goods-img/9389914c-2860-4a75-b603-53ed5a4e0509.jpg','/goods-img/9389914c-2860-4a75-b603-53ed5a4e0509.jpg','<p>商品介绍加载中...</p>',61,61,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10038,'无印良品 MUJI 便携式香薰机','新蜂精选',0,'/goods-img/6ab010e2-5f1e-4512-bd22-4c2550915d4c.jpg','/goods-img/6ab010e2-5f1e-4512-bd22-4c2550915d4c.jpg','<p>商品介绍加载中...</p>',200,200,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10039,'无印良品 MUJI 女式','粗棉线条纹长袖T恤 白色*横条 L',0,'/goods-img/fab00903-7ff6-40ee-a9bc-3fbc2f0f0ffc.jpg','/goods-img/fab00903-7ff6-40ee-a9bc-3fbc2f0f0ffc.jpg','<p>商品介绍加载中...</p>',198,70,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10040,'无印良品（MUJI） 聚丙烯化妆盒 1/2','半透明约150x220x86mm',0,'/goods-img/ab725751-adb8-452a-86dd-cb3d21da794e.jpg','/goods-img/ab725751-adb8-452a-86dd-cb3d21da794e.jpg','<p>商品介绍加载中...</p>',30,30,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10041,'无印良品 MUJI 聚丙烯','笔盒 大/约184*64*25㎜',0,'/goods-img/9f623290-928c-498f-89e6-171372b394f2.jpg','/goods-img/9f623290-928c-498f-89e6-171372b394f2.jpg','<p>商品介绍加载中...</p>',18,18,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10042,'无印良品（MUJI） 无针订书机 其他','新蜂精选',0,'/goods-img/a7221688-3c37-4ac0-b07e-d8bde1525d1e.jpg','/goods-img/a7221688-3c37-4ac0-b07e-d8bde1525d1e.jpg','<p>商品介绍加载中...</p>',52,52,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10043,'无印良品 MUJI 塑料橡皮','黑色 小',0,'/goods-img/75e26af4-8f15-43f2-9407-50d641f82acb.jpg','/goods-img/75e26af4-8f15-43f2-9407-50d641f82acb.jpg','<p>商品介绍加载中...</p>',4,4,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10044,'无印良品 MUJI 大容量基础乳液/高保湿型','400ml',0,'/goods-img/69d55773-1b43-497b-af18-90f2cec7c93a.jpg','/goods-img/69d55773-1b43-497b-af18-90f2cec7c93a.jpg','<p>商品介绍加载中...</p>',140,140,1000,'',0,0,'2019-09-18 13:18:52',0,'2020-10-13 10:41:59'),\n\t(10045,'无印良品 MUJI 毛笔','黑色',0,'/goods-img/419ddb3c-1793-49c1-8953-77409a5d5bce.jpg','/goods-img/419ddb3c-1793-49c1-8953-77409a5d5bce.jpg','<p>商品介绍加载中...</p>',20,20,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10046,'无印良品 MUJI 塑料橡皮','白色 小',0,'/goods-img/e53cc7af-f81c-4752-aec8-007e807b2fc1.jpg','/goods-img/e53cc7af-f81c-4752-aec8-007e807b2fc1.jpg','<p>商品介绍加载中...</p>',4,4,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10047,'无印良品 MUJI 男式','无侧缝法兰绒 睡衣 深海军蓝X格子 L',0,'/goods-img/481e8994-20cb-4f6c-8b77-4eb8509eb3b9.jpg','/goods-img/481e8994-20cb-4f6c-8b77-4eb8509eb3b9.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10048,'无印良品 MUJI 荧光笔','蓝色',0,'/goods-img/012ebf2d-8c96-4641-8782-eab01c85d98f.jpg','/goods-img/012ebf2d-8c96-4641-8782-eab01c85d98f.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10049,'无印良品（MUJI） 钢制指甲刀 小','新蜂精选',0,'/goods-img/2c150720-4b3a-4d9e-9ce6-77eb4998e1f1.jpg','/goods-img/2c150720-4b3a-4d9e-9ce6-77eb4998e1f1.jpg','<p>商品介绍加载中...</p>',42,42,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10050,'无印良品 MUJI 长条诗笺型笔记表格','白色 40枚 14行',0,'/goods-img/e7d2ea3f-6703-4fcc-bbb4-ad9ef43a0ae2.jpg','/goods-img/e7d2ea3f-6703-4fcc-bbb4-ad9ef43a0ae2.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10051,'无印良品 MUJI PET喷雾小分装瓶100ml','新蜂精选',0,'/goods-img/0ec8c4a7-aedc-464d-9e23-d3e4acafdc73.jpg','/goods-img/0ec8c4a7-aedc-464d-9e23-d3e4acafdc73.jpg','<p>商品介绍加载中...</p>',30,30,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10052,'无印良品 MUJI 塑料橡皮','黑色 大',0,'/goods-img/ce8ff43c-e8b4-4c52-9de1-c983c97068f6.jpg','/goods-img/ce8ff43c-e8b4-4c52-9de1-c983c97068f6.jpg','<p>商品介绍加载中...</p>',7,7,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10053,'无印良品 MUJI 荧光笔','黄色',0,'/goods-img/79b38a89-b02a-4fd1-80c4-5cb426028536.jpg','/goods-img/79b38a89-b02a-4fd1-80c4-5cb426028536.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10054,'无印良品 MUJI 遮瑕膏','棒状 自然色',0,'/goods-img/ffa69c8e-f57f-4ef4-a2a0-3695d538d6c5.jpg','/goods-img/ffa69c8e-f57f-4ef4-a2a0-3695d538d6c5.jpg','<p>商品介绍加载中...</p>',42,42,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10055,'无印良品 MUJI 马桶刷/附盒子','白色',0,'/goods-img/9dd1cdfb-e7f9-4d3c-98df-933e2bc3f9a8.jpg','/goods-img/9dd1cdfb-e7f9-4d3c-98df-933e2bc3f9a8.jpg','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10056,'无印良品 MUJI 耐热玻璃_壶_大','透明',0,'/goods-img/0bc4f5ac-d601-421d-8131-81958a195705.jpg','/goods-img/0bc4f5ac-d601-421d-8131-81958a195705.jpg','<p>商品介绍加载中...</p>',150,150,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10057,'无印良品 MUJI 女式','平纹短袖衬衫 藏青色 M',0,'/goods-img/76b6a573-12a0-4c63-b2ae-e7193aff0fc8.jpg','/goods-img/76b6a573-12a0-4c63-b2ae-e7193aff0fc8.jpg','<p>商品介绍加载中...</p>',198,59,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10058,'无印良品 MUJI 基础润肤化妆水','清爽型 50ml',0,'/goods-img/af7f9b21-d782-4bad-8b1a-d86bbc4d224e.png','/goods-img/af7f9b21-d782-4bad-8b1a-d86bbc4d224e.png','<p>商品介绍加载中...</p>',28,22,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10059,'无印良品 MUJI 男式','无侧缝法兰绒 睡衣 炭灰色 M',0,'/goods-img/26e0c424-f22d-4d3d-9bd6-a7958a346ff9.jpg','/goods-img/26e0c424-f22d-4d3d-9bd6-a7958a346ff9.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10060,'无印良品（MUJI） PET分裝瓶','新蜂精选',0,'/goods-img/24bf1630-0339-4c22-ad19-37152c561e71.jpg','/goods-img/24bf1630-0339-4c22-ad19-37152c561e71.jpg','<p>商品介绍加载中...</p>',15,15,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10061,'无印良品 MUJI 女式','无侧缝法兰绒 睡衣 灰色 M',0,'/goods-img/e8e26306-0521-4843-9e07-70ebd2fa6405.jpg','/goods-img/e8e26306-0521-4843-9e07-70ebd2fa6405.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10062,'无印良品（MUJI） PE分裝瓶','新蜂精选',0,'/goods-img/9b3af7c2-57f5-48a7-bea5-603b2d145000.jpg','/goods-img/9b3af7c2-57f5-48a7-bea5-603b2d145000.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10063,'无印良品 MUJI 基础润肤化妆水','滋润型 200ml',0,'/goods-img/7577f3e0-f48b-47a9-96b7-de405a6aaf95.png','/goods-img/7577f3e0-f48b-47a9-96b7-de405a6aaf95.png','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10064,'无印良品 MUJI 男式','干爽 凉感珠地网眼编织V领短袖T恤 黑色 L',0,'/goods-img/cce2af31-07ea-4744-8d01-16dd01d68e5b.jpg','/goods-img/cce2af31-07ea-4744-8d01-16dd01d68e5b.jpg','<p>商品介绍加载中...</p>',98,29,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10065,'无印良品（MUJI） 聚丙烯化妆盒 半透明约150x220x169mm','新蜂精选',0,'/goods-img/6dc279ac-fef0-401c-8604-b18dc9a9f7ab.jpg','/goods-img/6dc279ac-fef0-401c-8604-b18dc9a9f7ab.jpg','<p>商品介绍加载中...</p>',40,40,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10066,'无印良品（MUJI） 散粉小 自然色','新蜂精选',0,'/goods-img/94764fac-f4ad-4ee8-8d26-21af0c09ea76.jpg','/goods-img/94764fac-f4ad-4ee8-8d26-21af0c09ea76.jpg','<p>商品介绍加载中...</p>',60,60,1000,'',0,0,'2019-09-18 13:19:02',0,'2020-10-13 10:41:59'),\n\t(10067,'无印良品 MUJI 毛笔','黑色',0,'/goods-img/9cd07460-8c0b-49e5-9741-5015a3576e8e.jpg','/goods-img/9cd07460-8c0b-49e5-9741-5015a3576e8e.jpg','<p>商品介绍加载中...</p>',20,20,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10068,'无印良品 MUJI 塑料橡皮','白色 小',0,'/goods-img/70529ced-527a-4b46-aafa-874107ff9ea5.jpg','/goods-img/70529ced-527a-4b46-aafa-874107ff9ea5.jpg','<p>商品介绍加载中...</p>',4,4,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10069,'无印良品 MUJI 男式','无侧缝法兰绒 睡衣 深海军蓝X格子 L',0,'/goods-img/174ec60d-7d2b-4043-a7a6-7383c3de1a11.jpg','/goods-img/174ec60d-7d2b-4043-a7a6-7383c3de1a11.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10070,'无印良品 MUJI 荧光笔','蓝色',0,'/goods-img/eef29d44-17f5-41dd-b0ba-c6f63d7bdac3.jpg','/goods-img/eef29d44-17f5-41dd-b0ba-c6f63d7bdac3.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10071,'无印良品（MUJI） 钢制指甲刀 小','新蜂精选',0,'/goods-img/f9964432-a9b7-45c2-ac6d-680130c2d7a7.jpg','/goods-img/f9964432-a9b7-45c2-ac6d-680130c2d7a7.jpg','<p>商品介绍加载中...</p>',42,42,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10072,'无印良品 MUJI 长条诗笺型笔记表格','白色 40枚 14行',0,'/goods-img/da1e4523-adb4-48e4-afa5-313346187690.jpg','/goods-img/da1e4523-adb4-48e4-afa5-313346187690.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10073,'无印良品 MUJI PET喷雾小分装瓶100ml','新蜂精选',0,'/goods-img/7f1eec3d-d8e5-4a18-a1a9-b81876dcaaf5.jpg','/goods-img/7f1eec3d-d8e5-4a18-a1a9-b81876dcaaf5.jpg','<p>商品介绍加载中...</p>',30,30,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10074,'无印良品 MUJI 塑料橡皮','黑色 大',0,'/goods-img/1ca16211-2b80-4006-ab60-e1a3cab4218c.jpg','/goods-img/1ca16211-2b80-4006-ab60-e1a3cab4218c.jpg','<p>商品介绍加载中...</p>',7,7,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10075,'无印良品 MUJI 荧光笔','黄色',0,'/goods-img/56eec806-2af3-4136-a9bf-2333455339e7.jpg','/goods-img/56eec806-2af3-4136-a9bf-2333455339e7.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10076,'无印良品 MUJI 遮瑕膏','棒状 自然色',0,'/goods-img/593b65a7-feae-45aa-837e-47d58bb27474.jpg','/goods-img/593b65a7-feae-45aa-837e-47d58bb27474.jpg','<p>商品介绍加载中...</p>',42,42,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10077,'无印良品 MUJI 马桶刷/附盒子','白色',0,'/goods-img/a9983f71-d818-459d-ad59-bbdd26bb533b.jpg','/goods-img/a9983f71-d818-459d-ad59-bbdd26bb533b.jpg','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10078,'无印良品 MUJI 耐热玻璃_壶_大','透明',0,'/goods-img/7f89c29e-d888-4ee0-92af-ca713a7871a4.jpg','/goods-img/7f89c29e-d888-4ee0-92af-ca713a7871a4.jpg','<p>商品介绍加载中...</p>',150,150,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10079,'无印良品 MUJI 女式','平纹短袖衬衫 藏青色 M',0,'/goods-img/0b1e57bf-b4fd-40df-9832-4749d7d69db9.jpg','/goods-img/0b1e57bf-b4fd-40df-9832-4749d7d69db9.jpg','<p>商品介绍加载中...</p>',198,59,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10080,'无印良品 MUJI 基础润肤化妆水','清爽型 50ml',0,'/goods-img/9b4af7cf-235a-4742-bdc3-9e8e656f245c.png','/goods-img/9b4af7cf-235a-4742-bdc3-9e8e656f245c.png','<p>商品介绍加载中...</p>',28,22,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10081,'无印良品 MUJI 男式','无侧缝法兰绒 睡衣 炭灰色 M',0,'/goods-img/8ddfc2de-3da3-4fad-86aa-7c570cb55212.jpg','/goods-img/8ddfc2de-3da3-4fad-86aa-7c570cb55212.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10082,'无印良品（MUJI） PET分裝瓶','新蜂精选',0,'/goods-img/e62d04e9-3ae2-431c-8538-becda89e0e84.jpg','/goods-img/e62d04e9-3ae2-431c-8538-becda89e0e84.jpg','<p>商品介绍加载中...</p>',15,15,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10083,'无印良品 MUJI 女式','无侧缝法兰绒 睡衣 灰色 M',0,'/goods-img/3078143f-1cdd-4f66-951b-2cf08af8c826.jpg','/goods-img/3078143f-1cdd-4f66-951b-2cf08af8c826.jpg','<p>商品介绍加载中...</p>',398,199,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10084,'无印良品（MUJI） PE分裝瓶','新蜂精选',0,'/goods-img/97aa8872-26df-473a-b0d7-f5021776cb52.jpg','/goods-img/97aa8872-26df-473a-b0d7-f5021776cb52.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10085,'无印良品 MUJI 基础润肤化妆水','滋润型 200ml',0,'/goods-img/954da201-0cbb-45d1-9cd1-17ce4d24cfb4.png','/goods-img/954da201-0cbb-45d1-9cd1-17ce4d24cfb4.png','<p>商品介绍加载中...</p>',70,70,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10086,'无印良品 MUJI 男式','干爽 凉感珠地网眼编织V领短袖T恤 黑色 L',0,'/goods-img/b584ea09-7aae-422e-8435-fdc38c948434.jpg','/goods-img/b584ea09-7aae-422e-8435-fdc38c948434.jpg','<p>商品介绍加载中...</p>',98,29,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10087,'无印良品（MUJI） 聚丙烯化妆盒 半透明约150x220x169mm','新蜂精选',0,'/goods-img/a0a45b44-82c9-4a58-a972-304bed0632bb.jpg','/goods-img/a0a45b44-82c9-4a58-a972-304bed0632bb.jpg','<p>商品介绍加载中...</p>',40,40,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10088,'无印良品（MUJI） 散粉小 自然色','新蜂精选',0,'/goods-img/a1b8ff33-ec01-494e-a1db-fb5158f3c168.jpg','/goods-img/a1b8ff33-ec01-494e-a1db-fb5158f3c168.jpg','<p>商品介绍加载中...</p>',60,60,1000,'',0,0,'2019-09-18 13:19:07',0,'2020-10-13 10:41:59'),\n\t(10089,'无印良品 MUJI 荧光笔','粉红色',0,'/goods-img/c5d6d952-c81b-436a-a345-feb4c5a20a7d.jpg','/goods-img/c5d6d952-c81b-436a-a345-feb4c5a20a7d.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10090,'无印良品（MUJI） PET小分装瓶100ml','新蜂精选',0,'/goods-img/2ffe59f3-559f-4e6f-810d-1b6fa4ac04e1.jpg','/goods-img/2ffe59f3-559f-4e6f-810d-1b6fa4ac04e1.jpg','<p>商品介绍加载中...</p>',30,30,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10091,'无印良品 MUJI 基础润肤洁面乳','150ml',0,'/goods-img/1f24d75a-0468-471a-a608-bd6788f4c1a1.jpg','/goods-img/1f24d75a-0468-471a-a608-bd6788f4c1a1.jpg','<p>商品介绍加载中...</p>',74,74,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10092,'无印良品 MUJI 基础润肤乳霜','其他 50g',0,'/goods-img/86e027b3-8868-4fa5-971b-49e827027e3e.jpg','/goods-img/86e027b3-8868-4fa5-971b-49e827027e3e.jpg','<p>商品介绍加载中...</p>',100,100,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10093,'无印良品 MUJI 基础润肤洁面泡沫(替换装)','180ml',0,'/goods-img/1aea34fa-f45e-4c3c-b73c-da1f92492c95.jpg','/goods-img/1aea34fa-f45e-4c3c-b73c-da1f92492c95.jpg','<p>商品介绍加载中...</p>',69,69,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10094,'无印良品 MUJI 保湿洁面啫喱','100g',0,'/goods-img/838fc0cb-b98f-4dca-bd68-581138b21a30.jpg','/goods-img/838fc0cb-b98f-4dca-bd68-581138b21a30.jpg','<p>商品介绍加载中...</p>',100,50,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10095,'无印良品 MUJI 小型超声波香薰机','其他',0,'/goods-img/30f05c92-a303-4b94-bb5e-22f3c65f3c37.jpg','/goods-img/30f05c92-a303-4b94-bb5e-22f3c65f3c37.jpg','<p>商品介绍加载中...</p>',250,250,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10096,'无印良品 MUJI 修正带','其他',0,'/goods-img/759427b3-b723-4917-b565-c0ae2003bf02.jpg','/goods-img/759427b3-b723-4917-b565-c0ae2003bf02.jpg','<p>商品介绍加载中...</p>',25,25,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10097,'无印良品 MUJI 聚丙烯','笔盒 小/约170*51*20㎜',0,'/goods-img/734f1604-e687-4cd1-8573-bb00e680e94e.jpg','/goods-img/734f1604-e687-4cd1-8573-bb00e680e94e.jpg','<p>商品介绍加载中...</p>',12,12,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10098,'无印良品 MUJI 乳液','50ml',0,'/goods-img/4eed1033-7728-477c-a29d-589bfd3ae3ce.jpg','/goods-img/4eed1033-7728-477c-a29d-589bfd3ae3ce.jpg','<p>商品介绍加载中...</p>',55,27,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10099,'无印良品 MUJI 男式','棉水洗 平纹短袖衬衫 白色 L',0,'/goods-img/d3fa11f3-6cfa-4958-b09c-584a62137b4b.jpg','/goods-img/d3fa11f3-6cfa-4958-b09c-584a62137b4b.jpg','<p>商品介绍加载中...</p>',178,89,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10100,'无印良品 MUJI 香/绿意','12支装/棒状',0,'/goods-img/829f2d09-1589-4f63-8376-d347c3cec620.jpg','/goods-img/829f2d09-1589-4f63-8376-d347c3cec620.jpg','<p>商品介绍加载中...</p>',32,32,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10101,'无印良品 MUJI 润肤乳霜(高保湿型)50g','50g',0,'/goods-img/1c70ddcb-ca69-40ed-a263-30880b2e2cac.jpg','/goods-img/1c70ddcb-ca69-40ed-a263-30880b2e2cac.jpg','<p>商品介绍加载中...</p>',159,159,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10102,'无印良品 MUJI 柔滑笔芯','黑色',0,'/goods-img/1db10d7c-3429-4ef2-ac41-2991af57f442.jpg','/goods-img/1db10d7c-3429-4ef2-ac41-2991af57f442.jpg','<p>商品介绍加载中...</p>',19,19,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10103,'无印良品 MUJI 铝制','挂钩/吸盘式_2个装 大/约宽4.5x高6cm 2个装',0,'/goods-img/bd0b92b4-c8ca-453a-b572-b3447083bddf.png','/goods-img/bd0b92b4-c8ca-453a-b572-b3447083bddf.png','<p>商品介绍加载中...</p>',25,25,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10104,'无印良品 MUJI 修正带','POM材质 替芯',0,'/goods-img/98ce17e1-890e-4eaf-856a-7fce8ffebc4c.jpg','/goods-img/98ce17e1-890e-4eaf-856a-7fce8ffebc4c.jpg','<p>商品介绍加载中...</p>',15,15,999,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10105,'无印良品 MUJI 压克力记录板夹','Ａ4用/220×310ｍｍ',0,'/goods-img/64d4e0b7-cd01-47f6-9081-4c2e7625e4f9.jpg','/goods-img/64d4e0b7-cd01-47f6-9081-4c2e7625e4f9.jpg','<p>商品介绍加载中...</p>',35,35,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10106,'无印良品（MUJI） 自然亲肤粉底液 自然透亮色','新蜂精选',0,'/goods-img/09576fcd-ea01-4b1d-bed4-be96b71f2c4e.jpg','/goods-img/09576fcd-ea01-4b1d-bed4-be96b71f2c4e.jpg','<p>商品介绍加载中...</p>',75,75,1000,'',0,0,'2019-09-18 13:19:17',0,'2020-10-13 10:41:59'),\n\t(10107,'无印良品 MUJI 荧光笔','粉红色',0,'/goods-img/04a8c325-d296-4f0e-ac6d-8cccba4dc90e.jpg','/goods-img/04a8c325-d296-4f0e-ac6d-8cccba4dc90e.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10108,'无印良品（MUJI） PET小分装瓶100ml','新蜂精选',0,'/goods-img/755a34a3-bc3e-4f04-8943-f79860012e78.jpg','/goods-img/755a34a3-bc3e-4f04-8943-f79860012e78.jpg','<p>商品介绍加载中...</p>',30,30,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10109,'无印良品 MUJI 基础润肤洁面乳','150ml',0,'/goods-img/e6a986ed-9b83-4649-9e72-3cf676c1f90e.jpg','/goods-img/e6a986ed-9b83-4649-9e72-3cf676c1f90e.jpg','<p>商品介绍加载中...</p>',74,74,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10110,'无印良品 MUJI 基础润肤乳霜','其他 50g',0,'/goods-img/30036561-a150-4ea7-9106-29bbea278909.jpg','/goods-img/30036561-a150-4ea7-9106-29bbea278909.jpg','<p>商品介绍加载中...</p>',100,100,999,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10111,'无印良品 MUJI 基础润肤洁面泡沫(替换装)','180ml',0,'/goods-img/aa37202c-68eb-4c84-b02c-171b3d11c0e8.jpg','/goods-img/aa37202c-68eb-4c84-b02c-171b3d11c0e8.jpg','<p>商品介绍加载中...</p>',69,69,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10112,'无印良品 MUJI 保湿洁面啫喱','100g',0,'/goods-img/0f724c0f-8888-4b75-8fe1-dc7dd8f2b7bd.jpg','/goods-img/0f724c0f-8888-4b75-8fe1-dc7dd8f2b7bd.jpg','<p>商品介绍加载中...</p>',100,50,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10113,'无印良品 MUJI 小型超声波香薰机','其他',0,'/goods-img/9608b59d-cbca-4b70-9f05-226fde41c51c.jpg','/goods-img/9608b59d-cbca-4b70-9f05-226fde41c51c.jpg','<p>商品介绍加载中...</p>',250,250,998,'呼吸品质生活',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10114,'无印良品 MUJI 修正带','其他',0,'/goods-img/d91a71e7-aada-4770-91c5-4da21e4b7ed9.jpg','/goods-img/d91a71e7-aada-4770-91c5-4da21e4b7ed9.jpg','<p>商品介绍加载中...</p>',25,25,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10115,'无印良品 MUJI 聚丙烯','笔盒 小/约170*51*20㎜',0,'/goods-img/d543ba0d-18d8-427a-87ea-99968b319440.jpg','/goods-img/d543ba0d-18d8-427a-87ea-99968b319440.jpg','<p>商品介绍加载中...</p>',12,12,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10116,'无印良品 MUJI 乳液','50ml',0,'/goods-img/cd6d91b0-69b2-4415-8560-4cbd2690cb50.jpg','/goods-img/cd6d91b0-69b2-4415-8560-4cbd2690cb50.jpg','<p>商品介绍加载中...</p>',55,27,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10117,'无印良品 MUJI 男式','棉水洗 平纹短袖衬衫 白色 L',0,'/goods-img/b08c94ac-cba2-4468-b3d0-03d9447f5bf2.jpg','/goods-img/b08c94ac-cba2-4468-b3d0-03d9447f5bf2.jpg','<p>商品介绍加载中...</p>',178,89,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10118,'无印良品 MUJI 香/绿意','12支装/棒状',0,'/goods-img/5a65f952-4141-47f8-8f8e-84120bbf74ea.jpg','/goods-img/5a65f952-4141-47f8-8f8e-84120bbf74ea.jpg','<p>商品介绍加载中...</p>',32,32,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10119,'无印良品 MUJI 润肤乳霜(高保湿型)50g','50g',0,'/goods-img/503ef53e-d4ac-4c4e-83a7-8a03ead0ecc8.jpg','/goods-img/503ef53e-d4ac-4c4e-83a7-8a03ead0ecc8.jpg','<p>商品介绍加载中...</p>',159,159,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10120,'无印良品 MUJI 柔滑笔芯','黑色',0,'/goods-img/aa83ce5b-2db1-4ecf-bc4f-f43c437894d7.jpg','/goods-img/aa83ce5b-2db1-4ecf-bc4f-f43c437894d7.jpg','<p>商品介绍加载中...</p>',19,19,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10121,'无印良品 MUJI 铝制','挂钩/吸盘式_2个装 大/约宽4.5x高6cm 2个装',0,'/goods-img/5c590548-9de3-47a3-8cb9-4d8f040a9635.png','/goods-img/5c590548-9de3-47a3-8cb9-4d8f040a9635.png','<p>商品介绍加载中...</p>',25,25,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10122,'无印良品 MUJI 修正带','POM材质 替芯',0,'/goods-img/93181f0b-c069-4542-be91-a63856cd12d1.jpg','/goods-img/93181f0b-c069-4542-be91-a63856cd12d1.jpg','<p>商品介绍加载中...</p>',15,15,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10123,'无印良品 MUJI 压克力记录板夹','Ａ4用/220×310ｍｍ',0,'/goods-img/45be1de3-447b-404b-9df8-ddf07fdc8647.jpg','/goods-img/45be1de3-447b-404b-9df8-ddf07fdc8647.jpg','<p>商品介绍加载中...</p>',35,35,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10124,'无印良品（MUJI） 自然亲肤粉底液 自然透亮色','新蜂精选',0,'/goods-img/7f905827-5765-40bc-a1b8-bedd9f407ced.jpg','/goods-img/7f905827-5765-40bc-a1b8-bedd9f407ced.jpg','<p>商品介绍加载中...</p>',75,75,1000,'',0,0,'2019-09-18 13:19:22',0,'2020-10-13 10:41:59'),\n\t(10125,'无印良品 MUJI PE小分装盒','透明 30g',0,'/goods-img/1d7f28bb-6597-48de-a6bb-2561697db883.jpg','/goods-img/1d7f28bb-6597-48de-a6bb-2561697db883.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10126,'无印良品 MUJI 保湿化妆液','新蜂精选',0,'/goods-img/53a089a9-e1d1-487e-974e-18bb4df41cf3.jpg','/goods-img/53a089a9-e1d1-487e-974e-18bb4df41cf3.jpg','<p>商品介绍加载中...</p>',160,80,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10127,'无印良品 MUJI 女式','棉弹力 高领T恤 深灰色 M',0,'/goods-img/53a6478b-4fd5-4add-b095-9fd4ad983a7b.jpg','/goods-img/53a6478b-4fd5-4add-b095-9fd4ad983a7b.jpg','<p>商品介绍加载中...</p>',128,40,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10128,'无印良品 MUJI 男式','棉水洗 牛津纽扣领短袖衬衫 白色 L',0,'/goods-img/561e9e6d-b130-468d-8328-36a5ff70cdfa.jpg','/goods-img/561e9e6d-b130-468d-8328-36a5ff70cdfa.jpg','<p>商品介绍加载中...</p>',178,89,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10129,'无印良品 MUJI 基础润肤乳液','高保湿型 50ml',0,'/goods-img/01514263-83b4-4ac7-aee3-5e5a2448414f.jpg','/goods-img/01514263-83b4-4ac7-aee3-5e5a2448414f.jpg','<p>商品介绍加载中...</p>',37,29,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10130,'MUJI 羽毛 靠垫','白色',0,'/goods-img/23e5ee1d-5bb7-4f2a-b4b5-4fbc9ca3c163.jpg','/goods-img/23e5ee1d-5bb7-4f2a-b4b5-4fbc9ca3c163.jpg','<p>商品介绍加载中...</p>',65,65,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10131,'无印良品（MUJI） 可携带用小卷尺 白色','新蜂精选',0,'/goods-img/a4d3a61e-b0d3-4c58-85d6-fddf1de85f66.jpg','/goods-img/a4d3a61e-b0d3-4c58-85d6-fddf1de85f66.jpg','<p>商品介绍加载中...</p>',28,28,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10132,'无印良品 MUJI 笔记本/5mm方格','暗灰色 B5/30张/线装',0,'/goods-img/38c25b00-a4fb-4893-aa8e-34ff76963397.jpg','/goods-img/38c25b00-a4fb-4893-aa8e-34ff76963397.jpg','<p>商品介绍加载中...</p>',9,9,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10133,'无印良品 MUJI 低重心铅笔','白色',0,'/goods-img/dc497882-61ea-4d4f-98fe-d2b2500eda01.jpg','/goods-img/dc497882-61ea-4d4f-98fe-d2b2500eda01.jpg','<p>商品介绍加载中...</p>',47,47,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10134,'无印良品（MUJI） 手动碎纸机','新蜂精选',0,'/goods-img/f6e1ce14-a590-4736-9d36-df5628bc4188.jpg','/goods-img/f6e1ce14-a590-4736-9d36-df5628bc4188.jpg','<p>商品介绍加载中...</p>',75,75,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10135,'无印良品 MUJI 女式','无袖衫 燕麦色 XL',0,'/goods-img/c2e30c9b-ce49-4824-824a-b7d3ae173340.jpg','/goods-img/c2e30c9b-ce49-4824-824a-b7d3ae173340.jpg','<p>商品介绍加载中...</p>',178,53,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10136,'无印良品 MUJI 女式','粗棉线长袖T恤 生成色 L',0,'/goods-img/4b1b98d5-359f-4025-85e3-f357b6e9724a.jpg','/goods-img/4b1b98d5-359f-4025-85e3-f357b6e9724a.jpg','<p>商品介绍加载中...</p>',198,70,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10137,'无印良品 MUJI 塑料浴室座椅/小','原色',0,'/goods-img/37053615-750d-486e-b218-358a7c1adb21.jpg','/goods-img/37053615-750d-486e-b218-358a7c1adb21.jpg','<p>商品介绍加载中...</p>',85,85,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10138,'无印良品（MUJI） 树脂携带型订书机 白色','新蜂精选',0,'/goods-img/21dd6bd9-c4bc-4e17-8fed-23775cebf361.jpg','/goods-img/21dd6bd9-c4bc-4e17-8fed-23775cebf361.jpg','<p>商品介绍加载中...</p>',42,42,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10139,'无印良品 MUJI 基础润肤乳液','滋润型',0,'/goods-img/b8978340-ff72-4b5a-a9d3-4b5610982764.jpg','/goods-img/b8978340-ff72-4b5a-a9d3-4b5610982764.jpg','<p>商品介绍加载中...</p>',28,22,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10140,'无印良品（MUJI） 控色隔离霜30g 浅蓝色','新蜂精选',0,'/goods-img/b2969d29-b073-48f3-aa9a-b8aeb08a98d6.jpg','/goods-img/b2969d29-b073-48f3-aa9a-b8aeb08a98d6.jpg','<p>商品介绍加载中...</p>',65,65,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10141,'无印良品 MUJI 女式','粗棉线条纹长袖T恤 黑*横条 L',0,'/goods-img/a905c374-3411-4ddd-9b84-7ecbc9b50620.jpg','/goods-img/a905c374-3411-4ddd-9b84-7ecbc9b50620.jpg','<p>商品介绍加载中...</p>',198,70,1000,'',0,0,'2019-09-18 13:19:30',0,'2020-10-13 10:41:59'),\n\t(10142,'无印良品 MUJI PE小分装盒','透明 30g',0,'/goods-img/2750405a-2e01-463d-a059-54644c67f7cc.jpg','/goods-img/2750405a-2e01-463d-a059-54644c67f7cc.jpg','<p>商品介绍加载中...</p>',10,10,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10143,'无印良品 MUJI 保湿化妆液','新蜂精选',0,'/goods-img/17656dd7-c0fb-431d-810a-5eb29d07c011.jpg','/goods-img/17656dd7-c0fb-431d-810a-5eb29d07c011.jpg','<p>商品介绍加载中...</p>',160,80,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10144,'无印良品 MUJI 女式','棉弹力 高领T恤 深灰色 M',0,'/goods-img/780e716a-7be8-4d94-b8b6-833b4d97e148.jpg','/goods-img/780e716a-7be8-4d94-b8b6-833b4d97e148.jpg','<p>商品介绍加载中...</p>',128,40,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10145,'无印良品 MUJI 男式','棉水洗 牛津纽扣领短袖衬衫 白色 L',0,'/goods-img/94f5b471-1148-4320-aa8a-68573706fd91.jpg','/goods-img/94f5b471-1148-4320-aa8a-68573706fd91.jpg','<p>商品介绍加载中...</p>',178,89,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10146,'无印良品 MUJI 基础润肤乳液','高保湿型 50ml',0,'/goods-img/a12dcb9c-bb36-4df9-b517-1578a03fe062.jpg','/goods-img/a12dcb9c-bb36-4df9-b517-1578a03fe062.jpg','<p>商品介绍加载中...</p>',37,29,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10147,'MUJI 羽毛 靠垫','白色',0,'/goods-img/0f701215-b782-40c7-8bbd-97b51be56461.jpg','/goods-img/0f701215-b782-40c7-8bbd-97b51be56461.jpg','<p>商品介绍加载中...</p>',65,65,988,'悠享惬意',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10148,'无印良品（MUJI） 可携带用小卷尺 白色','新蜂精选',0,'/goods-img/737afa41-1905-4dbc-ab33-95f8489dde5b.jpg','/goods-img/737afa41-1905-4dbc-ab33-95f8489dde5b.jpg','<p>商品介绍加载中...</p>',28,28,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10149,'无印良品 MUJI 笔记本/5mm方格','暗灰色 B5/30张/线装',0,'/goods-img/c6632420-ad7e-451b-a2a9-b02299653db1.jpg','/goods-img/c6632420-ad7e-451b-a2a9-b02299653db1.jpg','<p>商品介绍加载中...</p>',9,9,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10150,'无印良品 MUJI 低重心铅笔','白色',0,'/goods-img/060e3ace-71ca-44a2-9ded-73a05f186fcf.jpg','/goods-img/060e3ace-71ca-44a2-9ded-73a05f186fcf.jpg','<p>商品介绍加载中...</p>',47,47,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10151,'无印良品（MUJI） 手动碎纸机','新蜂精选',0,'/goods-img/58d831e4-07f4-44e2-a994-1a7d585452a1.jpg','/goods-img/58d831e4-07f4-44e2-a994-1a7d585452a1.jpg','<p>商品介绍加载中...</p>',75,75,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10152,'无印良品 MUJI 女式','无袖衫 燕麦色 XL',0,'/goods-img/f2aaadc0-ddda-4736-9826-2dbb2c533ea0.jpg','/goods-img/f2aaadc0-ddda-4736-9826-2dbb2c533ea0.jpg','<p>商品介绍加载中...</p>',178,53,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10153,'无印良品 MUJI 女式','粗棉线长袖T恤 生成色 L',0,'/goods-img/09c87218-d645-48e7-bbd5-54af5e77bf4b.jpg','/goods-img/09c87218-d645-48e7-bbd5-54af5e77bf4b.jpg','<p>商品介绍加载中...</p>',198,70,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10154,'无印良品 MUJI 塑料浴室座椅','原色',0,'/goods-img/15395057-94e9-4545-a8ee-8aee025f40c5.jpg','/goods-img/15395057-94e9-4545-a8ee-8aee025f40c5.jpg','<p>商品介绍加载中...</p>',85,85,998,'无印良品',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10155,'无印良品（MUJI） 树脂携带型订书机 白色','新蜂精选',0,'/goods-img/3b40971a-3f32-45cf-a99a-aada90ee8e33.jpg','/goods-img/3b40971a-3f32-45cf-a99a-aada90ee8e33.jpg','<p>商品介绍加载中...</p>',42,42,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10156,'无印良品 MUJI 基础润肤乳液','滋润型',0,'/goods-img/f65ef709-8fa8-4a3f-8abd-75a9b0492b14.jpg','/goods-img/f65ef709-8fa8-4a3f-8abd-75a9b0492b14.jpg','<p>商品介绍加载中...</p>',28,22,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10157,'无印良品（MUJI） 控色隔离霜30g 浅蓝色','新蜂精选',0,'/goods-img/66311489-b28b-41c3-ac34-540293df6e42.jpg','/goods-img/66311489-b28b-41c3-ac34-540293df6e42.jpg','<p>商品介绍加载中...</p>',65,65,1000,'',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10158,'无印良品 女式粗棉线条纹长袖T恤','黑*横条 L',20,'/goods-img/5488564b-8335-4b0c-a5a4-52f3f03ee728.jpg','http://localhost:28089/goods-img/5488564b-8335-4b0c-a5a4-52f3f03ee728.jpg','<p>商品介绍加载中...</p>',198,70,985,'无印良品',0,0,'2019-09-18 13:19:35',0,'2020-10-13 10:41:59'),\n\t(10159,'Apple AirPods 配充电盒','苹果蓝牙耳机',0,'/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg','/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg','<p>商品介绍加载中...</p>',1246,1246,987,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10160,'小米 Redmi AirDots','真无线蓝牙耳机|分体式耳机 |收纳充电盒 |蓝牙5.0 |按键防触控操作',51,'/goods-img/c47403f1-b706-453b-88d8-2bfdee0316be.jpg','/goods-img/c47403f1-b706-453b-88d8-2bfdee0316be.jpg','<p>商品介绍加载中...</p>',129,129,998,'为自由发声',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10161,'荣耀原装三键线控带麦半入耳式耳机AM116(尊爵版)适用于华为荣耀手机','新蜂精选',0,'/goods-img/183481c3-47ff-4b2e-926f-b02b926ac02c.jpg','/goods-img/183481c3-47ff-4b2e-926f-b02b926ac02c.jpg','<p>商品介绍加载中...</p>',69,49,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10162,'诺基亚（NOKIA）BH-705 银白色 5.0真无线蓝牙耳机迷你运动跑步音乐商务入耳式安卓苹果手机蓝牙耳机','新蜂精选',0,'/goods-img/5e0d089b-fa91-410d-8ff2-9534eb6f627f.jpg','/goods-img/5e0d089b-fa91-410d-8ff2-9534eb6f627f.jpg','<p>商品介绍加载中...</p>',499,499,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10163,'华为耳机原装半入耳式有线mate9p10plus8x荣耀v20v10nova2s9iv9p9play 【标准版】华为AM115 白色-热卖款','新蜂精选',0,'/goods-img/79e2b467-a075-46ef-ab43-aa0535f8e4c9.jpg','/goods-img/79e2b467-a075-46ef-ab43-aa0535f8e4c9.jpg','<p>商品介绍加载中...</p>',69,39,999,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10164,'Beats X 蓝牙无线','入耳式耳机 带麦可通话 -桀骜黑红（十周年版） MRQA2PA/A',0,'/goods-img/911531a4-39a6-4771-b26e-2ba4db1ebcda.jpg','/goods-img/911531a4-39a6-4771-b26e-2ba4db1ebcda.jpg','<p>商品介绍加载中...</p>',1168,799,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10165,'华为（ HUAWEI） 华为无线耳机','真无线蓝牙耳机 双耳蓝牙音乐耳机 Freebuds 2 无线耳机 陶瓷白',0,'/goods-img/e70a4f29-2269-466a-984e-01e018206c2e.jpg','/goods-img/e70a4f29-2269-466a-984e-01e018206c2e.jpg','<p>商品介绍加载中...</p>',899,799,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10166,'【自营仓次日达】moloke真无线蓝牙耳机双耳适用于苹果华为小米 运动跑步入耳式oppo迷你商务耳机 【1:1尊享版】自动弹窗+无线充电+可触控（热卖）','新蜂精选',51,'/goods-img/70dc1586-13bd-4b4c-92a9-fe20aa1d531f.jpg','/goods-img/70dc1586-13bd-4b4c-92a9-fe20aa1d531f.jpg','<p>商品介绍加载中...</p>',359,199,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10167,'Beats Powerbeats Pro','完全无线高性能耳机 真无线蓝牙运动耳机 象牙白',0,'/goods-img/04441cd4-81c8-4ad9-a067-9d15422e508f.jpg','/goods-img/04441cd4-81c8-4ad9-a067-9d15422e508f.jpg','<p>商品介绍加载中...</p>',1888,1888,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10168,'纽曼（Newmine）NM-LK06 全兼容线控音乐手机耳机 白色','新蜂精选',0,'/goods-img/ad53ea23-6974-4e44-b62d-eab498ce1d63.jpg','/goods-img/ad53ea23-6974-4e44-b62d-eab498ce1d63.jpg','<p>商品介绍加载中...</p>',9,9,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10169,'索尼（SONY）重低音立体声耳机MDR-XB55AP 黑色','新蜂精选',0,'/goods-img/01e1998d-f183-4e99-b8ba-7715727cf90b.jpg','/goods-img/01e1998d-f183-4e99-b8ba-7715727cf90b.jpg','*黑色实物偏灰，请以实物为准 Bass Booster低音增强器技术可呈现紧实深邃低频。 12 毫米驱动单元和110dB/mW 的高灵敏度，呈现高质感音效。 人体工学设计的倾斜入耳方式，让耳塞能够深入耳朵内部，呈现出色的隔音效果，同时带来舒适的佩戴感和高音质的享受。 耳塞能够深入耳朵内部，呈现出色的隔音效果，同时为您带来舒适的佩戴感和高音质的享受。 采用混合两种硬度硅胶的耳塞套： 核心部分使用硬质材料保持音质，减少因耳塞变形导致的声音失真； 外围部分柔软材料提高了耳塞密闭性，让您能长时间舒适佩戴。 *线控的可用性及操作因智能手机而异 耳机线表面细小沟壑，减少容易引起缠绕的摩擦，使导线不容易纠结在一起，方便欣赏音乐和携带。 防缠绕耳机线 盲点设计 便携袋 防尘滤网 导线滑块 4种尺寸耳塞套 摘下耳机的耳塞套，可见保护单元的网罩，用来防止异物和灰尘堵塞单元，使耳机经久耐听。 在左耳外壳和耳机线的连接处设有浮点，凭手指触摸就能判别左右耳，方便操作。 随机附赠收纳袋一只，保护你心爱的耳机。 利用导线滑块来调整左右耳机线的长度，也能够减少收纳耳机时容易出现的缠线现象 提供4对不同尺寸（SS、S、M、L）的耳塞套（M号出厂时已安装至耳机上），根据你的耳洞大小自由更换，获得良好的隔音效果，佩戴舒适。 ● 立体声耳机 ● 混合硅胶耳塞（SS/S/M/L 每种尺寸2个) *M号出厂时安装至本耳机。 ● 便携袋(×1) *EXTRA BASS 和 EXTRABASS 是索尼公司的商标',229,185,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10170,'索尼（SONY）WI-1000X Hi-Res颈挂式 入耳式','无线蓝牙耳机 高音质降噪耳机 手机通话 黑色',0,'/goods-img/1631a30b-287c-41da-bbbe-1a9b1b8d1552.jpg','/goods-img/1631a30b-287c-41da-bbbe-1a9b1b8d1552.jpg','<p>商品介绍加载中...</p>',2399,1499,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10171,'小米耳机 圈铁Pro 入耳式有线运动音乐耳机耳麦','新蜂精选',51,'/goods-img/f3d269a4-5317-4b30-b164-1311f6c1f058.jpg','/goods-img/f3d269a4-5317-4b30-b164-1311f6c1f058.jpg','使用双动圈 + 动铁 三单元发声 ／ 均衡自然声音 高保真石墨烯振膜 ／ 25 道工序打磨 ／ 弹力磨砂线材 Pro 小米圈铁耳机 孕育万物的天空和大地，时刻传达着声音的释放与组合，更是寻找灵感的源头，鸟鸣、流水、雷响、风啸不同的声音互相交融，共同演奏出自然的本真。 小米圈铁耳机 Pro 使用双“动圈”单元+“动铁”单元，将三个单元共同融入到同一个耳机中，双“动圈”的醇厚低音，让声音更加扎实稳重，石墨烯材料的加入，则让声音的细节更为丰富。“动铁”的高音透亮，稳定自然，感受三频均衡的本色声音。随着声音的流淌，仿佛置身自然，听见这些细节，让声音一开始就感动内心。 双动圈+动铁，三单元发声，听见更多细节 为了可以真正实现高、中、低三频均衡，小米圈铁耳机 Pro  加入了双“动圈”单元，大动圈负责中低频，小动圈负责高频。在“动铁”单元的配合下，耳机的低频下潜深，中频声音扎实，而高频的细节展现更为丰富。那些刚刚好的声音，听在耳里，都在心里。 三频更均衡，声音更自然 我们听到的绝大多数乐器、人声，都在中低频段。为了让这部分声音更均衡、有感染力，我们都交由采用了石墨烯振膜的双动圈单元来负责，中低频更扎实，兼具丰富细节表现力。 石墨烯是目前自然界已知材料中轻薄、强度更高的材料，对声音的传导速度快，将它用作振膜材质，高频延展性能更好，细节丰富，声音清澈自然，更富穿透力。同时强度又是钢铁的100倍， 可以尽可能还原出电流信号， 真正发出高保真的好声音。 石墨烯振膜，让双动圈更有实力 小米圈铁耳机 Pro 的“动铁”单元依然采用自主研发的 \\\"衔铁＋驱动杆\\\" 结构，让声音细腻真实，更为稳定，在电容分频器的作用下，让高中低音衔接更好，失真更少。不论当你听何种音乐，细腻的感情都会被准确还原，听每首歌就像读每个故事，时刻感动自己。 动铁单元设计，高频解析好，细节不失真 好的音乐人将情感与生活用真实的方式，转化为音乐传递给每个人，每首歌都是一个故事，铭刻在各自的记忆中，为了让故事更好的表达，小米圈铁耳机 Pro 在科学客观调音的基础上，再次邀请到荣获 4 次格莱美大奖的 Luca Bignardi，为小米圈铁耳机 Pro 进行主观调音，为的就是让每个喜爱音乐的人能够真切的感受到每一个故事，跟随内心，娓娓道来... 多种科学调音，让声音更鲜活，更温暖 当耳机真正为声音服务时，设计将不再只是修饰耳机外观的道具，它将会成为辅助声音的一部分，小米圈铁耳机 Pro 采用圆润的设计风格，45° 斜角入耳设计，在满足舒适的同时更保证了声音的完整呈现。精密金属音腔设计，让音乐沉于耳畔，更有声音质感，弹力 TPE 磨砂线材的选用，让耳机线更为坚固耐用，确保耳机长久使用。一副好耳机，让声音和外表一起美好。 全新的外观设计，和声音一起美好 好的设计需要灵感，而灵感源于生活，为了锁住声音的灵感，小米圈铁耳机 Pro 将耳塞设计成45°斜角式入耳，贴合耳道，满足佩戴舒适感的同时尽可能减少外界声音干扰，毫无保留地听自己爱的音乐。 45°斜角入耳，舒适佩戴 小米圈铁耳机 Pro 的线控麦克风从耳机整体设计风格出发，金属磨砂弹头造型，精致小巧，指压按键圆润舒适，听歌的同时，更能感知指尖上的金属质感。 小米圈铁耳机 Pro 的耳机线材选取 TPE 材质，作为一种具有橡胶的高弹性材质， 触感柔软、耐温等特性，用它做成耳机线，将更为抗拉、耐用并且不易缠绕。让好音乐的陪伴更长久。 小米圈铁耳机 Pro 的耳塞选取奶嘴级硅胶材质，触感柔软顺滑，减少了耳塞对皮肤的刺激，让肌肤倍感亲密，同时提供四对不同尺寸的耳塞套，让佩戴者根据不同需求选择，带上它，向自己喜爱的音乐问好！ 用匠心打磨每一件产品，即使过程艰难复杂，也依然充满斗志，小米圈铁耳机 Pro 的诞生过程就是这样。25 道工序打造的金属音腔，每一处细节都精心打磨，一体成型钻石切割、细密 CD 纹雕刻、锆石喷砂、阳极氧化，千锤百炼，不放过每个细节，将金属打磨成入耳的艺术品，这就是小米圈铁耳机 Pro 对音乐执着，对好产品更要执着。 小米圈铁耳机 Pro 是铝合金音腔，采用了 CNC 钻石切割一刀成型工艺，加工精度高达0.01mm，这种工艺在对铝合金加工前都要进行工艺分析，选择合适的刀具及切削用量，将打磨成型，让耳机具有更细腻润泽的手感。 小米圈铁耳机 Pro 运用精密的 CD 纹处理，纹理细至 0.14mm，散发金属光泽，就像耳机的指纹一样。如此的精密打磨，只为让小米圈铁耳机 Pro 更具质感，让金属更光辉熠熠。 选用精细锆石喷砂，赋予小米圈铁耳机 Pro 细致均匀的外观，有效保证了耳机表面硬度，不易刮伤。出厂时，会在小米圈铁耳机 Pro 表层增加阳极处理，保证了美观程度和耐磨性，6μ的阳极厚度，坚固、耐磨，做传达好声音的艺术品。 拥有超过 700 项高于行业标准的苛刻测试，每一种测试都见证了小米圈铁耳机 Pro 的高品质， 从音乐品质到设计创新，再到匠心工艺，集合好耳机的所有亮点，都只为带给用户更好的音乐体验和使用感受，好的声音，一定需要千锤百炼 。',149,149,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10172,'Bose QuietControl 30','无线耳机 QC30耳塞式蓝牙降噪耳麦',0,'/goods-img/966a8b32-f547-457c-9161-009d3113d584.jpg','/goods-img/966a8b32-f547-457c-9161-009d3113d584.jpg','<p>商品介绍加载中...</p>',2498,2498,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10173,'Beats Solo3 Wireless','头戴式 蓝牙无线耳机 手机耳机 游戏耳机 - 桀骜黑红（十周年版） MRQC2PA/A',0,'/goods-img/72218e28-fc58-4aa0-b3cd-c1f2c764d25e.jpg','/goods-img/72218e28-fc58-4aa0-b3cd-c1f2c764d25e.jpg','<p>商品介绍加载中...</p>',2268,1698,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10174,'索尼（SONY）WH-1000XM3 高解析度无线蓝牙降噪 头戴式耳机（触控面板','智能降噪 长久续航）黑色',0,'/goods-img/4cc6c606-4d69-4f49-b10c-01cedeef813f.jpg','/goods-img/4cc6c606-4d69-4f49-b10c-01cedeef813f.jpg','<p>商品介绍加载中...</p>',2899,2599,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10175,'雷蛇 Razer 北海巨妖标准版X','北海巨妖标准版升级款 头戴式游戏耳机 电竞耳麦 7.1 电脑手机耳机 黑色',0,'/goods-img/7345c467-6c2d-4f30-a73d-83d675d5208c.jpg','/goods-img/7345c467-6c2d-4f30-a73d-83d675d5208c.jpg','产品信息Product Information 产品规格Product Specifications 品牌介绍Brand Introduction 注意事项Warning & Caution 雷蛇产品在出厂时会进行检测，脚贴及USB接口处如有轻微划痕属于正常测试痕迹。 RAZER关于划痕的注意事项： 以上数据图片均为官方测试环境下结果，因使用环境/设备不同会存在一定的差异，仅供参考，数据请以实际为准！  1. 产品实物与外包装上的SN（序列号）必须一致； 2. 产品外包装不能严重破损，盒内的相关配件要齐全，不能有缺失； 3. 不能有明显的人为破损（表面有明显的人为划痕，使用及存在拆卸的痕迹）； 4. 防伪标签不得撕开或损毁。 RAZER关于7天无理由退换货的注意事项： ',349,299,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10176,'森海塞尔（Sennheiser）MomentumTrueWireless 真无线蓝牙hifi发烧入耳式耳机 蓝牙5.0','黑色',0,'/goods-img/efea018e-8ab0-47f9-a3d4-260c8cd2de5f.jpg','/goods-img/efea018e-8ab0-47f9-a3d4-260c8cd2de5f.jpg','聆听带来改变 真     无     线     蓝     牙     HiFi     耳     机 MOMENTUM 真无线 懂你所需 全新的 MOMENTUM 真无线耳机，高品质的声音质量传承 MOMENTUM 品质，成为一款具有重要技术成就的新产品。 这款性能优异的蓝牙耳机融合音频质量、佩戴舒适性和精致设计及工艺。 全新的 MOMENTUM 透明聆听功能 防水防泼溅 电池使用时长 （4+8小时） 精雕细琢 经典优雅 高品质声音质量 智能降噪 智能触控操作 支持蓝牙5.0技术 智能触控操作 支持蓝牙 5.0技术 MOMENTUM真无线耳机采用Sennheiser发烧级别7毫米动圈驱动单元，可确保饱满的立体声效果，带来高保真音质，为苛刻的听者带来出色的高保真度。 高品质声音质量 两侧触摸区域都有单独的控制功能，您可以轻松使用右耳耳机语音访问智能助手（如苹果 Siri或Google智能助手）。 轻轻点击或滑动触摸界面，使用自然语音命令即可播放音乐、接听电话。 支持蓝牙5.0技术及编解码技术（包括AAC、Qualcomm apt-XTM和apt-X低延迟），这款耳机带来出众的连接稳定性和音频流畅性。 真正的无线体验 轻松适配周围环境 MOMENTUM 真无线耳机让你更好地感知外部环境，透明聆听让你能听到周围的环境声，从而更好地感知周围的环境，不需要摘掉耳机就能融入到自然的交谈之中。甚至在嘈杂的环境中，电话呼叫和语音交互也能够通过双话筒波束成形技术得以实现。 智能交互 通过自动开启/关闭和智能暂停功能，可以检测到耳机何时被收起来或者不使用，从而节约能源。 你的世界由你把控 通过双击右耳耳机开/关透明聆听功能 打开透明聆听=接收周围环境音 关闭透明聆听=物理降噪模式，不接收周围音 不需要摘掉耳机就可轻松地与周围人进行交谈。 4种尺寸的耳垫可选，均符合人体工程学设计，防水防泼溅，能够满足用户舒适佩戴的需求。 个性定制舒适体验 MOMENTUM真无线拥有4小时电池续航时间，可通过其带有集成电源的小巧耳机盒进行充电，从而享受长达12（4+8）小时的全天聆听乐趣，并满足未来所需。 镀金充电接触点 可磁性吸附到充电盒上 高保真7毫米动圈驱动单元 带来出色的声音重放 金属镭射表面 具有触控功能 多色 LED指示灯 用于语音信号拾取和透明聆听功能的话筒 舒适的入耳式 硅胶耳垫 便捷充电盒持久续航 注重细节、富于美感，这款小巧、 靓丽而轻盈的耳机是技术与艺术的 结合。它既是声音重放技术的成就，更是你耳畔精美的配饰。 质感黑色外壳，闪烁的金属镭射表面，镀金的充电接触点——时尚与功能融合于标志性的设计之中，带来优雅和实用感。 Sennheiser智能控制 MOMENTUM 真无线耳机提供了更为智能和个性化的体验，可以通过新款Sennheiser智能控制应用进行优化，根据个人喜好，利用内置音频EQ对声音进行微调。免费下载，兼容iOS 版本 11.0 及以上版本和Android 版本 7.0 及以上版本 ，简便直观的控制界面，为您的耳机提供个性化的配置和升级等功能。 APP 下载方法 Android 版本 7.0 及以上版本 打开链接下载APP https://share.weiyun.com/54byqjn iOS 版本 11.0 及以上版本 打开APP Store搜索 Sennheiser smart control 下载APP',2399,2399,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10177,'Bose SoundSport Free','真无线蓝牙耳机--黑色 运动耳机 防掉落耳塞',0,'/goods-img/b3de8a39-e33c-432f-872f-46f4a1662498.jpg','/goods-img/b3de8a39-e33c-432f-872f-46f4a1662498.jpg','<p>商品介绍加载中...</p>',1699,1699,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10178,'华为原装降噪有线手机耳机Mate9 10P9P10Plus荣耀V9V10PlayNova2s9i8x 【送耳机收纳包】AM115半入耳式耳机-经典热卖款','新蜂精选',0,'/goods-img/d6565a7e-473b-4933-93c5-e646495c8c4c.jpg','/goods-img/d6565a7e-473b-4933-93c5-e646495c8c4c.jpg','<p>商品介绍加载中...</p>',99,39,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10179,'Apple 采用Lightning/闪电接头的 EarPods','耳机',0,'/goods-img/bf6ccbc4-d0d0-4fbb-b975-4becb9cb38f4.jpg','/goods-img/bf6ccbc4-d0d0-4fbb-b975-4becb9cb38f4.jpg','<p>商品介绍加载中...</p>',223,223,1000,'',0,0,'2019-09-18 13:21:28',0,'2020-10-13 10:41:59'),\n\t(10180,'Apple AirPods 配充电盒','苹果蓝牙耳机',0,'/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg','/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg','<p>商品介绍加载中...</p>',1246,1246,995,'妙出新境界',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10181,'小米 Redmi AirDots','真无线蓝牙耳机|分体式耳机 |收纳充电盒 |蓝牙5.0 |按键防触控操作',51,'/goods-img/36d0fe8f-aa28-423c-81e7-82cab31b7598.jpg','/goods-img/36d0fe8f-aa28-423c-81e7-82cab31b7598.jpg','<p>商品介绍加载中...</p>',129,129,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10182,'荣耀原装三键线控带麦半入耳式耳机AM116(尊爵版)适用于华为荣耀手机','新蜂精选',0,'/goods-img/6113a562-f3f1-408c-9b0d-78a84407caf7.jpg','/goods-img/6113a562-f3f1-408c-9b0d-78a84407caf7.jpg','<p>商品介绍加载中...</p>',69,49,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10183,'诺基亚（NOKIA）BH-705 银白色 5.0真无线蓝牙耳机迷你运动跑步音乐商务入耳式安卓苹果手机蓝牙耳机','新蜂精选',0,'/goods-img/abb13d3a-3445-4b26-b8e9-44cbec227b5d.jpg','/goods-img/abb13d3a-3445-4b26-b8e9-44cbec227b5d.jpg','<p>商品介绍加载中...</p>',499,499,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10184,'华为耳机原装半入耳式有线mate9p10plus8x荣耀v20v10nova2s9iv9p9play 【标准版】华为AM115 白色-热卖款','新蜂精选',0,'/goods-img/fac9c3e9-4843-46d1-8668-7e2eac17ccf2.jpg','/goods-img/fac9c3e9-4843-46d1-8668-7e2eac17ccf2.jpg','<p>商品介绍加载中...</p>',69,39,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10185,'Beats X 蓝牙无线','入耳式耳机 带麦可通话 -桀骜黑红（十周年版） MRQA2PA/A',0,'/goods-img/25910a34-e026-4954-87b0-c379999e1dd0.jpg','/goods-img/25910a34-e026-4954-87b0-c379999e1dd0.jpg','<p>商品介绍加载中...</p>',1168,799,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10186,'华为（ HUAWEI） 华为无线耳机','真无线蓝牙耳机 双耳蓝牙音乐耳机 Freebuds 2 无线耳机 陶瓷白',0,'/goods-img/adf8cbc2-ccb9-408a-96d0-553848e111e9.jpg','/goods-img/adf8cbc2-ccb9-408a-96d0-553848e111e9.jpg','<p>商品介绍加载中...</p>',899,799,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10187,'【自营仓次日达】moloke真无线蓝牙耳机双耳适用于苹果华为小米 运动跑步入耳式oppo迷你商务耳机 【1:1尊享版】自动弹窗+无线充电+可触控（热卖）','新蜂精选',51,'/goods-img/1e5645d1-24cb-48eb-9aaa-f729fa0db195.jpg','/goods-img/1e5645d1-24cb-48eb-9aaa-f729fa0db195.jpg','<p>商品介绍加载中...</p>',359,199,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10188,'Beats Powerbeats Pro','完全无线高性能耳机 真无线蓝牙运动耳机 象牙白',0,'/goods-img/e028c016-6793-49a3-8b0f-d0102a415d21.jpg','/goods-img/e028c016-6793-49a3-8b0f-d0102a415d21.jpg','<p>商品介绍加载中...</p>',1888,1888,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10189,'纽曼（Newmine）NM-LK06 全兼容线控音乐手机耳机 白色','新蜂精选',0,'/goods-img/0b02244f-6908-4ccb-a9d2-ccb5a462e30e.jpg','/goods-img/0b02244f-6908-4ccb-a9d2-ccb5a462e30e.jpg','<p>商品介绍加载中...</p>',9,9,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10190,'索尼（SONY）重低音立体声耳机MDR-XB55AP 黑色','新蜂精选',0,'/goods-img/eec7b009-a9ff-45cd-a7be-4051eb7b3c22.jpg','/goods-img/eec7b009-a9ff-45cd-a7be-4051eb7b3c22.jpg','*黑色实物偏灰，请以实物为准 Bass Booster低音增强器技术可呈现紧实深邃低频。 12 毫米驱动单元和110dB/mW 的高灵敏度，呈现高质感音效。 人体工学设计的倾斜入耳方式，让耳塞能够深入耳朵内部，呈现出色的隔音效果，同时带来舒适的佩戴感和高音质的享受。 耳塞能够深入耳朵内部，呈现出色的隔音效果，同时为您带来舒适的佩戴感和高音质的享受。 采用混合两种硬度硅胶的耳塞套： 核心部分使用硬质材料保持音质，减少因耳塞变形导致的声音失真； 外围部分柔软材料提高了耳塞密闭性，让您能长时间舒适佩戴。 *线控的可用性及操作因智能手机而异 耳机线表面细小沟壑，减少容易引起缠绕的摩擦，使导线不容易纠结在一起，方便欣赏音乐和携带。 防缠绕耳机线 盲点设计 便携袋 防尘滤网 导线滑块 4种尺寸耳塞套 摘下耳机的耳塞套，可见保护单元的网罩，用来防止异物和灰尘堵塞单元，使耳机经久耐听。 在左耳外壳和耳机线的连接处设有浮点，凭手指触摸就能判别左右耳，方便操作。 随机附赠收纳袋一只，保护你心爱的耳机。 利用导线滑块来调整左右耳机线的长度，也能够减少收纳耳机时容易出现的缠线现象 提供4对不同尺寸（SS、S、M、L）的耳塞套（M号出厂时已安装至耳机上），根据你的耳洞大小自由更换，获得良好的隔音效果，佩戴舒适。 ● 立体声耳机 ● 混合硅胶耳塞（SS/S/M/L 每种尺寸2个) *M号出厂时安装至本耳机。 ● 便携袋(×1) *EXTRA BASS 和 EXTRABASS 是索尼公司的商标',229,185,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10191,'索尼（SONY）WI-1000X Hi-Res颈挂式 入耳式','无线蓝牙耳机 高音质降噪耳机 手机通话 黑色',0,'/goods-img/1c4adfba-f2f4-4ab3-8520-c28b0a437b7b.jpg','/goods-img/1c4adfba-f2f4-4ab3-8520-c28b0a437b7b.jpg','<p>商品介绍加载中...</p>',2399,1499,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10192,'小米耳机 圈铁Pro 入耳式有线运动音乐耳机耳麦','新蜂精选',51,'/goods-img/b1530f7f-d286-4eb1-8d2b-3c2a74fa9f06.jpg','/goods-img/b1530f7f-d286-4eb1-8d2b-3c2a74fa9f06.jpg','使用双动圈 + 动铁 三单元发声 ／ 均衡自然声音 高保真石墨烯振膜 ／ 25 道工序打磨 ／ 弹力磨砂线材 Pro 小米圈铁耳机 孕育万物的天空和大地，时刻传达着声音的释放与组合，更是寻找灵感的源头，鸟鸣、流水、雷响、风啸不同的声音互相交融，共同演奏出自然的本真。 小米圈铁耳机 Pro 使用双“动圈”单元+“动铁”单元，将三个单元共同融入到同一个耳机中，双“动圈”的醇厚低音，让声音更加扎实稳重，石墨烯材料的加入，则让声音的细节更为丰富。“动铁”的高音透亮，稳定自然，感受三频均衡的本色声音。随着声音的流淌，仿佛置身自然，听见这些细节，让声音一开始就感动内心。 双动圈+动铁，三单元发声，听见更多细节 为了可以真正实现高、中、低三频均衡，小米圈铁耳机 Pro  加入了双“动圈”单元，大动圈负责中低频，小动圈负责高频。在“动铁”单元的配合下，耳机的低频下潜深，中频声音扎实，而高频的细节展现更为丰富。那些刚刚好的声音，听在耳里，都在心里。 三频更均衡，声音更自然 我们听到的绝大多数乐器、人声，都在中低频段。为了让这部分声音更均衡、有感染力，我们都交由采用了石墨烯振膜的双动圈单元来负责，中低频更扎实，兼具丰富细节表现力。 石墨烯是目前自然界已知材料中轻薄、强度更高的材料，对声音的传导速度快，将它用作振膜材质，高频延展性能更好，细节丰富，声音清澈自然，更富穿透力。同时强度又是钢铁的100倍， 可以尽可能还原出电流信号， 真正发出高保真的好声音。 石墨烯振膜，让双动圈更有实力 小米圈铁耳机 Pro 的“动铁”单元依然采用自主研发的 \\\"衔铁＋驱动杆\\\" 结构，让声音细腻真实，更为稳定，在电容分频器的作用下，让高中低音衔接更好，失真更少。不论当你听何种音乐，细腻的感情都会被准确还原，听每首歌就像读每个故事，时刻感动自己。 动铁单元设计，高频解析好，细节不失真 好的音乐人将情感与生活用真实的方式，转化为音乐传递给每个人，每首歌都是一个故事，铭刻在各自的记忆中，为了让故事更好的表达，小米圈铁耳机 Pro 在科学客观调音的基础上，再次邀请到荣获 4 次格莱美大奖的 Luca Bignardi，为小米圈铁耳机 Pro 进行主观调音，为的就是让每个喜爱音乐的人能够真切的感受到每一个故事，跟随内心，娓娓道来... 多种科学调音，让声音更鲜活，更温暖 当耳机真正为声音服务时，设计将不再只是修饰耳机外观的道具，它将会成为辅助声音的一部分，小米圈铁耳机 Pro 采用圆润的设计风格，45° 斜角入耳设计，在满足舒适的同时更保证了声音的完整呈现。精密金属音腔设计，让音乐沉于耳畔，更有声音质感，弹力 TPE 磨砂线材的选用，让耳机线更为坚固耐用，确保耳机长久使用。一副好耳机，让声音和外表一起美好。 全新的外观设计，和声音一起美好 好的设计需要灵感，而灵感源于生活，为了锁住声音的灵感，小米圈铁耳机 Pro 将耳塞设计成45°斜角式入耳，贴合耳道，满足佩戴舒适感的同时尽可能减少外界声音干扰，毫无保留地听自己爱的音乐。 45°斜角入耳，舒适佩戴 小米圈铁耳机 Pro 的线控麦克风从耳机整体设计风格出发，金属磨砂弹头造型，精致小巧，指压按键圆润舒适，听歌的同时，更能感知指尖上的金属质感。 小米圈铁耳机 Pro 的耳机线材选取 TPE 材质，作为一种具有橡胶的高弹性材质， 触感柔软、耐温等特性，用它做成耳机线，将更为抗拉、耐用并且不易缠绕。让好音乐的陪伴更长久。 小米圈铁耳机 Pro 的耳塞选取奶嘴级硅胶材质，触感柔软顺滑，减少了耳塞对皮肤的刺激，让肌肤倍感亲密，同时提供四对不同尺寸的耳塞套，让佩戴者根据不同需求选择，带上它，向自己喜爱的音乐问好！ 用匠心打磨每一件产品，即使过程艰难复杂，也依然充满斗志，小米圈铁耳机 Pro 的诞生过程就是这样。25 道工序打造的金属音腔，每一处细节都精心打磨，一体成型钻石切割、细密 CD 纹雕刻、锆石喷砂、阳极氧化，千锤百炼，不放过每个细节，将金属打磨成入耳的艺术品，这就是小米圈铁耳机 Pro 对音乐执着，对好产品更要执着。 小米圈铁耳机 Pro 是铝合金音腔，采用了 CNC 钻石切割一刀成型工艺，加工精度高达0.01mm，这种工艺在对铝合金加工前都要进行工艺分析，选择合适的刀具及切削用量，将打磨成型，让耳机具有更细腻润泽的手感。 小米圈铁耳机 Pro 运用精密的 CD 纹处理，纹理细至 0.14mm，散发金属光泽，就像耳机的指纹一样。如此的精密打磨，只为让小米圈铁耳机 Pro 更具质感，让金属更光辉熠熠。 选用精细锆石喷砂，赋予小米圈铁耳机 Pro 细致均匀的外观，有效保证了耳机表面硬度，不易刮伤。出厂时，会在小米圈铁耳机 Pro 表层增加阳极处理，保证了美观程度和耐磨性，6μ的阳极厚度，坚固、耐磨，做传达好声音的艺术品。 拥有超过 700 项高于行业标准的苛刻测试，每一种测试都见证了小米圈铁耳机 Pro 的高品质， 从音乐品质到设计创新，再到匠心工艺，集合好耳机的所有亮点，都只为带给用户更好的音乐体验和使用感受，好的声音，一定需要千锤百炼 。',149,149,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10193,'Bose QuietControl 30','无线耳机 QC30耳塞式蓝牙降噪耳麦',0,'/goods-img/02cf272e-9062-4d4b-8b7f-7058f0472efa.jpg','/goods-img/02cf272e-9062-4d4b-8b7f-7058f0472efa.jpg','<p>商品介绍加载中...</p>',2498,2498,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10194,'Beats Solo3 Wireless','头戴式 蓝牙无线耳机 手机耳机 游戏耳机 - 桀骜黑红（十周年版） MRQC2PA/A',0,'/goods-img/af77eaba-fd00-4ec8-b0e6-928372a0741d.jpg','/goods-img/af77eaba-fd00-4ec8-b0e6-928372a0741d.jpg','<p>商品介绍加载中...</p>',2268,1698,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10195,'索尼 WH-1000XM3 头戴式耳机','高解析度无线蓝牙降噪（触控面板 智能降噪 长久续航）黑色',20,'/goods-img/0dc503b2-90a2-4971-9723-c085a1844b76.jpg','http://localhost:28089/goods-img/0dc503b2-90a2-4971-9723-c085a1844b76.jpg','<p>商品介绍加载中...</p>',2899,2599,987,'智能降噪 长久续航',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10196,'雷蛇 Razer 北海巨妖标准版X','北海巨妖标准版升级款 头戴式游戏耳机 电竞耳麦 7.1 电脑手机耳机 黑色',0,'/goods-img/0cc81546-1408-4140-af95-0341a7778b6c.jpg','/goods-img/0cc81546-1408-4140-af95-0341a7778b6c.jpg','产品信息Product Information 产品规格Product Specifications 品牌介绍Brand Introduction 注意事项Warning & Caution 雷蛇产品在出厂时会进行检测，脚贴及USB接口处如有轻微划痕属于正常测试痕迹。 RAZER关于划痕的注意事项： 以上数据图片均为官方测试环境下结果，因使用环境/设备不同会存在一定的差异，仅供参考，数据请以实际为准！  1. 产品实物与外包装上的SN（序列号）必须一致； 2. 产品外包装不能严重破损，盒内的相关配件要齐全，不能有缺失； 3. 不能有明显的人为破损（表面有明显的人为划痕，使用及存在拆卸的痕迹）； 4. 防伪标签不得撕开或损毁。 RAZER关于7天无理由退换货的注意事项： ',349,299,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10197,'森海塞尔（Sennheiser）MomentumTrueWireless 真无线蓝牙hifi发烧入耳式耳机 蓝牙5.0','黑色',0,'/goods-img/768e79e1-e875-4691-855d-262346451d22.jpg','/goods-img/768e79e1-e875-4691-855d-262346451d22.jpg','聆听带来改变 真     无     线     蓝     牙     HiFi     耳     机 MOMENTUM 真无线 懂你所需 全新的 MOMENTUM 真无线耳机，高品质的声音质量传承 MOMENTUM 品质，成为一款具有重要技术成就的新产品。 这款性能优异的蓝牙耳机融合音频质量、佩戴舒适性和精致设计及工艺。 全新的 MOMENTUM 透明聆听功能 防水防泼溅 电池使用时长 （4+8小时） 精雕细琢 经典优雅 高品质声音质量 智能降噪 智能触控操作 支持蓝牙5.0技术 智能触控操作 支持蓝牙 5.0技术 MOMENTUM真无线耳机采用Sennheiser发烧级别7毫米动圈驱动单元，可确保饱满的立体声效果，带来高保真音质，为苛刻的听者带来出色的高保真度。 高品质声音质量 两侧触摸区域都有单独的控制功能，您可以轻松使用右耳耳机语音访问智能助手（如苹果 Siri或Google智能助手）。 轻轻点击或滑动触摸界面，使用自然语音命令即可播放音乐、接听电话。 支持蓝牙5.0技术及编解码技术（包括AAC、Qualcomm apt-XTM和apt-X低延迟），这款耳机带来出众的连接稳定性和音频流畅性。 真正的无线体验 轻松适配周围环境 MOMENTUM 真无线耳机让你更好地感知外部环境，透明聆听让你能听到周围的环境声，从而更好地感知周围的环境，不需要摘掉耳机就能融入到自然的交谈之中。甚至在嘈杂的环境中，电话呼叫和语音交互也能够通过双话筒波束成形技术得以实现。 智能交互 通过自动开启/关闭和智能暂停功能，可以检测到耳机何时被收起来或者不使用，从而节约能源。 你的世界由你把控 通过双击右耳耳机开/关透明聆听功能 打开透明聆听=接收周围环境音 关闭透明聆听=物理降噪模式，不接收周围音 不需要摘掉耳机就可轻松地与周围人进行交谈。 4种尺寸的耳垫可选，均符合人体工程学设计，防水防泼溅，能够满足用户舒适佩戴的需求。 个性定制舒适体验 MOMENTUM真无线拥有4小时电池续航时间，可通过其带有集成电源的小巧耳机盒进行充电，从而享受长达12（4+8）小时的全天聆听乐趣，并满足未来所需。 镀金充电接触点 可磁性吸附到充电盒上 高保真7毫米动圈驱动单元 带来出色的声音重放 金属镭射表面 具有触控功能 多色 LED指示灯 用于语音信号拾取和透明聆听功能的话筒 舒适的入耳式 硅胶耳垫 便捷充电盒持久续航 注重细节、富于美感，这款小巧、 靓丽而轻盈的耳机是技术与艺术的 结合。它既是声音重放技术的成就，更是你耳畔精美的配饰。 质感黑色外壳，闪烁的金属镭射表面，镀金的充电接触点——时尚与功能融合于标志性的设计之中，带来优雅和实用感。 Sennheiser智能控制 MOMENTUM 真无线耳机提供了更为智能和个性化的体验，可以通过新款Sennheiser智能控制应用进行优化，根据个人喜好，利用内置音频EQ对声音进行微调。免费下载，兼容iOS 版本 11.0 及以上版本和Android 版本 7.0 及以上版本 ，简便直观的控制界面，为您的耳机提供个性化的配置和升级等功能。 APP 下载方法 Android 版本 7.0 及以上版本 打开链接下载APP https://share.weiyun.com/54byqjn iOS 版本 11.0 及以上版本 打开APP Store搜索 Sennheiser smart control 下载APP',2399,2399,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10198,'Bose SoundSport Free','真无线蓝牙耳机--黑色 运动耳机 防掉落耳塞',0,'/goods-img/d3370c50-e853-4546-a032-35073eb192ff.jpg','/goods-img/d3370c50-e853-4546-a032-35073eb192ff.jpg','<p>商品介绍加载中...</p>',1699,1699,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10199,'华为原装降噪有线手机耳机Mate9 10P9P10Plus荣耀V9V10PlayNova2s9i8x 【送耳机收纳包】AM115半入耳式耳机-经典热卖款','新蜂精选',0,'/goods-img/0cff5ace-7ab9-43a7-91fe-fb3550829577.jpg','/goods-img/0cff5ace-7ab9-43a7-91fe-fb3550829577.jpg','<p>商品介绍加载中...</p>',99,39,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10200,'Apple 采用Lightning/闪电接头的 EarPods','耳机',0,'/goods-img/7b8bcf01-0abe-4155-b1f4-e57a6b8fc36a.jpg','/goods-img/7b8bcf01-0abe-4155-b1f4-e57a6b8fc36a.jpg','<p>商品介绍加载中...</p>',223,223,1000,'',0,0,'2019-09-18 13:21:35',0,'2020-10-13 10:41:59'),\n\t(10201,'迪奥（Dior）烈艳蓝金唇膏滋润999# 3.5g 经典正红色','(口红 保湿滋润 气质显白 不挑皮) （新老包装随机）',0,'/goods-img/6b0bd268-40b1-4abf-a19b-95df7cb4d722.jpg','/goods-img/6b0bd268-40b1-4abf-a19b-95df7cb4d722.jpg','<p>商品介绍加载中...</p>',500,315,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10202,'迪奥（Dior）烈艳蓝金唇膏-哑光999# 3.5g 传奇红（口红','雾面质地 显色持久 显白 正红色 李佳琦推荐）',86,'/goods-img/d8d4ac7e-7189-459a-aef2-7116f723cb0b.jpg','/goods-img/d8d4ac7e-7189-459a-aef2-7116f723cb0b.jpg','<p>商品介绍加载中...</p>',400,315,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10203,'海囤全球 魅可（MAC)经典唇膏 子弹头口红3g','Chili 秀智色/小辣椒色',86,'/goods-img/18aca3b8-d024-47d3-a971-fb51d374b1ae.jpg','/goods-img/18aca3b8-d024-47d3-a971-fb51d374b1ae.jpg','<p>商品介绍加载中...</p>',170,155,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10204,'卡姿兰（Carslan）轻甜唇爱随心盒1.4g*4(13#暧昧 16#炽烈 18#嫉妒','19#欲望 唇盒 口红 七夕礼物 情人节礼物)',0,'/goods-img/44c8198e-f63a-45e0-8eff-789338de65f8.jpg','/goods-img/44c8198e-f63a-45e0-8eff-789338de65f8.jpg','关联销售入口 1 (1) 商品介绍加载中...',99,89,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10205,'【联名限量版】MANSLY口红套装中国风口红情人节女朋友生日礼物唇釉彩妆女磁扣锦绣红妆口红礼盒彩妆 锦绣红妆口红礼盒（6支）','新蜂精选',86,'/goods-img/c081314e-8f67-44f9-a27e-aad6c3f29343.jpg','/goods-img/c081314e-8f67-44f9-a27e-aad6c3f29343.jpg','<p>商品介绍加载中...</p>',295,295,995,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10206,'迪奥（Dior）滋润999礼盒套装（烈艳蓝金999#3.5g 经典正红色+香氛小样1ml*3+礼盒）（小样和礼盒款式随机）','新蜂精选',0,'/goods-img/39c69481-6d13-4d84-bc1e-7dca612667f0.jpg','/goods-img/39c69481-6d13-4d84-bc1e-7dca612667f0.jpg','<p>商品介绍加载中...</p>',379,379,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10207,'圣罗兰（YSL）莹亮纯魅唇膏12#（圆管口红）4.5g 斩男色','新蜂精选',86,'/goods-img/b4335e82-c9e1-4264-92e4-e324a601fedb.jpg','/goods-img/b4335e82-c9e1-4264-92e4-e324a601fedb.jpg','<p>商品介绍加载中...</p>',320,320,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10208,'圣罗兰（YSL）纯口红1#（正红色）3.8g','新蜂精选',86,'/goods-img/57d0bf26-0a0c-4027-8a2b-deeaa29905ee.jpg','/goods-img/57d0bf26-0a0c-4027-8a2b-deeaa29905ee.jpg','<p>商品介绍加载中...</p>',350,320,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10209,'纪梵希高定香榭天鹅绒唇膏306#(小羊皮口红 法式红 雾面哑光','持久锁色）新老包装随机发货',86,'/goods-img/f30bd8cb-aadd-43aa-8615-2c4795ee7f5f.jpg','/goods-img/f30bd8cb-aadd-43aa-8615-2c4795ee7f5f.jpg','<p>商品介绍加载中...</p>',355,355,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10210,'【联名款】MANSLY口红套装红鸾心动口红礼盒中国风开运红情人节女朋友生日礼物唇釉颐和园同款彩妆口红 红鸾心动口红礼盒（6支）','新蜂精选',86,'/goods-img/f128ad98-fe4d-4264-96e3-6393b6cc98f1.jpg','/goods-img/f128ad98-fe4d-4264-96e3-6393b6cc98f1.jpg','<p>商品介绍加载中...</p>',195,195,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10211,'海囤全球 迪奥（Dior）烈艳蓝金唇膏 口红','3.5g 999号 正红色',86,'/goods-img/8fcdb86b-e826-4c1b-af3c-33a9d590c4b0.jpg','/goods-img/8fcdb86b-e826-4c1b-af3c-33a9d590c4b0.jpg','<p>商品介绍加载中...</p>',410,258,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10212,'圣罗兰（YSL）纯口红13#（正橘色）3.8g','新蜂精选',86,'/goods-img/53a4a428-8ca2-4d19-937d-15d18f324237.jpg','/goods-img/53a4a428-8ca2-4d19-937d-15d18f324237.jpg','<p>商品介绍加载中...</p>',320,320,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10213,'海囤全球 魅可（MAC)磨砂系列 雾面丝绒哑光子弹头口红','3g 316 devoted to chili 泫雅色',86,'/goods-img/2da55bd1-046f-4ac2-b1b9-56ab00bb9db1.jpg','/goods-img/2da55bd1-046f-4ac2-b1b9-56ab00bb9db1.jpg','<p>商品介绍加载中...</p>',249,165,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10214,'【情人礼物】香奈儿Chanel 口红/唇膏可可小姐水亮/丝绒系列润唇保湿口红配玫瑰花礼盒 丝绒系列','43#斩男色',86,'/goods-img/247722ea-c87a-4283-806c-bc9fe57f2253.jpg','/goods-img/247722ea-c87a-4283-806c-bc9fe57f2253.jpg','<p>商品介绍加载中...</p>',299,298,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10215,'迪奥（Dior）口红礼盒套装（烈艳蓝金唇膏哑光#999 3.5g正红色+香氛小样1ml*3随机+随机礼盒样式）','新蜂精选',86,'/goods-img/ab1a0ced-954c-4857-92f4-f7c833d9d54a.jpg','/goods-img/ab1a0ced-954c-4857-92f4-f7c833d9d54a.jpg','<p>商品介绍加载中...</p>',379,379,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10216,'圣罗兰（YSL）纯口红52# 3.8g','新蜂精选',86,'/goods-img/1eefadae-5f62-4abd-b283-077e7b6d9193.jpg','/goods-img/1eefadae-5f62-4abd-b283-077e7b6d9193.jpg','<p>商品介绍加载中...</p>',340,320,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10217,'海囤全球 汤姆福特 TOM','FORD TF口红 经典黑金唇膏 3g 16 SCARLET ROUGE 复古番茄红',0,'/goods-img/da12f5cf-2728-446a-a3bd-b78baf7056ff.jpg','/goods-img/da12f5cf-2728-446a-a3bd-b78baf7056ff.jpg','<p>商品介绍加载中...</p>',429,375,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10218,'迪奥（Dior）烈艳蓝金口红唇膏 028# 3.5g','珊瑚红 (滋润保湿 持久显色 粉嫩少女 摩洛哥王妃 幸运色)',86,'/goods-img/7030b9b6-b650-4d9d-9446-e27dab8afa1f.jpg','/goods-img/7030b9b6-b650-4d9d-9446-e27dab8afa1f.jpg','<p>商品介绍加载中...</p>',400,315,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10219,'迪奥（Dior）烈艳蓝金唇膏520# 3.5g 玫瑰红(口红','缎光 滋润保湿 长效持妆 玫红色 斩男色 告白色 粉红色)',86,'/goods-img/96a91f11-e634-4e28-be13-db8b4732463e.jpg','/goods-img/96a91f11-e634-4e28-be13-db8b4732463e.jpg','<p>商品介绍加载中...</p>',360,315,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10220,'海囤全球 迪奥（Dior）烈艳蓝金唇膏 口红','3.5g 999号 哑光-经典正红',86,'/goods-img/fe048831-384d-46b2-beec-5549f7902c11.jpg','/goods-img/fe048831-384d-46b2-beec-5549f7902c11.jpg','<p>商品介绍加载中...</p>',410,255,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10221,'欧莱雅（LOREAL）纷泽滋润唇膏RC301复古魅红3.7g（金管 口红女 滋润显色）','新蜂精选',86,'/goods-img/b7495e02-fc4c-417a-8101-ccfc75a5a475.jpg','/goods-img/b7495e02-fc4c-417a-8101-ccfc75a5a475.jpg','品牌介绍Brand Description         巴黎欧莱雅通过将科技和美丽的结合，不断谋求创新、研发新的产品配方，以合理的价格，为消费者提供品质的产品和服务。自1907年安全合成染发剂的诞生，如今巴黎欧莱雅的产品已从染发剂扩展到了护肤、彩妆等诸多领域，在中国，巴黎欧莱雅的五大产品线为护肤系列、彩妆系列、家用染发系列、洗护发系列及男士护肤系列。为了将美的产品融于美的文化、艺术、理念，将“从指尖到发梢”的美丽带给全世界的人们，巴黎欧莱雅在全世界范围精心选择各行业明星，组成“梦之队”来见证巴黎欧莱雅的实力，从各个不同的角度来讲述巴黎欧莱雅美丽无疆界的气势，并使“巴黎欧莱雅，你值得拥有！”“Because you are worth it！”的美丽概念成为一种文化！',135,99,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10222,'阿玛尼(Armani) 口红女士唇釉 生日礼物/表白礼物','红管#405番茄红 【李佳琪推荐omg】',86,'/goods-img/75fdac25-1cfa-4a9b-957d-805ac706f32c.jpg','/goods-img/75fdac25-1cfa-4a9b-957d-805ac706f32c.jpg','<p>商品介绍加载中...</p>',366,285,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10223,'美宝莲（MAYBELLINE）绝色持久唇膏雾感哑光系列R09PM 3.9g（女皇色口红新老包装）','新蜂精选',86,'/goods-img/1055e30e-3d98-4dca-8b79-8d0b5a09a37b.jpg','/goods-img/1055e30e-3d98-4dca-8b79-8d0b5a09a37b.jpg','<p>商品介绍加载中...</p>',122,106,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10224,'【专柜正品】迪奥999Dior口红唇膏烈艳蓝金 哑光滋润520/888/999送礼礼品套装 烈艳蓝金','844#橘红色赠礼盒礼袋',86,'/goods-img/7b52a7bc-0ecf-41c4-b079-d162511c9530.jpg','/goods-img/7b52a7bc-0ecf-41c4-b079-d162511c9530.jpg','<p>商品介绍加载中...</p>',339,260,1000,'',0,0,'2019-09-18 13:24:47',0,'2020-10-13 10:41:59'),\n\t(10225,'迪奥（Dior）烈艳蓝金唇膏滋润999# 3.5g 经典正红色','(口红 保湿滋润 气质显白 不挑皮) （新老包装随机）',0,'/goods-img/bb05b83f-bb91-4300-b78f-23986ba8c0dd.jpg','/goods-img/bb05b83f-bb91-4300-b78f-23986ba8c0dd.jpg','<p>商品介绍加载中...</p>',500,315,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10226,'迪奥（Dior）烈艳蓝金唇膏-哑光999# 3.5g 传奇红（口红','雾面质地 显色持久 显白 正红色 李佳琦推荐）',86,'/goods-img/67280dcf-bf32-49c1-b99b-9d86bb2ffaac.jpg','/goods-img/67280dcf-bf32-49c1-b99b-9d86bb2ffaac.jpg','<p>商品介绍加载中...</p>',400,315,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10227,'海囤全球 魅可（MAC)经典唇膏 子弹头口红3g','Chili 秀智色/小辣椒色',86,'/goods-img/2b678c5d-820c-4174-bc0c-5a65ff9501b6.jpg','/goods-img/2b678c5d-820c-4174-bc0c-5a65ff9501b6.jpg','<p>商品介绍加载中...</p>',170,155,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10228,'卡姿兰（Carslan）轻甜唇爱随心盒1.4g*4(13#暧昧 16#炽烈 18#嫉妒','19#欲望 唇盒 口红 七夕礼物 情人节礼物)',0,'/goods-img/3f513cd6-bb5f-407d-8550-24550873d83b.jpg','/goods-img/3f513cd6-bb5f-407d-8550-24550873d83b.jpg','关联销售入口 1 (1) 商品介绍加载中...',99,89,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10229,'【联名限量版】MANSLY口红套装中国风口红情人节女朋友生日礼物唇釉彩妆女磁扣锦绣红妆口红礼盒彩妆 锦绣红妆口红礼盒（6支）','新蜂精选',86,'/goods-img/d82ba7f0-6c92-4254-bfb2-71b3f8b1dfda.jpg','/goods-img/d82ba7f0-6c92-4254-bfb2-71b3f8b1dfda.jpg','<p>商品介绍加载中...</p>',295,295,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10230,'迪奥（Dior）滋润999礼盒套装（烈艳蓝金999#3.5g 经典正红色+香氛小样1ml*3+礼盒）（小样和礼盒款式随机）','新蜂精选',0,'/goods-img/f6b1195a-3231-4e81-a676-866ee838748f.jpg','/goods-img/f6b1195a-3231-4e81-a676-866ee838748f.jpg','<p>商品介绍加载中...</p>',379,379,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10231,'圣罗兰（YSL）莹亮纯魅唇膏12#（圆管口红）4.5g 斩男色','新蜂精选',86,'/goods-img/359bb052-5fea-4390-bbe6-4cb9e1c19273.jpg','/goods-img/359bb052-5fea-4390-bbe6-4cb9e1c19273.jpg','<p>商品介绍加载中...</p>',320,320,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10232,'圣罗兰（YSL）纯口红1#（正红色）3.8g','新蜂精选',86,'/goods-img/a42498e5-d912-447b-9360-0659d2d55c42.jpg','/goods-img/a42498e5-d912-447b-9360-0659d2d55c42.jpg','<p>商品介绍加载中...</p>',350,320,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10233,'纪梵希高定香榭天鹅绒唇膏306#','(小羊皮口红 法式红 雾面哑光 持久锁色）新老包装随机发货',86,'/goods-img/04949c0e-87df-445b-96dd-29e7fc69f734.jpg','http://localhost:28089/goods-img/04949c0e-87df-445b-96dd-29e7fc69f734.jpg','<p>商品介绍加载中...</p>',355,355,998,'雾面哑光 持久锁色',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10234,'【联名款】MANSLY口红套装红鸾心动口红礼盒中国风开运红情人节女朋友生日礼物唇釉颐和园同款彩妆口红 红鸾心动口红礼盒（6支）','新蜂精选',86,'/goods-img/a9cd71ad-2db0-4876-9ead-c51233040220.jpg','/goods-img/a9cd71ad-2db0-4876-9ead-c51233040220.jpg','<p>商品介绍加载中...</p>',195,195,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10235,'海囤全球 迪奥（Dior）烈艳蓝金唇膏 口红','3.5g 999号 正红色',86,'/goods-img/49d2acf7-55e5-4293-a7da-5929740e1168.jpg','/goods-img/49d2acf7-55e5-4293-a7da-5929740e1168.jpg','<p>商品介绍加载中...</p>',410,258,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10236,'圣罗兰（YSL）纯口红13#（正橘色）3.8g','新蜂精选',86,'/goods-img/b0142d40-6adb-4d64-b5b2-6e4a34656990.jpg','/goods-img/b0142d40-6adb-4d64-b5b2-6e4a34656990.jpg','<p>商品介绍加载中...</p>',320,320,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10237,'MAC 雾面丝绒哑光子弹头口红','磨砂系列 3g 316 devoted to chili 泫雅色',86,'/goods-img/1930d79b-88bd-4c5c-8510-0697c9ad2578.jpg','http://localhost:28089/goods-img/1930d79b-88bd-4c5c-8510-0697c9ad2578.jpg','<p>商品介绍加载中...</p>',249,165,993,'雾面丝绒哑光',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10238,'【情人礼物】香奈儿Chanel 口红/唇膏可可小姐水亮/丝绒系列润唇保湿口红配玫瑰花礼盒 丝绒系列','43#斩男色',86,'/goods-img/70219912-838c-487b-8c3c-761b00de80e9.jpg','/goods-img/70219912-838c-487b-8c3c-761b00de80e9.jpg','<p>商品介绍加载中...</p>',299,298,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10239,'迪奥（Dior）口红礼盒套装（烈艳蓝金唇膏哑光#999 3.5g正红色+香氛小样1ml*3随机+随机礼盒样式）','新蜂精选',86,'/goods-img/cbce65ee-28b3-4822-895a-38243ee506e7.jpg','/goods-img/cbce65ee-28b3-4822-895a-38243ee506e7.jpg','<p>商品介绍加载中...</p>',379,379,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10240,'圣罗兰（YSL）纯口红52# 3.8g','新蜂精选',86,'/goods-img/abff57bf-247b-4881-9589-e1336049c3ba.jpg','/goods-img/abff57bf-247b-4881-9589-e1336049c3ba.jpg','<p>商品介绍加载中...</p>',340,320,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10241,'海囤全球 汤姆福特 TOM','FORD TF口红 经典黑金唇膏 3g 16 SCARLET ROUGE 复古番茄红',0,'/goods-img/ba0cd1e9-cded-427b-8692-e8e2a0d00e9f.jpg','/goods-img/ba0cd1e9-cded-427b-8692-e8e2a0d00e9f.jpg','<p>商品介绍加载中...</p>',429,375,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10242,'迪奥（Dior）烈艳蓝金口红唇膏 028# 3.5g','珊瑚红 (滋润保湿 持久显色 粉嫩少女 摩洛哥王妃 幸运色)',86,'/goods-img/ea87e780-ed4c-447d-bd22-e88e4742721e.jpg','/goods-img/ea87e780-ed4c-447d-bd22-e88e4742721e.jpg','<p>商品介绍加载中...</p>',400,315,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10243,'迪奥（Dior）烈艳蓝金唇膏520# 3.5g 玫瑰红(口红','缎光 滋润保湿 长效持妆 玫红色 斩男色 告白色 粉红色)',86,'/goods-img/dde0b711-58b0-49fb-972c-7a71d6ec30f1.jpg','/goods-img/dde0b711-58b0-49fb-972c-7a71d6ec30f1.jpg','<p>商品介绍加载中...</p>',360,315,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10244,'海囤全球 迪奥（Dior）烈艳蓝金唇膏 口红','3.5g 999号 哑光-经典正红',86,'/goods-img/79247aeb-2903-47b0-a711-ac94e22ddd54.jpg','/goods-img/79247aeb-2903-47b0-a711-ac94e22ddd54.jpg','<p>商品介绍加载中...</p>',410,255,997,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10245,'欧莱雅（LOREAL）纷泽滋润唇膏RC301复古魅红3.7g（金管 口红女 滋润显色）','新蜂精选',86,'/goods-img/3b420562-b449-448d-ae50-e20aab136e1b.jpg','/goods-img/3b420562-b449-448d-ae50-e20aab136e1b.jpg','品牌介绍Brand Description         巴黎欧莱雅通过将科技和美丽的结合，不断谋求创新、研发新的产品配方，以合理的价格，为消费者提供品质的产品和服务。自1907年安全合成染发剂的诞生，如今巴黎欧莱雅的产品已从染发剂扩展到了护肤、彩妆等诸多领域，在中国，巴黎欧莱雅的五大产品线为护肤系列、彩妆系列、家用染发系列、洗护发系列及男士护肤系列。为了将美的产品融于美的文化、艺术、理念，将“从指尖到发梢”的美丽带给全世界的人们，巴黎欧莱雅在全世界范围精心选择各行业明星，组成“梦之队”来见证巴黎欧莱雅的实力，从各个不同的角度来讲述巴黎欧莱雅美丽无疆界的气势，并使“巴黎欧莱雅，你值得拥有！”“Because you are worth it！”的美丽概念成为一种文化！',135,99,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10246,'阿玛尼(Armani) 口红女士唇釉 生日礼物/表白礼物','红管#405番茄红 【李佳琪推荐omg】',86,'/goods-img/db866c68-e526-42cf-a0b5-520254f30b76.jpg','/goods-img/db866c68-e526-42cf-a0b5-520254f30b76.jpg','<p>商品介绍加载中...</p>',366,285,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10247,'美宝莲（MAYBELLINE）绝色持久唇膏雾感哑光系列R09PM 3.9g（女皇色口红新老包装）','新蜂精选',86,'/goods-img/63d0a187-627d-4edb-870e-717969ad2bd0.jpg','/goods-img/63d0a187-627d-4edb-870e-717969ad2bd0.jpg','<p>商品介绍加载中...</p>',122,106,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10248,'【专柜正品】迪奥999Dior口红唇膏烈艳蓝金 哑光滋润520/888/999送礼礼品套装 烈艳蓝金','844#橘红色赠礼盒礼袋',86,'/goods-img/9822b4a5-9fd2-435b-bdd1-5bbcdc6fdfdf.jpg','/goods-img/9822b4a5-9fd2-435b-bdd1-5bbcdc6fdfdf.jpg','<p>商品介绍加载中...</p>',339,260,1000,'',0,0,'2019-09-18 13:25:08',0,'2020-10-13 10:41:59'),\n\t(10249,'Apple Macbook Air 13.3 ','Core i5 8G 128G SSD 笔记本电脑 轻薄本 银色 MQD32CH/A',0,'/goods-img/2d827a7e-fb30-493d-840a-cb21766814fd.jpg','/goods-img/2d827a7e-fb30-493d-840a-cb21766814fd.jpg','<p>商品介紹頁面素材由Apple提供...</p>',6928,5999,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10250,'Apple 2019款 Macbook Pro 13.3','【带触控栏】八代i5 8G 256G RP645显卡 银色 苹果笔记本电脑 MUHR2CH/A',0,'/goods-img/465936e0-40ad-4968-b868-4bea20c7beec.jpg','/goods-img/465936e0-40ad-4968-b868-4bea20c7beec.jpg','<p>商品介紹頁面素材由Apple提供...</p>',11499,10699,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10251,'Apple MacBook Air 13.3 ','Core i5 8G 256G SSD 银色 笔记本电脑 轻薄本 Z0UU00056原MQD42CH/A',0,'/goods-img/a4132109-8f18-4399-affd-a81fad6902c8.jpg','/goods-img/a4132109-8f18-4399-affd-a81fad6902c8.jpg','<p>商品介紹頁面素材由Apple提供...</p>',7999,7168,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10252,'Apple 2019款 MacBook Air 13.3 ','Retina屏 八代i5 8G 256G SSD 银色 笔记本电脑 轻薄本 MVFL2CH/A',0,'/goods-img/65b62668-3be5-48b0-a40c-bd05826a38c2.jpg','/goods-img/65b62668-3be5-48b0-a40c-bd05826a38c2.jpg','<p>商品介紹頁面素材由Apple提供...</p>',10399,9799,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10253,'Apple 2019款 MacBook Air 13.3 ','Retina屏 八代i5 8G 128G SSD 深空灰 笔记本电脑 轻薄本 MVFH2CH/A',0,'/goods-img/cb899039-a705-473d-9785-f245a6ed4d89.jpg','/goods-img/cb899039-a705-473d-9785-f245a6ed4d89.jpg','<p>商品介紹頁面素材由Apple提供...</p>',8899,8499,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10254,'Apple 2019款 MacBook Air 13.3 ','Retina屏 八代i5 8G 128G SSD 银色 笔记本电脑 轻薄本 MVFK2CH/A',0,'/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg','/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg','<p>商品介紹頁面素材由Apple提供...</p>',8899,8499,992,'再次倾心',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10255,'Apple MacBook Air 13.3 ','| 定制升级 Core i7 8G 128G SSD硬盘 银色 笔记本电脑 轻薄本 Z0UU00022',0,'/goods-img/53019ece-5e61-4de9-8eac-e1f00a4ef7e3.jpg','/goods-img/53019ece-5e61-4de9-8eac-e1f00a4ef7e3.jpg','<p>商品介绍加载中...</p>',8056,6968,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10256,'Apple 2019款 Macbook Pro 13.3','【带触控栏】八代i5 8G 256G RP645显卡 深空灰 苹果笔记本电脑 MUHP2CH/A',0,'/goods-img/f08404a7-0459-4289-aa60-dd1735c95bbe.jpg','/goods-img/f08404a7-0459-4289-aa60-dd1735c95bbe.jpg','<p>商品介紹頁面素材由Apple提供...</p>',11499,10699,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10257,'苹果（Apple） MacBook Air','苹果笔记本电脑 13.3英寸轻薄本 购买套餐更实惠 2017款/i5/8GB/128GB/D32',0,'/goods-img/83740c28-473c-4954-b0dc-3cadab5a87d1.jpg','/goods-img/83740c28-473c-4954-b0dc-3cadab5a87d1.jpg','<p>商品介绍加载中...</p>',6200,5488,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10258,'Apple 2019款 MacBook Air 13.3 ','Retina屏 八代i5 8G 256G SSD 深空灰 笔记本电脑 轻薄本 MVFJ2CH/A',0,'/goods-img/78957148-4c0c-4194-bc46-7360d7b1aa65.jpg','/goods-img/78957148-4c0c-4194-bc46-7360d7b1aa65.jpg','<p>商品介紹頁面素材由Apple提供...</p>',10399,9799,983,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10259,'Apple 2019新品 Macbook Pro 13.3','【带触控栏】八代i5 8G 256G 深空灰 笔记本电脑 轻薄本 MV962CH/A',0,'/goods-img/85787c16-8443-4db0-9cae-a811a20a0832.jpg','/goods-img/85787c16-8443-4db0-9cae-a811a20a0832.jpg','<p>商品介紹頁面素材由Apple提供...</p>',13899,12999,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10260,'Apple 2019款 MacBook Air 13.3 ','Retina屏 八代i5 8G 256G SSD 金色 苹果笔记本电脑 轻薄本 MVFN2CH/A',0,'/goods-img/82bdafc6-5828-495e-b77c-21598938b896.jpg','/goods-img/82bdafc6-5828-495e-b77c-21598938b896.jpg','<p>商品介紹頁面素材由Apple提供...</p>',10399,9799,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10261,'APPLE 苹果2018年19新款MacBook air笔记本电脑13.3英寸超薄笔记本','金色 i5/8GB内存/128GB闪存【19新款】',0,'/goods-img/270cdf75-8a7f-410e-8f2f-8eeba24f0503.jpg','/goods-img/270cdf75-8a7f-410e-8f2f-8eeba24f0503.jpg','<p>商品介绍加载中...</p>',8899,7888,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10262,'Apple 2019新品 Macbook Pro 15.4','【带触控栏】全新九代六核i7 16G 256G 深空灰 笔记本电脑轻薄本MV902CH/A',0,'/goods-img/7928eb46-9e1c-420e-a8ab-6c358d01891b.jpg','/goods-img/7928eb46-9e1c-420e-a8ab-6c358d01891b.jpg','<p>商品介紹頁面素材由Apple提供...</p>',18199,17099,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10263,'APPLE 苹果MacBook air苹果笔记本电脑13.3英寸超薄笔记本','标配+防水手提包+苹果原装鼠标版（下单送大礼包） i5+8GB内存+128GB闪存【D32】',0,'/goods-img/11968b35-9431-4b1c-a648-6ff46945ebf4.jpg','/goods-img/11968b35-9431-4b1c-a648-6ff46945ebf4.jpg','<p>商品介绍加载中...</p>',6988,5988,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10264,'APPLE苹果 MacBook Air13.3英寸轻薄笔记本电脑2017款','官方标配【购套餐版送大礼包】 i5+8GB内存+128GB闪存【D32】',0,'/goods-img/fb08ec83-2960-47f7-8679-8b78896c30d5.jpg','/goods-img/fb08ec83-2960-47f7-8679-8b78896c30d5.jpg','<p>商品介绍加载中...</p>',6188,5488,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10265,'Apple 2019款 MacBook Air 13.3 ','Retina屏 八代i5 8G 128G SSD 金色 笔记本电脑 轻薄本 MVFM2CH/A',0,'/goods-img/50748763-c0d6-4e73-80e5-864818fa3246.jpg','/goods-img/50748763-c0d6-4e73-80e5-864818fa3246.jpg','<p>商品介紹頁面素材由Apple提供...</p>',8899,8499,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10266,'Apple 2019款 Macbook Pro 13.3','【带触控栏】八代i5 8G 128G RP645显卡 深空灰 苹果笔记本电脑 MUHN2CH/A',0,'/goods-img/fe9e33a1-fbd0-4278-931f-825fef4ffb62.jpg','/goods-img/fe9e33a1-fbd0-4278-931f-825fef4ffb62.jpg','<p>商品介紹頁面素材由Apple提供...</p>',9999,9499,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10267,'Apple MacBook Air 13.3 ','定制升级 Core i7 8G 256G SSD硬盘 银色 笔记本电脑 轻薄本 Z0UU0004J',0,'/goods-img/0340d6b2-54bf-42a2-96f4-f35c5f47bb2d.jpg','/goods-img/0340d6b2-54bf-42a2-96f4-f35c5f47bb2d.jpg','<p>商品介紹頁面素材由Apple提供...</p>',9656,8499,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10268,'Apple 2019新品 Macbook Pro 15.4','【带触控栏】九代八核i9 16G 512G 深空灰 笔记本电脑 轻薄本 MV912CH/A',0,'/goods-img/33a29216-08d6-445b-b979-12d5de81d634.jpg','/goods-img/33a29216-08d6-445b-b979-12d5de81d634.jpg','<p>商品介紹頁面素材由Apple提供...</p>',21399,20399,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10269,'Apple 2019新品 Macbook Pro 13.3','【带触控栏】八代i5 8G 256G 银色 笔记本电脑 轻薄本 MV992CH/A',0,'/goods-img/a2afdb6c-69a7-4081-bd09-62174f9f5624.jpg','/goods-img/a2afdb6c-69a7-4081-bd09-62174f9f5624.jpg','商品介紹頁面素材由Apple提供  ',13899,12999,982,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10270,'Apple Macbook Pro 13.3','【带触控栏】Core i5 8G 512G SSD 银色 笔记本电脑 轻薄本 MR9V2CH/A',0,'/goods-img/4da4fa5d-ee2d-4496-9950-e53b102f0e8e.jpg','/goods-img/4da4fa5d-ee2d-4496-9950-e53b102f0e8e.jpg','<p>商品介绍加载中...</p>',14999,13068,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10271,'Apple 2019新品 Macbook Pro 15.4','【带触控栏】全新九代六核i7 16G 256G 银色 笔记本电脑 轻薄本 MV922CH/A',0,'/goods-img/49c9f6f8-11c2-4f57-98b9-daf12715b938.jpg','/goods-img/49c9f6f8-11c2-4f57-98b9-daf12715b938.jpg','<p>商品介紹頁面素材由Apple提供...</p>',18199,17099,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10272,'Apple 2019新品 Macbook Pro 13.3','【带触控栏】八代i5 8G 512G 银色 笔记本电脑 轻薄本 MV9A2CH/A',0,'/goods-img/9dd28614-7a17-4876-8cdd-232caf4154bc.jpg','/goods-img/9dd28614-7a17-4876-8cdd-232caf4154bc.jpg','<p>商品介紹頁面素材由Apple提供...</p>',15499,14499,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10273,'Apple 2019新品 Macbook Pro 15.4','【带触控栏】九代八核i9 16G 512G 银色 笔记本电脑 轻薄本 MV932CH/A',0,'/goods-img/2dcd61b8-f434-40ee-928f-c6e4ae934db8.jpg','/goods-img/2dcd61b8-f434-40ee-928f-c6e4ae934db8.jpg','<p>商品介紹頁面素材由Apple提供...</p>',21399,20399,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10274,'【新品首发】苹果Apple MacBook Pro13.3英寸2019新款18/17苹果笔记本电脑','19款灰色/256G/带bar/MUHP2CH/A',0,'/goods-img/4dbbfbf1-80c0-4389-a02e-ca19fbeb5340.jpg','/goods-img/4dbbfbf1-80c0-4389-a02e-ca19fbeb5340.jpg','<p>商品介绍加载中...</p>',12580,10488,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10275,'【新品首发】苹果Apple MacBook Pro13.3英寸2019新款18/17苹果笔记本电脑','19款灰色/128G/带bar/MUHN2CH/A',0,'/goods-img/3b095a66-4001-4c69-9026-2e09139b5f11.jpg','/goods-img/3b095a66-4001-4c69-9026-2e09139b5f11.jpg','<p>商品介绍加载中...</p>',10100,9088,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10276,'Apple 2019新品 Macbook Pro 13.3','【带触控栏】八代i5 8G 512G 深空灰 苹果笔记本电脑 轻薄本 MV972CH/A',0,'/goods-img/82fb6b31-1afe-4bcb-a243-5205ed32d3ee.jpg','/goods-img/82fb6b31-1afe-4bcb-a243-5205ed32d3ee.jpg','<p>商品介紹頁面素材由Apple提供...</p>',15499,14499,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10277,'Apple Macbook Pro 13.3','【无触控栏】Core i5 8G 256G SSD 银色 笔记本电脑 轻薄本 MPXU2CH/A',0,'/goods-img/73a8c7e9-40af-4e0a-9826-5f6374361e61.jpg','/goods-img/73a8c7e9-40af-4e0a-9826-5f6374361e61.jpg','<p>商品介绍加载中...</p>',11299,10199,1000,'',0,0,'2019-09-18 13:25:52',0,'2020-10-13 10:41:59'),\n\t(10278,'Apple iPhone 11 (A2223)','64GB 黑色 移动联通电信4G手机 双卡双待',47,'/goods-img/4755f3e5-257c-424c-a5f4-63908061d6d9.jpg','http://localhost:28089/goods-img/4755f3e5-257c-424c-a5f4-63908061d6d9.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',5499,5499,998,'2019 新品',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10279,'Apple iPhone 11 (A2223)','128GB 白色 移动联通电信4G手机 双卡双待',47,'/goods-img/a0d09f94-9c46-4ee1-aaef-dfd132e7543e.jpg','/goods-img/a0d09f94-9c46-4ee1-aaef-dfd132e7543e.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',5999,5999,997,'2019 新品',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10280,'Apple iPhone 11 (A2223)','128GB 紫色 移动联通电信4G手机 双卡双待',47,'/goods-img/8dfe8ea9-2279-4132-a72b-4f8a52d002a4.jpg','/goods-img/8dfe8ea9-2279-4132-a72b-4f8a52d002a4.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',5999,5999,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10281,'Apple iPhone 11 (A2223)','64GB 红色 移动联通电信4G手机 双卡双待',47,'/goods-img/7368f461-fd0a-4f37-bc8b-31d8ad3d6e95.jpg','/goods-img/7368f461-fd0a-4f37-bc8b-31d8ad3d6e95.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',5499,5499,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10282,'Apple iPhone 11 (A2223)','64GB 黄色 移动联通电信4G手机 双卡双待',47,'/goods-img/cea55d85-b11e-4639-88ab-9403b05ce1e8.jpg','/goods-img/cea55d85-b11e-4639-88ab-9403b05ce1e8.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',5499,5499,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10283,'Apple iPhone 11 (A2223)','256GB 绿色 移动联通电信4G手机 双卡双待',47,'/goods-img/075a188a-9045-45f0-9c67-1e42e0552aa2.jpg','/goods-img/075a188a-9045-45f0-9c67-1e42e0552aa2.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',6799,6799,992,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10284,'Apple iPhone XR (A2108)','128GB 黑色 移动联通电信4G手机 双卡双待',47,'/goods-img/23ac3107-6309-40c8-bd28-164eb1186b62.jpg','/goods-img/23ac3107-6309-40c8-bd28-164eb1186b62.jpg','<p>商品介绍加载中...</p>',5599,5099,991,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10285,'Apple iPhone XR (A2108)','128GB 白色 移动联通电信4G手机 双卡双待',47,'/goods-img/3f47c376-c603-43fc-bfe5-2daa985ff423.jpg','/goods-img/3f47c376-c603-43fc-bfe5-2daa985ff423.jpg','<p>商品介绍加载中...</p>',5599,5099,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10286,'Apple iPhone XR (A2108)','128GB 红色 移动联通电信4G手机 双卡双待',47,'/goods-img/56cef3d7-41e6-4aad-825d-a3d423e74dfd.jpg','/goods-img/56cef3d7-41e6-4aad-825d-a3d423e74dfd.jpg','<p>商品介绍加载中...</p>',5599,5099,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10287,'Apple iPhone XR (A2108)','128GB 珊瑚色 移动联通电信4G手机 双卡双待',47,'/goods-img/c2e3b2e4-1fc8-43f3-b133-6f4eae7faa5d.jpg','/goods-img/c2e3b2e4-1fc8-43f3-b133-6f4eae7faa5d.jpg','<p>商品介绍加载中...</p>',5599,5199,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10288,'Apple iPhone XR (A2108)','128GB 蓝色 移动联通电信4G手机 双卡双待',47,'/goods-img/2f5079e9-57f3-490a-8d3d-5fd64207939d.jpg','/goods-img/2f5079e9-57f3-490a-8d3d-5fd64207939d.jpg','<p>商品介绍加载中...</p>',5599,5199,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10289,'Apple iPhone XR (A2108)','128GB 黄色 移动联通电信4G手机 双卡双待',47,'/goods-img/b1259d73-7c5a-4eca-81eb-53a4e9bcc77e.jpg','/goods-img/b1259d73-7c5a-4eca-81eb-53a4e9bcc77e.jpg','<p>商品介绍加载中...</p>',5599,5199,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10290,'Apple iPhone 11 Pro','Max (A2220) 64GB 暗夜绿色 移动联通电信4G手机 双卡双待',47,'/goods-img/0656b280-66d9-430b-9d0d-e48bf379d89a.jpg','/goods-img/0656b280-66d9-430b-9d0d-e48bf379d89a.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',9599,9599,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10291,'Apple iPhone 11 Pro','Max (A2220) 256GB 深空灰色 移动联通电信4G手机 双卡双待',47,'/goods-img/77ce1f09-3900-4eff-8d97-e67fa8193a84.jpg','/goods-img/77ce1f09-3900-4eff-8d97-e67fa8193a84.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',10899,10899,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10292,'Apple iPhone 11 Pro','Max (A2220) 64GB 金色 移动联通电信4G手机 双卡双待',47,'/goods-img/e45be404-d582-4c1e-80e8-48073327551e.jpg','/goods-img/e45be404-d582-4c1e-80e8-48073327551e.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',9599,9599,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10293,'Apple iPhone 11 Pro','Max (A2220) 512GB 银色 移动联通电信4G手机 双卡双待',47,'/goods-img/76670f49-4556-40ae-b485-3b25dcdcb636.jpg','/goods-img/76670f49-4556-40ae-b485-3b25dcdcb636.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',12699,12699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10294,'Apple iPhone 7 (A1660)','128G 黑色 移动联通电信4G手机',47,'/goods-img/101abd40-e9a2-4ab0-9f4e-16569c9dbf82.jpg','/goods-img/101abd40-e9a2-4ab0-9f4e-16569c9dbf82.jpg','<p>商品介绍加载中...</p>',3199,2949,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10295,'Apple iPhone 7 (A1660)','128G 玫瑰金色 移动联通电信4G手机',47,'/goods-img/6229468b-bcb7-4415-880a-aea3eef4eea2.jpg','/goods-img/6229468b-bcb7-4415-880a-aea3eef4eea2.jpg','<p>商品介绍加载中...</p>',3199,2929,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10296,'Apple iPhone 7 (A1660)','128G 金色 移动联通电信4G手机',47,'/goods-img/1f5bb955-fbe7-451a-b12c-3e2115c53020.jpg','/goods-img/1f5bb955-fbe7-451a-b12c-3e2115c53020.jpg','<p>商品介绍加载中...</p>',3199,2929,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10297,'Apple iPhone 7 (A1660)','128G 银色 移动联通电信4G手机',47,'/goods-img/9fc3c48f-c8e2-426b-915a-c32b0e72998d.jpg','/goods-img/9fc3c48f-c8e2-426b-915a-c32b0e72998d.jpg','<p>商品介绍加载中...</p>',3199,2929,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10298,'Apple iPhone XS Max','(A2104) 256GB 深空灰色 移动联通电信4G手机 双卡双待',47,'/goods-img/ec4af4a5-0a53-4246-bd88-919b0541a55c.jpg','/goods-img/ec4af4a5-0a53-4246-bd88-919b0541a55c.jpg','<p>商品介绍加载中...</p>',9599,8999,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10299,'Apple iPhone XS Max','(A2104) 256GB 金色 移动联通电信4G手机 双卡双待',47,'/goods-img/b7d2373a-5a8c-4be5-a4ce-57b408c6d9f2.jpg','/goods-img/b7d2373a-5a8c-4be5-a4ce-57b408c6d9f2.jpg','<p>商品介绍加载中...</p>',9599,8999,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10300,'Apple iPhone XS Max','(A2104) 256GB 银色 移动联通电信4G手机 双卡双待',47,'/goods-img/837aaf40-5797-4929-b162-a248bfe73b36.jpg','/goods-img/837aaf40-5797-4929-b162-a248bfe73b36.jpg','<p>商品介绍加载中...</p>',9599,8999,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10301,'Apple iPhone 8 (A1863)','64GB 深空灰色 移动联通电信4G手机',47,'/goods-img/8ab049d8-5b2e-4b69-bef0-013bec414598.jpg','/goods-img/8ab049d8-5b2e-4b69-bef0-013bec414598.jpg','<p>商品介绍加载中...</p>',3699,3499,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10302,'Apple iPhone 8 (A1863)','64GB 银色 移动联通电信4G手机',47,'/goods-img/eaeb6faf-2ead-4f5d-84d2-1629686a492c.jpg','/goods-img/eaeb6faf-2ead-4f5d-84d2-1629686a492c.jpg','<p>商品介绍加载中...</p>',3699,3499,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10303,'Apple iPhone 8 (A1863)','64GB 金色 移动联通电信4G手机',47,'/goods-img/0611528c-73c8-4114-a1d8-d9387e771284.jpg','/goods-img/0611528c-73c8-4114-a1d8-d9387e771284.jpg','<p>商品介绍加载中...</p>',3699,3499,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10304,'Apple iPhone 7 Plus','(A1661) 128G 黑色 移动联通电信4G手机',47,'/goods-img/dbafc182-23b7-442c-b9cb-0ea825a659a9.jpg','/goods-img/dbafc182-23b7-442c-b9cb-0ea825a659a9.jpg','<p>商品介绍加载中...</p>',4199,3699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10305,'Apple iPhone 7 Plus','(A1661) 128G 玫瑰金色 移动联通电信4G手机',47,'/goods-img/c227df08-9a26-430a-88a5-72c1e4da5b6e.jpg','/goods-img/c227df08-9a26-430a-88a5-72c1e4da5b6e.jpg','<p>商品介绍加载中...</p>',4199,3699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10306,'Apple iPhone 7 Plus','(A1661) 128G 金色 移动联通电信4G手机',47,'/goods-img/bf58f29f-75ed-411e-8255-3b9f802634f2.jpg','/goods-img/bf58f29f-75ed-411e-8255-3b9f802634f2.jpg','<p>商品介绍加载中...</p>',4199,3699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10307,'Apple iPhone 7 Plus','(A1661) 128G 银色 移动联通电信4G手机',47,'/goods-img/dfab7fee-e787-423d-9771-67e05b03b358.jpg','/goods-img/dfab7fee-e787-423d-9771-67e05b03b358.jpg','<p>商品介绍加载中...</p>',4199,3699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10308,'Apple iPhone XS (A2099)','64GB 金色 移动联通4G手机',47,'/goods-img/b3ff5475-9519-4d94-8f07-5840bb796e60.jpg','/goods-img/b3ff5475-9519-4d94-8f07-5840bb796e60.jpg','<p>商品介绍加载中...</p>',7299,6299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10309,'Apple iPhone XS (A2099)','64GB 深空灰色 移动联通4G手机',47,'/goods-img/7cc8d012-cfaa-45c4-ba35-70ca46c8bd66.jpg','/goods-img/7cc8d012-cfaa-45c4-ba35-70ca46c8bd66.jpg','<p>商品介绍加载中...</p>',7299,6299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10310,'Apple iPhone XS (A2099)','256GB 银色 移动联通4G手机',47,'/goods-img/776b459b-e981-434f-bbf7-635cafab7418.jpg','/goods-img/776b459b-e981-434f-bbf7-635cafab7418.jpg','<p>商品介绍加载中...</p>',10099,7699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10311,'Apple iPhone 8 Plus','(A1899) 64GB 深空灰色 移动联通4G手机',47,'/goods-img/8eb2e38b-84e1-4f31-9dae-841800f68038.jpg','/goods-img/8eb2e38b-84e1-4f31-9dae-841800f68038.jpg','<p>商品介绍加载中...</p>',4599,3999,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10312,'Apple iPhone 8 Plus','(A1864) 64GB 金色 移动联通电信4G手机',47,'/goods-img/58c6a2c3-d3f7-4b0a-b4ae-e649b1032087.jpg','/goods-img/58c6a2c3-d3f7-4b0a-b4ae-e649b1032087.jpg','<p>商品介绍加载中...</p>',4799,4399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10313,'Apple iPhone 8 Plus','(A1864) 64GB 银色 移动联通电信4G手机',47,'/goods-img/2839c451-3eaf-4820-8a15-1858ce339407.jpg','/goods-img/2839c451-3eaf-4820-8a15-1858ce339407.jpg','<p>商品介绍加载中...</p>',4799,4399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10314,'Apple 苹果 iPhone xr','手机 双卡双待 黑色 全网通64G',47,'/goods-img/35bbe123-c822-457c-aaf0-fdcd861bc06d.jpg','/goods-img/35bbe123-c822-457c-aaf0-fdcd861bc06d.jpg','<p>商品介绍加载中...</p>',6199,4598,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10315,'Apple 苹果 iPhone xr','手机 双卡双待 白色 全网通64G',47,'/goods-img/0e565b23-554e-45d3-ac62-a2fb25be7f2c.jpg','/goods-img/0e565b23-554e-45d3-ac62-a2fb25be7f2c.jpg','<p>商品介绍加载中...</p>',6199,4658,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10316,'Apple 苹果 iPhone xr','手机 双卡双待 蓝色 全网通64G',47,'/goods-img/c08b6ddc-735f-4d2c-b47f-1f0e7f62a9b1.jpg','/goods-img/c08b6ddc-735f-4d2c-b47f-1f0e7f62a9b1.jpg','<p>商品介绍加载中...</p>',6199,4698,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10317,'Apple 苹果 iPhone xr','手机 双卡双待 黄色 全网通64G',47,'/goods-img/c09636de-93b1-444e-b00e-668506676443.jpg','/goods-img/c09636de-93b1-444e-b00e-668506676443.jpg','<p>商品介绍加载中...</p>',6199,4698,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10318,'Apple 苹果 iPhone xr','手机 双卡双待 红色 全网通128G',47,'/goods-img/b26d8460-7ab5-4006-ba5c-e212ee0f31bd.jpg','/goods-img/b26d8460-7ab5-4006-ba5c-e212ee0f31bd.jpg','<p>商品介绍加载中...</p>',6699,5038,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10319,'Apple 苹果 iPhone xr','手机 双卡双待 珊瑚色 全网通64G',47,'/goods-img/fab7cf40-9b7d-4141-8227-9ce7e02e8330.jpg','/goods-img/fab7cf40-9b7d-4141-8227-9ce7e02e8330.jpg','<p>商品介绍加载中...</p>',6199,4698,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10320,'Apple iPhone 11 Pro','(A2217) 256GB 暗夜绿色 移动联通电信4G手机 双卡双待',47,'/goods-img/0025ad55-e260-4a00-be79-fa5b8c5ac0de.jpg','/goods-img/0025ad55-e260-4a00-be79-fa5b8c5ac0de.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',9999,9999,996,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10321,'Apple iPhone 11 Pro','(A2217) 64GB 深空灰色 移动联通电信4G手机 双卡双待',47,'/goods-img/d0abbd2a-19ca-4ae7-9b3c-1eb4eb77c565.jpg','/goods-img/d0abbd2a-19ca-4ae7-9b3c-1eb4eb77c565.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',8699,8699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10322,'Apple iPhone 11 Pro','(A2217) 64GB 银色 移动联通电信4G手机 双卡双待',47,'/goods-img/7d192eff-938f-4e6d-8952-9d405707033e.jpg','/goods-img/7d192eff-938f-4e6d-8952-9d405707033e.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',8699,8699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10323,'【换修无忧年付版】Apple iPhone 11 Pro','(A2217) 512GB 金色 移动联通电信4G手机 双卡双待',47,'/goods-img/38b3f3a9-7056-45a3-b183-ad46dc71f493.jpg','/goods-img/38b3f3a9-7056-45a3-b183-ad46dc71f493.jpg','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-0.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-1.png\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-11-2.png\\\" /> \\n\t</div>\\n</div>',12598,12598,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10324,'Apple 苹果 iPhone 6s','Plus 4G手机 金色 全网通 128G',47,'/goods-img/22febff2-db52-4f7a-8d16-414e755e788b.jpg','/goods-img/22febff2-db52-4f7a-8d16-414e755e788b.jpg','<p>商品介绍加载中...</p>',3599,2918,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10325,'Apple 苹果 iPhone 6s','Plus 4G手机 玫瑰金 全网通 128G',47,'/goods-img/dfb0d434-4d59-4fda-896a-1ebd9e4d9ece.jpg','/goods-img/dfb0d434-4d59-4fda-896a-1ebd9e4d9ece.jpg','<p>商品介绍加载中...</p>',3599,2918,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10326,'Apple 苹果 iPhone 6s','Plus 4G手机 深空灰 全网通 128G',47,'/goods-img/d3a4b902-8010-4619-89e4-96cb88e6d4e4.jpg','/goods-img/d3a4b902-8010-4619-89e4-96cb88e6d4e4.jpg','<p>商品介绍加载中...</p>',3599,2888,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10327,'Apple 苹果 iPhone 6s','Plus 4G手机 银色 全网通 128G',47,'/goods-img/b4b7e7d3-b7ba-4917-a1f9-70c52f28df9d.jpg','/goods-img/b4b7e7d3-b7ba-4917-a1f9-70c52f28df9d.jpg','<p>商品介绍加载中...</p>',3599,2988,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10328,'【二手9成新】Apple iPhone XSmax 苹果XSmax','国行二手手机 XS Max 深空灰 64G',47,'/goods-img/0514e529-6b3e-40d5-9183-84088ddb55e1.jpg','/goods-img/0514e529-6b3e-40d5-9183-84088ddb55e1.jpg','<p>商品介绍加载中...</p>',7766,6088,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10329,'【二手9成新】Apple iPhone XSmax 苹果XSmax','国行二手手机 XS Max 金色 64G',47,'/goods-img/a0dfd1ad-61ed-43ee-add4-74bdfea1d6c1.jpg','/goods-img/a0dfd1ad-61ed-43ee-add4-74bdfea1d6c1.jpg','<p>商品介绍加载中...</p>',14999,6088,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10330,'【二手9成新】Apple iPhone XSmax 苹果XSmax','国行二手手机 XS Max 银色 256G',47,'/goods-img/87b66719-fc17-4c97-a954-de8a78b42a09.jpg','/goods-img/87b66719-fc17-4c97-a954-de8a78b42a09.jpg','<p>商品介绍加载中...</p>',14999,6938,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10331,'【二手9成新】Apple iPhone 6s Plus','苹果6sPlus 二手手机（送一年碎屏险） 玫瑰金色 64G 全网通',47,'/goods-img/5b132b57-24e4-4d65-9cb8-3299dc0e9ed6.png','/goods-img/5b132b57-24e4-4d65-9cb8-3299dc0e9ed6.png','<p>商品介绍加载中...</p>',1799,1468,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10332,'【二手9成新】Apple iPhone 6s Plus','苹果6sPlus 二手手机（送一年碎屏险） 金色 64G 全网通',47,'/goods-img/f289ec14-e0e2-481e-a703-39eec00a1b15.png','/goods-img/f289ec14-e0e2-481e-a703-39eec00a1b15.png','<p>商品介绍加载中...</p>',1799,1499,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10333,'【二手9成新】Apple iPhone 6s Plus','苹果6sPlus 二手手机（送一年碎屏险） 银色 64G 全网通',47,'/goods-img/084208d0-4dc2-4f1a-aff4-4114616dfae1.png','/goods-img/084208d0-4dc2-4f1a-aff4-4114616dfae1.png','<p>商品介绍加载中...</p>',1799,1599,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10334,'【二手9成新】Apple iPhone 6s Plus','苹果6sPlus 二手手机（送一年碎屏险） 深空灰色 64G 全网通',47,'/goods-img/8a598420-0052-4551-b00a-b288b6c22a48.png','/goods-img/8a598420-0052-4551-b00a-b288b6c22a48.png','<p>商品介绍加载中...</p>',1799,1638,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10335,'Apple 苹果 iPhone xr','手机 双卡双待 白色 全网通 64G',47,'/goods-img/6110a187-511f-45d0-8b59-ea2a75546a45.jpg','/goods-img/6110a187-511f-45d0-8b59-ea2a75546a45.jpg','<p>商品介绍加载中...</p>',5499,4699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10336,'Apple 苹果 iPhone xr','手机 双卡双待 黑色 全网通 128G',47,'/goods-img/41b10e86-857c-435c-b86d-d822e35450ab.jpg','/goods-img/41b10e86-857c-435c-b86d-d822e35450ab.jpg','<p>商品介绍加载中...</p>',5699,5079,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10337,'Apple 苹果 iPhone xr','手机 双卡双待 蓝色 全网通 64G',47,'/goods-img/d38bcaab-7a0a-4f86-ad75-60ac74a308e6.jpg','/goods-img/d38bcaab-7a0a-4f86-ad75-60ac74a308e6.jpg','<p>商品介绍加载中...</p>',5499,4699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10338,'Apple 苹果 iPhone xr','手机 双卡双待 黄色 全网通 128G',47,'/goods-img/73fc7cb9-5b43-4bce-a2b3-a82516773de0.jpg','/goods-img/73fc7cb9-5b43-4bce-a2b3-a82516773de0.jpg','<p>商品介绍加载中...</p>',5699,5079,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10339,'Apple 苹果 iPhone xr','手机 双卡双待 珊瑚色 全网通 64G',47,'/goods-img/00e53d76-db08-4ae2-864f-ca1cd7c8c32b.jpg','/goods-img/00e53d76-db08-4ae2-864f-ca1cd7c8c32b.jpg','<p>商品介绍加载中...</p>',5499,4699,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10340,'【二手95新】Apple iPhonex XSmax苹果x xsmax','国行 二手手机 XS max金色 64G 全网通',47,'/goods-img/5b9acfd4-7808-4b3b-bf5c-4b367667418c.jpg','/goods-img/5b9acfd4-7808-4b3b-bf5c-4b367667418c.jpg','<p>商品介绍加载中...</p>',12999,6088,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10341,'【二手95新】Apple iPhonex XSmax苹果x xsmax','国行 二手手机 XS 金色 64G 全网通',47,'/goods-img/cd2b481d-a4a2-4bc0-a4e1-784a28c37ef9.jpg','/goods-img/cd2b481d-a4a2-4bc0-a4e1-784a28c37ef9.jpg','<p>商品介绍加载中...</p>',12999,5299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10342,'【二手95新】Apple iPhonex XSmax苹果x xsmax','国行 二手手机 XS max灰色 256G 全网通',47,'/goods-img/1d866674-4e57-483a-955f-5fd1a4f5d921.jpg','/goods-img/1d866674-4e57-483a-955f-5fd1a4f5d921.jpg','<p>商品介绍加载中...</p>',12999,6938,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10343,'【二手95新】Apple iPhonex XSmax苹果x xsmax','国行 二手手机 XS max银色 64G 全网通',47,'/goods-img/3f3e086e-e4be-464f-9c20-760430cab2df.jpg','/goods-img/3f3e086e-e4be-464f-9c20-760430cab2df.jpg','<p>商品介绍加载中...</p>',12999,6088,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10344,'【二手95新】Apple iPhonex XSmax苹果x xsmax','国行 二手手机 XS 灰色 64G 全网通',47,'/goods-img/4a4a0820-aad5-47d4-a926-f040fd090c96.jpg','/goods-img/4a4a0820-aad5-47d4-a926-f040fd090c96.jpg','<p>商品介绍加载中...</p>',12999,5299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10345,'【二手95新】Apple iPhonex XSmax苹果x xsmax','国行 二手手机 XS 银色 64G 全网通',47,'/goods-img/a6b87d83-5ba7-4683-be17-43ab9aa043e3.jpg','/goods-img/a6b87d83-5ba7-4683-be17-43ab9aa043e3.jpg','<p>商品介绍加载中...</p>',12999,5299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10346,'【二手9成新】Apple iPhone X 苹果X','二手手机 深空灰色 64G 全网通',47,'/goods-img/3cd13e20-2a00-4049-8768-0ba662df7e40.jpg','/goods-img/3cd13e20-2a00-4049-8768-0ba662df7e40.jpg','<p>商品介绍加载中...</p>',3989,3989,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10347,'【二手9成新】Apple iPhone X 苹果X','二手手机 银色 64G 全网通',47,'/goods-img/fc3db752-e0dc-4ae7-bac3-fd60ab8a1e17.jpg','/goods-img/fc3db752-e0dc-4ae7-bac3-fd60ab8a1e17.jpg','<p>商品介绍加载中...</p>',4008,4008,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10348,'【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P','二手手机 磨砂黑 128G 全网通',47,'/goods-img/24b442e2-1bdd-4350-bbab-4e4d3d3445f1.jpg','/goods-img/24b442e2-1bdd-4350-bbab-4e4d3d3445f1.jpg','<p>商品介绍加载中...</p>',2899,2399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10349,'【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P','二手手机 亮黑色 128G 全网通',47,'/goods-img/7601e13f-de8e-449c-84be-65fbc7280cfc.png','/goods-img/7601e13f-de8e-449c-84be-65fbc7280cfc.png','<p>商品介绍加载中...</p>',2899,2399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10350,'【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P','二手手机 玫瑰金 128G 全网通',47,'/goods-img/771bc653-485b-4c5d-bca3-c84d3e90020d.jpg','/goods-img/771bc653-485b-4c5d-bca3-c84d3e90020d.jpg','<p>商品介绍加载中...</p>',2666,2399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10351,'【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P','二手手机 金色 128G 全网通',47,'/goods-img/5a170339-acb4-4890-bd08-bb109864e853.jpg','/goods-img/5a170339-acb4-4890-bd08-bb109864e853.jpg','<p>商品介绍加载中...</p>',2739,2399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10352,'【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P','二手手机 银色 128G 全网通',47,'/goods-img/a419ebb4-18a5-4295-9404-0593dd215ad0.jpg','/goods-img/a419ebb4-18a5-4295-9404-0593dd215ad0.jpg','<p>商品介绍加载中...</p>',2699,2466,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10353,'【二手9成新】Apple iPhone X 苹果X','二手手机 全网通 深空灰 64G',47,'/goods-img/4f666eee-c2c7-459c-934e-b32714d1e1c4.png','/goods-img/4f666eee-c2c7-459c-934e-b32714d1e1c4.png','<p>商品介绍加载中...</p>',5188,3956,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10354,'【二手9成新】苹果8Plus手机 Apple iPhone 8Plus','苹果8P 二手手机 深空灰 64G 全网通',47,'/goods-img/ada8e547-dca3-47fc-8aab-35884575090a.jpg','/goods-img/ada8e547-dca3-47fc-8aab-35884575090a.jpg','<p>商品介绍加载中...</p>',3888,3199,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10355,'【二手9成新】苹果8Plus手机 Apple iPhone 8Plus','苹果8P 二手手机 金色 64G 全网通',47,'/goods-img/76a2e417-2f15-412f-ab73-3a5eb2a7d2d1.jpg','/goods-img/76a2e417-2f15-412f-ab73-3a5eb2a7d2d1.jpg','<p>商品介绍加载中...</p>',3550,3199,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10356,'【二手9成新】苹果8Plus手机 Apple iPhone 8Plus','苹果8P 二手手机 银色 64G 全网通',47,'/goods-img/5bfb8955-0b1c-4652-b162-a9b91b71211a.jpg','/goods-img/5bfb8955-0b1c-4652-b162-a9b91b71211a.jpg','<p>商品介绍加载中...</p>',3499,3238,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10357,'【二手9成新】苹果8Plus手机 Apple iPhone 8Plus','苹果8P 二手手机 中国红 64G 全网通',47,'/goods-img/d31193ee-04c1-4bac-8a91-1a4690a396be.jpg','/goods-img/d31193ee-04c1-4bac-8a91-1a4690a396be.jpg','<p>商品介绍加载中...</p>',3438,3299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10358,'【二手9成新】Apple iPhoneX 苹果X 二手苹果x手机','深空灰 64G全网通',47,'/goods-img/b9264842-cd50-4d6f-a4a5-e8cc9dd483a4.png','/goods-img/b9264842-cd50-4d6f-a4a5-e8cc9dd483a4.png','<p>商品介绍加载中...</p>',4799,3989,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10359,'【二手9成新】Apple iPhoneX 苹果X 二手苹果x手机','银色 64G全网通',47,'/goods-img/58e9a125-61c1-416b-b17f-99cda431a202.png','/goods-img/58e9a125-61c1-416b-b17f-99cda431a202.png','<p>商品介绍加载中...</p>',4799,4016,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10360,'【二手95新】Apple iPhone XS 苹果xs','国行全网通二手手机 银色 全网通 64G',47,'/goods-img/5a732ada-1fdb-48f1-b106-666159565a94.jpg','/goods-img/5a732ada-1fdb-48f1-b106-666159565a94.jpg','<p>商品介绍加载中...</p>',9999,5299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10361,'【二手95新】Apple iPhone XS 苹果xs','国行全网通二手手机 金色 全网通 256G',47,'/goods-img/f9e9b321-4b25-40c5-af6d-d9f3fe74a053.jpg','/goods-img/f9e9b321-4b25-40c5-af6d-d9f3fe74a053.jpg','<p>商品介绍加载中...</p>',9999,6008,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10362,'【二手9成新】Apple iPhone X 苹果x','二手手机 X 银色 256G 全网通',47,'/goods-img/8da60128-fcc7-46ed-98b6-0066c69624c0.png','/goods-img/8da60128-fcc7-46ed-98b6-0066c69624c0.png','<p>商品介绍加载中...</p>',5058,4639,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10363,'【二手9成新】Apple iPhone X 苹果x','国行全网通二手手机 X 灰色 64G 全网通',47,'/goods-img/8aca87a3-65dd-4c42-91c7-bbbd10fcf7a6.jpg','/goods-img/8aca87a3-65dd-4c42-91c7-bbbd10fcf7a6.jpg','<p>商品介绍加载中...</p>',6999,3999,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10364,'【二手9成新】Apple iPhone X 苹果x','国行全网通二手手机 X 银色 64G 全网通',47,'/goods-img/fdec1b37-9a2f-46ea-af03-5091d83e546a.jpg','/goods-img/fdec1b37-9a2f-46ea-af03-5091d83e546a.jpg','<p>商品介绍加载中...</p>',6999,4078,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10365,'【二手9成新】Apple iPhone XR 苹果xr','二手手机双卡双待 白色 128G 全网通',47,'/goods-img/9834bb8d-fe1c-4218-a624-4a25aecb0676.jpg','/goods-img/9834bb8d-fe1c-4218-a624-4a25aecb0676.jpg','<p>商品介绍加载中...</p>',5888,4299,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10366,'【二手9成新】Apple iPhone XR 苹果xr','二手手机双卡双待 蓝色 128G 全网通',47,'/goods-img/3993feaa-0365-4d7e-9cc5-dcf583243ca3.jpg','/goods-img/3993feaa-0365-4d7e-9cc5-dcf583243ca3.jpg','<p>商品介绍加载中...</p>',5888,4399,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10367,'【二手9成新】Apple iPhone XR 苹果xr','二手手机双卡双待 黑色 64G 全网通',47,'/goods-img/ba9cf789-60a8-48db-8329-97c3fc13a061.jpg','/goods-img/ba9cf789-60a8-48db-8329-97c3fc13a061.jpg','<p>商品介绍加载中...</p>',5888,4055,1000,'',0,0,'2019-09-18 13:27:13',0,'2020-10-13 10:41:59'),\n\t(10689,'荣耀Play3 6.39英寸魅眼全视屏 4000mAh大电池 真4800万AI三摄','麒麟710F自研芯片 全网通4GB+64GB 幻夜黑',45,'/goods-img/9aa34959-cd60-418f-b42e-aa7243b6869c.jpg','/goods-img/9aa34959-cd60-418f-b42e-aa7243b6869c.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10690,'华为 HUAWEI 畅享10 Plus','超高清全视屏前置悬浮式镜头4800万超广角AI三摄 4GB+128GB幻夜黑全网通双4G手机',46,'/goods-img/2613a582-460c-4c2b-bbc0-6c7dbf501bd2.jpg','/goods-img/2613a582-460c-4c2b-bbc0-6c7dbf501bd2.jpg','<p>商品介绍加载中...</p>',1499,1499,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10691,'华为 HUAWEI 畅享10 Plus','超高清全视屏前置悬浮式镜头4800万超广角AI三摄 4GB+128GB翡冷翠全网通双4G手机',46,'/goods-img/21b0751b-f6ae-4a57-8fb8-61e007395c43.jpg','/goods-img/21b0751b-f6ae-4a57-8fb8-61e007395c43.jpg','<p>商品介绍加载中...</p>',1499,1499,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10692,'华为 HUAWEI 畅享10 Plus','超高清全视屏前置悬浮式镜头4800万超广角AI三摄 6GB+128GB天空之境全网通双4G手机',46,'/goods-img/3f68538f-3b56-4e98-9676-99139857428c.jpg','/goods-img/3f68538f-3b56-4e98-9676-99139857428c.jpg','<p>商品介绍加载中...</p>',1799,1799,999,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10693,'荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB','渐变蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/f8ab28c3-8e04-49a0-ba05-2e6a3ae7211f.jpg','/goods-img/f8ab28c3-8e04-49a0-ba05-2e6a3ae7211f.jpg','<p>商品介绍加载中...</p>',1099,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10694,'荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB','幻夜黑 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/de654f42-d58d-4336-8edd-da01c3523449.jpg','/goods-img/de654f42-d58d-4336-8edd-da01c3523449.jpg','<p>商品介绍加载中...</p>',1099,999,999,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10695,'荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB','渐变红 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/87254a42-9fdf-4e68-a11e-e8e2eef28d2c.jpg','/goods-img/87254a42-9fdf-4e68-a11e-e8e2eef28d2c.jpg','<p>商品介绍加载中...</p>',1099,999,997,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10696,'荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB','铃兰白 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/81b7060a-7274-4bff-86c0-72d5fc7ff383.jpg','/goods-img/81b7060a-7274-4bff-86c0-72d5fc7ff383.jpg','<p>商品介绍加载中...</p>',1099,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10697,'荣耀8X 千元屏霸 91%屏占比 2000万AI双摄','4GB+64GB 幻夜黑 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/d7f74e8f-5c52-422b-ac99-a8d691830494.jpg','/goods-img/d7f74e8f-5c52-422b-ac99-a8d691830494.jpg','<p>商品介绍加载中...</p>',1399,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10698,'荣耀8X 千元屏霸 91%屏占比 2000万AI双摄','4GB+64GB 幻影蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/7031c07e-a70f-4f6d-9e2d-d0af31e3393a.jpg','/goods-img/7031c07e-a70f-4f6d-9e2d-d0af31e3393a.jpg','<p>商品介绍加载中...</p>',1399,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10699,'荣耀8X 千元屏霸 91%屏占比 2000万AI双摄','4GB+64GB 魅海蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/b7bfcc28-98c2-4cb4-8ce3-afe4c482b674.jpg','/goods-img/b7bfcc28-98c2-4cb4-8ce3-afe4c482b674.jpg','<p>商品介绍加载中...</p>',1399,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10700,'荣耀8X 千元屏霸 91%屏占比 2000万AI双摄','4GB+64GB 魅焰红 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/6a160b96-9b4a-4844-b335-feb31b1f5d8c.jpg','/goods-img/6a160b96-9b4a-4844-b335-feb31b1f5d8c.jpg','<p>商品介绍加载中...</p>',1399,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10701,'荣耀8X 千元屏霸 91%屏占比 2000万AI双摄','4GB+64GB 梦幻紫 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/8ccc13ec-96fe-4488-a604-526601548c9e.jpg','/goods-img/8ccc13ec-96fe-4488-a604-526601548c9e.jpg','<p>商品介绍加载中...</p>',1399,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10702,'华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB天空之境全网通双4G手机','新蜂精选',46,'/goods-img/edb7e8ef-7785-418b-a75e-dfed2aa74e39.jpg','/goods-img/edb7e8ef-7785-418b-a75e-dfed2aa74e39.jpg','<p>商品介绍加载中...</p>',4288,3988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10703,'华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB亮黑色全网通双4G手机','新蜂精选',46,'/goods-img/e13294f7-9ab0-42dc-afb1-9f41c59436cf.jpg','/goods-img/e13294f7-9ab0-42dc-afb1-9f41c59436cf.jpg','<p>商品介绍加载中...</p>',4288,3988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10704,'华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB珠光贝母全网通双4G手机','新蜂精选',46,'/goods-img/b9e6d770-06dd-40f4-9ae5-31103cec6e5f.jpg','/goods-img/b9e6d770-06dd-40f4-9ae5-31103cec6e5f.jpg','<p>商品介绍加载中...</p>',4288,3988,998,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10705,'华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB极光色全网通双4G手机','新蜂精选',46,'/goods-img/20312f4e-da4f-49b9-8150-ab54f0302915.jpg','/goods-img/20312f4e-da4f-49b9-8150-ab54f0302915.jpg','<p>商品介绍加载中...</p>',4288,3988,997,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10706,'华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB赤茶橘全网通双4G手机','新蜂精选',46,'/goods-img/192b1727-bcab-4bdf-8494-182f8ec5b2e6.jpg','/goods-img/192b1727-bcab-4bdf-8494-182f8ec5b2e6.jpg','<p>商品介绍加载中...</p>',4288,3988,987,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10707,'荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB','渐变蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/74146e03-42d1-453c-843d-b02d8bcc24f4.jpg','/goods-img/74146e03-42d1-453c-843d-b02d8bcc24f4.jpg','<p>商品介绍加载中...</p>',1399,1299,996,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10708,'荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB','渐变红 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/4c066fc2-3a58-44df-9dc6-8465b25f92ef.jpg','/goods-img/4c066fc2-3a58-44df-9dc6-8465b25f92ef.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10709,'荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB','幻夜黑 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/525bdd6e-848b-4e02-b19f-1a08fdb87faa.jpg','/goods-img/525bdd6e-848b-4e02-b19f-1a08fdb87faa.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10710,'荣耀9X 麒麟810 4000mAh超强续航 4800万超清夜拍','6.59英寸升降全面屏 全网通6GB+64GB 魅海蓝',45,'/goods-img/7b8b7da7-f154-453e-a6a6-ea2f5e7d8b4a.jpg','/goods-img/7b8b7da7-f154-453e-a6a6-ea2f5e7d8b4a.jpg','<p>商品介绍加载中...</p>',1599,1599,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10711,'荣耀9X 麒麟810 4000mAh超强续航 4800万超清夜拍','6.59英寸升降全面屏 全网通6GB+64GB 幻夜黑',45,'/goods-img/d30f7986-bc0f-4ea8-8fbb-94c6bae248f5.jpg','/goods-img/d30f7986-bc0f-4ea8-8fbb-94c6bae248f5.jpg','<p>商品介绍加载中...</p>',1599,1599,975,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10712,'荣耀9X 麒麟810 4000mAh超强续航 4800万超清夜拍','6.59英寸升降全面屏 全网通4GB+64GB 魅焰红',45,'/goods-img/95b5df3b-cfec-40bb-8ead-35e0fe7fb7b2.jpg','/goods-img/95b5df3b-cfec-40bb-8ead-35e0fe7fb7b2.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10713,'荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍','麒麟Kirin980全网通版8GB+128GB 蓝水翡翠 全面屏手机',45,'/goods-img/2469b8fa-8117-4409-a8d6-3b52a33b3e51.jpg','/goods-img/2469b8fa-8117-4409-a8d6-3b52a33b3e51.jpg','<p>商品介绍加载中...</p>',2699,2499,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10714,'荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍','麒麟Kirin980全网通版8GB+128GB 幻夜黑 全面屏手机',45,'/goods-img/474e2ef0-2321-4363-ab31-7a838546f172.jpg','/goods-img/474e2ef0-2321-4363-ab31-7a838546f172.jpg','<p>商品介绍加载中...</p>',2699,2499,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10715,'荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍','麒麟Kirin980全网通版8GB+128GB 冰岛白 全面屏手机',45,'/goods-img/77d87d20-4fc7-441c-82a8-baf9089fc3ad.jpg','/goods-img/77d87d20-4fc7-441c-82a8-baf9089fc3ad.jpg','<p>商品介绍加载中...</p>',2699,2499,994,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10716,'荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍','麒麟Kirin980全网通版8GB+128GB 幻影蓝 全面屏手机',45,'/goods-img/1a200710-8c41-4411-8edf-a49575807a08.jpg','/goods-img/1a200710-8c41-4411-8edf-a49575807a08.jpg','<p>商品介绍加载中...</p>',2699,2499,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10717,'荣耀20 PRO 李现同款 4800万全焦段AI四摄','双光学防抖 麒麟980 全网通4G 8GB+128GB 冰岛幻境 拍照手机',45,'/goods-img/391cd4e6-6071-41ea-a6fc-d983b30a5470.jpg','/goods-img/391cd4e6-6071-41ea-a6fc-d983b30a5470.jpg','<p>商品介绍加载中...</p>',3199,2899,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10718,'荣耀20 PRO 李现同款 4800万全焦段AI四摄','双光学防抖 麒麟980 全网通4G 8GB+128GB 蓝水翡翠 拍照手机',45,'/goods-img/5d7ee18f-ca20-4d72-a803-dc5b03bd80e2.jpg','/goods-img/5d7ee18f-ca20-4d72-a803-dc5b03bd80e2.jpg','<p>商品介绍加载中...</p>',3199,2899,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10719,'荣耀20 PRO 李现同款 4800万全焦段AI四摄','双光学防抖 麒麟980 全网通4G 8GB+128GB 幻夜星河 拍照手机',45,'/goods-img/e1505375-d00d-4cd8-a090-a13490b430d5.jpg','/goods-img/e1505375-d00d-4cd8-a090-a13490b430d5.jpg','<p>商品介绍加载中...</p>',3199,2899,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10720,'荣耀20 PRO × MOSCHINO联名版','4800万全焦段AI四摄 双光学防抖 麒麟980 8GB+256GB 黑色',45,'/goods-img/0ae89667-8a69-4efc-b8d8-c0ebaf56753a.jpg','/goods-img/0ae89667-8a69-4efc-b8d8-c0ebaf56753a.jpg','<p>商品介绍加载中...</p>',3799,3799,997,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10721,'华为 HUAWEI 畅享 9S','6GB+64GB 幻夜黑 全网通 2400万超广角三摄珍珠屏大存储 移动联通电信4G手机 双卡双待',46,'/goods-img/1b96ae9b-8c56-465e-9e82-ff712305e2d9.jpg','/goods-img/1b96ae9b-8c56-465e-9e82-ff712305e2d9.jpg','<p>商品介绍加载中...</p>',1499,1199,989,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10722,'华为 HUAWEI 畅享 9S','6GB+64GB 极光蓝 全网通 2400万超广角三摄珍珠屏大存储 移动联通电信4G手机 双卡双待',46,'/goods-img/b49530f5-fe13-42b3-9ca9-6f1367e0f8f8.jpg','/goods-img/b49530f5-fe13-42b3-9ca9-6f1367e0f8f8.jpg','<p>商品介绍加载中...</p>',1499,1199,994,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10723,'华为 HUAWEI 畅享 9S','6GB+64GB 珊瑚红 全网通 2400万超广角三摄珍珠屏大存储 移动联通电信4G手机 双卡双待',46,'/goods-img/84397a4c-ff06-4f08-bad5-bd4d5f8e23ff.jpg','/goods-img/84397a4c-ff06-4f08-bad5-bd4d5f8e23ff.jpg','<p>商品介绍加载中...</p>',1499,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10724,'荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏','4800万深感相机 6GB+128GB 幻夜黑 移动联通电信4G全面屏手机',45,'/goods-img/7a58b5b2-0101-4a55-9872-d7765f08cf19.jpg','/goods-img/7a58b5b2-0101-4a55-9872-d7765f08cf19.jpg','<p>商品介绍加载中...</p>',2199,2099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10725,'荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏','4800万深感相机 6GB+128GB 魅海蓝 移动联通电信4G全面屏手机',45,'/goods-img/5dd6b4de-0b39-48fc-9285-7356c22edf7b.jpg','/goods-img/5dd6b4de-0b39-48fc-9285-7356c22edf7b.jpg','<p>商品介绍加载中...</p>',2199,2099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10726,'荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏','4800万深感相机 6GB+128GB 幻影蓝 移动联通电信4G全面屏手机',45,'/goods-img/c5a6593b-ef49-42fd-b330-0be8021362d8.jpg','/goods-img/c5a6593b-ef49-42fd-b330-0be8021362d8.jpg','<p>商品介绍加载中...</p>',2199,2099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10727,'荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏','4800万深感相机 6GB+128GB 魅丽红 移动联通电信4G全面屏手机',45,'/goods-img/b57f705a-ef7f-4a9f-a244-3fc980e17555.jpg','/goods-img/b57f705a-ef7f-4a9f-a244-3fc980e17555.jpg','<p>商品介绍加载中...</p>',2199,2099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10728,'荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏','4800万深感相机 6GB+128GB 幻影红 移动联通电信4G全面屏手机',45,'/goods-img/3dd91f7d-8f89-4e8a-a808-fa556ee1ceb3.jpg','/goods-img/3dd91f7d-8f89-4e8a-a808-fa556ee1ceb3.jpg','<p>商品介绍加载中...</p>',2199,2099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10729,'华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机','6GB+128GB 亮黑色 全网通移动联通电信4G手机 双卡双待',46,'/goods-img/f8edc81a-8fbd-425b-8ed7-d6b4c14ec6a1.jpg','/goods-img/f8edc81a-8fbd-425b-8ed7-d6b4c14ec6a1.jpg','<p>商品介绍加载中...</p>',3088,2799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10730,'华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机','6GB+64GB 极光色 全网通移动联通电信4G手机 双卡双待',46,'/goods-img/c17c5292-2c20-4196-88e3-7ea813530db5.jpg','/goods-img/c17c5292-2c20-4196-88e3-7ea813530db5.jpg','<p>商品介绍加载中...</p>',2788,2679,997,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10731,'华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机','6GB+64GB 宝石蓝 全网通移动联通电信4G手机 双卡双待',46,'/goods-img/b43bcd55-3709-4c32-b3a2-5b59c80f3610.jpg','/goods-img/b43bcd55-3709-4c32-b3a2-5b59c80f3610.jpg','<p>商品介绍加载中...</p>',2788,2699,999,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10732,'华为 HUAWEI P20 AI智慧全面屏','6GB+64GB 极光闪蝶色 全网通版 移动联通电信4G手机 双卡双待',46,'/goods-img/3b183d9a-ac01-4bed-a7bb-1ddeba6ad416.jpg','/goods-img/3b183d9a-ac01-4bed-a7bb-1ddeba6ad416.jpg','<p>商品介绍加载中...</p>',2788,2679,998,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10733,'华为 HUAWEI P20 AI智慧全面屏','6GB+64GB 珠光贝母色 全网通版 移动联通电信4G手机 双卡双待',46,'/goods-img/28e94d5d-9ccc-4843-a296-2747530037ce.jpg','/goods-img/28e94d5d-9ccc-4843-a296-2747530037ce.jpg','<p>商品介绍加载中...</p>',3388,2988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10734,'华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机','6GB+128GB 香槟金 全网通移动联通电信4G手机 双卡双待',46,'/goods-img/0b11241e-4d6b-44ea-afb0-e029d1b5a54d.jpg','/goods-img/0b11241e-4d6b-44ea-afb0-e029d1b5a54d.jpg','<p>商品介绍加载中...</p>',3888,3888,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10735,'荣耀20S 李现同款 3200万人像超级夜景 4800万超广角AI三摄','麒麟810旗舰级芯片 全网通版6GB+128GB 蝶羽蓝',45,'/goods-img/8883043d-bef3-442c-9ccf-af9c03510c5d.jpg','/goods-img/8883043d-bef3-442c-9ccf-af9c03510c5d.jpg','<p>商品介绍加载中...</p>',1899,1899,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10736,'华为 HUAWEI 畅享MAX 4GB+64GB','幻夜黑 全网通版 珍珠屏杜比全景声大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/522ed5b9-bcae-401f-9933-d2e957bb3384.jpg','/goods-img/522ed5b9-bcae-401f-9933-d2e957bb3384.jpg','<p>商品介绍加载中...</p>',1199,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10737,'华为 HUAWEI 畅享MAX 4GB+64GB','琥珀棕 全网通版 珍珠屏杜比全景声大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/36bdfdb9-21b1-46d5-9534-8b3873c9b6d9.jpg','/goods-img/36bdfdb9-21b1-46d5-9534-8b3873c9b6d9.jpg','<p>商品介绍加载中...</p>',1199,999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10738,'华为 HUAWEI 畅享MAX 4GB+128GB','天际白 全网通版 珍珠屏杜比全景声大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/51fa04cf-1c05-49ee-8dea-0c1757ff32c4.jpg','/goods-img/51fa04cf-1c05-49ee-8dea-0c1757ff32c4.jpg','<p>商品介绍加载中...</p>',1899,1399,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10739,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB极光色全网通版双4G手机',46,'/goods-img/65c8e729-aeca-4780-977b-4d0d39d4aa2e.jpg','/goods-img/65c8e729-aeca-4780-977b-4d0d39d4aa2e.jpg','<p>商品介绍加载中...</p>',5488,4988,998,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10740,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB亮黑色全网通版双4G手机',46,'/goods-img/bc90bb1e-494a-44d4-b180-42a994ec80fc.jpg','/goods-img/bc90bb1e-494a-44d4-b180-42a994ec80fc.jpg','<p>商品介绍加载中...</p>',5488,4988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10741,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB珠光贝母全网通版双4G手机',46,'/goods-img/a6f309b7-765a-4407-be71-bbd5b764d448.jpg','/goods-img/a6f309b7-765a-4407-be71-bbd5b764d448.jpg','<p>商品介绍加载中...</p>',5488,4988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10742,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+256GB天空之境全网通版双4G手机',46,'/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg','/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg','<p>商品介绍加载中...</p>',5988,5488,961,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10743,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+256GB墨玉蓝全网通版双4G手机',46,'/goods-img/8755a735-baa1-4f17-a9bd-30c4f4f1451b.jpg','/goods-img/8755a735-baa1-4f17-a9bd-30c4f4f1451b.jpg','<p>商品介绍加载中...</p>',5988,5488,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10744,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB赤茶橘全网通版双4G手机',46,'/goods-img/44e78820-86f3-429d-94af-64f6af308846.jpg','/goods-img/44e78820-86f3-429d-94af-64f6af308846.jpg','<p>商品介绍加载中...</p>',5488,4988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10745,'华为 HUAWEI P30 Pro','超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB嫣紫色全网通版双4G手机',46,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',5488,4988,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10746,'华为 HUAWEI nova 5','Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB绮境森林全网通双4G手机',46,'/goods-img/2948815e-043a-4f47-896f-7f6ccf916369.jpg','/goods-img/2948815e-043a-4f47-896f-7f6ccf916369.jpg','<p>商品介绍加载中...</p>',2999,2999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10747,'华为 HUAWEI nova 5','Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB亮黑色全网通双4G手机',46,'/goods-img/df1bea42-9172-4cd5-9fc5-f35bb736108f.jpg','/goods-img/df1bea42-9172-4cd5-9fc5-f35bb736108f.jpg','<p>商品介绍加载中...</p>',2999,2999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10748,'华为 HUAWEI nova 5','Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片 8GB+128GB仲夏紫全网通双4G手机',46,'/goods-img/ab6f8463-794f-4f40-87b8-d01e6260ff1c.jpg','/goods-img/ab6f8463-794f-4f40-87b8-d01e6260ff1c.jpg','<p>商品介绍加载中...</p>',2999,2999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10749,'华为 HUAWEI nova 5','Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB苏音蓝全网通双4G手机',46,'/goods-img/98e90b6e-2a5d-462d-8cd1-44699144a0b5.jpg','/goods-img/98e90b6e-2a5d-462d-8cd1-44699144a0b5.jpg','<p>商品介绍加载中...</p>',2999,2999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10750,'华为 HUAWEI nova 5','Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB珊瑚橙全网通双4G手机',46,'/goods-img/ec0bafed-d651-4be7-b2aa-13e84248219a.jpg','/goods-img/ec0bafed-d651-4be7-b2aa-13e84248219a.jpg','<p>商品介绍加载中...</p>',2999,2999,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10751,'华为 HUAWEI nova 5','Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+256GB仲夏紫星耀礼盒版全网通',46,'/goods-img/83f39052-5a1c-4769-a7db-cf2bd53d2a29.jpg','/goods-img/83f39052-5a1c-4769-a7db-cf2bd53d2a29.jpg','<p>商品介绍加载中...</p>',3799,3599,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10752,'华为 HUAWEI nova 5i','后置AI四摄 极点全面屏 前置2400万高清摄像头 8GB+128GB 苏音蓝 全网通双卡双待',46,'/goods-img/4b2bffff-ec0b-42e0-8152-ada9a121ad31.jpg','/goods-img/4b2bffff-ec0b-42e0-8152-ada9a121ad31.jpg','<p>商品介绍加载中...</p>',2199,2199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10753,'华为 HUAWEI nova 5i','后置AI四摄 极点全面屏 前置2400万高清摄像头 8GB+128GB 幻夜黑 全网通双卡双待',46,'/goods-img/04dce482-ff0e-483c-b324-dfc030b6cdd1.jpg','/goods-img/04dce482-ff0e-483c-b324-dfc030b6cdd1.jpg','<p>商品介绍加载中...</p>',2199,2199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10754,'华为 HUAWEI nova 5i','后置AI四摄 极点全面屏 前置2400万高清摄像头 8GB+128GB 蜜语红 全网通双卡双待',46,'/goods-img/b5e139d3-ea6b-4874-9ccc-c18aca44a8bc.jpg','/goods-img/b5e139d3-ea6b-4874-9ccc-c18aca44a8bc.jpg','<p>商品介绍加载中...</p>',2199,2199,996,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10755,'荣耀9X PRO 麒麟810液冷散热 4000mAh超强续航','4800万超广角夜拍三摄 6.59英寸全网通8GB+128GB 幻影紫',45,'/goods-img/86bd80cd-140b-474c-8277-3747332f61b3.jpg','/goods-img/86bd80cd-140b-474c-8277-3747332f61b3.jpg','<p>商品介绍加载中...</p>',2199,2199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10756,'荣耀9X PRO 麒麟810液冷散热 4000mAh超强续航','4800万超广角夜拍三摄 6.59英寸全网通8GB+128GB 幻夜黑',45,'/goods-img/3b008be9-e906-4364-8aa0-0df2e670dbd2.jpg','/goods-img/3b008be9-e906-4364-8aa0-0df2e670dbd2.jpg','<p>商品介绍加载中...</p>',2199,2199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10757,'荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+32GB','极光蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/7f7d2343-6743-490b-baec-3e0a76d061e5.jpg','/goods-img/7f7d2343-6743-490b-baec-3e0a76d061e5.jpg','<p>商品介绍加载中...</p>',899,799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10758,'荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+32GB','铂光金 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/b163ca1b-7deb-4b15-818a-dc765c852305.jpg','/goods-img/b163ca1b-7deb-4b15-818a-dc765c852305.jpg','<p>商品介绍加载中...</p>',899,799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10759,'荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+32GB','星云紫 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/f949289a-4c51-4159-a754-871da347e1e5.jpg','/goods-img/f949289a-4c51-4159-a754-871da347e1e5.jpg','<p>商品介绍加载中...</p>',899,799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10760,'荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+64GB','幻夜黑 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/27c3c018-95c5-429f-9ad7-be0fedd78329.jpg','/goods-img/27c3c018-95c5-429f-9ad7-be0fedd78329.jpg','<p>商品介绍加载中...</p>',1399,1099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10761,'荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+64GB','幻影蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/61224f59-e11a-4005-84dc-cadfdd4162f6.jpg','/goods-img/61224f59-e11a-4005-84dc-cadfdd4162f6.jpg','<p>商品介绍加载中...</p>',1399,1099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10762,'华为 HUAWEI 畅享8e 青春版','2GB+32GB全面屏 金色 全网通版 移动联通电信4G手机 双卡双待',46,'/goods-img/af23223e-56fa-4aa7-b832-c55c713fa604.jpg','/goods-img/af23223e-56fa-4aa7-b832-c55c713fa604.jpg','<p>商品介绍加载中...</p>',699,549,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10763,'华为 HUAWEI 畅享8e青春 2GB+32GB全面屏','黑色 全网通版 移动联通电信4G手机 双卡双待',46,'/goods-img/bf64e22d-1cd3-40b0-9ce1-cc944e35d2d4.jpg','/goods-img/bf64e22d-1cd3-40b0-9ce1-cc944e35d2d4.jpg','<p>商品介绍加载中...</p>',699,549,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10764,'华为 HUAWEI 畅享8e青春 2GB+32GB全面屏','蓝色 全网通版 移动联通电信4G手机 双卡双待',46,'/goods-img/70f9ecf9-4859-45de-8f67-5afbdba6735c.jpg','/goods-img/70f9ecf9-4859-45de-8f67-5afbdba6735c.jpg','<p>商品介绍加载中...</p>',699,549,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10765,'华为 HUAWEI nova 4e','3200万立体美颜AI超广角三摄珍珠屏6GB+128GB雀翎蓝全网通版双4G手机',46,'/goods-img/55b997f9-fa22-40b0-8b33-429760c2af49.jpg','/goods-img/55b997f9-fa22-40b0-8b33-429760c2af49.jpg','<p>商品介绍加载中...</p>',1999,1799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10766,'华为 HUAWEI nova 4e','3200万立体美颜AI超广角三摄珍珠屏6GB+128GB幻夜黑全网通版双4G手机',46,'/goods-img/8d675ec6-efe0-4ca6-8f83-193820b07256.jpg','/goods-img/8d675ec6-efe0-4ca6-8f83-193820b07256.jpg','<p>商品介绍加载中...</p>',1999,1799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10767,'华为 HUAWEI nova 4e','3200万立体美颜AI超广角三摄珍珠屏6GB+128GB珍珠白全网通版双4G手机',46,'/goods-img/c8ce9a44-7b40-48b2-91cb-2a1607561b4a.jpg','/goods-img/c8ce9a44-7b40-48b2-91cb-2a1607561b4a.jpg','<p>商品介绍加载中...</p>',1999,1799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10768,'华为 HUAWEI 畅享9 Plus','4GB+64GB 极光紫 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/5ea16713-f6ae-4fa7-a53d-1700c29cb3d3.jpg','/goods-img/5ea16713-f6ae-4fa7-a53d-1700c29cb3d3.jpg','<p>商品介绍加载中...</p>',1299,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10769,'华为 HUAWEI 畅享9 Plus','4GB+64GB 幻夜黑 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/39e4b0c8-c4c5-4162-8a32-3bb9bb483503.jpg','/goods-img/39e4b0c8-c4c5-4162-8a32-3bb9bb483503.jpg','<p>商品介绍加载中...</p>',1299,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10770,'华为 HUAWEI 畅享9 Plus','4GB+64GB 宝石蓝 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/ca2bb115-c75e-475b-93ab-c2436f31aa16.jpg','/goods-img/ca2bb115-c75e-475b-93ab-c2436f31aa16.jpg','<p>商品介绍加载中...</p>',1299,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10771,'华为 HUAWEI 畅享9 Plus','4GB+64GB 樱语粉 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待',46,'/goods-img/65e953c4-1d29-423a-b7d7-4276c4d42aaa.jpg','/goods-img/65e953c4-1d29-423a-b7d7-4276c4d42aaa.jpg','<p>商品介绍加载中...</p>',1299,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10772,'华为 HUAWEI nova 3i','全面屏高清四摄游戏手机4GB+128GB 亮黑色 移动4G+ 移动联通电信4G手机双卡双待',46,'/goods-img/2252c604-ced3-4e92-b58b-15402ae7be2c.jpg','/goods-img/2252c604-ced3-4e92-b58b-15402ae7be2c.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10773,'华为 HUAWEI nova 3i','全面屏高清四摄游戏手机4GB+128GB 蓝楹紫 移动4G+ 移动联通电信4G手机双卡双待',46,'/goods-img/a17dc2b3-17dc-4be7-a04d-12a3fa62de31.jpg','/goods-img/a17dc2b3-17dc-4be7-a04d-12a3fa62de31.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10774,'华为 HUAWEI nova 5i','Pro 前置3200万人像超级夜景4800万AI四摄极点全面屏6GB+128GB翡冷翠全网通双4G手机',46,'/goods-img/e3f32e21-1208-481d-bfcd-8447de78043b.jpg','/goods-img/e3f32e21-1208-481d-bfcd-8447de78043b.jpg','<p>商品介绍加载中...</p>',2199,2149,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10775,'华为 HUAWEI nova 5i','Pro 前置3200万人像超级夜景4800万AI四摄极点全面屏6GB+128GB幻夜黑全网通双4G手机',46,'/goods-img/1eb1e40c-7f38-47ed-a839-d43c1d0b79a8.jpg','/goods-img/1eb1e40c-7f38-47ed-a839-d43c1d0b79a8.jpg','<p>商品介绍加载中...</p>',2199,2149,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10776,'华为 HUAWEI nova 5i','Pro 前置3200万人像超级夜景4800万AI四摄极点全面屏6GB+128GB极光色全网通双4G手机',46,'/goods-img/80f05e0d-0d06-4aa8-bca5-0d39a2365b4b.jpg','/goods-img/80f05e0d-0d06-4aa8-bca5-0d39a2365b4b.jpg','<p>商品介绍加载中...</p>',2199,2149,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10777,'华为 HUAWEI Mate 20','麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB亮黑色全网通版双4G手机',46,'/goods-img/9024ab8a-be67-4459-8414-8d84225851a7.jpg','/goods-img/9024ab8a-be67-4459-8414-8d84225851a7.jpg','<p>商品介绍加载中...</p>',3799,3699,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10778,'华为 HUAWEI Mate 20','麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB极光色全网通版双4G手机',46,'/goods-img/940a6c56-9f7b-4008-8679-c7ef5a44d695.jpg','/goods-img/940a6c56-9f7b-4008-8679-c7ef5a44d695.jpg','<p>商品介绍加载中...</p>',3799,3699,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10779,'华为 HUAWEI Mate 20','麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+64GB翡冷翠全网通版双4G手机',46,'/goods-img/08f9a912-f049-4cf8-a839-115fc6582398.jpg','/goods-img/08f9a912-f049-4cf8-a839-115fc6582398.jpg','<p>商品介绍加载中...</p>',3299,3199,994,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10780,'华为 HUAWEI Mate 20','麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB宝石蓝全网通版双4G手机',46,'/goods-img/5d57e0ba-1bc7-45a7-9677-f501e0384442.jpg','/goods-img/5d57e0ba-1bc7-45a7-9677-f501e0384442.jpg','<p>商品介绍加载中...</p>',3799,3699,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10781,'华为 HUAWEI 麦芒 8','超广角AI三摄 高清珍珠屏 大存储 6GB+128GB 极光蓝 全网通双4G手机',46,'/goods-img/bde7fc16-fb6b-42b0-8950-13ff287c3cd3.jpg','/goods-img/bde7fc16-fb6b-42b0-8950-13ff287c3cd3.jpg','<p>商品介绍加载中...</p>',1899,1699,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10782,'华为 HUAWEI 麦芒 8','超广角AI三摄 高清珍珠屏 大存储 6GB+128GB 幻夜黑 全网通双4G手机',46,'/goods-img/e299773e-14e4-4168-adab-514f6c6d35ed.jpg','/goods-img/e299773e-14e4-4168-adab-514f6c6d35ed.jpg','<p>商品介绍加载中...</p>',1899,1699,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10783,'华为 HUAWEI 麦芒 8','超广角AI三摄 高清珍珠屏 大存储 6GB+128GB 宝石蓝 全网通双4G手机',46,'/goods-img/2a3fb7d2-cb76-47b2-88c6-db0f869b5718.jpg','/goods-img/2a3fb7d2-cb76-47b2-88c6-db0f869b5718.jpg','<p>商品介绍加载中...</p>',1899,1699,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10784,'荣耀8X Max 骁龙660 7.12英寸90%屏占比珍珠屏','6GB+64GB 魅海蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/c0763005-4e67-4861-98f2-e6a550ec4d87.jpg','/goods-img/c0763005-4e67-4861-98f2-e6a550ec4d87.jpg','<p>商品介绍加载中...</p>',1799,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10785,'荣耀8X Max 骁龙660 7.12英寸90%屏占比珍珠屏','6GB+64GB 幻夜黑 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/aea7760b-d950-4f64-8db9-ef055f15d234.jpg','/goods-img/aea7760b-d950-4f64-8db9-ef055f15d234.jpg','<p>商品介绍加载中...</p>',1799,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10786,'荣耀8X Max 骁龙660 7.12英寸90%屏占比珍珠屏','6GB+64GB 魅焰红 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/f5e2d2e7-541a-44fa-ad5c-4f15f48ebfc9.jpg','/goods-img/f5e2d2e7-541a-44fa-ad5c-4f15f48ebfc9.jpg','<p>商品介绍加载中...</p>',1799,1199,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10787,'华为 HUAWEI Mate 10','4GB+64GB 亮黑色 移动4G+手机 双卡双待',46,'/goods-img/b67a4ac6-7766-4995-8110-1bd442ec0797.jpg','/goods-img/b67a4ac6-7766-4995-8110-1bd442ec0797.jpg','<p>商品介绍加载中...</p>',1799,1799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10788,'华为 HUAWEI 畅享9 3GB+32GB','极光蓝 高清珍珠屏 AI长续航 全网通标配版 移动联通电信4G手机',46,'/goods-img/bd8b2d93-c251-46b8-9990-77baaf3075f3.jpg','/goods-img/bd8b2d93-c251-46b8-9990-77baaf3075f3.jpg','<p>商品介绍加载中...</p>',999,799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10789,'华为 HUAWEI 畅享9 3GB+32GB','幻夜黑 高清珍珠屏 AI长续航 全网通标配版 移动联通电信4G手机',46,'/goods-img/71ae1ce8-38e8-4da3-8fa1-5e8157a12685.jpg','/goods-img/71ae1ce8-38e8-4da3-8fa1-5e8157a12685.jpg','<p>商品介绍加载中...</p>',999,799,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10790,'华为 HUAWEI 畅享9 4GB+64GB','极光紫 高清珍珠屏 AI长续航 全网通高配版 移动联通电信4G手机',46,'/goods-img/371386b8-ddf4-4fc1-985e-ef0e1a076710.jpg','/goods-img/371386b8-ddf4-4fc1-985e-ef0e1a076710.jpg','<p>商品介绍加载中...</p>',1099,1099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10791,'华为 HUAWEI 畅享9 4GB+64GB','珊瑚红 高清珍珠屏 AI长续航 全网通高配版 移动联通电信4G手机',46,'/goods-img/60392ae1-d076-47b5-a00d-b2278e01ccb5.jpg','/goods-img/60392ae1-d076-47b5-a00d-b2278e01ccb5.jpg','<p>商品介绍加载中...</p>',1099,1099,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10792,'荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB','幻夜黑 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/0a592388-1535-4f9f-8201-ecb78c48bb3d.jpg','/goods-img/0a592388-1535-4f9f-8201-ecb78c48bb3d.jpg','<p>商品介绍加载中...</p>',799,649,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10793,'荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB','极光蓝 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/fd218943-8f6f-4fb8-91a4-d6216cc5afdc.jpg','/goods-img/fd218943-8f6f-4fb8-91a4-d6216cc5afdc.jpg','<p>商品介绍加载中...</p>',799,649,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10794,'荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB','魅焰红 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/54641753-d8e7-45da-8c6c-81192552cf15.jpg','/goods-img/54641753-d8e7-45da-8c6c-81192552cf15.jpg','<p>商品介绍加载中...</p>',799,649,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10795,'荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB','铂光金 移动联通电信4G全面屏手机 双卡双待',45,'/goods-img/7b65ad3d-74a4-4322-8653-6bda47a8b4eb.jpg','/goods-img/7b65ad3d-74a4-4322-8653-6bda47a8b4eb.jpg','<p>商品介绍加载中...</p>',799,649,1000,'',0,0,'2019-09-18 13:37:44',0,'2020-10-13 10:41:59'),\n\t(10796,'Redmi K20Pro 骁龙855 索尼4800万超广角三摄','AMOLED弹出式全面屏 8GB+256GB 碳纤黑 游戏智能手机 小米 红米',0,'/goods-img/2a05cc6a-3eea-42f9-ab97-2e2529a72099.jpg','/goods-img/2a05cc6a-3eea-42f9-ab97-2e2529a72099.jpg','<p>商品介绍加载中...</p>',2999,2699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10797,'小米9 Pro 5G 全面屏游戏拍照新品手机','新蜂精选',51,'/goods-img/d5fc8bec-0add-48d3-b73b-349a0375e8dc.jpg','/goods-img/d5fc8bec-0add-48d3-b73b-349a0375e8dc.jpg','<p>商品介绍加载中...</p>',9999,9999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10798,'【新品抢购】Redmi Note8 4800万全场景四摄 4000mAh长续航','高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 梦幻蓝 游戏智能手机 小米 红米',0,'/goods-img/e4e4c543-6d9a-4b19-bedf-3f40024cb710.jpg','/goods-img/e4e4c543-6d9a-4b19-bedf-3f40024cb710.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10799,'【新品抢购】Redmi Note8 4800万全场景四摄 4000mAh长续航','高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 皓月白 游戏智能手机 小米 红米',0,'/goods-img/87e0f6ab-45ef-4710-a5f4-e57a470b6b26.jpg','/goods-img/87e0f6ab-45ef-4710-a5f4-e57a470b6b26.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10800,'【新品抢购】Redmi Note8 4800万全场景四摄 4000mAh长续航','高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 曜石黑 游戏智能手机 小米 红米',0,'/goods-img/4a5c5b20-2dd3-4343-a6d1-31195c9edea4.jpg','/goods-img/4a5c5b20-2dd3-4343-a6d1-31195c9edea4.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10801,'Redmi Note7 4800万双摄千元机 满血骁龙660','18个月超长质保 4000mAh超长续航 6GB+64GB 镜花水月 游戏智能手机 小米 红米',0,'/goods-img/30ef1f51-f958-486f-8d79-f48f6d8293dd.jpg','/goods-img/30ef1f51-f958-486f-8d79-f48f6d8293dd.jpg','<p>商品介绍加载中...</p>',1199,1099,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10802,'Redmi Note7 4800万双摄千元机 满血骁龙660','18个月超长质保 4000mAh超长续航 6GB+64GB 亮黑色 游戏智能手机 小米 红米',20,'/goods-img/92beacb0-f692-42ff-a20f-8fecd2b0c046.jpg','/goods-img/92beacb0-f692-42ff-a20f-8fecd2b0c046.jpg','<p>*相机默认1200w，如何设置4800w？ 打开相机&nbsp;—&nbsp;右滑切换到“专业”模式&nbsp;—&nbsp;点击屏幕左上方的“48MP”，打开4800万超清。&nbsp;</p><p>*如何设置全面屏模式？ 点击设置&nbsp;—&nbsp;点击全面屏&nbsp;—&nbsp;进入全面屏设置会出现两个选项，可以选择经典导航也可以选择全面屏手势。选择全面屏手势，可进行手势学习，使用全面屏模式进行操作&nbsp;</p><p>*是否支持OTG功能？ 支持。&nbsp;</p><p>*红米Note7出厂预装版本是Andriod&nbsp;9.0吗？ 该商品首批出厂操作系统：MIUI&nbsp;10&nbsp;(Andriod&nbsp;9.0)。&nbsp;</p><p>*有呼吸灯吗？是否支持NFC？&nbsp;是否支持收音机？ 有呼吸灯，不支持NFC，支持收音机。</p><p>*4800万模式是否支持AI场景识别，能否有快速切换方式介绍？ 4800万模式下不支持AI场景识别，普通相机模式下可支持AI识别。</p><p><span style=\\\"font-family: &quot;Source Sans Pro&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 1rem;\\\">*是否支持王者荣耀Vulkan&nbsp;模式？ 目前暂不支持王者荣耀Vulkan模式。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redmi&nbsp;红米Note&nbsp;7&nbsp;常见问题</span></p>',1199,1099,1000,'手机',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10803,'Redmi Note7 4800万双摄千元机 满血骁龙660','18个月超长质保 4000mAh超长续航 6GB+64GB 暮光金 游戏智能手机 小米 红米',0,'/goods-img/0cf95c37-2665-4894-bd42-5f8de06c6d94.jpg','/goods-img/0cf95c37-2665-4894-bd42-5f8de06c6d94.jpg','<p>*相机默认1200w，如何设置4800w？ 打开相机&nbsp;—&nbsp;右滑切换到“专业”模式&nbsp;—&nbsp;点击屏幕左上方的“48MP”，打开4800万超清。&nbsp;</p><p>*如何设置全面屏模式？ 点击设置&nbsp;—&nbsp;点击全面屏&nbsp;—&nbsp;进入全面屏设置会出现两个选项，可以选择经典导航也可以选择全面屏手势。选择全面屏手势，可进行手势学习，使用全面屏模式进行操作&nbsp;</p><p>*是否支持OTG功能？ 支持。&nbsp;</p><p>*红米Note7出厂预装版本是Andriod&nbsp;9.0吗？ 该商品首批出厂操作系统：MIUI&nbsp;10&nbsp;(Andriod&nbsp;9.0)。&nbsp;</p><p>*有呼吸灯吗？是否支持NFC？&nbsp;是否支持收音机？ 有呼吸灯，不支持NFC，支持收音机。</p><p>*4800万模式是否支持AI场景识别，能否有快速切换方式介绍？ 4800万模式下不支持AI场景识别，普通相机模式下可支持AI识别。</p><p><span style=\\\"font-family: &quot;Source Sans Pro&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 1rem;\\\">*是否支持王者荣耀Vulkan&nbsp;模式？ 目前暂不支持王者荣耀Vulkan模式。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redmi&nbsp;红米Note&nbsp;7&nbsp;常见问题</span></p>',1199,1099,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10804,'Redmi Note7 4800万双摄千元机 满血骁龙660','4000mAh超长续航 6GB+64GB 梦幻蓝 游戏智能手机 小米 红米',0,'/goods-img/f6c46245-b957-41ed-b235-133c17cba7f9.jpg','/goods-img/f6c46245-b957-41ed-b235-133c17cba7f9.jpg','<p>*相机默认1200w，如何设置4800w？ 打开相机&nbsp;—&nbsp;右滑切换到“专业”模式&nbsp;—&nbsp;点击屏幕左上方的“48MP”，打开4800万超清。&nbsp;</p><p>*如何设置全面屏模式？ 点击设置&nbsp;—&nbsp;点击全面屏&nbsp;—&nbsp;进入全面屏设置会出现两个选项，可以选择经典导航也可以选择全面屏手势。选择全面屏手势，可进行手势学习，使用全面屏模式进行操作&nbsp;</p><p>*是否支持OTG功能？ 支持。&nbsp;</p><p>*红米Note7出厂预装版本是Andriod&nbsp;9.0吗？ 该商品首批出厂操作系统：MIUI&nbsp;10&nbsp;(Andriod&nbsp;9.0)。&nbsp;</p><p>*有呼吸灯吗？是否支持NFC？&nbsp;是否支持收音机？ 有呼吸灯，不支持NFC，支持收音机。</p><p>*4800万模式是否支持AI场景识别，能否有快速切换方式介绍？ 4800万模式下不支持AI场景识别，普通相机模式下可支持AI识别。</p><p><span style=\\\"font-family: &quot;Source Sans Pro&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;; font-size: 1rem;\\\">*是否支持王者荣耀Vulkan&nbsp;模式？ 目前暂不支持王者荣耀Vulkan模式。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redmi&nbsp;红米Note&nbsp;7&nbsp;常见问题</span></p>',1199,1099,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10805,'【新品抢购】Redmi Note8Pro 6400万全场景四摄 液冷游戏芯','4500mAh长续航 NFC 18W快充 红外遥控 6GB+64GB 贝母白 游戏智能手机 小米 红米',0,'/goods-img/54985ce7-1df6-442f-9a28-0ff0bab924bd.jpg','/goods-img/54985ce7-1df6-442f-9a28-0ff0bab924bd.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10806,'【新品抢购】Redmi Note8Pro 6400万全场景四摄 液冷游戏芯','4500mAh长续航 NFC 18W快充 红外遥控 6GB+128GB 冰翡翠 游戏智能手机 小米 红米',0,'/goods-img/e3de1717-e373-4544-9f1e-057a91fd2595.jpg','/goods-img/e3de1717-e373-4544-9f1e-057a91fd2595.jpg','<p>商品介绍加载中...</p>',1599,1599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10807,'【新品抢购】Redmi Note8Pro 6400万全场景四摄 液冷游戏芯','4500mAh长续航 NFC 18W快充 红外遥控 6GB+64GB 电光灰 游戏智能手机 小米 红米',0,'/goods-img/a1552f03-58ab-4b05-91ec-7df52af18a66.jpg','/goods-img/a1552f03-58ab-4b05-91ec-7df52af18a66.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10808,'Redmi Note7Pro 索尼4800万超清双摄 骁龙675','18个月超长质保 4000mAh超长续航 6GB+128GB 亮黑色 游戏智能手机 小米 红米',0,'/goods-img/647470fa-85b1-4626-99d0-d5b7512c8f23.jpg','/goods-img/647470fa-85b1-4626-99d0-d5b7512c8f23.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10809,'Redmi Note7pro 索尼4800万超清双摄 骁龙675','18个月超长质保 4000mAh超长续航 6GB+128GB 镜花水月 游戏智能手机 小米 红米',0,'/goods-img/edb8a694-84a5-47da-9bae-30f7a69d2c63.jpg','/goods-img/edb8a694-84a5-47da-9bae-30f7a69d2c63.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10810,'Redmi Note7Pro 索尼4800万超清双摄 骁龙675','18个月超长质保 4000mAh超长续航 6GB+128GB 梦幻蓝 游戏智能手机 小米 红米',0,'/goods-img/c76edfa6-c16e-45b9-9119-46d300739112.jpg','/goods-img/c76edfa6-c16e-45b9-9119-46d300739112.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10811,'Redmi Note7Pro 索尼4800万超清双摄 骁龙675','18个月超长质保 4000mAh超长续航 6GB+128GB 暮光金 游戏智能手机 小米 红米',0,'/goods-img/bf0c2d17-3630-4709-af38-d7bd14a76f22.jpg','/goods-img/bf0c2d17-3630-4709-af38-d7bd14a76f22.jpg','<p>商品介绍加载中...</p>',1399,1399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10812,'Redmi 7A 4000mAh超长续航 AI人脸解锁','骁龙8核 标配10W充电器 整机防泼溅 3GB+32GB 磨砂黑 游戏智能手机 小米 红米',0,'/goods-img/28c56015-cb20-44cb-86fb-246ad509e828.jpg','/goods-img/28c56015-cb20-44cb-86fb-246ad509e828.jpg','<p>商品介绍加载中...</p>',699,599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10813,'Redmi 7A 4000mAh超长续航 AI人脸解锁','骁龙8核 标配10W充电器 整机防泼溅 3GB+32GB 晨曦蓝 游戏智能手机 小米 红米',0,'/goods-img/d845c984-f749-4f22-86a5-558677b1322c.jpg','/goods-img/d845c984-f749-4f22-86a5-558677b1322c.jpg','<p>商品介绍加载中...</p>',699,599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10814,'Redmi 7A 4000mAh超长续航 AI人脸解锁','骁龙8核 标配10W充电器 整机防泼溅 3GB+32GB 雾光金 游戏智能手机 小米 红米',0,'/goods-img/56ac4c58-8742-40c8-b130-83b4d2925a8c.jpg','/goods-img/56ac4c58-8742-40c8-b130-83b4d2925a8c.jpg','<p>商品介绍加载中...</p>',599,599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10815,'Redmi 7 4000mAh超长续航 骁龙632','1200万AI双摄 18个月超长质保 AI人脸解锁 3GB+32GB 亮黑色 游戏智能手机 小米 红米',0,'/goods-img/0647d1b4-d19a-4424-b6ac-68344addacb4.jpg','/goods-img/0647d1b4-d19a-4424-b6ac-68344addacb4.jpg','<p>商品介绍加载中...</p>',699,699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10816,'Redmi 7 4000mAh超长续航 骁龙632','1200万AI双摄 18个月超长质保 AI人脸解锁 3GB+32GB 魅夜红 游戏智能手机 小米 红米',0,'/goods-img/711c54f0-f9d0-472e-b61b-94e25c628599.jpg','/goods-img/711c54f0-f9d0-472e-b61b-94e25c628599.jpg','<p>商品介绍加载中...</p>',699,699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10817,'Redmi 7 4000mAh超长续航 骁龙632','1200万AI双摄 18个月超长质保 AI人脸解锁 3GB+32GB 梦幻蓝 游戏智能手机 小米 红米',0,'/goods-img/c8c97b68-3ba6-4f97-8940-d04c9e7c7302.jpg','/goods-img/c8c97b68-3ba6-4f97-8940-d04c9e7c7302.jpg','<p>商品介绍加载中...</p>',699,699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10818,'小米MIX2S 骁龙845 AI感光双摄 四曲面陶瓷全面屏','白色 多功能 NFC 6GB+128GB 游戏智能拍照手机',51,'/goods-img/d423bb5c-60c8-4b66-bd72-3490b5d6461b.jpg','/goods-img/d423bb5c-60c8-4b66-bd72-3490b5d6461b.jpg','<p>商品介绍加载中...</p>',2099,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10819,'小米MIX2S 骁龙845 AI感光双摄 四曲面陶瓷全面屏','黑色 多功能 NFC 6GB+128GB 游戏智能拍照手机',51,'/goods-img/9a554cae-5bec-4964-992f-e2f4de192e2c.jpg','/goods-img/9a554cae-5bec-4964-992f-e2f4de192e2c.jpg','<p>商品介绍加载中...</p>',2099,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10820,'小米9 4800万超广角三摄 6GB+128GB全息幻彩蓝 骁龙855','全网通4G 双卡双待 水滴全面屏拍照智能游戏手机',51,'/goods-img/55a6dc67-1ed9-421a-9782-acdfa9c123e1.jpg','/goods-img/55a6dc67-1ed9-421a-9782-acdfa9c123e1.jpg','<p>商品介绍加载中...</p>',2799,2599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10821,'小米9 4800万超广角三摄 8GB+256GB 透明版','骁龙855 全网通4G 双卡双待 水滴全面屏拍照智能游戏手机',51,'/goods-img/54249648-d37b-4b22-80dc-243e58ed56a1.jpg','/goods-img/54249648-d37b-4b22-80dc-243e58ed56a1.jpg','<p>商品介绍加载中...</p>',3699,3699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10822,'小米9 4800万超广角三摄 8GB+128GB 深空灰','骁龙855 全网通4G 双卡双待 水滴全面屏拍照智能游戏手机',51,'/goods-img/e8087861-89fd-43af-b64d-290864b0fe35.jpg','/goods-img/e8087861-89fd-43af-b64d-290864b0fe35.jpg','<p>商品介绍加载中...</p>',2999,2799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10823,'小米9 4800万超广角三摄 8GB+128GB 全息幻彩紫','骁龙855 全网通4G 双卡双待 水滴全面屏拍照智能游戏手机',51,'/goods-img/7a406989-061b-4f69-baa1-6fa499aa091d.jpg','/goods-img/7a406989-061b-4f69-baa1-6fa499aa091d.jpg','<p>商品介绍加载中...</p>',2999,2799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10824,'小米CC9e 索尼4800万旗舰相机 3200万美颜自拍 4030mAh','屏幕指纹 白色恋人 6GB+64GB 游戏智能拍照手机',51,'/goods-img/8fc9776e-9393-421d-998c-e516b3877dba.jpg','/goods-img/8fc9776e-9393-421d-998c-e516b3877dba.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10825,'小米CC9e 索尼4800万旗舰相机 3200万美颜自拍 4030mAh','屏幕指纹 暗夜王子 6GB+64GB 游戏智能拍照手机',51,'/goods-img/033685d7-bf11-4389-9e52-ef5a51182306.jpg','/goods-img/033685d7-bf11-4389-9e52-ef5a51182306.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10826,'小米CC9e 索尼4800万旗舰相机 3200万美颜自拍 4030mAh','屏幕指纹 深蓝星球 6GB+64GB 游戏智能拍照手机',51,'/goods-img/e8dba692-7fda-4f42-b0ee-6f51ca7dc77d.jpg','/goods-img/e8dba692-7fda-4f42-b0ee-6f51ca7dc77d.jpg','<p>商品介绍加载中...</p>',1399,1299,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10827,'小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC','4030mAh 深蓝星球 6GB+64GB 游戏智能拍照手机',51,'/goods-img/387afca1-a14a-4ab8-9d99-120b7095029c.jpg','/goods-img/387afca1-a14a-4ab8-9d99-120b7095029c.jpg','<p>商品介绍加载中...</p>',1799,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10828,'小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC','4030mAh 白色恋人 6GB+64GB 游戏智能拍照手机',51,'/goods-img/f96f376e-8341-4bad-ad2a-b3f12486958a.jpg','/goods-img/f96f376e-8341-4bad-ad2a-b3f12486958a.jpg','<p>商品介绍加载中...</p>',1799,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10829,'小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC','4030mAh 暗夜王子 6GB+128GB 游戏智能拍照手机',51,'/goods-img/4c148e8e-7e26-4c74-a3d3-f5f37ae9248d.jpg','/goods-img/4c148e8e-7e26-4c74-a3d3-f5f37ae9248d.jpg','<p>商品介绍加载中...</p>',1999,1999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10830,'小米CC9美图定制版 索尼4800万AI三摄 3200万美颜自拍 全身美型','多功能NFC 8GB+256GB 游戏智能拍照手机',51,'/goods-img/92482741-3637-4cd3-91ff-cc5aeb0d3316.jpg','/goods-img/92482741-3637-4cd3-91ff-cc5aeb0d3316.jpg','<p>商品介绍加载中...</p>',2599,2599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10831,'小米Play 流光渐变AI双摄 6GB+128GB 梦幻蓝','移动4G+ 双卡双待 小水滴全面屏拍照游戏智能手机',51,'/goods-img/f0b19f6c-6a8b-4128-8e5d-2e4953331c46.jpg','/goods-img/f0b19f6c-6a8b-4128-8e5d-2e4953331c46.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10832,'小米Play 流光渐变AI双摄 6GB+128GB 黑色','移动4G+ 双卡双待 小水滴全面屏拍照游戏智能手机',51,'/goods-img/e39da33d-1b55-4e97-b8e6-824ac2cd1062.jpg','/goods-img/e39da33d-1b55-4e97-b8e6-824ac2cd1062.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10833,'小米Play 流光渐变AI双摄 6GB+64GB 暮光金','全网通4G 双卡双待 小水滴全面屏拍照游戏智能手机',51,'/goods-img/2a93185a-8d3b-4908-af8c-c17db78e2fb0.jpg','/goods-img/2a93185a-8d3b-4908-af8c-c17db78e2fb0.jpg','<p>商品介绍加载中...</p>',899,899,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10834,'小米9SE 骁龙712 索尼4800万超广角三摄 5.97英寸舒适握感','全息幻彩蓝 8GB+128GB 游戏智能拍照手机',51,'/goods-img/b28f3eac-0091-442f-90f3-68914bf947c7.jpg','/goods-img/b28f3eac-0091-442f-90f3-68914bf947c7.jpg','<p>商品介绍加载中...</p>',2099,1899,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10835,'小米9 SE 4800万超广角三摄 骁龙712','水滴全面屏 游戏智能拍照手机 6GB+64GB 深空灰 全网通4G 双卡双待',51,'/goods-img/ef8370c4-ed8e-497f-9e10-185de4d01fe9.jpg','/goods-img/ef8370c4-ed8e-497f-9e10-185de4d01fe9.jpg','<p>商品介绍加载中...</p>',1799,1599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10836,'小米9SE 骁龙712 索尼4800万超广角三摄 5.97英寸舒适握感','全息幻彩紫 8GB+128GB 游戏智能拍照手机',51,'/goods-img/f436d00b-2253-4dcc-8b4a-d82e99af275a.jpg','/goods-img/f436d00b-2253-4dcc-8b4a-d82e99af275a.jpg','<p>商品介绍加载中...</p>',2099,1999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10837,'小米MIX3 骁龙845AIE AI 双摄','磁动力滑盖全面屏 三星 AMOLED屏幕 黑色 8GB+128GB 游戏智能拍照手机',51,'/goods-img/3bfc7c72-b56a-4088-8acf-e01e830ce72a.jpg','/goods-img/3bfc7c72-b56a-4088-8acf-e01e830ce72a.jpg','<p>商品介绍加载中...</p>',2599,2599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10838,'Redmi K20 索尼4800万超广角三摄 AMOLED弹出式全面屏','第七代屏下指纹 6GB+128GB 冰川蓝 游戏智能手机 小米 红米',0,'/goods-img/ed860c53-955b-4cfd-b605-a8b4bb959e2f.jpg','/goods-img/ed860c53-955b-4cfd-b605-a8b4bb959e2f.jpg','<p>商品介绍加载中...</p>',1999,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10839,'Redmi K20 索尼4800万超广角三摄 AMOLED弹出式全面屏','第七代屏下指纹 6GB+128GB 火焰红 游戏智能手机 小米 红米',0,'/goods-img/8e64ea39-5477-482c-a200-2c12fdeff004.jpg','/goods-img/8e64ea39-5477-482c-a200-2c12fdeff004.jpg','<p>商品介绍加载中...</p>',1999,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10840,'Redmi K20 索尼4800万超广角三摄 AMOLED弹出式全面屏','第七代屏下指纹 6GB+128GB 碳纤黑 游戏智能手机 小米 红米',0,'/goods-img/38a69084-0bc4-479e-a5ba-aed135dee974.jpg','/goods-img/38a69084-0bc4-479e-a5ba-aed135dee974.jpg','<p>商品介绍加载中...</p>',1999,1799,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10841,'红米6A 1300万高清相机 AI人脸解锁 12nm高性能处理器','3GB+32GB 流沙金 游戏智能手机 小米',0,'/goods-img/6c77e8f9-11d8-42c3-925e-4396d0d3709f.jpg','/goods-img/6c77e8f9-11d8-42c3-925e-4396d0d3709f.jpg','<p>商品介绍加载中...</p>',649,599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10842,'红米6A 1300万高清相机 AI人脸解锁 12nm高性能处理器','3GB+32GB 铂银灰 游戏智能手机 小米',0,'/goods-img/17b2eb9f-7289-45f8-b26a-114ec29ceb3c.jpg','/goods-img/17b2eb9f-7289-45f8-b26a-114ec29ceb3c.jpg','<p>商品介绍加载中...</p>',649,599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10843,'小米 红米6A 全网通版 2GB内存','樱花粉 16GB 移动联通电信4G手机 双卡双待',51,'/goods-img/1ba819c2-dc89-41d9-86a9-4649418972da.jpg','/goods-img/1ba819c2-dc89-41d9-86a9-4649418972da.jpg','<p>商品介绍加载中...</p>',549,549,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10844,'红米6A 1300万高清相机 AI人脸解锁 12nm高性能处理器','3GB+32GB 巴厘蓝 游戏智能手机 小米',0,'/goods-img/1ef84d7e-d804-4064-9140-a53607aa8df2.jpg','/goods-img/1ef84d7e-d804-4064-9140-a53607aa8df2.jpg','<p>商品介绍加载中...</p>',649,599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10845,'小米Max3 5500mAh充电宝级电量 AI双摄 全金属机身','骁龙八核处理器 蓝色 6GB+128GB 游戏智能拍照手机',51,'/goods-img/b6c3eea7-9d34-4ac0-ba66-2fde6f26253b.jpg','/goods-img/b6c3eea7-9d34-4ac0-ba66-2fde6f26253b.jpg','<p>商品介绍加载中...</p>',1599,1499,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10846,'小米Max3 5500mAh充电宝级电量 AI双摄 全金属机身','骁龙八核处理器 黑色 6GB+128GB 游戏智能拍照手机',51,'/goods-img/30574476-f5bc-4f3c-80f6-4da22ea48f48.jpg','/goods-img/30574476-f5bc-4f3c-80f6-4da22ea48f48.jpg','<p>商品介绍加载中...</p>',1599,1499,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10847,'小米Max3 5500mAh充电宝级电量 AI双摄 全金属机身','骁龙八核处理器 金色 6GB+128GB 游戏智能拍照手机',51,'/goods-img/114e92f8-bf78-481e-8d8a-9936d026d9d4.jpg','/goods-img/114e92f8-bf78-481e-8d8a-9936d026d9d4.jpg','<p>商品介绍加载中...</p>',1599,1499,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10848,'Redmi Note8 4800万全场景四摄 4000mAh长续航','高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 梦幻蓝 游戏智能手机 小米 红米',0,'/goods-img/8d3ebf2d-8da7-478c-bd6c-e7a869fdde97.jpg','/goods-img/8d3ebf2d-8da7-478c-bd6c-e7a869fdde97.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10849,'Redmi Note8 4800万全场景四摄 4000mAh长续航','高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 皓月白 游戏智能手机 小米 红米',0,'/goods-img/b4ff98bc-ad00-48f7-ac64-0d52780d4c48.jpg','/goods-img/b4ff98bc-ad00-48f7-ac64-0d52780d4c48.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10850,'Redmi Note8 4800万全场景四摄 4000mAh长续航','高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 曜石黑 游戏智能手机 小米 红米',0,'/goods-img/b82cc8fd-075b-44d3-b211-8ea633fe2ffe.jpg','/goods-img/b82cc8fd-075b-44d3-b211-8ea633fe2ffe.jpg','<p>商品介绍加载中...</p>',999,999,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10851,'小米（MI） 小米8青春版 手机 深空灰','全网通 6G+128G',51,'/goods-img/52425573-6311-4877-bad8-1c04bf01e9d3.jpg','/goods-img/52425573-6311-4877-bad8-1c04bf01e9d3.jpg','<p>商品介绍加载中...</p>',1599,1168,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10852,'小米（MI） 小米8青春版 手机 梦幻蓝','全网通 4G+128G',51,'/goods-img/8c1c9fb2-26aa-4fa0-b9ce-cf278d827fa6.jpg','/goods-img/8c1c9fb2-26aa-4fa0-b9ce-cf278d827fa6.jpg','<p>商品介绍加载中...</p>',1599,1599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10853,'小米（MI） 小米8青春版 手机 暮光金','全网通 6G+64G',51,'/goods-img/bd94d7e0-f56f-4b7f-8653-b8a4e267bd15.jpg','/goods-img/bd94d7e0-f56f-4b7f-8653-b8a4e267bd15.jpg','<p>商品介绍加载中...</p>',1299,1068,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10854,'小米 红米Note8 pro 手机【6400万四摄','液冷游戏芯】 冰翡翠 全网通6+128',51,'/goods-img/42913aa4-4a49-4121-9c80-3434c12d0ac9.jpg','/goods-img/42913aa4-4a49-4121-9c80-3434c12d0ac9.jpg','<p>商品介绍加载中...</p>',1799,1599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10855,'小米 红米Note8 pro 手机【6400万四摄','液冷游戏芯】 贝母白 全网通6+128',51,'/goods-img/777ebd38-965d-4c77-970e-f1e25022255f.jpg','/goods-img/777ebd38-965d-4c77-970e-f1e25022255f.jpg','<p>商品介绍加载中...</p>',1799,1599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10856,'小米 红米Note8 pro 手机【6400万四摄','液冷游戏芯】 电光灰 全网通6+128',51,'/goods-img/db21f41b-34ac-4bc7-a50f-1f812b1522d1.jpg','/goods-img/db21f41b-34ac-4bc7-a50f-1f812b1522d1.jpg','<p>商品介绍加载中...</p>',1799,1599,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10857,'小米（MI） 小米8 游戏手机 黑','6GB+64GB',51,'/goods-img/63588dfb-f85f-41a2-8198-c7ae66aa0261.png','/goods-img/63588dfb-f85f-41a2-8198-c7ae66aa0261.png','<p>商品介绍加载中...</p>',1698,1568,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10858,'小米（MI） 小米8 游戏手机 白','6GB+64GB',51,'/goods-img/d55d6e4a-99e7-4a3d-86a4-9b3899a63b42.png','/goods-img/d55d6e4a-99e7-4a3d-86a4-9b3899a63b42.png','<p>商品介绍加载中...</p>',1698,1568,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10859,'小米（MI） 小米8 游戏手机 蓝','8GB+128GB',51,'/goods-img/5a2a90aa-fe2c-4bb0-8d8d-1ac1613f453a.png','/goods-img/5a2a90aa-fe2c-4bb0-8d8d-1ac1613f453a.png','<p>商品介绍加载中...</p>',1998,1868,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10860,'小米（MI） 小米8 游戏手机 金','6GB+128GB',51,'/goods-img/c1cdb555-f605-4226-906a-022483612319.png','/goods-img/c1cdb555-f605-4226-906a-022483612319.png','<p>商品介绍加载中...</p>',1898,1838,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10861,'小米（MI） 小米8青春版 手机 深空灰','全网通(6G+128G)',51,'/goods-img/fafda3af-7741-47f2-936e-c0d9030fbf5b.png','/goods-img/fafda3af-7741-47f2-936e-c0d9030fbf5b.png','<p>商品介绍加载中...</p>',1188,1188,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10862,'小米（MI） 小米8青春版 手机 梦幻蓝','全网通(6G+64G)',51,'/goods-img/ef5ac8cb-5d4e-4dc6-bece-27c9ff5a2e1c.png','/goods-img/ef5ac8cb-5d4e-4dc6-bece-27c9ff5a2e1c.png','<p>商品介绍加载中...</p>',1388,1388,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10863,'小米（MI） 小米8青春版 手机 暮光金','全网通(6G+128G)',51,'/goods-img/d8b30b9f-faa4-4a0d-84bc-53b9c4745977.png','/goods-img/d8b30b9f-faa4-4a0d-84bc-53b9c4745977.png','<p>商品介绍加载中...</p>',1578,1578,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10864,'小米 红米Redmi 7 全网通4G','双卡双待 幻彩渐变AI双摄 水滴全面屏拍照游戏智能手机 梦幻蓝 4GB+64GB',51,'/goods-img/18ce5224-c98d-4a9c-a024-5ac5b6f9a2d7.jpg','/goods-img/18ce5224-c98d-4a9c-a024-5ac5b6f9a2d7.jpg','<p>商品介绍加载中...</p>',1200,808,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10865,'小米 红米Redmi 7 全网通4G','双卡双待 幻彩渐变AI双摄 水滴全面屏拍照游戏智能手机 亮黑色 4GB+64GB',51,'/goods-img/f7a9a98d-9e3f-4443-b8a7-5612bcd7c1d0.jpg','/goods-img/f7a9a98d-9e3f-4443-b8a7-5612bcd7c1d0.jpg','<p>商品介绍加载中...</p>',1200,818,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10866,'小米 红米Redmi 7 全网通4G','双卡双待 幻彩渐变AI双摄 水滴全面屏拍照游戏智能手机 魅夜红 4GB+64GB',51,'/goods-img/02523f49-742b-4c45-b59b-f550fe5a60ae.jpg','/goods-img/02523f49-742b-4c45-b59b-f550fe5a60ae.jpg','<p>商品介绍加载中...</p>',1200,818,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10867,'小米 小米8屏幕指纹版 手机 黑色','全网通(6G + 128G )',51,'/goods-img/35b9c185-2ca6-4052-af40-2abd2157f200.png','/goods-img/35b9c185-2ca6-4052-af40-2abd2157f200.png','产品信息Product Information',2099,1808,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10868,'小米 小米8屏幕指纹版 手机 透明版','全网通(8G + 128G)',51,'/goods-img/fcd1faf9-10b5-4318-b92b-36105be8752f.png','/goods-img/fcd1faf9-10b5-4318-b92b-36105be8752f.png','产品信息Product Information',2499,2028,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10869,'小米 小米8屏幕指纹版 手机 暮光金','全网通(6G + 128G )',51,'/goods-img/e9818435-c510-4042-91e1-734a818a2577.png','/goods-img/e9818435-c510-4042-91e1-734a818a2577.png','产品信息Product Information',2099,2099,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10870,'小米 红米6 全网通版 3GB内存','流沙金 32GB 移动联通电信4G手机 双卡双待',51,'/goods-img/515706fb-a5f8-4d72-a08e-7523cf4ea113.jpg','/goods-img/515706fb-a5f8-4d72-a08e-7523cf4ea113.jpg','<p>商品介绍加载中...</p>',699,699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10871,'小米 红米6 3GB+32GB 铂银灰','全网通4G手机 双卡双待 老人机 智能拍照手机',51,'/goods-img/bcec0048-e992-4e57-9aaf-ddbd9fe852ce.jpg','/goods-img/bcec0048-e992-4e57-9aaf-ddbd9fe852ce.jpg','<p>商品介绍加载中...</p>',699,699,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10872,'小米（MI） 小米8屏幕指纹版 全面屏游戏手机 曜石黑（屏幕指纹版）','6G+128G',51,'/goods-img/e1c2b06f-fd06-4242-acb7-9ebd7179181b.png','/goods-img/e1c2b06f-fd06-4242-acb7-9ebd7179181b.png','<p>商品介绍加载中...</p>',2199,1818,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10873,'小米（MI） 小米8屏幕指纹版 全面屏游戏手机 透明版(屏幕指纹版)','8G+128G',51,'/goods-img/314274fc-1ee0-474d-bbb5-b9c70a8a9573.png','/goods-img/314274fc-1ee0-474d-bbb5-b9c70a8a9573.png','<p>商品介绍加载中...</p>',2599,2018,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10874,'小米（MI） 小米8屏幕指纹版 全面屏游戏手机 暮光金(屏幕指纹版)','8G+128G',51,'/goods-img/c2905bd8-bd68-4672-bada-b8a202a9327e.png','/goods-img/c2905bd8-bd68-4672-bada-b8a202a9327e.png','<p>商品介绍加载中...</p>',2599,2058,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10875,'小米8 游戏手机 全面屏 黑色','全网通(6G+64G)',51,'/goods-img/5afd1749-a3bc-41c2-90b2-928ede8aedda.jpg','/goods-img/5afd1749-a3bc-41c2-90b2-928ede8aedda.jpg','<p>商品介绍加载中...</p>',1799,1558,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10876,'小米8 游戏手机 全面屏 白色','全网通(6G+64G)',51,'/goods-img/a96dd5bc-2d74-4d57-9336-45a8ac09a363.jpg','/goods-img/a96dd5bc-2d74-4d57-9336-45a8ac09a363.jpg','<p>商品介绍加载中...</p>',1799,1550,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10877,'小米8 游戏手机 全面屏 白色','全网通(6G+128G)',51,'/goods-img/25e44283-a440-4e64-bb27-1887370c3d2e.jpg','/goods-img/25e44283-a440-4e64-bb27-1887370c3d2e.jpg','<p>商品介绍加载中...</p>',1999,1798,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10878,'小米8 游戏手机 全面屏 金色','全网通(6G+128G)',51,'/goods-img/6b5e5711-8ae6-4f66-bd22-30c9be85d3c6.jpg','/goods-img/6b5e5711-8ae6-4f66-bd22-30c9be85d3c6.jpg','<p>商品介绍加载中...</p>',1999,1849,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10879,'小米8 游戏手机 全面屏 黑色','全网通(6G+128G)',51,'/goods-img/040a3aa6-1699-4eca-ac67-5021cc419979.jpg','/goods-img/040a3aa6-1699-4eca-ac67-5021cc419979.jpg','<p>商品介绍加载中...</p>',1999,1849,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10880,'小米8 游戏手机 全面屏 金色','全网通(6G+64G)',51,'/goods-img/47c28778-88a4-42fd-bb4d-c93fe8df36b5.jpg','/goods-img/47c28778-88a4-42fd-bb4d-c93fe8df36b5.jpg','<p>商品介绍加载中...</p>',1799,1598,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10881,'小米8 游戏手机 全面屏 屏幕指纹版','暮光金 全网通(8G+128G)',51,'http://localhost:28089/admin/dist/img/no-img.png','http://localhost:28089/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',3799,2199,1000,'1',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10882,'小米8 游戏手机 全面屏 蓝色','全网通(6G+64G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',1799,1598,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10883,'小米8 游戏手机 全面屏 金色','全网通(6G+256G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',3199,2158,1000,'新品',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10884,'小米8 游戏手机 全面屏 白色','全网通(6G+256G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',3199,2158,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10885,'小米8 游戏手机 全面屏 蓝色','全网通(6G+256G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',3199,2158,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10886,'小米8 游戏手机 全面屏 黑色','全网通(6G+256G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',3199,3199,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10887,'小米8 游戏手机 全面屏 透明探索版','全网通(8G+128G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',4299,4299,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10888,'小米8 游戏手机 全面屏 屏幕指纹版','暮光金 全网通(6G+128G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',3399,3399,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10889,'小米8 游戏手机 全面屏 蓝色','全网通(6G+128G)',51,'/admin/dist/img/no-img.png','/admin/dist/img/no-img.png','<p>商品介绍加载中...</p>',1849,1849,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10890,'小米 红米7 手机 Redmi7','AI双摄 拍照游戏手机 全网通双卡双待 亮黑色 4G+64G 全网通',51,'/goods-img/b6084354-1841-4241-ba7b-7e97186a9076.jpg','/goods-img/b6084354-1841-4241-ba7b-7e97186a9076.jpg','<p>商品介绍加载中...</p>',1299,808,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10891,'小米 红米7 手机 Redmi7','AI双摄 拍照游戏手机 全网通双卡双待 魅夜红 4G+64G 全网通',51,'/goods-img/7b4e03b1-eca7-42f5-8dda-14d02d3ab318.jpg','/goods-img/7b4e03b1-eca7-42f5-8dda-14d02d3ab318.jpg','<p>商品介绍加载中...</p>',1009,818,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10892,'小米 红米7 手机 Redmi7','AI双摄 拍照游戏手机 全网通双卡双待 梦幻蓝 3G+32G 全网通',51,'/goods-img/7bca8b59-35f3-480a-a95d-99efcbb8cfda.jpg','/goods-img/7bca8b59-35f3-480a-a95d-99efcbb8cfda.jpg','<p>商品介绍加载中...</p>',787,715,1000,'',0,0,'2019-09-18 13:38:32',0,'2020-10-13 10:41:59'),\n\t(10893,'HUAWEI Mate 30 Pro 双4000万徕卡电影四摄','超曲面OLED环幕屏 8GB+256GB 全网通4G版（星河银）',46,'/goods-img/mate30p2.png','/goods-img/mate30p2.png','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\r\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\r\\n\t<br />\\r\\n</div>\\r\\n\t</div>\\r\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\r\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\r\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/huawei-1.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/huawei-3.jpg\\\" /> \\r\\n\t</div>\\r\\n</div>',5399,5399,1000,'重构想象',0,0,'2019-09-19 23:17:39',0,'2020-10-13 10:41:59'),\n\t(10894,'HUAWEI Mate 30 Pro','超曲面OLED环幕屏 8GB+128GB 全网通4G版（翡冷翠）',46,'/goods-img/mate30p3.png','/goods-img/mate30p3.png','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\r\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\r\\n\t<br />\\r\\n</div>\\r\\n\t</div>\\r\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\r\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\r\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/huawei-1.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/huawei-3.jpg\\\" /> \\r\\n\t</div>\\r\\n</div>',5399,5399,995,'重构想象',0,0,'2019-09-19 23:20:24',0,'2020-10-13 10:41:59'),\n\t(10895,'HUAWEI Mate 30 4000万超感光徕卡影像','OLED全面屏 8GB+128GB 全网通4G版 （罗兰紫）',46,'/goods-img/mate30-3.png','/goods-img/mate30-3.png','<div id=\\\"activity_header\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n<div style=\\\"margin:0px;padding:0px;text-align:center;\\\">\\n\t<br />\\n</div>\\n\t</div>\\n<div id=\\\"J-detail-content\\\" style=\\\"margin:0px;padding:0px;color:#666666;font-family:tahoma, arial, \\\" background-color:#ffffff;\\\"=\\\"\\\">\\n\t<div style=\\\"margin:0px auto;padding:0px;\\\">\\n\t\t<img class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/huawei-1.jpg\\\" /><img border=\\\"0\\\" class=\\\"\\\" src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/huawei-3.jpg\\\" /> \\n\t</div>\\n</div>',3999,3999,964,'重构想象',0,0,'2019-09-19 23:22:22',0,'2020-10-13 10:41:59'),\n\t(10903,'华为 HUAWEI P40 冰霜银 全网通5G手机','麒麟990 5G SoC芯片 5000万超感知徕卡三摄 30倍数字变焦 6GB+128GB',46,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p40-silver.png','https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p40-silver.png','<img src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p40-detail.jpg\\\" alt=\\\"\\\" />',4399,4399,1997,'超感知影像',0,0,'2020-03-27 10:07:37',0,'2020-10-13 10:41:59'),\n\t(10905,'Apple iPhone12 (A2404) 蓝色 支持移动联通电信5G 双卡双待手机','A14仿生芯片，6.1英寸超视网膜XDR显示屏，超瓷晶面板，升维大提速，现实力登场！',47,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iPhone12-blue.png','https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iPhone12-blue.png','<img src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone12-detail.jpg\\\" alt=\\\"\\\" />',6299,6299,1000,'升维，大提速。',0,0,'2020-10-14 10:30:06',0,'2020-10-14 10:30:06'),\n\t(10906,'Apple iPhone12 Pro (A2408) 128GB 海蓝色 支持移动联通电信5G 双卡双待手机','A14仿生芯片，6.1英寸超视网膜XDR显示屏，激光雷达扫描仪，超瓷晶面板，现实力登场！',47,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-12-pro-blue-hero.png','https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-12-pro-blue-hero.png','<img src=\\\"https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone12pro-detail.jpg\\\" alt=\\\"\\\" />',8499,8499,2000,'自我再飞跃',0,0,'2020-10-14 10:32:55',0,'2020-10-14 10:32:55');\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_index_config\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_index_config`;\nCREATE TABLE `tb_newbee_mall_index_config`  (\n  `config_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '首页配置项主键id',\n  `config_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '显示字符(配置搜索时不可为空，其他可为空)',\n  `config_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1-搜索框热搜 2-搜索下拉框热搜 3-(首页)热销商品 4-(首页)新品上线 5-(首页)为你推荐',\n  `goods_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '商品id 默认为0',\n  `redirect_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '##' COMMENT '点击后的跳转地址(默认不跳转)',\n  `config_rank` int(11) NOT NULL DEFAULT 0 COMMENT '排序值(字段越大越靠前)',\n  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '删除标识字段(0-未删除 1-已删除)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `create_user` int(11) NOT NULL DEFAULT 0 COMMENT '创建者id',\n  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新修改时间',\n  `update_user` int(11) NULL DEFAULT 0 COMMENT '修改者id',\n  PRIMARY KEY (`config_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_index_config\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_index_config` VALUES (1, '热销商品 iPhone XR', 3, 10284, '##', 10, 0, '2019-09-18 17:04:56', 0, '2019-09-18 17:04:56', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (2, '热销商品 华为 Mate20', 3, 10779, '##', 100, 0, '2019-09-18 17:05:27', 0, '2019-09-18 17:05:27', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (3, '热销商品 荣耀8X', 3, 10700, '##', 300, 0, '2019-09-18 17:08:02', 0, '2019-09-18 17:08:02', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (4, '热销商品 Apple AirPods', 3, 10159, '##', 101, 0, '2019-09-18 17:08:56', 0, '2019-09-18 17:08:56', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (5, '新品上线 Macbook Pro', 4, 10269, '##', 100, 0, '2019-09-18 17:10:36', 0, '2019-09-18 17:10:36', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (6, '新品上线 荣耀 9X Pro', 4, 10755, '##', 100, 0, '2019-09-18 17:11:05', 0, '2019-09-18 17:11:05', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (7, '新品上线 iPhone 11', 4, 10283, '##', 102, 0, '2019-09-18 17:11:44', 0, '2019-09-18 17:11:44', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (8, '新品上线 iPhone 11 Pro', 4, 10320, '##', 101, 0, '2019-09-18 17:11:58', 0, '2019-09-18 17:11:58', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (9, '新品上线 华为无线耳机', 4, 10186, '##', 100, 0, '2019-09-18 17:12:29', 0, '2019-09-18 17:12:29', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (10, '纪梵希高定香榭天鹅绒唇膏', 5, 10233, '##', 98, 0, '2019-09-18 17:47:23', 0, '2019-09-18 17:47:23', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (11, 'MAC 磨砂系列', 5, 10237, '##', 100, 0, '2019-09-18 17:47:44', 0, '2019-09-18 17:47:44', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (12, '索尼 WH-1000XM3', 5, 10195, '##', 102, 0, '2019-09-18 17:48:00', 0, '2019-09-18 17:48:00', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (13, 'Apple AirPods', 5, 10180, '##', 101, 0, '2019-09-18 17:49:11', 0, '2019-09-18 17:49:11', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (14, '小米 Redmi AirDots', 5, 10160, '##', 100, 0, '2019-09-18 17:49:28', 0, '2019-09-18 17:49:28', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (15, '2019 MacBookAir 13', 5, 10254, '##', 100, 0, '2019-09-18 17:50:18', 0, '2019-09-18 17:50:18', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (16, '女式粗棉线条纹长袖T恤', 5, 10158, '##', 99, 0, '2019-09-18 17:52:03', 0, '2019-09-18 17:52:03', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (17, '塑料浴室座椅', 5, 10154, '##', 100, 0, '2019-09-18 17:52:19', 0, '2019-09-18 17:52:19', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (18, '靠垫', 5, 10147, '##', 101, 0, '2019-09-18 17:52:50', 0, '2019-09-18 17:52:50', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (19, '小型超声波香薰机', 5, 10113, '##', 100, 0, '2019-09-18 17:54:07', 0, '2019-09-18 17:54:07', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (20, '11', 5, 1, '##', 0, 1, '2019-09-19 08:31:11', 0, '2019-09-19 08:31:20', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (21, '热销商品 华为 P30', 3, 10742, '##', 200, 0, '2019-09-19 23:23:38', 0, '2019-09-19 23:23:38', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (22, '新品上线 华为Mate30 Pro', 4, 10893, '##', 200, 0, '2019-09-19 23:26:05', 0, '2019-09-19 23:26:05', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (23, '新品上线 华为 Mate 30', 4, 10895, '##', 199, 0, '2019-09-19 23:26:32', 0, '2019-09-19 23:26:32', 0);\nINSERT INTO `tb_newbee_mall_index_config` VALUES (24, '华为 Mate 30 Pro', 5, 10894, '##', 101, 0, '2019-09-19 23:27:00', 0, '2019-09-19 23:27:00', 0);\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_order\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_order`;\nCREATE TABLE `tb_newbee_mall_order`  (\n  `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单表主键id',\n  `order_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '订单号',\n  `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户主键id',\n  `total_price` int(11) NOT NULL DEFAULT 1 COMMENT '订单总价',\n  `pay_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '支付状态:0.未支付,1.支付成功,-1:支付失败',\n  `pay_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0.无 1.支付宝支付 2.微信支付',\n  `pay_time` datetime(0) NULL DEFAULT NULL COMMENT '支付时间',\n  `order_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '订单状态:0.待支付 1.已支付 2.配货完成 3:出库成功 4.交易成功 -1.手动关闭 -2.超时关闭 -3.商家关闭',\n  `extra_info` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '订单body',\n  `user_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货人姓名',\n  `user_phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货人手机号',\n  `user_address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货人收货地址',\n  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '删除标识字段(0-未删除 1-已删除)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新修改时间',\n  PRIMARY KEY (`order_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_order\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_order` VALUES (1, '15688187285093508', 1, 2492, 1, 2, '2019-09-18 23:00:18', -1, '', '', '', 'xafsdufhpwe', 0, '2019-09-18 22:53:07', '2019-09-18 22:55:32');\nINSERT INTO `tb_newbee_mall_order` VALUES (2, '15688188616936181', 1, 135, 1, 1, '2019-09-18 23:01:06', 1, '', '', '', 'xafsdufhpwe', 0, '2019-09-18 22:55:20', '2019-09-18 23:01:06');\nINSERT INTO `tb_newbee_mall_order` VALUES (3, '15689089426956979', 1, 15487, 1, 1, '2019-09-20 00:16:03', 3, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-19 23:56:40', '2019-09-20 00:10:39');\nINSERT INTO `tb_newbee_mall_order` VALUES (4, '15689090398492576', 1, 8499, 0, 0, NULL, 0, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-19 23:58:18', '2019-09-19 23:58:18');\nINSERT INTO `tb_newbee_mall_order` VALUES (5, '15689096266448452', 1, 115, 1, 2, '2019-09-20 00:13:52', 1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-20 00:08:04', '2019-09-20 00:13:52');\nINSERT INTO `tb_newbee_mall_order` VALUES (6, '15691645776131562', 7, 7998, 1, 1, '2019-09-22 23:05:53', 1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-22 22:57:15', '2019-09-22 23:05:53');\nINSERT INTO `tb_newbee_mall_order` VALUES (7, '15691648465397435', 7, 13998, 1, 2, '2019-09-22 23:07:38', -1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-22 23:01:44', '2019-09-22 23:02:10');\nINSERT INTO `tb_newbee_mall_order` VALUES (8, '15691649071896878', 7, 1246, 1, 1, '2019-09-22 23:08:31', 1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-22 23:02:45', '2019-09-22 23:08:31');\nINSERT INTO `tb_newbee_mall_order` VALUES (9, '15691649748362177', 7, 25656, 1, 1, '2019-09-22 23:09:39', 4, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-22 23:03:52', '2019-09-22 23:50:45');\nINSERT INTO `tb_newbee_mall_order` VALUES (10, '15691652286194502', 7, 16197, 0, 0, NULL, 0, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-22 23:08:06', '2019-09-22 23:08:06');\nINSERT INTO `tb_newbee_mall_order` VALUES (11, '15692210075967186', 6, 5999, 1, 2, '2019-09-23 17:03:05', 1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-23 14:43:27', '2019-09-23 17:03:05');\nINSERT INTO `tb_newbee_mall_order` VALUES (12, '15692218454123239', 6, 7245, 0, 0, NULL, 0, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-23 14:57:25', '2019-09-23 14:57:25');\nINSERT INTO `tb_newbee_mall_order` VALUES (13, '15692225252983527', 6, 5488, 1, 2, '2019-09-23 15:38:54', 1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-23 15:08:45', '2019-09-23 15:38:54');\nINSERT INTO `tb_newbee_mall_order` VALUES (14, '15692291639125640', 6, 9046, 1, 2, '2019-09-23 16:59:32', -1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2709', 0, '2019-09-23 16:59:23', '2019-09-23 16:59:40');\nINSERT INTO `tb_newbee_mall_order` VALUES (15, '15692295348262843', 6, 65, 1, 2, '2019-09-23 17:06:17', 1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2709', 0, '2019-09-23 17:05:34', '2019-09-23 17:06:17');\nINSERT INTO `tb_newbee_mall_order` VALUES (16, '15692298037679052', 6, 15233, 1, 2, '2019-09-23 17:10:08', 1, '', '', '', '上海浦东新区XX路XX号 999 137xxxx7797', 0, '2019-09-23 17:10:03', '2019-09-23 17:10:08');\nINSERT INTO `tb_newbee_mall_order` VALUES (17, '15694781962831307', 7, 1246, 1, 2, '2019-09-26 14:10:12', -1, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-26 14:09:56', '2019-09-26 14:10:22');\nINSERT INTO `tb_newbee_mall_order` VALUES (18, '15698039249771093', 7, 3199, 0, 0, NULL, 0, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-09-30 08:38:26', '2019-09-30 08:38:26');\nINSERT INTO `tb_newbee_mall_order` VALUES (19, '15702783557537865', 7, 6819, 0, 0, NULL, 0, '', '', '', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, '2019-10-05 20:20:10', '2019-10-05 20:20:10');\nINSERT INTO `tb_newbee_mall_order` VALUES (20, '15702847670935185', 6, 3999, 1, 2, '2019-10-05 22:13:03', 1, '', '', '', '上海浦东新区XX路XX号 999 137xxxx7797', 0, '2019-10-05 22:12:47', '2019-10-05 22:13:03');\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_order_item\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_order_item`;\nCREATE TABLE `tb_newbee_mall_order_item`  (\n  `order_item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单关联购物项主键id',\n  `order_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '订单主键id',\n  `goods_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '关联商品id',\n  `goods_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '下单时商品的名称(订单快照)',\n  `goods_cover_img` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '下单时商品的主图(订单快照)',\n  `selling_price` int(11) NOT NULL DEFAULT 1 COMMENT '下单时商品的价格(订单快照)',\n  `goods_count` int(11) NOT NULL DEFAULT 1 COMMENT '数量(订单快照)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  PRIMARY KEY (`order_item_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_order_item\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_order_item` VALUES (1, 1, 10180, 'Apple AirPods 配充电盒', '/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg', 1246, 2, '2019-09-18 22:53:07');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (2, 2, 10147, 'MUJI 羽毛 靠垫', '/goods-img/0f701215-b782-40c7-8bbd-97b51be56461.jpg', 65, 1, '2019-09-18 22:55:20');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (3, 2, 10158, '无印良品 女式粗棉线条纹长袖T恤', 'http://localhost:28089/goods-img/5488564b-8335-4b0c-a5a4-52f3f03ee728.jpg', 70, 1, '2019-09-18 22:55:20');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (4, 3, 10742, '华为 HUAWEI P30 Pro', '/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg', 5488, 1, '2019-09-19 23:56:40');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (5, 3, 10320, 'Apple iPhone 11 Pro', '/goods-img/0025ad55-e260-4a00-be79-fa5b8c5ac0de.jpg', 9999, 1, '2019-09-19 23:56:40');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (6, 4, 10254, 'Apple 2019款 MacBook Air 13.3', '/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg', 8499, 1, '2019-09-19 23:58:18');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (7, 5, 10104, '无印良品 MUJI 修正带', '/goods-img/98ce17e1-890e-4eaf-856a-7fce8ffebc4c.jpg', 15, 1, '2019-09-20 00:08:04');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (8, 5, 10110, '无印良品 MUJI 基础润肤乳霜', '/goods-img/30036561-a150-4ea7-9106-29bbea278909.jpg', 100, 1, '2019-09-20 00:08:04');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (9, 6, 10895, 'HUAWEI Mate 30 4000万超感光徕卡影像', '/goods-img/mate30-3.png', 3999, 2, '2019-09-22 22:57:15');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (10, 7, 10895, 'HUAWEI Mate 30 4000万超感光徕卡影像', '/goods-img/mate30-3.png', 3999, 1, '2019-09-22 23:01:44');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (11, 7, 10320, 'Apple iPhone 11 Pro', '/goods-img/0025ad55-e260-4a00-be79-fa5b8c5ac0de.jpg', 9999, 1, '2019-09-22 23:01:44');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (12, 8, 10180, 'Apple AirPods 配充电盒', '/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg', 1246, 1, '2019-09-22 23:02:45');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (13, 9, 10237, 'MAC 雾面丝绒哑光子弹头口红', 'http://localhost:28089/goods-img/1930d79b-88bd-4c5c-8510-0697c9ad2578.jpg', 165, 4, '2019-09-22 23:03:52');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (14, 9, 10254, 'Apple 2019款 MacBook Air 13.3', '/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg', 8499, 2, '2019-09-22 23:03:52');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (15, 9, 10195, '索尼 WH-1000XM3 头戴式耳机', 'http://localhost:28089/goods-img/0dc503b2-90a2-4971-9723-c085a1844b76.jpg', 2599, 1, '2019-09-22 23:03:52');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (16, 9, 10894, 'HUAWEI Mate 30 Pro', '/goods-img/mate30p3.png', 5399, 1, '2019-09-22 23:03:52');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (17, 10, 10894, 'HUAWEI Mate 30 Pro', '/goods-img/mate30p3.png', 5399, 3, '2019-09-22 23:08:06');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (18, 11, 10279, 'Apple iPhone 11 (A2223)', '/goods-img/a0d09f94-9c46-4ee1-aaef-dfd132e7543e.jpg', 5999, 1, '2019-09-23 14:43:27');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (19, 12, 10279, 'Apple iPhone 11 (A2223)', '/goods-img/a0d09f94-9c46-4ee1-aaef-dfd132e7543e.jpg', 5999, 1, '2019-09-23 14:57:26');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (20, 12, 10159, 'Apple AirPods 配充电盒', '/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg', 1246, 1, '2019-09-23 14:57:26');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (21, 13, 10742, '华为 HUAWEI P30 Pro', '/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg', 5488, 1, '2019-09-23 15:08:46');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (22, 14, 10158, '无印良品 女式粗棉线条纹长袖T恤', '/goods-img/5488564b-8335-4b0c-a5a4-52f3f03ee728.jpg', 70, 1, '2019-09-23 16:59:24');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (23, 14, 10704, '华为 HUAWEI P30 超感光徕卡三摄麒麟980AI...', '/goods-img/b9e6d770-06dd-40f4-9ae5-31103cec6e5f.jpg', 3988, 1, '2019-09-23 16:59:24');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (24, 14, 10739, '华为 HUAWEI P30 Pro', '/goods-img/65c8e729-aeca-4780-977b-4d0d39d4aa2e.jpg', 4988, 1, '2019-09-23 16:59:24');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (25, 15, 10147, 'MUJI 羽毛 靠垫', '/goods-img/0f701215-b782-40c7-8bbd-97b51be56461.jpg', 65, 1, '2019-09-23 17:05:34');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (26, 16, 10742, '华为 HUAWEI P30 Pro', '/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg', 5488, 1, '2019-09-23 17:10:03');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (27, 16, 10159, 'Apple AirPods 配充电盒', '/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg', 1246, 1, '2019-09-23 17:10:03');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (28, 16, 10254, 'Apple 2019款 MacBook Air 13.3', '/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg', 8499, 1, '2019-09-23 17:10:03');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (29, 17, 10180, 'Apple AirPods 配充电盒', '/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg', 1246, 1, '2019-09-26 14:09:56');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (30, 18, 10779, '华为 HUAWEI Mate 20', '/goods-img/08f9a912-f049-4cf8-a839-115fc6582398.jpg', 3199, 1, '2019-09-30 08:38:26');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (31, 19, 10742, '华为 HUAWEI P30 Pro', '/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg', 5488, 1, '2019-10-05 20:20:10');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (32, 19, 10154, '无印良品 MUJI 塑料浴室座椅', '/goods-img/15395057-94e9-4545-a8ee-8aee025f40c5.jpg', 85, 1, '2019-10-05 20:20:10');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (33, 19, 10159, 'Apple AirPods 配充电盒', '/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg', 1246, 1, '2019-10-05 20:20:10');\nINSERT INTO `tb_newbee_mall_order_item` VALUES (34, 20, 10895, 'HUAWEI Mate 30 4000万超感光徕卡影像', '/goods-img/mate30-3.png', 3999, 1, '2019-10-05 22:12:47');\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_shopping_cart_item\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_shopping_cart_item`;\nCREATE TABLE `tb_newbee_mall_shopping_cart_item`  (\n  `cart_item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '购物项主键id',\n  `user_id` bigint(20) NOT NULL COMMENT '用户主键id',\n  `goods_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '关联商品id',\n  `goods_count` int(11) NOT NULL DEFAULT 1 COMMENT '数量(最大为5)',\n  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '删除标识字段(0-未删除 1-已删除)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新修改时间',\n  PRIMARY KEY (`cart_item_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 69 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Table structure for tb_newbee_mall_user\n-- ----------------------------\nDROP TABLE IF EXISTS `tb_newbee_mall_user`;\nCREATE TABLE `tb_newbee_mall_user`  (\n  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户主键id',\n  `nick_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称',\n  `login_name` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '登陆名称(默认为手机号)',\n  `password_md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'MD5加密后的密码',\n  `introduce_sign` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '个性签名',\n  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '收货地址',\n  `is_deleted` tinyint(4) NOT NULL DEFAULT 0 COMMENT '注销标识字段(0-正常 1-已注销)',\n  `locked_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '锁定标识字段(0-未锁定 1-已锁定)',\n  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',\n  PRIMARY KEY (`user_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- author 13\n-- qq交流群 796794009\n-- email 2449207463@qq.com\n-- link https://github.com/newbee-ltd\n-- Records of tb_newbee_mall_user\n-- ----------------------------\nINSERT INTO `tb_newbee_mall_user` VALUES (1, '十三', '13700002703', 'e10adc3949ba59abbe56e057f20f883e', '我不怕千万人阻挡，只怕自己投降', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, 0, '2019-09-22 08:44:57');\nINSERT INTO `tb_newbee_mall_user` VALUES (6, '测试用户1', '13711113333', 'dda01dc6d334badcd031102be6bee182', '测试用户1', '上海浦东新区XX路XX号 999 137xxxx7797', 0, 0, '2019-08-29 10:51:39');\nINSERT INTO `tb_newbee_mall_user` VALUES (7, '测试用户2测试用户2测试用户2测试用户2', '13811113333', 'dda01dc6d334badcd031102be6bee182', '测试用户2', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, 0, '2019-08-29 10:55:08');\nINSERT INTO `tb_newbee_mall_user` VALUES (8, '测试用户3', '13911113333', 'dda01dc6d334badcd031102be6bee182', '测试用户3', '杭州市西湖区xx小区x幢419 十三 137xxxx2703', 0, 0, '2019-08-29 10:55:16');"
  },
  {
    "path": "src/main/resources/static/admin/dist/css/adminlte.css",
    "content": "/*!\n *   AdminLTE v3.0.0-alpha\n *   Author: Abdullah Almsaeed\n *\t Website: AdminLTE.io <http://adminlte.io>\n *   License: Open source - MIT <http://opensource.org/licenses/MIT>\n */\n/*!\n * Bootstrap v4.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #ffffff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: \"Source Sans Pro\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: \"Source Sans Pro\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #ffffff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\ndfn {\n  font-style: italic;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.2;\n  color: inherit;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled, .chart-legend, .contacts-list, .users-list, .mailbox-attachments {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #ffffff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #ffffff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n  box-shadow: inset 0 -0.1rem 0 rgba(0, 0, 0, 0.25);\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n  box-shadow: none;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 7.5px;\n  padding-left: 7.5px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 7.5px;\n  padding-left: 7.5px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: flex;\n  flex-wrap: wrap;\n  margin-right: -7.5px;\n  margin-left: -7.5px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  min-height: 1px;\n  padding-right: 7.5px;\n  padding-left: 7.5px;\n}\n\n.col {\n  flex-basis: 0;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n  max-width: none;\n}\n\n.col-1 {\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  order: -1;\n}\n\n.order-last {\n  order: 13;\n}\n\n.order-0 {\n  order: 0;\n}\n\n.order-1 {\n  order: 1;\n}\n\n.order-2 {\n  order: 2;\n}\n\n.order-3 {\n  order: 3;\n}\n\n.order-4 {\n  order: 4;\n}\n\n.order-5 {\n  order: 5;\n}\n\n.order-6 {\n  order: 6;\n}\n\n.order-7 {\n  order: 7;\n}\n\n.order-8 {\n  order: 8;\n}\n\n.order-9 {\n  order: 9;\n}\n\n.order-10 {\n  order: 10;\n}\n\n.order-11 {\n  order: 11;\n}\n\n.order-12 {\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-sm-1 {\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    order: -1;\n  }\n  .order-sm-last {\n    order: 13;\n  }\n  .order-sm-0 {\n    order: 0;\n  }\n  .order-sm-1 {\n    order: 1;\n  }\n  .order-sm-2 {\n    order: 2;\n  }\n  .order-sm-3 {\n    order: 3;\n  }\n  .order-sm-4 {\n    order: 4;\n  }\n  .order-sm-5 {\n    order: 5;\n  }\n  .order-sm-6 {\n    order: 6;\n  }\n  .order-sm-7 {\n    order: 7;\n  }\n  .order-sm-8 {\n    order: 8;\n  }\n  .order-sm-9 {\n    order: 9;\n  }\n  .order-sm-10 {\n    order: 10;\n  }\n  .order-sm-11 {\n    order: 11;\n  }\n  .order-sm-12 {\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-md-1 {\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    order: -1;\n  }\n  .order-md-last {\n    order: 13;\n  }\n  .order-md-0 {\n    order: 0;\n  }\n  .order-md-1 {\n    order: 1;\n  }\n  .order-md-2 {\n    order: 2;\n  }\n  .order-md-3 {\n    order: 3;\n  }\n  .order-md-4 {\n    order: 4;\n  }\n  .order-md-5 {\n    order: 5;\n  }\n  .order-md-6 {\n    order: 6;\n  }\n  .order-md-7 {\n    order: 7;\n  }\n  .order-md-8 {\n    order: 8;\n  }\n  .order-md-9 {\n    order: 9;\n  }\n  .order-md-10 {\n    order: 10;\n  }\n  .order-md-11 {\n    order: 11;\n  }\n  .order-md-12 {\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-lg-1 {\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    order: -1;\n  }\n  .order-lg-last {\n    order: 13;\n  }\n  .order-lg-0 {\n    order: 0;\n  }\n  .order-lg-1 {\n    order: 1;\n  }\n  .order-lg-2 {\n    order: 2;\n  }\n  .order-lg-3 {\n    order: 3;\n  }\n  .order-lg-4 {\n    order: 4;\n  }\n  .order-lg-5 {\n    order: 5;\n  }\n  .order-lg-6 {\n    order: 6;\n  }\n  .order-lg-7 {\n    order: 7;\n  }\n  .order-lg-8 {\n    order: 8;\n  }\n  .order-lg-9 {\n    order: 9;\n  }\n  .order-lg-10 {\n    order: 10;\n  }\n  .order-lg-11 {\n    order: 11;\n  }\n  .order-lg-12 {\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-xl-1 {\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    order: -1;\n  }\n  .order-xl-last {\n    order: 13;\n  }\n  .order-xl-0 {\n    order: 0;\n  }\n  .order-xl-1 {\n    order: 1;\n  }\n  .order-xl-2 {\n    order: 2;\n  }\n  .order-xl-3 {\n    order: 3;\n  }\n  .order-xl-4 {\n    order: 4;\n  }\n  .order-xl-5 {\n    order: 5;\n  }\n  .order-xl-6 {\n    order: 6;\n  }\n  .order-xl-7 {\n    order: 7;\n  }\n  .order-xl-8 {\n    order: 8;\n  }\n  .order-xl-9 {\n    order: 9;\n  }\n  .order-xl-10 {\n    order: 10;\n  }\n  .order-xl-11 {\n    order: 11;\n  }\n  .order-xl-12 {\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 1rem;\n  background-color: transparent;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #ffffff;\n  background-color: #212529;\n  border-color: #32383e;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #ffffff;\n  background-color: #212529;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #32383e;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  box-shadow: inset 0 0 0 transparent;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #ffffff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: inset 0 0 0 transparent, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n  height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #ffffff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-sm > .input-group-append > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-lg > .input-group-append > .form-control-plaintext.btn {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(2.875rem + 2px);\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: flex;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: inline-flex;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: .5rem;\n  margin-top: .1rem;\n  font-size: .875rem;\n  line-height: 1;\n  color: #ffffff;\n  background-color: rgba(40, 167, 69, 0.8);\n  border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n  border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip, .was-validated\n.custom-select:valid ~ .valid-feedback,\n.was-validated\n.custom-select:valid ~ .valid-tooltip,\n.custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  background-color: #71dd8a;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #ffffff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label::before, .custom-file-input.is-valid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: .5rem;\n  margin-top: .1rem;\n  font-size: .875rem;\n  line-height: 1;\n  color: #ffffff;\n  background-color: rgba(220, 53, 69, 0.8);\n  border-radius: .2rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n  border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  background-color: #efa2a9;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #ffffff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label::before, .custom-file-input.is-invalid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: flex;\n  flex-flow: row wrap;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: flex;\n    flex: 0 0 auto;\n    flex-flow: row wrap;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    align-items: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  user-select: none;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n\n.btn:hover, .btn:focus {\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n  box-shadow: none;\n}\n\n.btn:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\n.btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active {\n  background-image: none;\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn:not(:disabled):not(.disabled):active:focus, .btn:not(:disabled):not(.disabled).active:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25), inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #007bff;\n  border-color: #007bff;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-primary:hover {\n  color: #ffffff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #ffffff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #ffffff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #ffffff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-secondary:hover {\n  color: #ffffff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #ffffff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #ffffff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #28a745;\n  border-color: #28a745;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-success:hover {\n  color: #ffffff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #ffffff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #ffffff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-info:hover {\n  color: #ffffff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #ffffff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #ffffff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-warning {\n  color: #1F2D3D;\n  background-color: #ffc107;\n  border-color: #ffc107;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-warning:hover {\n  color: #1F2D3D;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #1F2D3D;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #1F2D3D;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-danger:hover {\n  color: #ffffff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #ffffff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #ffffff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-light {\n  color: #1F2D3D;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-light:hover {\n  color: #1F2D3D;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #1F2D3D;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #1F2D3D;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-dark {\n  color: #ffffff;\n  background-color: #343a40;\n  border-color: #343a40;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-dark:hover {\n  color: #ffffff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #ffffff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #ffffff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  background-color: transparent;\n  background-image: none;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #ffffff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #ffffff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  background-color: transparent;\n  background-image: none;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n  color: #ffffff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #ffffff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  background-color: transparent;\n  background-image: none;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #ffffff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #ffffff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  background-color: transparent;\n  background-image: none;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #ffffff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #ffffff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  background-color: transparent;\n  background-image: none;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #1F2D3D;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #1F2D3D;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  background-color: transparent;\n  background-image: none;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #ffffff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #ffffff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  background-color: transparent;\n  background-image: none;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #1F2D3D;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #1F2D3D;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  background-color: transparent;\n  background-image: none;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #ffffff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #ffffff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: none;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: none;\n  border-color: transparent;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.175);\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  flex: 0 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group.show .dropdown-toggle {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.show .dropdown-toggle.btn-link {\n  box-shadow: none;\n}\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file:focus {\n  z-index: 3;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: flex;\n  align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label,\n.input-group > .custom-file:not(:first-child) .custom-file-label::after {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #ffffff;\n  background-color: #007bff;\n  box-shadow: none;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #ffffff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:active ~ .custom-control-label::before {\n  color: #ffffff;\n  background-color: #b3d7ff;\n  box-shadow: none;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  margin-bottom: 0;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: 0;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  user-select: none;\n  background-color: #dee2e6;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: 0;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background-repeat: no-repeat;\n  background-position: center center;\n  background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  background-color: #007bff;\n  box-shadow: none;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23ffffff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23ffffff'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: #ffffff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n  background-size: 8px 10px;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #ffffff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  opacity: 0;\n}\n\n.custom-select-sm {\n  height: calc(1.8125rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 75%;\n}\n\n.custom-select-lg {\n  height: calc(2.875rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 125%;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:focus ~ .custom-file-label::after {\n  border-color: #80bdff;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #ffffff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  box-shadow: inset 0 0 0 transparent;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(calc(2.25rem + 2px) - 1px * 2);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: 1px solid #ced4da;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  padding-left: 0;\n  background-color: transparent;\n  appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1);\n  appearance: none;\n}\n\n.custom-range::-webkit-slider-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #ffffff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1);\n  appearance: none;\n}\n\n.custom-range::-moz-range-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #ffffff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1);\n  appearance: none;\n}\n\n.custom-range::-ms-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #ffffff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n  box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1);\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.nav {\n  display: flex;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #6c757d;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #ffffff;\n  border-color: #dee2e6 #dee2e6 #ffffff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #ffffff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  flex-basis: 0;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding: 0.5rem 0.5rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 0.5rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  flex-basis: 100%;\n  flex-grow: 1;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 1rem;\n    padding-left: 1rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 1rem;\n    padding-left: 1rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 1rem;\n    padding-left: 1rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 1rem;\n    padding-left: 1rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  flex-flow: row nowrap;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 1rem;\n  padding-left: 1rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: flex !important;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #ffffff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #ffffff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: white;\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #ffffff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.75);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.75)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-text a {\n  color: #ffffff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #ffffff;\n}\n\n.card {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #ffffff;\n  background-clip: border-box;\n  border: 0 solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 0 solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 0) calc(0.25rem - 0) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 0 solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 0) calc(0.25rem - 0);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 0);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 0);\n  border-top-right-radius: calc(0.25rem - 0);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 0);\n  border-bottom-left-radius: calc(0.25rem - 0);\n}\n\n.card-deck {\n  display: flex;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 7.5px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    flex-flow: row wrap;\n    margin-right: -7.5px;\n    margin-left: -7.5px;\n  }\n  .card-deck .card {\n    display: flex;\n    flex: 1 0 0%;\n    flex-direction: column;\n    margin-right: 7.5px;\n    margin-bottom: 0;\n    margin-left: 7.5px;\n  }\n}\n\n.card-group {\n  display: flex;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 7.5px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:first-child {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-top,\n  .card-group > .card:first-child .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-bottom,\n  .card-group > .card:first-child .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:last-child {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-top,\n  .card-group > .card:last-child .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-bottom,\n  .card-group > .card:last-child .card-footer {\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:only-child {\n    border-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-top,\n  .card-group > .card:only-child .card-header {\n    border-top-left-radius: 0.25rem;\n    border-top-right-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-bottom,\n  .card-group > .card:only-child .card-footer {\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {\n    border-radius: 0;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {\n    border-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    column-count: 3;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n\n.accordion .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n\n.accordion .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #ffffff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-link:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #ffffff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #ffffff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #ffffff;\n  background-color: #007bff;\n}\n\n.badge-primary[href]:hover, .badge-primary[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #0062cc;\n}\n\n.badge-secondary {\n  color: #ffffff;\n  background-color: #6c757d;\n}\n\n.badge-secondary[href]:hover, .badge-secondary[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #545b62;\n}\n\n.badge-success {\n  color: #ffffff;\n  background-color: #28a745;\n}\n\n.badge-success[href]:hover, .badge-success[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #1e7e34;\n}\n\n.badge-info {\n  color: #ffffff;\n  background-color: #17a2b8;\n}\n\n.badge-info[href]:hover, .badge-info[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #117a8b;\n}\n\n.badge-warning {\n  color: #1F2D3D;\n  background-color: #ffc107;\n}\n\n.badge-warning[href]:hover, .badge-warning[href]:focus {\n  color: #1F2D3D;\n  text-decoration: none;\n  background-color: #d39e00;\n}\n\n.badge-danger {\n  color: #ffffff;\n  background-color: #dc3545;\n}\n\n.badge-danger[href]:hover, .badge-danger[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #bd2130;\n}\n\n.badge-light {\n  color: #1F2D3D;\n  background-color: #f8f9fa;\n}\n\n.badge-light[href]:hover, .badge-light[href]:focus {\n  color: #1F2D3D;\n  text-decoration: none;\n  background-color: #dae0e5;\n}\n\n.badge-dark {\n  color: #ffffff;\n  background-color: #343a40;\n}\n\n.badge-dark[href]:hover, .badge-dark[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #1d2124;\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close, .alert-dismissible .mailbox-attachment-close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n  color: #202326;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n  box-shadow: inset 0 0.1rem 0.1rem rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n  display: flex;\n  align-items: flex-start;\n}\n\n.media-body {\n  flex: 1;\n}\n\n.list-group {\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:hover, .list-group-item:focus {\n  z-index: 1;\n  text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  background-color: #ffffff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #ffffff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close, .mailbox-attachment-close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: .5;\n}\n\n.close:hover, .mailbox-attachment-close:hover, .close:focus, .mailbox-attachment-close:focus {\n  color: #000;\n  text-decoration: none;\n  opacity: .75;\n}\n\n.close:not(:disabled):not(.disabled), .mailbox-attachment-close:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\nbutton.close, button.mailbox-attachment-close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: transform 0.3s ease-out;\n  transform: translate(0, -25%);\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  transform: translate(0, 0);\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - (0.5rem * 2));\n}\n\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.5);\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  padding: 1rem;\n  border-bottom: 1px solid #e9ecef;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close, .modal-header .mailbox-attachment-close {\n  padding: 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - (1.75rem * 2));\n  }\n  .modal-content {\n    box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg {\n    max-width: 800px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: \"Source Sans Pro\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #ffffff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: \"Source Sans Pro\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.2);\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top .arrow, .bs-popover-auto[x-placement^=\"top\"] .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0;\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n  bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  bottom: 1px;\n  border-top-color: #ffffff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right .arrow, .bs-popover-auto[x-placement^=\"right\"] .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n  left: 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  left: 1px;\n  border-right-color: #ffffff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n  top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  top: 1px;\n  border-bottom-color: #ffffff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left .arrow, .bs-popover-auto[x-placement^=\"left\"] .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n  right: 0;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  right: 1px;\n  border-left-color: #ffffff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  color: inherit;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  align-items: center;\n  width: 100%;\n  transition: transform 0.6s ease;\n  backface-visibility: hidden;\n  perspective: 1000px;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n  position: absolute;\n  top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n  transform: translateX(0);\n}\n\n@supports (transform-style: preserve-3d) {\n  .carousel-item-next.carousel-item-left,\n  .carousel-item-prev.carousel-item-right {\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n  transform: translateX(100%);\n}\n\n@supports (transform-style: preserve-3d) {\n  .carousel-item-next,\n  .active.carousel-item-right {\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n  transform: translateX(-100%);\n}\n\n@supports (transform-style: preserve-3d) {\n  .carousel-item-prev,\n  .active.carousel-item-left {\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-duration: .6s;\n  transition-property: opacity;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  opacity: 0;\n}\n\n.carousel-fade .carousel-item-next,\n.carousel-fade .carousel-item-prev,\n.carousel-fade .carousel-item.active,\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-prev {\n  transform: translateX(0);\n}\n\n@supports (transform-style: preserve-3d) {\n  .carousel-fade .carousel-item-next,\n  .carousel-fade .carousel-item-prev,\n  .carousel-fade .carousel-item.active,\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-prev {\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 15%;\n  color: #ffffff;\n  text-align: center;\n  opacity: 0.5;\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  opacity: .9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: transparent no-repeat center center;\n  background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 10px;\n  left: 0;\n  z-index: 15;\n  display: flex;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  position: relative;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n  position: absolute;\n  top: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n\n.carousel-indicators li::after {\n  position: absolute;\n  bottom: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n\n.carousel-indicators .active {\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary, .label-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.label-primary:hover, a.bg-primary:focus, a.label-primary:focus,\nbutton.bg-primary:hover,\nbutton.label-primary:hover,\nbutton.bg-primary:focus,\nbutton.label-primary:focus {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n\n.bg-success, .alert-success, .label-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.alert-success:hover, a.label-success:hover, a.bg-success:focus, a.alert-success:focus, a.label-success:focus,\nbutton.bg-success:hover,\nbutton.alert-success:hover,\nbutton.label-success:hover,\nbutton.bg-success:focus,\nbutton.alert-success:focus,\nbutton.label-success:focus {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info, .alert-info, .label-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.alert-info:hover, a.label-info:hover, a.bg-info:focus, a.alert-info:focus, a.label-info:focus,\nbutton.bg-info:hover,\nbutton.alert-info:hover,\nbutton.label-info:hover,\nbutton.bg-info:focus,\nbutton.alert-info:focus,\nbutton.label-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning, .alert-warning, .label-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.alert-warning:hover, a.label-warning:hover, a.bg-warning:focus, a.alert-warning:focus, a.label-warning:focus,\nbutton.bg-warning:hover,\nbutton.alert-warning:hover,\nbutton.label-warning:hover,\nbutton.bg-warning:focus,\nbutton.alert-warning:focus,\nbutton.label-warning:focus {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger, .alert-danger,\n.alert-error, .label-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.alert-danger:hover,\na.alert-error:hover, a.label-danger:hover, a.bg-danger:focus, a.alert-danger:focus,\na.alert-error:focus, a.label-danger:focus,\nbutton.bg-danger:hover,\nbutton.alert-danger:hover,\nbutton.alert-error:hover,\nbutton.label-danger:hover,\nbutton.bg-danger:focus,\nbutton.alert-danger:focus,\nbutton.alert-error:focus,\nbutton.label-danger:focus {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #ffffff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #ffffff !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex, .info-box, .info-box-icon {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center, .info-box-icon {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center, .info-box-icon {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports (position: sticky) {\n  .sticky-top {\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2, .progress-group,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3, .small-box, .card, .info-box, .callout,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4, .card-body.p-0 .table thead > tr > th:last-of-type,\n.card-body.p-0 .table thead > tr > td:last-of-type,\n.card-body.p-0 .table tbody > tr > th:last-of-type,\n.card-body.p-0 .table tbody > tr > td:last-of-type,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4, .card-body.p-0 .table thead > tr > th:first-of-type,\n.card-body.p-0 .table thead > tr > td:first-of-type,\n.card-body.p-0 .table tbody > tr > th:first-of-type,\n.card-body.p-0 .table tbody > tr > td:first-of-type,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #ffffff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #0062cc !important;\n}\n\n.text-secondary {\n  color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #545b62 !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #1e7e34 !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #117a8b !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #d39e00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #bd2130 !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #dae0e5 !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #1d2124 !important;\n}\n\n.text-body {\n  color: #212529 !important;\n}\n\n.text-muted {\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #ffffff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n}\n\n/*\n * Core: General Layout Style\n * -------------------------\n */\nhtml,\nbody,\n.wrapper {\n  min-height: 100%;\n  overflow-x: hidden;\n}\n\n.wrapper {\n  position: relative;\n}\n\n.layout-boxed .wrapper {\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);\n}\n\n.layout-boxed .wrapper, .layout-boxed .wrapper:before {\n  margin: 0 auto;\n  max-width: 1250px;\n}\n\n@media (min-width: 768px) {\n  .content-wrapper,\n  .main-footer,\n  .main-header {\n    transition: margin-left 0.3s ease-in-out;\n    margin-left: 250px;\n    z-index: 3000;\n  }\n}\n\n@media screen and (min-width: 768px) and (prefers-reduced-motion: reduce) {\n  .content-wrapper,\n  .main-footer,\n  .main-header {\n    transition: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .sidebar-collapse .content-wrapper, .sidebar-collapse\n  .main-footer, .sidebar-collapse\n  .main-header {\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .content-wrapper, .content-wrapper:before,\n  .main-footer,\n  .main-footer:before,\n  .main-header,\n  .main-header:before {\n    margin-left: 0;\n  }\n}\n\n.content-wrapper {\n  background: #f4f6f9;\n}\n\n.content-wrapper > .content {\n  padding: 0 0.5rem;\n}\n\n.main-sidebar {\n  position: fixed;\n  top: 0;\n  left: 0;\n  bottom: 0;\n}\n\n.main-sidebar, .main-sidebar:before {\n  transition: margin-left 0.3s ease-in-out, width 0.3s ease-in-out;\n  width: 250px;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .main-sidebar, .main-sidebar:before {\n    transition: none;\n  }\n}\n\n.sidebar-collapse .main-sidebar, .sidebar-collapse .main-sidebar:before {\n  margin-left: -250px;\n}\n\n@media (max-width: 991.98px) {\n  .main-sidebar, .main-sidebar:before {\n    box-shadow: none !important;\n    margin-left: -250px;\n  }\n  .sidebar-open .main-sidebar, .sidebar-open .main-sidebar:before {\n    margin-left: 0;\n  }\n}\n\n.main-footer {\n  padding: 15px;\n  color: #555;\n  border-top: 1px solid #dee2e6;\n  background: #ffffff;\n}\n\n.content-header {\n  padding: 15px 0.5rem;\n}\n\n.content-header h1 {\n  font-size: 1.8rem;\n  margin: 0;\n}\n\n.content-header .breadcrumb {\n  margin-bottom: 0;\n  padding: 0;\n  background: transparent;\n  line-height: 1.8rem;\n}\n\n.hold-transition .content-wrapper,\n.hold-transition .main-header,\n.hold-transition .main-footer {\n  transition: none !important;\n}\n\n/*\n * Component: Main Header\n * ----------------------\n */\n.main-header {\n  z-index: 1000;\n}\n\n.main-header .navbar-nav .nav-item {\n  margin: 0;\n}\n\n.main-header .nav-link {\n  position: relative;\n  height: 2.5rem;\n}\n\n.main-header .navbar-nav[class*=\"-right\"] .dropdown-menu {\n  margin-top: -3px;\n  right: 0;\n  left: auto;\n}\n\n@media (max-width: 575.98px) {\n  .main-header .navbar-nav[class*=\"-right\"] .dropdown-menu {\n    left: 0;\n    right: auto;\n  }\n}\n\n.navbar-img {\n  height: 1.25rem;\n  width: auto;\n}\n\n.navbar-badge {\n  position: absolute;\n  top: 9px;\n  right: 5px;\n  font-size: .6rem;\n  font-weight: 300;\n  padding: 2px 4px;\n}\n\n.btn-navbar {\n  border-left-width: 0;\n  background-color: transparent;\n}\n\n.form-control-navbar {\n  border-right-width: 0;\n}\n\n.form-control-navbar + .input-group-append {\n  margin-left: 0;\n}\n\n.form-control-navbar,\n.btn-navbar {\n  transition: none;\n}\n\n.navbar-dark .form-control-navbar,\n.navbar-dark .btn-navbar {\n  background-color: rgba(255, 255, 255, 0.2);\n  border: 0;\n}\n\n.navbar-dark .form-control-navbar::placeholder,\n.navbar-dark .form-control-navbar + .input-group-append > .btn-navbar {\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.navbar-dark .form-control-navbar :-moz-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.navbar-dark .form-control-navbar ::-moz-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.navbar-dark .form-control-navbar :-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.navbar-dark .form-control-navbar:focus,\n.navbar-dark .form-control-navbar:focus + .input-group-append .btn-navbar {\n  border: 0 !important;\n  background-color: rgba(255, 255, 255, 0.6);\n  color: #343a40;\n}\n\n.navbar-light .form-control-navbar,\n.navbar-light .btn-navbar {\n  background-color: #f2f4f6;\n  border: 0;\n}\n\n.navbar-light .form-control-navbar::placeholder,\n.navbar-light .form-control-navbar + .input-group-append > .btn-navbar {\n  color: rgba(0, 0, 0, 0.6);\n}\n\n.navbar-light .form-control-navbar :-moz-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n\n.navbar-light .form-control-navbar ::-moz-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n\n.navbar-light .form-control-navbar :-ms-input-placeholder {\n  color: rgba(0, 0, 0, 0.6);\n}\n\n.navbar-light .form-control-navbar:focus,\n.navbar-light .form-control-navbar:focus + .input-group-append .btn-navbar {\n  border: 0 !important;\n  background-color: #e9ecef;\n  color: #343a40;\n}\n\n.brand-link {\n  padding: 0.8125rem 0.5rem;\n  font-size: 1.25rem;\n  display: block;\n  line-height: 1.5;\n  white-space: nowrap;\n}\n\n.brand-link:hover {\n  color: #ffffff;\n  text-decoration: none;\n}\n\n[class*=\"sidebar-dark\"] .brand-link {\n  color: rgba(255, 255, 255, 0.8);\n  border-bottom: 1px solid #4b545c;\n}\n\n[class*=\"sidebar-light\"] .brand-link {\n  color: rgba(0, 0, 0, 0.8);\n  border-bottom: 1px solid #dee2e6;\n}\n\n.brand-image {\n  float: left;\n  line-height: .8;\n  max-height: 34px;\n  width: auto;\n  margin-left: .8rem;\n  margin-right: .5rem;\n  margin-top: -3px;\n}\n\n/**\n * Component: Sidebar\n * ------------------\n */\n.main-sidebar {\n  z-index: 1100;\n  height: 100vh;\n  overflow-y: hidden;\n}\n\n.sidebar {\n  padding-bottom: 0;\n  padding-top: 0;\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n  overflow-y: auto;\n  height: calc(100% - 4rem);\n}\n\n.user-panel {\n  position: relative;\n}\n\n[class*=\"sidebar-dark\"] .user-panel {\n  border-bottom: 1px solid #4f5962;\n}\n\n[class*=\"sidebar-light\"] .user-panel {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.user-panel,\n.user-panel .info {\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n.user-panel .image {\n  padding-left: 0.8rem;\n  display: inline-block;\n}\n\n.user-panel img {\n  width: 2.1rem;\n  height: auto;\n}\n\n.user-panel .info {\n  display: inline-block;\n  padding: 5px 5px 5px 10px;\n}\n\n.user-panel .status,\n.user-panel .dropdown-menu {\n  font-size: 0.875rem;\n}\n\n.nav-sidebar .nav-item > .nav-link {\n  margin-bottom: 0.2rem;\n}\n\n.nav-sidebar .nav-item > .nav-link .right {\n  transition: transform ease-in-out 0.3s;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .nav-sidebar .nav-item > .nav-link .right {\n    transition: none;\n  }\n}\n\n.nav-sidebar .nav-link > p > .right {\n  position: absolute;\n  right: 1rem;\n  top: 12px;\n}\n\n.nav-sidebar .menu-open > .nav-treeview {\n  display: block;\n}\n\n.nav-sidebar .menu-open > .nav-link .right {\n  -ms-transform: rotate(-90deg);\n  transform: rotate(-90deg);\n}\n\n.nav-sidebar > .nav-item {\n  margin-bottom: 0;\n}\n\n.nav-sidebar > .nav-item .nav-icon {\n  text-align: center;\n  width: 1.6rem;\n  font-size: 1.2rem;\n  margin-right: .2rem;\n}\n\n.nav-sidebar > .nav-item .float-right {\n  margin-top: 3px;\n}\n\n.nav-sidebar .nav-treeview {\n  display: none;\n  list-style: none;\n  padding: 0;\n}\n\n.nav-sidebar .nav-treeview > .nav-item > .nav-link > .nav-icon {\n  width: 1.6rem;\n}\n\n.nav-sidebar .nav-header {\n  font-size: .9rem;\n  padding: 0.5rem;\n}\n\n.nav-sidebar .nav-header:not(:first-of-type) {\n  padding: 1.7rem 1rem .5rem 1rem;\n}\n\n.nav-sidebar .nav-link p {\n  display: inline-block;\n  margin: 0;\n}\n\n#sidebar-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  display: none;\n  background-color: rgba(0, 0, 0, 0.1);\n  z-index: 1099;\n}\n\n@media (max-width: 991.98px) {\n  .sidebar-open #sidebar-overlay {\n    display: block;\n  }\n}\n\n.sidebar-dark-primary {\n  background-color: #343a40;\n}\n\n.sidebar-dark-primary .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-primary .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-primary .user-panel .status:hover, .sidebar-dark-primary .user-panel .status:focus, .sidebar-dark-primary .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-primary .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-primary .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-primary .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-primary .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-primary .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-primary .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-primary .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #007bff;\n}\n\n.sidebar-dark-primary .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-primary .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-primary .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-primary .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-primary .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-primary .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-primary .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-primary .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-primary {\n  background-color: #ffffff;\n}\n\n.sidebar-light-primary .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-primary .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-primary .user-panel .status:hover, .sidebar-light-primary .user-panel .status:focus, .sidebar-light-primary .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-primary .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-primary .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-primary .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-primary .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-primary .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-primary .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-primary .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #007bff;\n}\n\n.sidebar-light-primary .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-primary .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-primary .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-primary .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-primary .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-primary .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-primary .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-primary .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-secondary {\n  background-color: #343a40;\n}\n\n.sidebar-dark-secondary .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-secondary .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-secondary .user-panel .status:hover, .sidebar-dark-secondary .user-panel .status:focus, .sidebar-dark-secondary .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-secondary .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-secondary .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-secondary .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-secondary .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-secondary .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-secondary .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-secondary .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #6c757d;\n}\n\n.sidebar-dark-secondary .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-secondary .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-secondary .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-secondary .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-secondary .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-secondary .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-secondary .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-secondary .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-secondary {\n  background-color: #ffffff;\n}\n\n.sidebar-light-secondary .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-secondary .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-secondary .user-panel .status:hover, .sidebar-light-secondary .user-panel .status:focus, .sidebar-light-secondary .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-secondary .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-secondary .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-secondary .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-secondary .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-secondary .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-secondary .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-secondary .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #6c757d;\n}\n\n.sidebar-light-secondary .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-secondary .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-secondary .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-secondary .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-secondary .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-secondary .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-secondary .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-secondary .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-success {\n  background-color: #343a40;\n}\n\n.sidebar-dark-success .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-success .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-success .user-panel .status:hover, .sidebar-dark-success .user-panel .status:focus, .sidebar-dark-success .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-success .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-success .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-success .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-success .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-success .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-success .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-success .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #28a745;\n}\n\n.sidebar-dark-success .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-success .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-success .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-success .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-success .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-success .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-success .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-success .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-success {\n  background-color: #ffffff;\n}\n\n.sidebar-light-success .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-success .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-success .user-panel .status:hover, .sidebar-light-success .user-panel .status:focus, .sidebar-light-success .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-success .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-success .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-success .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-success .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-success .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-success .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-success .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #28a745;\n}\n\n.sidebar-light-success .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-success .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-success .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-success .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-success .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-success .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-success .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-success .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-info {\n  background-color: #343a40;\n}\n\n.sidebar-dark-info .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-info .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-info .user-panel .status:hover, .sidebar-dark-info .user-panel .status:focus, .sidebar-dark-info .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-info .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-info .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-info .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-info .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-info .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-info .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-info .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #17a2b8;\n}\n\n.sidebar-dark-info .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-info .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-info .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-info .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-info .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-info .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-info .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-info .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-info {\n  background-color: #ffffff;\n}\n\n.sidebar-light-info .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-info .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-info .user-panel .status:hover, .sidebar-light-info .user-panel .status:focus, .sidebar-light-info .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-info .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-info .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-info .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-info .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-info .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-info .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-info .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #17a2b8;\n}\n\n.sidebar-light-info .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-info .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-info .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-info .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-info .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-info .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-info .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-info .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-warning {\n  background-color: #343a40;\n}\n\n.sidebar-dark-warning .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-warning .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-warning .user-panel .status:hover, .sidebar-dark-warning .user-panel .status:focus, .sidebar-dark-warning .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-warning .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-warning .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-warning .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-warning .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-warning .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-warning .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-warning .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #ffc107;\n}\n\n.sidebar-dark-warning .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-warning .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-warning .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-warning .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-warning .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-warning .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-warning .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-warning .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-warning {\n  background-color: #ffffff;\n}\n\n.sidebar-light-warning .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-warning .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-warning .user-panel .status:hover, .sidebar-light-warning .user-panel .status:focus, .sidebar-light-warning .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-warning .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-warning .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-warning .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-warning .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-warning .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-warning .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-warning .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #ffc107;\n}\n\n.sidebar-light-warning .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-warning .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-warning .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-warning .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-warning .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-warning .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-warning .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-warning .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-danger {\n  background-color: #343a40;\n}\n\n.sidebar-dark-danger .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-danger .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-danger .user-panel .status:hover, .sidebar-dark-danger .user-panel .status:focus, .sidebar-dark-danger .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-danger .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-danger .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-danger .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-danger .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-danger .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-danger .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-danger .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #dc3545;\n}\n\n.sidebar-dark-danger .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-danger .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-danger .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-danger .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-danger .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-danger .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-danger .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-danger .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-danger {\n  background-color: #ffffff;\n}\n\n.sidebar-light-danger .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-danger .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-danger .user-panel .status:hover, .sidebar-light-danger .user-panel .status:focus, .sidebar-light-danger .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-danger .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-danger .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-danger .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-danger .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-danger .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-danger .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-danger .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #dc3545;\n}\n\n.sidebar-light-danger .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-danger .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-danger .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-danger .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-danger .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-danger .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-danger .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-danger .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-light {\n  background-color: #343a40;\n}\n\n.sidebar-dark-light .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-light .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-light .user-panel .status:hover, .sidebar-dark-light .user-panel .status:focus, .sidebar-dark-light .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-light .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-light .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-light .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-light .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-light .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-light .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-light .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #f8f9fa;\n}\n\n.sidebar-dark-light .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-light .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-light .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-light .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-light .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-light .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-light .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-light .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-light {\n  background-color: #ffffff;\n}\n\n.sidebar-light-light .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-light .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-light .user-panel .status:hover, .sidebar-light-light .user-panel .status:focus, .sidebar-light-light .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-light .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-light .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-light .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-light .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-light .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-light .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-light .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #f8f9fa;\n}\n\n.sidebar-light-light .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-light .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-light .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-light .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-light .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-light .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-light .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-light .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n.sidebar-dark-dark {\n  background-color: #343a40;\n}\n\n.sidebar-dark-dark .user-panel a:hover {\n  color: #ffffff;\n}\n\n.sidebar-dark-dark .user-panel .status {\n  color: #C2C7D0;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-dark .user-panel .status:hover, .sidebar-dark-dark .user-panel .status:focus, .sidebar-dark-dark .user-panel .status:active {\n  color: #ffffff;\n  background: rgba(247, 247, 247, 0.1);\n}\n\n.sidebar-dark-dark .user-panel .dropdown-menu {\n  border-color: rgba(242, 242, 242, 0.1);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-dark-dark .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-dark-dark .nav-sidebar > .nav-item > .nav-link:active, .sidebar-dark-dark .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-dark .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-dark-dark .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-dark .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #343a40;\n}\n\n.sidebar-dark-dark .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-dark-dark .nav-header {\n  color: #d0d4db;\n  background: inherit;\n}\n\n.sidebar-dark-dark .sidebar a {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-dark .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-dark-dark .nav-treeview > .nav-item > .nav-link {\n  color: #C2C7D0;\n}\n\n.sidebar-dark-dark .nav-treeview > .nav-item > .nav-link:hover {\n  color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.1);\n}\n\n.sidebar-dark-dark .nav-treeview > .nav-item > .nav-link.active, .sidebar-dark-dark .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #343a40;\n  background-color: rgba(255, 255, 255, 0.9);\n}\n\n.sidebar-light-dark {\n  background-color: #ffffff;\n}\n\n.sidebar-light-dark .user-panel a:hover {\n  color: #212529;\n}\n\n.sidebar-light-dark .user-panel .status {\n  color: #343a40;\n  background: #f4f4f5;\n}\n\n.sidebar-light-dark .user-panel .status:hover, .sidebar-light-dark .user-panel .status:focus, .sidebar-light-dark .user-panel .status:active {\n  color: #212529;\n  background: #ececed;\n}\n\n.sidebar-light-dark .user-panel .dropdown-menu {\n  border-color: #e7e7e8;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);\n}\n\n.sidebar-light-dark .user-panel .dropdown-item {\n  color: #212529;\n}\n\n.sidebar-light-dark .nav-sidebar > .nav-item > .nav-link:active, .sidebar-light-dark .nav-sidebar > .nav-item > .nav-link:focus {\n  color: #343a40;\n}\n\n.sidebar-light-dark .nav-sidebar > .nav-item.menu-open > .nav-link,\n.sidebar-light-dark .nav-sidebar > .nav-item:hover > .nav-link {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-dark .nav-sidebar > .nav-item > .nav-link.active {\n  color: #ffffff;\n  background-color: #343a40;\n}\n\n.sidebar-light-dark .nav-sidebar > .nav-item > .nav-treeview {\n  background: transparent;\n}\n\n.sidebar-light-dark .nav-header {\n  color: #292d32;\n  background: inherit;\n}\n\n.sidebar-light-dark .sidebar a {\n  color: #343a40;\n}\n\n.sidebar-light-dark .sidebar a:hover {\n  text-decoration: none;\n}\n\n.sidebar-light-dark .nav-treeview > .nav-item > .nav-link {\n  color: #777;\n}\n\n.sidebar-light-dark .nav-treeview > .nav-item > .nav-link.active, .sidebar-light-dark .nav-treeview > .nav-item > .nav-link.active:hover {\n  color: #212529;\n  background-color: #f4f4f5;\n}\n\n.sidebar-light-dark .nav-treeview > .nav-item > .nav-link:hover {\n  background-color: #f4f4f5;\n}\n\n/*\n * Component: Sidebar Mini\n */\n@media (min-width: 992px) {\n  .sidebar-mini .nav-sidebar,\n  .sidebar-mini .nav-sidebar > .nav-header,\n  .sidebar-mini .nav-sidebar .nav-link {\n    white-space: nowrap;\n    overflow: hidden;\n  }\n  .sidebar-mini.sidebar-collapse .d-hidden-mini {\n    display: none;\n  }\n  .sidebar-mini.sidebar-collapse .content-wrapper,\n  .sidebar-mini.sidebar-collapse .main-footer,\n  .sidebar-mini.sidebar-collapse .main-header {\n    margin-left: 4.6rem !important;\n  }\n  .sidebar-mini.sidebar-collapse .nav-sidebar .nav-header {\n    display: none;\n  }\n  .sidebar-mini.sidebar-collapse .sidebar .user-panel > .info,\n  .sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p,\n  .sidebar-mini.sidebar-collapse .brand-text {\n    opacity: 0;\n    margin-left: -10px;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar, .sidebar-mini.sidebar-collapse .main-sidebar:before {\n    margin-left: 0;\n    width: 4.6rem;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar .user-panel .image {\n    float: none;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover {\n    width: 250px;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel {\n    text-align: left;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel .image {\n    float: left;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel > .info,\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text {\n    opacity: 1;\n    margin-left: 0;\n    display: inline-block;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-image {\n    margin-right: .5rem;\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .sidebar-form,\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel > .info {\n    display: block !important;\n    -webkit-transform: translateZ(0);\n  }\n  .sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar > .nav-item > .nav-link > span {\n    display: inline-block !important;\n  }\n  .sidebar-mini.sidebar-collapse .visible-sidebar-mini {\n    display: block !important;\n  }\n}\n\n.nav-sidebar {\n  position: relative;\n}\n\n.nav-sidebar:hover {\n  overflow: visible;\n}\n\n.sidebar-form,\n.nav-sidebar > .nav-header {\n  overflow: hidden;\n  text-overflow: clip;\n}\n\n.nav-sidebar .nav-item > .nav-link {\n  position: relative;\n}\n\n.nav-sidebar .nav-item > .nav-link > .float-right {\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  margin-top: -7px;\n}\n\n.sidebar .nav-link p,\n.main-sidebar .brand-text,\n.sidebar .user-panel .info {\n  transition: margin-left 0.3s linear, opacity 0.5s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .sidebar .nav-link p,\n  .main-sidebar .brand-text,\n  .sidebar .user-panel .info {\n    transition: none;\n  }\n}\n\n/*\n * Component: Control sidebar. By default, this is the right sidebar.\n */\n.control-sidebar {\n  position: absolute;\n  top: 2.5rem;\n  z-index: 830;\n}\n\n.control-sidebar, .control-sidebar:before {\n  width: 250px;\n  right: -250px;\n  bottom: 0;\n  transition: right 0.3s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .control-sidebar, .control-sidebar:before {\n    transition: none;\n  }\n}\n\n.control-sidebar:before {\n  top: 0;\n  display: block;\n  position: fixed;\n  content: \" \";\n  z-index: -1;\n}\n\n@media (min-width: 768px) {\n  .control-sidebar-open .control-sidebar, .control-sidebar-open .control-sidebar:before {\n    right: 0;\n  }\n  .control-sidebar-open .content-wrapper,\n  .control-sidebar-open .main-footer {\n    margin-right: 250px;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .control-sidebar-open .control-sidebar, .control-sidebar-open .control-sidebar:before {\n    right: 0;\n  }\n}\n\n.control-sidebar-slide-open .control-sidebar, .control-sidebar-slide-open .control-sidebar:before {\n  right: 0;\n}\n\n.control-sidebar-dark,\n.control-sidebar-dark a,\n.control-sidebar-dark .nav-link {\n  color: #C2C7D0;\n}\n\n.control-sidebar-dark, .control-sidebar-dark:before {\n  background: #343a40;\n}\n\n.control-sidebar-dark a:hover {\n  color: #ffffff;\n}\n\n.control-sidebar-dark h1,\n.control-sidebar-dark h2,\n.control-sidebar-dark h3,\n.control-sidebar-dark h4,\n.control-sidebar-dark h5,\n.control-sidebar-dark h6,\n.control-sidebar-dark label {\n  color: #ffffff;\n}\n\n.control-sidebar-dark .nav-tabs {\n  border-bottom: 0;\n  background-color: rgba(255, 255, 255, 0.1);\n  margin-bottom: 5px;\n}\n\n.control-sidebar-dark .nav-tabs .nav-item {\n  margin: 0;\n}\n\n.control-sidebar-dark .nav-tabs .nav-link {\n  position: relative;\n  border-radius: 0;\n  text-align: center;\n  padding: 10px 20px;\n}\n\n.control-sidebar-dark .nav-tabs .nav-link, .control-sidebar-dark .nav-tabs .nav-link:hover, .control-sidebar-dark .nav-tabs .nav-link:active, .control-sidebar-dark .nav-tabs .nav-link:focus, .control-sidebar-dark .nav-tabs .nav-link.active {\n  border: 0;\n}\n\n.control-sidebar-dark .nav-tabs .nav-link:hover, .control-sidebar-dark .nav-tabs .nav-link:active, .control-sidebar-dark .nav-tabs .nav-link:focus, .control-sidebar-dark .nav-tabs .nav-link.active {\n  border-left-color: transparent;\n  border-bottom-color: transparent;\n  border-top-color: transparent;\n  color: #ffffff;\n}\n\n.control-sidebar-dark .nav-tabs .nav-link.active {\n  background-color: #343a40;\n}\n\n.control-sidebar-dark .tab-pane {\n  padding: 10px 15px;\n}\n\n.control-sidebar-light {\n  color: #4b545c;\n}\n\n.control-sidebar-light, .control-sidebar-light:before {\n  background: #ffffff;\n  border-left: 1px solid #adb5bd;\n}\n\n/*\n * Component: Dropdown menus\n * -------------------------\n */\n.dropdown-item-title {\n  font-size: 1rem;\n  margin: 0;\n}\n\n.dropdown-menu-lg {\n  min-width: 280px;\n  max-width: 300px;\n  padding: 0;\n}\n\n.dropdown-menu-lg .dropdown-divider {\n  margin: 0;\n}\n\n.dropdown-menu-lg .dropdown-item {\n  padding: 0.5rem 1rem;\n}\n\n.dropdown-menu-lg p {\n  white-space: normal;\n  margin: 0;\n}\n\n.dropdown-footer,\n.dropdown-header {\n  text-align: center;\n  display: block;\n  padding: 0.5rem 1rem;\n  font-size: 0.875rem;\n}\n\n/* Add fade animation to dropdown menus by appending\n the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/\n.open:not(.dropup) > .animated-dropdown-menu {\n  backface-visibility: visible !important;\n  animation: flipInX 0.7s both;\n}\n\n@keyframes flipInX {\n  0% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transition-timing-function: ease-in;\n  }\n  60% {\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    transform: perspective(400px);\n  }\n}\n\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n  }\n}\n\n/* Fix dropdown menu in navbars */\n.navbar-custom-menu > .navbar-nav > li {\n  position: relative;\n}\n\n.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n  position: absolute;\n  right: 0;\n  left: auto;\n}\n\n@media (max-width: 767.98px) {\n  .navbar-custom-menu > .navbar-nav {\n    float: right;\n  }\n  .navbar-custom-menu > .navbar-nav > li {\n    position: static;\n  }\n  .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {\n    position: absolute;\n    right: 5%;\n    left: auto;\n    border: 1px solid #ddd;\n    background: #ffffff;\n  }\n}\n\n/*\n * Component: Form\n * ---------------\n */\n.form-group.has-icon {\n  position: relative;\n}\n\n.form-group.has-icon .form-control {\n  padding-right: 35px;\n}\n\n.form-group.has-icon .form-icon {\n  cursor: pointer;\n  position: absolute;\n  right: 3px;\n  top: 0;\n  padding: 0.375rem 0.75rem;\n  border: 0;\n  background-color: transparent;\n  font-size: 1rem;\n}\n\n/* button groups */\n.btn-group-vertical .btn.btn-flat:first-of-type, .btn-group-vertical .btn.btn-flat:last-of-type {\n  border-radius: 0;\n}\n\n/* Support Font Awesome icons in form-control */\n.form-control-feedback.fa {\n  line-height: calc(2.25rem + 2px);\n}\n\n.input-lg + .form-control-feedback.fa,\n.input-group-lg + .form-control-feedback.fa,\n.form-group-lg .form-control + .form-control-feedback.fa {\n  line-height: calc(2.875rem + 2px);\n}\n\n.input-sm + .form-control-feedback.fa,\n.input-group-sm + .form-control-feedback.fa,\n.form-group-sm .form-control + .form-control-feedback.fa {\n  line-height: calc(1.8125rem + 2px);\n}\n\nlabel:not(.form-check-label):not(.custom-file-label) {\n  font-weight: 700;\n}\n\n/*\n * Component: Progress Bar\n * -----------------------\n */\n.progress {\n  box-shadow: none;\n  border-radius: 1px;\n}\n\n.progress-sm {\n  height: 10px;\n}\n\n.progress-xs {\n  height: 7px;\n}\n\n.progress-xxs {\n  height: 3px;\n}\n\n.progress.vertical {\n  position: relative;\n  width: 30px;\n  height: 200px;\n  display: inline-block;\n  margin-right: 10px;\n}\n\n.progress.vertical > .progress-bar {\n  width: 100%;\n  position: absolute;\n  bottom: 0;\n}\n\n.progress.vertical.sm, .progress.vertical.progress-sm {\n  width: 20px;\n}\n\n.progress.vertical.xs, .progress.vertical.progress-xs {\n  width: 10px;\n}\n\n.progress.vertical.xxs, .progress.vertical.progress-xxs {\n  width: 3px;\n}\n\n.table tr > td .progress {\n  margin: 0;\n}\n\n/*\n * Component: Small Box\n * --------------------\n */\n.small-box {\n  border-radius: 0.25rem;\n  box-shadow: 0 0 1px rgba(0, 0, 0, 0.125), 0 1px 3px rgba(0, 0, 0, 0.2);\n  position: relative;\n  display: block;\n  margin-bottom: 20px;\n}\n\n.small-box > .inner {\n  padding: 10px;\n}\n\n.small-box > .small-box-footer {\n  position: relative;\n  text-align: center;\n  padding: 3px 0;\n  color: #ffffff;\n  color: rgba(255, 255, 255, 0.8);\n  display: block;\n  z-index: 10;\n  background: rgba(0, 0, 0, 0.1);\n  text-decoration: none;\n}\n\n.small-box > .small-box-footer:hover {\n  color: #ffffff;\n  background: rgba(0, 0, 0, 0.15);\n}\n\n.small-box h3 {\n  font-size: 38px;\n  font-weight: bold;\n  margin: 0 0 10px 0;\n  white-space: nowrap;\n  padding: 0;\n}\n\n.small-box p {\n  font-size: 15px;\n}\n\n.small-box p > small {\n  display: block;\n  color: #f9f9f9;\n  font-size: 13px;\n  margin-top: 5px;\n}\n\n.small-box h3, .small-box p {\n  z-index: 5;\n}\n\n.small-box .icon {\n  transition: all 0.3s linear;\n  position: absolute;\n  top: -10px;\n  right: 10px;\n  z-index: 0;\n  font-size: 90px;\n  color: rgba(0, 0, 0, 0.15);\n}\n\n.small-box:hover {\n  text-decoration: none;\n}\n\n.small-box:hover .icon {\n  font-size: 95px;\n}\n\n@media (max-width: 767.98px) {\n  .small-box {\n    text-align: center;\n  }\n  .small-box .icon {\n    display: none;\n  }\n  .small-box p {\n    font-size: 12px;\n  }\n}\n\n/*\n * Component: Box\n * --------------\n */\n.card {\n  box-shadow: 0 0 1px rgba(0, 0, 0, 0.125), 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.card.bg-dark,\n.card.bg-dark .card-body {\n  color: #ffffff;\n}\n\n.card.collapsed-card .card-body,\n.card.collapsed-card .card-footer {\n  display: none;\n}\n\n.card .nav.flex-column > li {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n  margin: 0;\n}\n\n.card .nav.flex-column > li:last-of-type {\n  border-bottom: none;\n}\n\n.card.height-control .card-body {\n  max-height: 300px;\n  overflow: auto;\n}\n\n.card .border-right {\n  border-right: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card .border-left {\n  border-left: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card > .overlay,\n.card > .loading-img,\n.overlay-wrapper > .overlay,\n.overlay-wrapper > .loading-img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.card .overlay,\n.overlay-wrapper .overlay {\n  z-index: 50;\n  background: rgba(255, 255, 255, 0.7);\n  border-radius: 0.25rem;\n}\n\n.card .overlay > .fa,\n.overlay-wrapper .overlay > .fa {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin-left: -15px;\n  margin-top: -15px;\n  color: #000;\n  font-size: 30px;\n}\n\n.card .overlay.dark,\n.overlay-wrapper .overlay.dark {\n  background: rgba(0, 0, 0, 0.5);\n}\n\n.card-header::after,\n.card-body::after,\n.card-footer::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.card-header {\n  position: relative;\n  background-color: transparent;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.collapsed-card .card-header {\n  border-bottom: none;\n}\n\n.card-header > .card-tools {\n  position: absolute;\n  right: 1rem;\n  top: .5rem;\n}\n\n.card-header > .card-tools [data-toggle=\"tooltip\"] {\n  position: relative;\n}\n\n.card-title {\n  font-size: 1.25rem;\n  font-weight: 400;\n  margin: 0;\n}\n\n.btn-tool {\n  padding: .25rem .5rem;\n  font-size: 0.875rem;\n  background: transparent;\n  color: #adb5bd;\n}\n\n.btn-group.show .btn-tool, .btn-tool:hover {\n  color: #495057;\n}\n\n.show .btn-tool, .btn-tool:focus {\n  box-shadow: none !important;\n}\n\n.card-body > .table {\n  margin-bottom: 0;\n}\n\n.card-body > .table > thead > tr > th,\n.card-body > .table > thead > tr > td {\n  border-top-width: 0;\n}\n\n.card-body .fc {\n  margin-top: 5px;\n}\n\n.card-body .full-width-chart {\n  margin: -19px;\n}\n\n.card-body.p-0 .full-width-chart {\n  margin: -9px;\n}\n\n.chart-legend {\n  margin: 10px 0;\n}\n\n@media (max-width: 576px) {\n  .chart-legend > li {\n    float: left;\n    margin-right: 10px;\n  }\n}\n\n.card-comments {\n  background: #f7f7f7;\n}\n\n.card-comments .card-comment {\n  padding: 8px 0;\n  border-bottom: 1px solid #eee;\n}\n\n.card-comments .card-comment::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.card-comments .card-comment:last-of-type {\n  border-bottom: 0;\n}\n\n.card-comments .card-comment:first-of-type {\n  padding-top: 0;\n}\n\n.card-comments .card-comment img {\n  float: left;\n}\n\n.card-comments .comment-text {\n  margin-left: 40px;\n  color: #555;\n}\n\n.card-comments .username {\n  color: #444;\n  display: block;\n  font-weight: 600;\n}\n\n.card-comments .text-muted {\n  font-weight: 400;\n  font-size: 12px;\n}\n\n.todo-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow: auto;\n}\n\n.todo-list > li {\n  border-radius: 2px;\n  padding: 10px;\n  background: #f4f4f4;\n  margin-bottom: 2px;\n  border-left: 2px solid #e6e7e8;\n  color: #444;\n}\n\n.todo-list > li:last-of-type {\n  margin-bottom: 0;\n}\n\n.todo-list > li > input[type='checkbox'] {\n  margin: 0 10px 0 5px;\n}\n\n.todo-list > li .text {\n  display: inline-block;\n  margin-left: 5px;\n  font-weight: 600;\n}\n\n.todo-list > li .label {\n  margin-left: 10px;\n  font-size: 9px;\n}\n\n.todo-list > li .tools {\n  display: none;\n  float: right;\n  color: #dc3545;\n}\n\n.todo-list > li .tools > .fa, .todo-list > li .tools > .glyphicon, .todo-list > li .tools > .ion {\n  margin-right: 5px;\n  cursor: pointer;\n}\n\n.todo-list > li:hover .tools {\n  display: inline-block;\n}\n\n.todo-list > li.done {\n  color: #999;\n}\n\n.todo-list > li.done .text {\n  text-decoration: line-through;\n  font-weight: 500;\n}\n\n.todo-list > li.done .label {\n  background: #adb5bd !important;\n}\n\n.todo-list .danger {\n  border-left-color: #dc3545;\n}\n\n.todo-list .warning {\n  border-left-color: #ffc107;\n}\n\n.todo-list .info {\n  border-left-color: #17a2b8;\n}\n\n.todo-list .success {\n  border-left-color: #28a745;\n}\n\n.todo-list .primary {\n  border-left-color: #007bff;\n}\n\n.todo-list .handle {\n  display: inline-block;\n  cursor: move;\n  margin: 0 5px;\n}\n\n.card-input {\n  max-width: 200px;\n}\n\n.card-primary:not(.card-outline) .card-header {\n  background-color: #007bff;\n  border-bottom: 0;\n}\n\n.card-primary:not(.card-outline) .card-header,\n.card-primary:not(.card-outline) .card-header a {\n  color: #ffffff;\n}\n\n.card-primary.card-outline {\n  border-top: 3px solid #007bff;\n}\n\n.bg-primary .btn-tool, .label-primary .btn-tool,\n.bg-primary-gradient .btn-tool,\n.card-primary:not(.card-outline) .btn-tool {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.bg-primary .btn-tool:hover, .label-primary .btn-tool:hover,\n.bg-primary-gradient .btn-tool:hover,\n.card-primary:not(.card-outline) .btn-tool:hover {\n  color: #ffffff;\n}\n\n.card-secondary:not(.card-outline) .card-header {\n  background-color: #6c757d;\n  border-bottom: 0;\n}\n\n.card-secondary:not(.card-outline) .card-header,\n.card-secondary:not(.card-outline) .card-header a {\n  color: #ffffff;\n}\n\n.card-secondary.card-outline {\n  border-top: 3px solid #6c757d;\n}\n\n.bg-secondary .btn-tool,\n.bg-secondary-gradient .btn-tool,\n.card-secondary:not(.card-outline) .btn-tool {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.bg-secondary .btn-tool:hover,\n.bg-secondary-gradient .btn-tool:hover,\n.card-secondary:not(.card-outline) .btn-tool:hover {\n  color: #ffffff;\n}\n\n.card-success:not(.card-outline) .card-header {\n  background-color: #28a745;\n  border-bottom: 0;\n}\n\n.card-success:not(.card-outline) .card-header,\n.card-success:not(.card-outline) .card-header a {\n  color: #ffffff;\n}\n\n.card-success.card-outline {\n  border-top: 3px solid #28a745;\n}\n\n.bg-success .btn-tool, .alert-success .btn-tool, .label-success .btn-tool,\n.bg-success-gradient .btn-tool,\n.card-success:not(.card-outline) .btn-tool {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.bg-success .btn-tool:hover, .alert-success .btn-tool:hover, .label-success .btn-tool:hover,\n.bg-success-gradient .btn-tool:hover,\n.card-success:not(.card-outline) .btn-tool:hover {\n  color: #ffffff;\n}\n\n.card-info:not(.card-outline) .card-header {\n  background-color: #17a2b8;\n  border-bottom: 0;\n}\n\n.card-info:not(.card-outline) .card-header,\n.card-info:not(.card-outline) .card-header a {\n  color: #ffffff;\n}\n\n.card-info.card-outline {\n  border-top: 3px solid #17a2b8;\n}\n\n.bg-info .btn-tool, .alert-info .btn-tool, .label-info .btn-tool,\n.bg-info-gradient .btn-tool,\n.card-info:not(.card-outline) .btn-tool {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.bg-info .btn-tool:hover, .alert-info .btn-tool:hover, .label-info .btn-tool:hover,\n.bg-info-gradient .btn-tool:hover,\n.card-info:not(.card-outline) .btn-tool:hover {\n  color: #ffffff;\n}\n\n.card-warning:not(.card-outline) .card-header {\n  background-color: #ffc107;\n  border-bottom: 0;\n}\n\n.card-warning:not(.card-outline) .card-header,\n.card-warning:not(.card-outline) .card-header a {\n  color: #1F2D3D;\n}\n\n.card-warning.card-outline {\n  border-top: 3px solid #ffc107;\n}\n\n.bg-warning .btn-tool, .alert-warning .btn-tool, .label-warning .btn-tool,\n.bg-warning-gradient .btn-tool,\n.card-warning:not(.card-outline) .btn-tool {\n  color: rgba(31, 45, 61, 0.8);\n}\n\n.bg-warning .btn-tool:hover, .alert-warning .btn-tool:hover, .label-warning .btn-tool:hover,\n.bg-warning-gradient .btn-tool:hover,\n.card-warning:not(.card-outline) .btn-tool:hover {\n  color: #1F2D3D;\n}\n\n.card-danger:not(.card-outline) .card-header {\n  background-color: #dc3545;\n  border-bottom: 0;\n}\n\n.card-danger:not(.card-outline) .card-header,\n.card-danger:not(.card-outline) .card-header a {\n  color: #ffffff;\n}\n\n.card-danger.card-outline {\n  border-top: 3px solid #dc3545;\n}\n\n.bg-danger .btn-tool, .alert-danger .btn-tool, .alert-error .btn-tool, .label-danger .btn-tool,\n.bg-danger-gradient .btn-tool,\n.card-danger:not(.card-outline) .btn-tool {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.bg-danger .btn-tool:hover, .alert-danger .btn-tool:hover, .alert-error .btn-tool:hover, .label-danger .btn-tool:hover,\n.bg-danger-gradient .btn-tool:hover,\n.card-danger:not(.card-outline) .btn-tool:hover {\n  color: #ffffff;\n}\n\n.card-light:not(.card-outline) .card-header {\n  background-color: #f8f9fa;\n  border-bottom: 0;\n}\n\n.card-light:not(.card-outline) .card-header,\n.card-light:not(.card-outline) .card-header a {\n  color: #1F2D3D;\n}\n\n.card-light.card-outline {\n  border-top: 3px solid #f8f9fa;\n}\n\n.bg-light .btn-tool,\n.bg-light-gradient .btn-tool,\n.card-light:not(.card-outline) .btn-tool {\n  color: rgba(31, 45, 61, 0.8);\n}\n\n.bg-light .btn-tool:hover,\n.bg-light-gradient .btn-tool:hover,\n.card-light:not(.card-outline) .btn-tool:hover {\n  color: #1F2D3D;\n}\n\n.card-dark:not(.card-outline) .card-header {\n  background-color: #343a40;\n  border-bottom: 0;\n}\n\n.card-dark:not(.card-outline) .card-header,\n.card-dark:not(.card-outline) .card-header a {\n  color: #ffffff;\n}\n\n.card-dark.card-outline {\n  border-top: 3px solid #343a40;\n}\n\n.bg-dark .btn-tool,\n.bg-dark-gradient .btn-tool,\n.card-dark:not(.card-outline) .btn-tool {\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.bg-dark .btn-tool:hover,\n.bg-dark-gradient .btn-tool:hover,\n.card-dark:not(.card-outline) .btn-tool:hover {\n  color: #ffffff;\n}\n\n/*\n * Component: Info Box\n * -------------------\n */\n.info-box {\n  box-shadow: 0 0 1px rgba(0, 0, 0, 0.125), 0 1px 3px rgba(0, 0, 0, 0.2);\n  border-radius: 0.25rem;\n  padding: .5rem;\n  min-height: 80px;\n  background: #ffffff;\n}\n\n.info-box .progress {\n  background-color: rgba(0, 0, 0, 0.125);\n  margin: 5px 0;\n  height: 2px;\n}\n\n.info-box .progress .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box-icon {\n  border-radius: 0.25rem;\n  display: block;\n  width: 70px;\n  text-align: center;\n  font-size: 30px;\n}\n\n.info-box-icon > img {\n  max-width: 100%;\n}\n\n.info-box-content {\n  padding: 5px 10px;\n  flex: 1;\n}\n\n.info-box-number {\n  display: block;\n  font-weight: 700;\n}\n\n.progress-description,\n.info-box-text {\n  display: block;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.info-box.bg-primary, .info-box.label-primary,\n.info-box.bg-primary-gradient {\n  color: #ffffff;\n}\n\n.info-box.bg-primary .progress-bar, .info-box.label-primary .progress-bar,\n.info-box.bg-primary-gradient .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box.bg-secondary,\n.info-box.bg-secondary-gradient {\n  color: #ffffff;\n}\n\n.info-box.bg-secondary .progress-bar,\n.info-box.bg-secondary-gradient .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box.bg-success, .info-box.alert-success, .info-box.label-success,\n.info-box.bg-success-gradient {\n  color: #ffffff;\n}\n\n.info-box.bg-success .progress-bar, .info-box.alert-success .progress-bar, .info-box.label-success .progress-bar,\n.info-box.bg-success-gradient .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box.bg-info, .info-box.alert-info, .info-box.label-info,\n.info-box.bg-info-gradient {\n  color: #ffffff;\n}\n\n.info-box.bg-info .progress-bar, .info-box.alert-info .progress-bar, .info-box.label-info .progress-bar,\n.info-box.bg-info-gradient .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box.bg-warning, .info-box.alert-warning, .info-box.label-warning,\n.info-box.bg-warning-gradient {\n  color: #1F2D3D;\n}\n\n.info-box.bg-warning .progress-bar, .info-box.alert-warning .progress-bar, .info-box.label-warning .progress-bar,\n.info-box.bg-warning-gradient .progress-bar {\n  background-color: #1F2D3D;\n}\n\n.info-box.bg-danger, .info-box.alert-danger,\n.info-box.alert-error, .info-box.label-danger,\n.info-box.bg-danger-gradient {\n  color: #ffffff;\n}\n\n.info-box.bg-danger .progress-bar, .info-box.alert-danger .progress-bar, .info-box.alert-error .progress-bar, .info-box.label-danger .progress-bar,\n.info-box.bg-danger-gradient .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box.bg-light,\n.info-box.bg-light-gradient {\n  color: #1F2D3D;\n}\n\n.info-box.bg-light .progress-bar,\n.info-box.bg-light-gradient .progress-bar {\n  background-color: #1F2D3D;\n}\n\n.info-box.bg-dark,\n.info-box.bg-dark-gradient {\n  color: #ffffff;\n}\n\n.info-box.bg-dark .progress-bar,\n.info-box.bg-dark-gradient .progress-bar {\n  background-color: #ffffff;\n}\n\n.info-box-more {\n  display: block;\n}\n\n.progress-description {\n  margin: 0;\n}\n\n/*\n * Component: Timeline\n * -------------------\n */\n.timeline {\n  position: relative;\n  margin: 0 0 30px 0;\n  padding: 0;\n  list-style: none;\n}\n\n.timeline:before {\n  content: '';\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 4px;\n  background: #ddd;\n  left: 31px;\n  margin: 0;\n  border-radius: 0.25rem;\n}\n\n.timeline > li {\n  position: relative;\n  margin-right: 10px;\n  margin-bottom: 15px;\n}\n\n.timeline > li::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.timeline > li > .timeline-item {\n  box-shadow: 0 0 1px rgba(0, 0, 0, 0.125), 0 1px 3px rgba(0, 0, 0, 0.2);\n  border-radius: 0.25rem;\n  margin-top: 0;\n  background: #ffffff;\n  color: #444;\n  margin-left: 60px;\n  margin-right: 15px;\n  padding: 0;\n  position: relative;\n}\n\n.timeline > li > .timeline-item > .time {\n  color: #999;\n  float: right;\n  padding: 10px;\n  font-size: 12px;\n}\n\n.timeline > li > .timeline-item > .timeline-header {\n  margin: 0;\n  color: #555;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n  padding: 10px;\n  font-size: 16px;\n  line-height: 1.1;\n}\n\n.timeline > li > .timeline-item > .timeline-header > a {\n  font-weight: 600;\n}\n\n.timeline > li > .timeline-item > .timeline-body, .timeline > li > .timeline-item > .timeline-footer {\n  padding: 10px;\n}\n\n.timeline > li > .fa,\n.timeline > li > .glyphicon,\n.timeline > li > .ion {\n  width: 30px;\n  height: 30px;\n  font-size: 15px;\n  line-height: 30px;\n  position: absolute;\n  background: #adb5bd;\n  border-radius: 50%;\n  text-align: center;\n  left: 18px;\n  top: 0;\n}\n\n.timeline > .time-label > span {\n  font-weight: 600;\n  padding: 5px;\n  display: inline-block;\n  background-color: #ffffff;\n  border-radius: 4px;\n}\n\n.timeline-inverse > li > .timeline-item {\n  background: #f8f9fa;\n  border: 1px solid #ddd;\n  box-shadow: none;\n}\n\n.timeline-inverse > li > .timeline-item > .timeline-header {\n  border-bottom-color: #ddd;\n}\n\n/*\n * Component: Button\n * -----------------\n */\n.btn.btn-flat {\n  border-radius: 0;\n  box-shadow: none;\n  border-width: 1px;\n}\n\n.btn.btn-file {\n  position: relative;\n  overflow: hidden;\n}\n\n.btn.btn-file > input[type='file'] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  min-width: 100%;\n  min-height: 100%;\n  font-size: 100px;\n  text-align: right;\n  opacity: 0;\n  outline: none;\n  background: white;\n  cursor: inherit;\n  display: block;\n}\n\n.btn-default {\n  background-color: #f4f4f4;\n  color: #444;\n  border-color: #ddd;\n}\n\n.btn-default:hover, .btn-default:active, .btn-default.hover {\n  background-color: #e7e7e7;\n}\n\n.btn-app {\n  border-radius: 3px;\n  position: relative;\n  padding: 15px 5px;\n  margin: 0 0 10px 10px;\n  min-width: 80px;\n  height: 60px;\n  text-align: center;\n  color: #666;\n  border: 1px solid #ddd;\n  background-color: #f4f4f4;\n  font-size: 12px;\n}\n\n.btn-app > .fa,\n.btn-app > .glyphicon,\n.btn-app > .ion {\n  font-size: 20px;\n  display: block;\n}\n\n.btn-app:hover {\n  background: #f4f4f4;\n  color: #444;\n  border-color: #aaa;\n}\n\n.btn-app:active, .btn-app:focus {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-app > .badge {\n  position: absolute;\n  top: -3px;\n  right: -10px;\n  font-size: 10px;\n  font-weight: 400;\n}\n\n/*\n * Component: Callout\n * ------------------\n */\n.callout {\n  border-radius: 0.25rem;\n  background-color: #ffffff;\n  padding: .5rem 1rem .5rem .5rem;\n  border-left: 5px solid #eee;\n}\n\n.callout a {\n  color: #ffffff;\n  text-decoration: underline;\n}\n\n.callout a:hover {\n  color: #eee;\n}\n\n.callout p:last-child {\n  margin-bottom: 0;\n}\n\n.callout.callout-danger {\n  border-left-color: #bd2130;\n}\n\n.callout.callout-warning {\n  border-left-color: #d39e00;\n}\n\n.callout.callout-info {\n  border-left-color: #117a8b;\n}\n\n.callout.callout-success {\n  border-left-color: #1e7e34;\n}\n\n/*\n * Component: alert\n * ----------------\n */\n.alert .icon {\n  margin-right: 10px;\n}\n\n.alert .close, .alert .mailbox-attachment-close {\n  color: #000;\n  opacity: .2;\n}\n\n.alert .close:hover, .alert .mailbox-attachment-close:hover {\n  opacity: .5;\n}\n\n.alert a {\n  color: #ffffff;\n  text-decoration: underline;\n}\n\n.alert-success {\n  border-color: #23923d;\n}\n\n.alert-danger,\n.alert-error {\n  border-color: #d32535;\n}\n\n.alert-warning {\n  border-color: #edb100;\n}\n\n.alert-info {\n  border-color: #148ea1;\n}\n\n/*\n * Component: Nav\n * --------------\n */\n.nav-pills .nav-link {\n  color: #6c757d;\n}\n\n.nav-pills .nav-link:not(.active):hover {\n  color: #007bff;\n}\n\n/*\n * Component: Products List\n * ------------------------\n */\n.products-list {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n.products-list > .item {\n  border-radius: 0.25rem;\n  padding: 10px 0;\n  background: #ffffff;\n}\n\n.products-list > .item::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.products-list .product-img {\n  float: left;\n}\n\n.products-list .product-img img {\n  width: 50px;\n  height: 50px;\n}\n\n.products-list .product-info {\n  margin-left: 60px;\n}\n\n.products-list .product-title {\n  font-weight: 600;\n}\n\n.products-list .product-description {\n  display: block;\n  color: #6c757d;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.product-list-in-card > .item {\n  border-radius: 0;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.product-list-in-card > .item:last-of-type {\n  border-bottom-width: 0;\n}\n\n/*\n * Component: Table\n * ----------------\n */\n.table.no-border,\n.table.no-border td,\n.table.no-border th {\n  border: 0;\n}\n\n.table.text-center, .table.text-center td, .table.text-center th {\n  text-align: center;\n}\n\n.table-valign-middle thead > tr > th,\n.table-valign-middle thead > tr > td,\n.table-valign-middle tbody > tr > th,\n.table-valign-middle tbody > tr > td {\n  vertical-align: middle;\n}\n\n/*\n * Component: Label\n * ----------------\n */\n.label-default {\n  background-color: #adb5bd;\n  color: #444;\n}\n\n/*\n * Component: Direct Chat\n * ----------------------\n */\n.direct-chat .card-body {\n  position: relative;\n  overflow-x: hidden;\n  padding: 0;\n}\n\n.direct-chat.chat-pane-open .direct-chat-contacts {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n\n.direct-chat-messages {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n  padding: 10px;\n  height: 250px;\n  overflow: auto;\n}\n\n.direct-chat-msg,\n.direct-chat-text {\n  display: block;\n}\n\n.direct-chat-msg {\n  margin-bottom: 10px;\n}\n\n.direct-chat-msg::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.direct-chat-messages,\n.direct-chat-contacts {\n  transition: transform .5s ease-in-out;\n}\n\n.direct-chat-text {\n  border-radius: 0.3rem;\n  position: relative;\n  padding: 5px 10px;\n  background: #d2d6de;\n  border: 1px solid #d2d6de;\n  margin: 5px 0 0 50px;\n  color: #444;\n}\n\n.direct-chat-text:after, .direct-chat-text:before {\n  position: absolute;\n  right: 100%;\n  top: 15px;\n  border: solid transparent;\n  border-right-color: #d2d6de;\n  content: ' ';\n  height: 0;\n  width: 0;\n  pointer-events: none;\n}\n\n.direct-chat-text:after {\n  border-width: 5px;\n  margin-top: -5px;\n}\n\n.direct-chat-text:before {\n  border-width: 6px;\n  margin-top: -6px;\n}\n\n.right .direct-chat-text {\n  margin-right: 50px;\n  margin-left: 0;\n}\n\n.right .direct-chat-text:after, .right .direct-chat-text:before {\n  right: auto;\n  left: 100%;\n  border-right-color: transparent;\n  border-left-color: #d2d6de;\n}\n\n.direct-chat-img {\n  border-radius: 50%;\n  float: left;\n  width: 40px;\n  height: 40px;\n}\n\n.right .direct-chat-img {\n  float: right;\n}\n\n.direct-chat-info {\n  display: block;\n  margin-bottom: 2px;\n  font-size: 0.875rem;\n}\n\n.direct-chat-name {\n  font-weight: 600;\n}\n\n.direct-chat-timestamp {\n  color: #999;\n}\n\n.direct-chat-contacts-open .direct-chat-contacts {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n\n.direct-chat-contacts {\n  -webkit-transform: translate(101%, 0);\n  -ms-transform: translate(101%, 0);\n  transform: translate(101%, 0);\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  height: 250px;\n  width: 100%;\n  background: #222d32;\n  color: #ffffff;\n  overflow: auto;\n}\n\n.contacts-list > li {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  padding: 10px;\n  margin: 0;\n}\n\n.contacts-list > li::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.contacts-list > li:last-of-type {\n  border-bottom: none;\n}\n\n.contacts-list-img {\n  border-radius: 50%;\n  width: 40px;\n  float: left;\n}\n\n.contacts-list-info {\n  margin-left: 45px;\n  color: #ffffff;\n}\n\n.contacts-list-name,\n.contacts-list-status {\n  display: block;\n}\n\n.contacts-list-name {\n  font-weight: 600;\n}\n\n.contacts-list-status {\n  font-size: 0.875rem;\n}\n\n.contacts-list-date {\n  color: #aaa;\n  font-weight: normal;\n}\n\n.contacts-list-msg {\n  color: #999;\n}\n\n.direct-chat-danger .right > .direct-chat-text {\n  background: #dc3545;\n  border-color: #dc3545;\n  color: #ffffff;\n}\n\n.direct-chat-danger .right > .direct-chat-text:after, .direct-chat-danger .right > .direct-chat-text:before {\n  border-left-color: #dc3545;\n}\n\n.direct-chat-primary .right > .direct-chat-text {\n  background: #007bff;\n  border-color: #007bff;\n  color: #ffffff;\n}\n\n.direct-chat-primary .right > .direct-chat-text:after, .direct-chat-primary .right > .direct-chat-text:before {\n  border-left-color: #007bff;\n}\n\n.direct-chat-warning .right > .direct-chat-text {\n  background: #ffc107;\n  border-color: #ffc107;\n  color: #1F2D3D;\n}\n\n.direct-chat-warning .right > .direct-chat-text:after, .direct-chat-warning .right > .direct-chat-text:before {\n  border-left-color: #ffc107;\n}\n\n.direct-chat-info .right > .direct-chat-text {\n  background: #17a2b8;\n  border-color: #17a2b8;\n  color: #ffffff;\n}\n\n.direct-chat-info .right > .direct-chat-text:after, .direct-chat-info .right > .direct-chat-text:before {\n  border-left-color: #17a2b8;\n}\n\n.direct-chat-success .right > .direct-chat-text {\n  background: #28a745;\n  border-color: #28a745;\n  color: #ffffff;\n}\n\n.direct-chat-success .right > .direct-chat-text:after, .direct-chat-success .right > .direct-chat-text:before {\n  border-left-color: #28a745;\n}\n\n/*\n * Component: Users List\n * ---------------------\n */\n.users-list > li {\n  width: 25%;\n  float: left;\n  padding: 10px;\n  text-align: center;\n}\n\n.users-list > li img {\n  border-radius: 50%;\n  max-width: 100%;\n  height: auto;\n}\n\n.users-list > li > a:hover,\n.users-list > li > a:hover .users-list-name {\n  color: #999;\n}\n\n.users-list-name,\n.users-list-date {\n  display: block;\n}\n\n.users-list-name {\n  font-size: 0.875rem;\n  color: #444;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.users-list-date {\n  color: #999;\n  font-size: 12px;\n}\n\n/*\n * Component: Carousel\n * -------------------\n */\n.carousel-control.left, .carousel-control.right {\n  background-image: none;\n}\n\n.carousel-control > .fa {\n  font-size: 40px;\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n  margin-top: -20px;\n}\n\n/*\n * Component: Social Widgets\n * -------------------------\n */\n.card-widget {\n  border: none;\n  position: relative;\n}\n\n.widget-user .widget-user-header {\n  padding: 1rem;\n  height: 120px;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.widget-user .widget-user-username {\n  margin-top: 0;\n  margin-bottom: 5px;\n  font-size: 25px;\n  font-weight: 300;\n  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);\n}\n\n.widget-user .widget-user-desc {\n  margin-top: 0;\n}\n\n.widget-user .widget-user-image {\n  position: absolute;\n  top: 65px;\n  left: 50%;\n  margin-left: -45px;\n}\n\n.widget-user .widget-user-image > img {\n  width: 90px;\n  height: auto;\n  border: 3px solid #ffffff;\n}\n\n.widget-user .card-footer {\n  padding-top: 40px;\n}\n\n.widget-user-2 .widget-user-header {\n  padding: 1rem;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.widget-user-2 .widget-user-username {\n  margin-top: 5px;\n  margin-bottom: 5px;\n  font-size: 25px;\n  font-weight: 300;\n}\n\n.widget-user-2 .widget-user-desc {\n  margin-top: 0;\n}\n\n.widget-user-2 .widget-user-username,\n.widget-user-2 .widget-user-desc {\n  margin-left: 75px;\n}\n\n.widget-user-2 .widget-user-image > img {\n  width: 65px;\n  height: auto;\n  float: left;\n}\n\n/*\n * Page: Mailbox\n * -------------\n */\n.mailbox-messages > .table {\n  margin: 0;\n}\n\n.mailbox-controls {\n  padding: 5px;\n}\n\n.mailbox-controls.with-border {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.mailbox-read-info {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n  padding: 10px;\n}\n\n.mailbox-read-info h3 {\n  font-size: 20px;\n  margin: 0;\n}\n\n.mailbox-read-info h5 {\n  margin: 0;\n  padding: 5px 0 0 0;\n}\n\n.mailbox-read-time {\n  color: #999;\n  font-size: 13px;\n}\n\n.mailbox-read-message {\n  padding: 10px;\n}\n\n.mailbox-attachments li {\n  float: left;\n  width: 200px;\n  border: 1px solid #eee;\n  margin-bottom: 10px;\n  margin-right: 10px;\n}\n\n.mailbox-attachment-name {\n  font-weight: bold;\n  color: #666;\n}\n\n.mailbox-attachment-icon,\n.mailbox-attachment-info,\n.mailbox-attachment-size {\n  display: block;\n}\n\n.mailbox-attachment-info {\n  padding: 10px;\n  background: #f4f4f4;\n}\n\n.mailbox-attachment-size {\n  color: #999;\n  font-size: 12px;\n}\n\n.mailbox-attachment-icon {\n  text-align: center;\n  font-size: 65px;\n  color: #666;\n  padding: 20px 10px;\n}\n\n.mailbox-attachment-icon.has-img {\n  padding: 0;\n}\n\n.mailbox-attachment-icon.has-img > img {\n  max-width: 100%;\n  height: auto;\n}\n\n/*\n * Page: Lock Screen\n * -----------------\n */\n/* ADD THIS CLASS TO THE <BODY> TAG */\n.lockscreen {\n  background: #e9ecef;\n}\n\n.lockscreen-logo {\n  font-size: 35px;\n  text-align: center;\n  margin-bottom: 25px;\n  font-weight: 300;\n}\n\n.lockscreen-logo a {\n  color: #444;\n}\n\n.lockscreen-wrapper {\n  max-width: 400px;\n  margin: 0 auto;\n  margin-top: 10%;\n}\n\n/* User name [optional] */\n.lockscreen .lockscreen-name {\n  text-align: center;\n  font-weight: 600;\n}\n\n/* Will contain the image and the sign in form */\n.lockscreen-item {\n  border-radius: 4px;\n  padding: 0;\n  background: #ffffff;\n  position: relative;\n  margin: 10px auto 30px auto;\n  width: 290px;\n}\n\n/* User image */\n.lockscreen-image {\n  border-radius: 50%;\n  position: absolute;\n  left: -10px;\n  top: -25px;\n  background: #ffffff;\n  padding: 5px;\n  z-index: 10;\n}\n\n.lockscreen-image > img {\n  border-radius: 50%;\n  width: 70px;\n  height: 70px;\n}\n\n/* Contains the password input and the login button */\n.lockscreen-credentials {\n  margin-left: 70px;\n}\n\n.lockscreen-credentials .form-control {\n  border: 0;\n}\n\n.lockscreen-credentials .btn {\n  background-color: #ffffff;\n  border: 0;\n  padding: 0 10px;\n}\n\n.lockscreen-footer {\n  margin-top: 10px;\n}\n\n/*\n * Page: Login & Register\n * ----------------------\n */\n.login-logo,\n.register-logo {\n  font-size: 35px;\n  text-align: center;\n  margin-bottom: 25px;\n  font-weight: 300;\n}\n\n.login-logo a,\n.register-logo a {\n  color: #444;\n}\n\n.login-page,\n.register-page {\n  background: #e9ecef;\n}\n\n.login-box,\n.register-box {\n  width: 360px;\n  margin: 7% auto;\n}\n\n@media (max-width: 576px) {\n  .login-box,\n  .register-box {\n    width: 90%;\n    margin-top: 20px;\n  }\n}\n\n.login-box-body,\n.register-box-body {\n  background: #ffffff;\n  padding: 20px;\n  border-top: 0;\n  color: #666;\n}\n\n.login-box-body .form-control-feedback,\n.register-box-body .form-control-feedback {\n  color: #777;\n}\n\n.login-box-msg,\n.register-box-msg {\n  margin: 0;\n  text-align: center;\n  padding: 0 20px 20px 20px;\n}\n\n.social-auth-links {\n  margin: 10px 0;\n}\n\n/*\n * Page: 400 and 500 error pages\n * ------------------------------\n */\n.error-page {\n  width: 600px;\n  margin: 20px auto 0 auto;\n}\n\n@media (max-width: 767.98px) {\n  .error-page {\n    width: 100%;\n  }\n}\n\n.error-page > .headline {\n  float: left;\n  font-size: 100px;\n  font-weight: 300;\n}\n\n@media (max-width: 767.98px) {\n  .error-page > .headline {\n    float: none;\n    text-align: center;\n  }\n}\n\n.error-page > .error-content {\n  margin-left: 190px;\n  display: block;\n}\n\n@media (max-width: 767.98px) {\n  .error-page > .error-content {\n    margin-left: 0;\n  }\n}\n\n.error-page > .error-content > h3 {\n  font-weight: 300;\n  font-size: 25px;\n}\n\n@media (max-width: 767.98px) {\n  .error-page > .error-content > h3 {\n    text-align: center;\n  }\n}\n\n/*\n * Page: Invoice\n * -------------\n */\n.invoice {\n  position: relative;\n  background: #ffffff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.invoice-title {\n  margin-top: 0;\n}\n\n/*\n * Page: Profile\n * -------------\n */\n.profile-user-img {\n  margin: 0 auto;\n  width: 100px;\n  padding: 3px;\n  border: 3px solid #adb5bd;\n}\n\n.profile-username {\n  font-size: 21px;\n  margin-top: 5px;\n}\n\n.post {\n  border-bottom: 1px solid #adb5bd;\n  margin-bottom: 15px;\n  padding-bottom: 15px;\n  color: #666;\n}\n\n.post:last-of-type {\n  border-bottom: 0;\n  margin-bottom: 0;\n  padding-bottom: 0;\n}\n\n.post .user-block {\n  margin-bottom: 15px;\n}\n\n/*\n * Plugin: Full Calendar\n * ---------------------\n */\n.fc-button {\n  background: #f4f4f4;\n  background-image: none;\n  color: #444;\n  border-color: #ddd;\n  border-bottom-color: #ddd;\n}\n\n.fc-button:hover, .fc-button:active, .fc-button.hover {\n  background-color: #e9e9e9;\n}\n\n.fc-header-title h2 {\n  font-size: 15px;\n  line-height: 1.6em;\n  color: #666;\n  margin-left: 10px;\n}\n\n.fc-header-right {\n  padding-right: 10px;\n}\n\n.fc-header-left {\n  padding-left: 10px;\n}\n\n.fc-widget-header {\n  background: #fafafa;\n}\n\n.fc-grid {\n  width: 100%;\n  border: 0;\n}\n\n.fc-widget-header:first-of-type,\n.fc-widget-content:first-of-type {\n  border-left: 0;\n  border-right: 0;\n}\n\n.fc-widget-header:last-of-type,\n.fc-widget-content:last-of-type {\n  border-right: 0;\n}\n\n.fc-toolbar {\n  padding: 1rem;\n  margin: 0;\n}\n\n.fc-day-number {\n  font-size: 20px;\n  font-weight: 300;\n  padding-right: 10px;\n}\n\n.fc-color-picker {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n.fc-color-picker > li {\n  float: left;\n  font-size: 30px;\n  margin-right: 5px;\n  line-height: 30px;\n}\n\n.fc-color-picker > li .fa {\n  transition: transform linear .3s;\n}\n\n.fc-color-picker > li .fa:hover {\n  -ms-transform: rotate(30deg);\n  transform: rotate(30deg);\n}\n\n#add-new-event {\n  transition: all linear .3s;\n}\n\n.external-event {\n  box-shadow: 0 0 1px rgba(0, 0, 0, 0.125), 0 1px 3px rgba(0, 0, 0, 0.2);\n  padding: 5px 10px;\n  font-weight: bold;\n  margin-bottom: 4px;\n  border-radius: 0.25rem;\n  cursor: move;\n}\n\n.external-event:hover {\n  box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);\n}\n\n/*\n * Plugin: Select2\n * ---------------\n */\n.select2-container--default.select2-container--focus, .select2-container--default:focus, .select2-container--default:active,\n.select2-selection.select2-container--focus,\n.select2-selection:focus,\n.select2-selection:active {\n  outline: none;\n}\n\n.select2-container--default .select2-selection--single,\n.select2-selection .select2-selection--single {\n  border: 1px solid #d2d6de;\n  padding: 6px 12px;\n  height: 34px;\n}\n\n.select2-container--default.select2-container--open {\n  border-color: #007bff;\n}\n\n.select2-dropdown {\n  border: 1px solid #d2d6de;\n}\n\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: #007bff;\n  color: white;\n}\n\n.select2-results__option {\n  padding: 6px 12px;\n  user-select: none;\n  -webkit-user-select: none;\n}\n\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-left: 0;\n  padding-right: 0;\n  height: auto;\n  margin-top: -4px;\n}\n\n.select2-container[dir=\"rtl\"] .select2-selection--single .select2-selection__rendered {\n  padding-right: 6px;\n  padding-left: 20px;\n}\n\n.select2-container--default .select2-selection--single .select2-selection__arrow {\n  height: 28px;\n  right: 3px;\n}\n\n.select2-container--default .select2-selection--single .select2-selection__arrow b {\n  margin-top: 0;\n}\n\n.select2-dropdown .select2-search__field,\n.select2-search--inline .select2-search__field {\n  border: 1px solid #d2d6de;\n}\n\n.select2-dropdown .select2-search__field:focus,\n.select2-search--inline .select2-search__field:focus {\n  outline: none;\n  border: 1px solid #007bff;\n}\n\n.select2-container--default .select2-results__option[aria-disabled=true] {\n  color: #999;\n}\n\n.select2-container--default .select2-results__option[aria-selected=true] {\n  background-color: #ddd;\n}\n\n.select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[aria-selected=true]:hover {\n  color: #444;\n}\n\n.select2-container--default .select2-selection--multiple {\n  border: 1px solid #d2d6de;\n}\n\n.select2-container--default .select2-selection--multiple:focus {\n  border-color: #007bff;\n}\n\n.select2-container--default.select2-container--focus .select2-selection--multiple {\n  border-color: #d2d6de;\n}\n\n.select2-container--default .select2-selection--multiple .select2-selection__choice {\n  background-color: #007bff;\n  border-color: #006fe6;\n  padding: 1px 10px;\n  color: #ffffff;\n}\n\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n  margin-right: 5px;\n  color: rgba(255, 255, 255, 0.7);\n}\n\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {\n  color: #ffffff;\n}\n\n.select2-container .select2-selection--single .select2-selection__rendered {\n  padding-right: 10px;\n}\n\n/*\n * General: Miscellaneous\n * ----------------------\n */\na.text-muted:hover {\n  color: #007bff !important;\n}\n\n.border-transparent {\n  border-color: transparent !important;\n}\n\n.description-block {\n  display: block;\n  margin: 10px 0;\n  text-align: center;\n}\n\n.description-block.margin-bottom {\n  margin-bottom: 25px;\n}\n\n.description-block > .description-header {\n  margin: 0;\n  padding: 0;\n  font-weight: 600;\n  font-size: 16px;\n}\n\n.description-block > .description-text {\n  text-transform: uppercase;\n}\n\n.bg-primary, .label-primary,\n.bg-primary a,\n.label-primary a {\n  color: #ffffff !important;\n}\n\n.bg-secondary,\n.bg-secondary a {\n  color: #ffffff !important;\n}\n\n.bg-success, .alert-success, .label-success,\n.bg-success a,\n.alert-success a,\n.label-success a {\n  color: #ffffff !important;\n}\n\n.bg-info, .alert-info, .label-info,\n.bg-info a,\n.alert-info a,\n.label-info a {\n  color: #ffffff !important;\n}\n\n.bg-warning, .alert-warning, .label-warning,\n.bg-warning a,\n.alert-warning a,\n.label-warning a {\n  color: #1F2D3D !important;\n}\n\n.bg-danger, .alert-danger,\n.alert-error, .label-danger,\n.bg-danger a,\n.alert-danger a,\n.alert-error a,\n.label-danger a {\n  color: #ffffff !important;\n}\n\n.bg-light,\n.bg-light a {\n  color: #1F2D3D !important;\n}\n\n.bg-dark,\n.bg-dark a {\n  color: #ffffff !important;\n}\n\n.bg-gray {\n  color: #000;\n  background-color: #adb5bd;\n}\n\n.bg-gray-light {\n  background-color: #f2f4f5;\n  color: #1F2D3D !important;\n}\n\n.bg-black {\n  background-color: #000;\n  color: #ffffff !important;\n}\n\n.bg-white {\n  background-color: #ffffff;\n  color: #1F2D3D !important;\n}\n\n[class^=\"bg-\"].disabled {\n  opacity: .65;\n}\n\n.link-muted {\n  color: #5d6974;\n}\n\n.link-muted:hover, .link-muted:focus {\n  color: #464f58;\n}\n\n.link-black {\n  color: #666;\n}\n\n.link-black:hover, .link-black:focus {\n  color: #999;\n}\n\n.hide {\n  display: none !important;\n}\n\n.no-border {\n  border: 0 !important;\n}\n\n.no-shadow {\n  box-shadow: none !important;\n}\n\n.list-unstyled, .chart-legend, .contacts-list, .users-list, .mailbox-attachments {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n.list-group-unbordered > .list-group-item {\n  border-left: 0;\n  border-right: 0;\n  border-radius: 0;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.flat {\n  border-radius: 0 !important;\n}\n\n.jqstooltip {\n  padding: 5px !important;\n  width: auto !important;\n  height: auto !important;\n}\n\n.bg-primary-gradient {\n  background: #007bff;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #007bff), color-stop(1, #3395ff));\n  background: -ms-linear-gradient(bottom, #007bff, #3395ff);\n  background: -moz-linear-gradient(center bottom, #007bff 0%, #3395ff 100%);\n  background: -o-linear-gradient(#3395ff, #007bff);\n  color: #ffffff;\n}\n\n.bg-secondary-gradient {\n  background: #6c757d;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #6c757d), color-stop(1, #868e96));\n  background: -ms-linear-gradient(bottom, #6c757d, #868e96);\n  background: -moz-linear-gradient(center bottom, #6c757d 0%, #868e96 100%);\n  background: -o-linear-gradient(#868e96, #6c757d);\n  color: #ffffff;\n}\n\n.bg-success-gradient {\n  background: #28a745;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #28a745), color-stop(1, #34ce57));\n  background: -ms-linear-gradient(bottom, #28a745, #34ce57);\n  background: -moz-linear-gradient(center bottom, #28a745 0%, #34ce57 100%);\n  background: -o-linear-gradient(#34ce57, #28a745);\n  color: #ffffff;\n}\n\n.bg-info-gradient {\n  background: #17a2b8;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #17a2b8), color-stop(1, #1fc8e3));\n  background: -ms-linear-gradient(bottom, #17a2b8, #1fc8e3);\n  background: -moz-linear-gradient(center bottom, #17a2b8 0%, #1fc8e3 100%);\n  background: -o-linear-gradient(#1fc8e3, #17a2b8);\n  color: #ffffff;\n}\n\n.bg-warning-gradient {\n  background: #ffc107;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ffc107), color-stop(1, #ffce3a));\n  background: -ms-linear-gradient(bottom, #ffc107, #ffce3a);\n  background: -moz-linear-gradient(center bottom, #ffc107 0%, #ffce3a 100%);\n  background: -o-linear-gradient(#ffce3a, #ffc107);\n  color: #1F2D3D;\n}\n\n.bg-danger-gradient {\n  background: #dc3545;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dc3545), color-stop(1, #e4606d));\n  background: -ms-linear-gradient(bottom, #dc3545, #e4606d);\n  background: -moz-linear-gradient(center bottom, #dc3545 0%, #e4606d 100%);\n  background: -o-linear-gradient(#e4606d, #dc3545);\n  color: #ffffff;\n}\n\n.bg-light-gradient {\n  background: #f8f9fa;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f8f9fa), color-stop(1, white));\n  background: -ms-linear-gradient(bottom, #f8f9fa, white);\n  background: -moz-linear-gradient(center bottom, #f8f9fa 0%, white 100%);\n  background: -o-linear-gradient(white, #f8f9fa);\n  color: #1F2D3D;\n}\n\n.bg-dark-gradient {\n  background: #343a40;\n  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #343a40), color-stop(1, #4b545c));\n  background: -ms-linear-gradient(bottom, #343a40, #4b545c);\n  background: -moz-linear-gradient(center bottom, #343a40 0%, #4b545c 100%);\n  background: -o-linear-gradient(#4b545c, #343a40);\n  color: #ffffff;\n}\n\n.description-block .description-icon {\n  font-size: 16px;\n}\n\n.list-header {\n  font-size: 15px;\n  padding: 10px 4px;\n  font-weight: bold;\n  color: #666;\n}\n\n.list-seperator {\n  height: 1px;\n  background: rgba(0, 0, 0, 0.125);\n  margin: 15px 0 9px 0;\n}\n\n.list-link > a {\n  padding: 4px;\n  color: #777;\n}\n\n.list-link > a:hover {\n  color: #222;\n}\n\n.user-block::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.user-block img {\n  width: 40px;\n  height: 40px;\n  float: left;\n}\n\n.user-block .username,\n.user-block .description,\n.user-block .comment {\n  display: block;\n  margin-left: 50px;\n}\n\n.user-block .username {\n  font-size: 16px;\n  font-weight: 600;\n}\n\n.user-block .description {\n  color: #999;\n  font-size: 13px;\n}\n\n.user-block.user-block-sm .username,\n.user-block.user-block-sm .description,\n.user-block.user-block-sm .comment {\n  margin-left: 40px;\n}\n\n.user-block.user-block-sm .username {\n  font-size: 14px;\n}\n\n.img-sm, .card-comments .card-comment img, .user-block.user-block-sm img,\n.img-md,\n.img-lg {\n  float: left;\n}\n\n.img-sm, .card-comments .card-comment img, .user-block.user-block-sm img {\n  width: 30px !important;\n  height: 30px !important;\n}\n\n.img-sm + .img-push, .card-comments .card-comment img + .img-push, .user-block.user-block-sm img + .img-push {\n  margin-left: 40px;\n}\n\n.img-md {\n  width: 60px;\n  height: 60px;\n}\n\n.img-md + .img-push {\n  margin-left: 70px;\n}\n\n.img-lg {\n  width: 100px;\n  height: 100px;\n}\n\n.img-lg + .img-push {\n  margin-left: 110px;\n}\n\n.img-bordered {\n  border: 3px solid #adb5bd;\n  padding: 3px;\n}\n\n.img-bordered-sm {\n  border: 2px solid #adb5bd;\n  padding: 2px;\n}\n\n.img-rounded {\n  border-radius: 0.25rem;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\n.img-size-64,\n.img-size-50,\n.img-size-32 {\n  height: auto;\n}\n\n.img-size-64 {\n  width: 64px;\n}\n\n.img-size-50 {\n  width: 50px;\n}\n\n.img-size-32 {\n  width: 32px;\n}\n\n.size-32,\n.size-40,\n.size-50 {\n  display: block;\n  text-align: center;\n}\n\n.size-32 {\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n}\n\n.size-40 {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n}\n\n.size-50 {\n  width: 50px;\n  height: 50px;\n  line-height: 50px;\n}\n\n.attachment-block {\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  padding: 5px;\n  margin-bottom: 10px;\n  background: #f7f7f7;\n}\n\n.attachment-block .attachment-img {\n  max-width: 100px;\n  max-height: 100px;\n  height: auto;\n  float: left;\n}\n\n.attachment-block .attachment-pushed {\n  margin-left: 110px;\n}\n\n.attachment-block .attachment-heading {\n  margin: 0;\n}\n\n.attachment-block .attachment-text {\n  color: #555;\n}\n\n.connectedSortable {\n  min-height: 100px;\n}\n\n.ui-helper-hidden-accessible {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\n.sort-highlight {\n  background: #f4f4f4;\n  border: 1px dashed #ddd;\n  margin-bottom: 10px;\n}\n\n.chart {\n  position: relative;\n  overflow: hidden;\n}\n\n.flex-1 {\n  flex: 1;\n}\n\n/*\n * Misc: print\n * -----------\n */\n@media print {\n  .no-print, .main-sidebar,\n  .main-header,\n  .content-header {\n    display: none !important;\n  }\n  .content-wrapper,\n  .main-footer {\n    margin-left: 0 !important;\n    min-height: 0 !important;\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    transform: translate(0, 0);\n  }\n  .layout-fixed .content-wrapper {\n    padding-top: 0 !important;\n  }\n  .invoice {\n    width: 100%;\n    border: 0;\n    margin: 0;\n    padding: 0;\n  }\n  .invoice-col {\n    float: left;\n    width: 33.3333333%;\n  }\n  .table-responsive {\n    overflow: auto;\n  }\n  .table-responsive > .table tr th,\n  .table-responsive > .table tr td {\n    white-space: normal !important;\n  }\n}\n\n.text-bold, .text-bold.table td, .text-bold.table th {\n  font-weight: 700;\n}\n\n.text-sm {\n  font-size: 0.875rem;\n}\n\n.text-xs {\n  font-size: 1rem;\n}\n\n.text-lg {\n  font-size: 1.25rem;\n}\n\n.text-xl {\n  font-size: 2rem;\n}\n\n.elevation-0 {\n  box-shadow: none;\n}\n\n.elevation-1, .sidebar-dark-primary .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-primary .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-secondary .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-secondary .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-success .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-success .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-info .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-info .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-warning .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-warning .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-danger .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-danger .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-light .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-light .nav-sidebar > .nav-item > .nav-link.active, .sidebar-dark-dark .nav-sidebar > .nav-item > .nav-link.active, .sidebar-light-dark .nav-sidebar > .nav-item > .nav-link.active, .callout {\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\n}\n\n.elevation-2 {\n  box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);\n}\n\n.elevation-3 {\n  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);\n}\n\n.elevation-4 {\n  box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);\n}\n\n.elevation-5 {\n  box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22);\n}\n\n/*# sourceMappingURL=adminlte.css.map */"
  },
  {
    "path": "src/main/resources/static/admin/dist/css/main.css",
    "content": "html { overflow-x:hidden; }\n.content-header {\n\tposition: relative;\n\tpadding: 0 0 3px 8px\n}\n\n.content-header>.breadcrumb {\n    position: relative;\n    top: 0;\n    right: 0;\n    float: none;\n    margin-top: 0px;\n    padding-left: 10px;\n    background: #ecf0f5;\n}\n\n.main-footer {\n    padding: 7px;\n    color: #444;\n    border-top: 1px solid #eee;\n}\n\n[v-cloak] {\n  display: none;\n}\n\n.grid-btn{\n    margin-bottom:12px;\n    display:flex;\n}\n.grid-btn .btn{\n\tmargin-right:10px;\n}\n.pointer{cursor: pointer;}\n\n.ml-10 { margin-left:0 !important; }\n@media (min-width: 768px) {\n\t.ml-10 { margin-left:10px !important; }\n\t.col-sm-10 {width: 70%;padding-left: 0px;}\n\t.col-sm-2 {width: 24%;}\n}\ntbody > tr > th {font-weight: normal; }\n.panel .table { margin:0 0; }\n.panel .pagination { margin:0; }\n.panel-default>.panel-heading {background-color: #f5f5f5;}\n.row{\n\tborder-top: 1px solid #ddd;\n\tmargin:0;\n\tpadding:20px 2px 0px 2px;\n}\n.col-xs-6{padding-left: 0px;padding-right: 0px;}\n.form-horizontal .form-group {margin-left:0px;margin-right:0px;}\n.form-horizontal{\n\twidth:550px;padding-top:20px;\n}\n\n.dropdown-donate-lg {\n    min-width: 120px;\n    max-width: 120px;\n    padding: 0;\n}\n\nul.thumbnails.image_picker_selector {\n    overflow: auto;\n    list-style-image: none;\n    list-style-position: outside;\n    list-style-type: none;\n    padding: 0px;\n    margin: 0px; }\nul.thumbnails.image_picker_selector li {\n    margin: 0px 12px 12px 0px;\n    float: left; }\nul.thumbnails.image_picker_selector li .thumbnail {\n    padding: 6px;\n    border: 1px solid #dddddd; }\nul.thumbnails.image_picker_selector li .thumbnail.selected {\n    background: #0088cc; }\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/adminlte.js",
    "content": "/*!\n * AdminLTE v3.0.0-alpha (https://adminlte.io)\n * Copyright 2014-2018 Abdullah Almsaeed <abdullah@almsaeedstudio.com>\n * Licensed under MIT (https://github.com/almasaeed2010/AdminLTE/blob/master/LICENSE)\n */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.adminlte = {})));\n}(this, (function (exports) { 'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\n/**\n * --------------------------------------------\n * AdminLTE ControlSidebar.js\n * License MIT\n * --------------------------------------------\n */\n\nvar ControlSidebar = function ($) {\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME = 'ControlSidebar';\n  var DATA_KEY = 'lte.control.sidebar';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    CONTROL_SIDEBAR: '.control-sidebar',\n    DATA_TOGGLE: '[data-widget=\"control-sidebar\"]',\n    MAIN_HEADER: '.main-header'\n  };\n\n  var ClassName = {\n    CONTROL_SIDEBAR_OPEN: 'control-sidebar-open',\n    CONTROL_SIDEBAR_SLIDE: 'control-sidebar-slide-open'\n  };\n\n  var Default = {\n    slide: true\n\n    /**\n     * Class Definition\n     * ====================================================\n     */\n\n  };\n  var ControlSidebar = function () {\n    function ControlSidebar(element, config) {\n      classCallCheck(this, ControlSidebar);\n\n      this._element = element;\n      this._config = this._getConfig(config);\n    }\n\n    // Public\n\n    ControlSidebar.prototype.show = function show() {\n      // Show the control sidebar\n      if (this._config.slide) {\n        $('body').removeClass(ClassName.CONTROL_SIDEBAR_SLIDE);\n      } else {\n        $('body').removeClass(ClassName.CONTROL_SIDEBAR_OPEN);\n      }\n    };\n\n    ControlSidebar.prototype.collapse = function collapse() {\n      // Collapse the control sidebar\n      if (this._config.slide) {\n        $('body').addClass(ClassName.CONTROL_SIDEBAR_SLIDE);\n      } else {\n        $('body').addClass(ClassName.CONTROL_SIDEBAR_OPEN);\n      }\n    };\n\n    ControlSidebar.prototype.toggle = function toggle() {\n      this._setMargin();\n\n      var shouldOpen = $('body').hasClass(ClassName.CONTROL_SIDEBAR_OPEN) || $('body').hasClass(ClassName.CONTROL_SIDEBAR_SLIDE);\n      if (shouldOpen) {\n        // Open the control sidebar\n        this.show();\n      } else {\n        // Close the control sidebar\n        this.collapse();\n      }\n    };\n\n    // Private\n\n    ControlSidebar.prototype._getConfig = function _getConfig(config) {\n      return $.extend({}, Default, config);\n    };\n\n    ControlSidebar.prototype._setMargin = function _setMargin() {\n      $(Selector.CONTROL_SIDEBAR).css({\n        top: $(Selector.MAIN_HEADER).outerHeight()\n      });\n    };\n\n    // Static\n\n    ControlSidebar._jQueryInterface = function _jQueryInterface(operation) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY);\n\n        if (!data) {\n          data = new ControlSidebar(this, $(this).data());\n          $(this).data(DATA_KEY, data);\n        }\n\n        if (data[operation] === 'undefined') {\n          throw new Error(operation + ' is not a function');\n        }\n\n        data[operation]();\n      });\n    };\n\n    return ControlSidebar;\n  }();\n\n  /**\n   *\n   * Data Api implementation\n   * ====================================================\n   */\n\n\n  $(document).on('click', Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    ControlSidebar._jQueryInterface.call($(this), 'toggle');\n  });\n\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $.fn[NAME] = ControlSidebar._jQueryInterface;\n  $.fn[NAME].Constructor = ControlSidebar;\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return ControlSidebar._jQueryInterface;\n  };\n\n  return ControlSidebar;\n}(jQuery);\n\n/**\n * --------------------------------------------\n * AdminLTE Layout.js\n * License MIT\n * --------------------------------------------\n */\n\nvar Layout = function ($) {\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME = 'Layout';\n  var DATA_KEY = 'lte.layout';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n\n  var Selector = {\n    SIDEBAR: '.main-sidebar',\n    HEADER: '.main-header',\n    CONTENT: '.content-wrapper',\n    CONTENT_HEADER: '.content-header',\n    WRAPPER: '.wrapper',\n    CONTROL_SIDEBAR: '.control-sidebar',\n    LAYOUT_FIXED: '.layout-fixed',\n    FOOTER: '.main-footer'\n  };\n\n  var ClassName = {\n    HOLD: 'hold-transition',\n    SIDEBAR: 'main-sidebar',\n    LAYOUT_FIXED: 'layout-fixed'\n\n    /**\n     * Class Definition\n     * ====================================================\n     */\n\n  };\n  var Layout = function () {\n    function Layout(element) {\n      classCallCheck(this, Layout);\n\n      this._element = element;\n\n      this._init();\n    }\n\n    // Public\n\n    Layout.prototype.fixLayoutHeight = function fixLayoutHeight() {\n      var heights = {\n        window: $(window).height(),\n        header: $(Selector.HEADER).outerHeight(),\n        footer: $(Selector.FOOTER).outerHeight(),\n        sidebar: $(Selector.SIDEBAR).height()\n      };\n      var max = this._max(heights);\n\n      $(Selector.CONTENT).css('min-height', max - heights.header);\n      $(Selector.SIDEBAR).css('min-height', max - heights.header);\n    };\n\n    // Private\n\n    Layout.prototype._init = function _init() {\n      var _this = this;\n\n      // Enable transitions\n      $('body').removeClass(ClassName.HOLD);\n\n      // Activate layout height watcher\n      this.fixLayoutHeight();\n      $(Selector.SIDEBAR).on('collapsed.lte.treeview expanded.lte.treeview collapsed.lte.pushmenu expanded.lte.pushmenu', function () {\n        _this.fixLayoutHeight();\n      });\n\n      $(window).resize(function () {\n        _this.fixLayoutHeight();\n      });\n\n      $('body, html').css('height', 'auto');\n    };\n\n    Layout.prototype._max = function _max(numbers) {\n      // Calculate the maximum number in a list\n      var max = 0;\n\n      Object.keys(numbers).forEach(function (key) {\n        if (numbers[key] > max) {\n          max = numbers[key];\n        }\n      });\n\n      return max;\n    };\n\n    // Static\n\n    Layout._jQueryInterface = function _jQueryInterface(operation) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY);\n\n        if (!data) {\n          data = new Layout(this);\n          $(this).data(DATA_KEY, data);\n        }\n\n        if (operation) {\n          data[operation]();\n        }\n      });\n    };\n\n    return Layout;\n  }();\n\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $(window).on('load', function () {\n    Layout._jQueryInterface.call($('body'));\n  });\n\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $.fn[NAME] = Layout._jQueryInterface;\n  $.fn[NAME].Constructor = Layout;\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Layout._jQueryInterface;\n  };\n\n  return Layout;\n}(jQuery);\n\n/**\n * --------------------------------------------\n * AdminLTE PushMenu.js\n * License MIT\n * --------------------------------------------\n */\n\nvar PushMenu = function ($) {\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME = 'PushMenu';\n  var DATA_KEY = 'lte.pushmenu';\n  var EVENT_KEY = '.' + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n\n  var Event = {\n    COLLAPSED: 'collapsed' + EVENT_KEY,\n    SHOWN: 'shown' + EVENT_KEY\n  };\n\n  var Default = {\n    screenCollapseSize: 768\n  };\n\n  var Selector = {\n    TOGGLE_BUTTON: '[data-widget=\"pushmenu\"]',\n    SIDEBAR_MINI: '.sidebar-mini',\n    SIDEBAR_COLLAPSED: '.sidebar-collapse',\n    BODY: 'body',\n    OVERLAY: '#sidebar-overlay',\n    WRAPPER: '.wrapper'\n  };\n\n  var ClassName = {\n    SIDEBAR_OPEN: 'sidebar-open',\n    COLLAPSED: 'sidebar-collapse',\n    OPEN: 'sidebar-open',\n    SIDEBAR_MINI: 'sidebar-mini'\n\n    /**\n     * Class Definition\n     * ====================================================\n     */\n\n  };\n  var PushMenu = function () {\n    function PushMenu(element, options) {\n      classCallCheck(this, PushMenu);\n\n      this._element = element;\n      this._options = $.extend({}, Default, options);\n\n      if (!$(Selector.OVERLAY).length) {\n        this._addOverlay();\n      }\n    }\n\n    // Public\n\n    PushMenu.prototype.show = function show() {\n      $(Selector.BODY).addClass(ClassName.OPEN).removeClass(ClassName.COLLAPSED);\n\n      var shownEvent = $.Event(Event.SHOWN);\n      $(this._element).trigger(shownEvent);\n    };\n\n    PushMenu.prototype.collapse = function collapse() {\n      $(Selector.BODY).removeClass(ClassName.OPEN).addClass(ClassName.COLLAPSED);\n\n      var collapsedEvent = $.Event(Event.COLLAPSED);\n      $(this._element).trigger(collapsedEvent);\n    };\n\n    PushMenu.prototype.toggle = function toggle() {\n      var isShown = void 0;\n      if ($(window).width() >= this._options.screenCollapseSize) {\n        isShown = !$(Selector.BODY).hasClass(ClassName.COLLAPSED);\n      } else {\n        isShown = $(Selector.BODY).hasClass(ClassName.OPEN);\n      }\n\n      if (isShown) {\n        this.collapse();\n      } else {\n        this.show();\n      }\n    };\n\n    // Private\n\n\n    PushMenu.prototype._addOverlay = function _addOverlay() {\n      var _this = this;\n\n      var overlay = $('<div />', {\n        id: 'sidebar-overlay'\n      });\n\n      overlay.on('click', function () {\n        _this.collapse();\n      });\n\n      $(Selector.WRAPPER).append(overlay);\n    };\n\n    // Static\n\n    PushMenu._jQueryInterface = function _jQueryInterface(operation) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY);\n\n        if (!data) {\n          data = new PushMenu(this);\n          $(this).data(DATA_KEY, data);\n        }\n\n        if (operation) {\n          data[operation]();\n        }\n      });\n    };\n\n    return PushMenu;\n  }();\n\n  /**\n   * Data API\n   * ====================================================\n   */\n\n  $(document).on('click', Selector.TOGGLE_BUTTON, function (event) {\n    event.preventDefault();\n\n    var button = event.currentTarget;\n\n    if ($(button).data('widget') !== 'pushmenu') {\n      button = $(button).closest(Selector.TOGGLE_BUTTON);\n    }\n\n    PushMenu._jQueryInterface.call($(button), 'toggle');\n  });\n\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $.fn[NAME] = PushMenu._jQueryInterface;\n  $.fn[NAME].Constructor = PushMenu;\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return PushMenu._jQueryInterface;\n  };\n\n  return PushMenu;\n}(jQuery);\n\n/**\n * --------------------------------------------\n * AdminLTE Treeview.js\n * License MIT\n * --------------------------------------------\n */\n\nvar Treeview = function ($) {\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME = 'Treeview';\n  var DATA_KEY = 'lte.treeview';\n  var EVENT_KEY = '.' + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n\n  var Event = {\n    SELECTED: 'selected' + EVENT_KEY,\n    EXPANDED: 'expanded' + EVENT_KEY,\n    COLLAPSED: 'collapsed' + EVENT_KEY,\n    LOAD_DATA_API: 'load' + EVENT_KEY\n  };\n\n  var Selector = {\n    LI: '.nav-item',\n    LINK: '.nav-link',\n    TREEVIEW_MENU: '.nav-treeview',\n    OPEN: '.menu-open',\n    DATA_WIDGET: '[data-widget=\"treeview\"]'\n  };\n\n  var ClassName = {\n    LI: 'nav-item',\n    LINK: 'nav-link',\n    TREEVIEW_MENU: 'nav-treeview',\n    OPEN: 'menu-open'\n  };\n\n  var Default = {\n    trigger: Selector.DATA_WIDGET + ' ' + Selector.LINK,\n    animationSpeed: 300,\n    accordion: true\n\n    /**\n     * Class Definition\n     * ====================================================\n     */\n  };\n  var Treeview = function () {\n    function Treeview(element, config) {\n      classCallCheck(this, Treeview);\n\n      this._config = config;\n      this._element = element;\n    }\n\n    // Public\n\n    Treeview.prototype.init = function init() {\n      this._setupListeners();\n    };\n\n    Treeview.prototype.expand = function expand(treeviewMenu, parentLi) {\n      var _this = this;\n\n      var expandedEvent = $.Event(Event.EXPANDED);\n\n      if (this._config.accordion) {\n        var openMenuLi = parentLi.siblings(Selector.OPEN).first();\n        var openTreeview = openMenuLi.find(Selector.TREEVIEW_MENU).first();\n        this.collapse(openTreeview, openMenuLi);\n      }\n\n      treeviewMenu.slideDown(this._config.animationSpeed, function () {\n        parentLi.addClass(ClassName.OPEN);\n        $(_this._element).trigger(expandedEvent);\n      });\n    };\n\n    Treeview.prototype.collapse = function collapse(treeviewMenu, parentLi) {\n      var _this2 = this;\n\n      var collapsedEvent = $.Event(Event.COLLAPSED);\n\n      treeviewMenu.slideUp(this._config.animationSpeed, function () {\n        parentLi.removeClass(ClassName.OPEN);\n        $(_this2._element).trigger(collapsedEvent);\n        treeviewMenu.find(Selector.OPEN + ' > ' + Selector.TREEVIEW_MENU).slideUp();\n        treeviewMenu.find(Selector.OPEN).removeClass(ClassName.OPEN);\n      });\n    };\n\n    Treeview.prototype.toggle = function toggle(event) {\n      var $relativeTarget = $(event.currentTarget);\n      var treeviewMenu = $relativeTarget.next();\n\n      if (!treeviewMenu.is(Selector.TREEVIEW_MENU)) {\n        return;\n      }\n\n      event.preventDefault();\n\n      var parentLi = $relativeTarget.parents(Selector.LI).first();\n      var isOpen = parentLi.hasClass(ClassName.OPEN);\n\n      if (isOpen) {\n        this.collapse($(treeviewMenu), parentLi);\n      } else {\n        this.expand($(treeviewMenu), parentLi);\n      }\n    };\n\n    // Private\n\n    Treeview.prototype._setupListeners = function _setupListeners() {\n      var _this3 = this;\n\n      $(document).on('click', this._config.trigger, function (event) {\n        _this3.toggle(event);\n      });\n    };\n\n    // Static\n\n    Treeview._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY);\n        var _config = $.extend({}, Default, $(this).data());\n\n        if (!data) {\n          data = new Treeview($(this), _config);\n          $(this).data(DATA_KEY, data);\n        }\n\n        if (config === 'init') {\n          data[config]();\n        }\n      });\n    };\n\n    return Treeview;\n  }();\n\n  /**\n   * Data API\n   * ====================================================\n   */\n\n  $(window).on(Event.LOAD_DATA_API, function () {\n    $(Selector.DATA_WIDGET).each(function () {\n      Treeview._jQueryInterface.call($(this), 'init');\n    });\n  });\n\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $.fn[NAME] = Treeview._jQueryInterface;\n  $.fn[NAME].Constructor = Treeview;\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Treeview._jQueryInterface;\n  };\n\n  return Treeview;\n}(jQuery);\n\n/**\n * --------------------------------------------\n * AdminLTE Widget.js\n * License MIT\n * --------------------------------------------\n */\n\nvar Widget = function ($) {\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME = 'Widget';\n  var DATA_KEY = 'lte.widget';\n  var EVENT_KEY = '.' + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n\n  var Event = {\n    EXPANDED: 'expanded' + EVENT_KEY,\n    COLLAPSED: 'collapsed' + EVENT_KEY,\n    REMOVED: 'removed' + EVENT_KEY\n  };\n\n  var Selector = {\n    DATA_REMOVE: '[data-widget=\"remove\"]',\n    DATA_COLLAPSE: '[data-widget=\"collapse\"]',\n    CARD: '.card',\n    CARD_HEADER: '.card-header',\n    CARD_BODY: '.card-body',\n    CARD_FOOTER: '.card-footer',\n    COLLAPSED: '.collapsed-card'\n  };\n\n  var ClassName = {\n    COLLAPSED: 'collapsed-card'\n  };\n\n  var Default = {\n    animationSpeed: 'normal',\n    collapseTrigger: Selector.DATA_COLLAPSE,\n    removeTrigger: Selector.DATA_REMOVE\n  };\n\n  var Widget = function () {\n    function Widget(element, settings) {\n      classCallCheck(this, Widget);\n\n      this._element = element;\n      this._parent = element.parents(Selector.CARD).first();\n      this._settings = $.extend({}, Default, settings);\n    }\n\n    Widget.prototype.collapse = function collapse() {\n      var _this = this;\n\n      this._parent.children(Selector.CARD_BODY + ', ' + Selector.CARD_FOOTER).slideUp(this._settings.animationSpeed, function () {\n        _this._parent.addClass(ClassName.COLLAPSED);\n      });\n\n      var collapsed = $.Event(Event.COLLAPSED);\n\n      this._element.trigger(collapsed, this._parent);\n    };\n\n    Widget.prototype.expand = function expand() {\n      var _this2 = this;\n\n      this._parent.children(Selector.CARD_BODY + ', ' + Selector.CARD_FOOTER).slideDown(this._settings.animationSpeed, function () {\n        _this2._parent.removeClass(ClassName.COLLAPSED);\n      });\n\n      var expanded = $.Event(Event.EXPANDED);\n\n      this._element.trigger(expanded, this._parent);\n    };\n\n    Widget.prototype.remove = function remove() {\n      this._parent.slideUp();\n\n      var removed = $.Event(Event.REMOVED);\n\n      this._element.trigger(removed, this._parent);\n    };\n\n    Widget.prototype.toggle = function toggle() {\n      if (this._parent.hasClass(ClassName.COLLAPSED)) {\n        this.expand();\n        return;\n      }\n\n      this.collapse();\n    };\n\n    // Private\n\n    Widget.prototype._init = function _init(card) {\n      var _this3 = this;\n\n      this._parent = card;\n\n      $(this).find(this._settings.collapseTrigger).click(function () {\n        _this3.toggle();\n      });\n\n      $(this).find(this._settings.removeTrigger).click(function () {\n        _this3.remove();\n      });\n    };\n\n    // Static\n\n    Widget._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY);\n\n        if (!data) {\n          data = new Widget($(this), data);\n          $(this).data(DATA_KEY, typeof config === 'string' ? data : config);\n        }\n\n        if (typeof config === 'string' && config.match(/remove|toggle/)) {\n          data[config]();\n        } else if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {\n          data._init($(this));\n        }\n      });\n    };\n\n    return Widget;\n  }();\n\n  /**\n   * Data API\n   * ====================================================\n   */\n\n  $(document).on('click', Selector.DATA_COLLAPSE, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    Widget._jQueryInterface.call($(this), 'toggle');\n  });\n\n  $(document).on('click', Selector.DATA_REMOVE, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    Widget._jQueryInterface.call($(this), 'remove');\n  });\n\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $.fn[NAME] = Widget._jQueryInterface;\n  $.fn[NAME].Constructor = Widget;\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Widget._jQueryInterface;\n  };\n\n  return Widget;\n}(jQuery);\n\nexports.ControlSidebar = ControlSidebar;\nexports.Layout = Layout;\nexports.PushMenu = PushMenu;\nexports.Treeview = Treeview;\nexports.Widget = Widget;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=adminlte.js.map\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/demo.js",
    "content": "/**\n * AdminLTE Demo Menu\n * ------------------\n * You should not use this file in production.\n * This file is for demo purposes only.\n */\n(function ($) {\n  'use strict'\n\n  var $sidebar   = $('.control-sidebar')\n  var $container = $('<div />', {\n    class: 'p-3'\n  })\n\n  $sidebar.append($container)\n\n  var navbar_dark_skins = [\n    'bg-primary',\n    'bg-info',\n    'bg-success',\n    'bg-danger'\n  ]\n\n  var navbar_light_skins = [\n    'bg-warning',\n    'bg-white',\n    'bg-gray-light'\n  ]\n\n  $container.append(\n    '<h5>Customize AdminLTE</h5><hr class=\"mb-2\"/>'\n    + '<h6>Navbar Variants</h6>'\n  )\n\n  var $navbar_variants        = $('<div />', {\n    'class': 'd-flex'\n  })\n  var navbar_all_colors       = navbar_dark_skins.concat(navbar_light_skins)\n  var $navbar_variants_colors = createSkinBlock(navbar_all_colors, function (e) {\n    var color = $(this).data('color')\n    console.log('Adding ' + color)\n    var $main_header = $('.main-header')\n    $main_header.removeClass('navbar-dark').removeClass('navbar-light')\n    navbar_all_colors.map(function (color) {\n      $main_header.removeClass(color)\n    })\n\n    if (navbar_dark_skins.indexOf(color) > -1) {\n      $main_header.addClass('navbar-dark')\n      console.log('AND navbar-dark')\n    } else {\n      console.log('AND navbar-light')\n      $main_header.addClass('navbar-light')\n    }\n\n    $main_header.addClass(color)\n  })\n\n  $navbar_variants.append($navbar_variants_colors)\n\n  $container.append($navbar_variants)\n\n  var $checkbox_container = $('<div />', {\n    'class': 'mb-4'\n  })\n  var $navbar_border = $('<input />', {\n    type   : 'checkbox',\n    value  : 1,\n    checked: $('.main-header').hasClass('border-bottom'),\n    'class': 'mr-1'\n  }).on('click', function () {\n    if ($(this).is(':checked')) {\n      $('.main-header').addClass('border-bottom')\n    } else {\n      $('.main-header').removeClass('border-bottom')\n    }\n    console.log($(this).is(':checked'), 'hi')\n  })\n  $checkbox_container.append($navbar_border)\n  $checkbox_container.append('<span>Navbar border</span>')\n  $container.append($checkbox_container)\n\n\n  var sidebar_colors = [\n    'bg-primary',\n    'bg-warning',\n    'bg-info',\n    'bg-danger',\n    'bg-success'\n  ]\n\n  var sidebar_skins = [\n    'sidebar-dark-primary',\n    'sidebar-dark-warning',\n    'sidebar-dark-info',\n    'sidebar-dark-danger',\n    'sidebar-dark-success',\n    'sidebar-light-primary',\n    'sidebar-light-warning',\n    'sidebar-light-info',\n    'sidebar-light-danger',\n    'sidebar-light-success'\n  ]\n\n  $container.append('<h6>Dark Sidebar Variants</h6>')\n  var $sidebar_variants = $('<div />', {\n    'class': 'd-flex'\n  })\n  $container.append($sidebar_variants)\n  $container.append(createSkinBlock(sidebar_colors, function () {\n    var color         = $(this).data('color')\n    var sidebar_class = 'sidebar-dark-' + color.replace('bg-', '')\n    var $sidebar      = $('.main-sidebar')\n    sidebar_skins.map(function (skin) {\n      $sidebar.removeClass(skin)\n    })\n\n    $sidebar.addClass(sidebar_class)\n    console.log('added ' + sidebar_class)\n  }))\n\n  $container.append('<h6>Light Sidebar Variants</h6>')\n  var $sidebar_variants = $('<div />', {\n    'class': 'd-flex'\n  })\n  $container.append($sidebar_variants)\n  $container.append(createSkinBlock(sidebar_colors, function () {\n    var color         = $(this).data('color')\n    var sidebar_class = 'sidebar-light-' + color.replace('bg-', '')\n    var $sidebar      = $('.main-sidebar')\n    sidebar_skins.map(function (skin) {\n      $sidebar.removeClass(skin)\n    })\n\n    $sidebar.addClass(sidebar_class)\n    console.log('added ' + sidebar_class)\n  }))\n\n  var logo_skins = navbar_all_colors\n  $container.append('<h6>Brand Logo Variants</h6>')\n  var $logo_variants = $('<div />', {\n    'class': 'd-flex'\n  })\n  $container.append($logo_variants)\n  var $clear_btn = $('<a />', {\n    href: 'javascript:void(0)'\n  }).text('clear').on('click', function () {\n    var $logo = $('.brand-link')\n    logo_skins.map(function (skin) {\n      $logo.removeClass(skin)\n    })\n  })\n  $container.append(createSkinBlock(logo_skins, function () {\n    var color = $(this).data('color')\n    var $logo = $('.brand-link')\n    logo_skins.map(function (skin) {\n      $logo.removeClass(skin)\n    })\n    $logo.addClass(color)\n  }).append($clear_btn))\n\n  function createSkinBlock(colors, callback) {\n    var $block = $('<div />', {\n      'class': 'd-flex flex-wrap mb-3'\n    })\n\n    colors.map(function (color) {\n      var $color = $('<div />', {\n        'class': (typeof color === 'object' ? color.join(' ') : color) + ' elevation-2'\n      })\n\n      $block.append($color)\n\n      $color.data('color', color)\n\n      $color.css({\n        width       : '40px',\n        height      : '20px',\n        borderRadius: '25px',\n        marginRight : 10,\n        marginBottom: 10,\n        opacity     : 0.8,\n        cursor      : 'pointer'\n      })\n\n      $color.hover(function () {\n        $(this).css({ opacity: 1 }).removeClass('elevation-2').addClass('elevation-4')\n      }, function () {\n        $(this).css({ opacity: 0.8 }).removeClass('elevation-4').addClass('elevation-2')\n      })\n\n      if (callback) {\n        $color.on('click', callback)\n      }\n    })\n\n    return $block\n  }\n})(jQuery)\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_carousel.js",
    "content": "$(function () {\n    $(\"#jqGrid\").jqGrid({\n        url: '/admin/carousels/list',\n        datatype: \"json\",\n        colModel: [\n            {label: 'id', name: 'carouselId', index: 'carouselId', width: 50, key: true, hidden: true},\n            {label: '轮播图', name: 'carouselUrl', index: 'carouselUrl', width: 180, formatter: coverImageFormatter},\n            {label: '跳转链接', name: 'redirectUrl', index: 'redirectUrl', width: 120},\n            {label: '排序值', name: 'carouselRank', index: 'carouselRank', width: 120},\n            {label: '添加时间', name: 'createTime', index: 'createTime', width: 120}\n        ],\n        height: 560,\n        rowNum: 10,\n        rowList: [10, 20, 50],\n        styleUI: 'Bootstrap',\n        loadtext: '信息读取中...',\n        rownumbers: false,\n        rownumWidth: 20,\n        autowidth: true,\n        multiselect: true,\n        pager: \"#jqGridPager\",\n        jsonReader: {\n            root: \"data.list\",\n            page: \"data.currPage\",\n            total: \"data.totalPage\",\n            records: \"data.totalCount\"\n        },\n        prmNames: {\n            page: \"page\",\n            rows: \"limit\",\n            order: \"order\",\n        },\n        gridComplete: function () {\n            //隐藏grid底部滚动条\n            $(\"#jqGrid\").closest(\".ui-jqgrid-bdiv\").css({\"overflow-x\": \"hidden\"});\n        }\n    });\n\n    function coverImageFormatter(cellvalue) {\n        return \"<img src='\" + cellvalue + \"' height=\\\"120\\\" width=\\\"160\\\" alt='coverImage'/>\";\n    }\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n\n    new AjaxUpload('#uploadCarouselImage', {\n        action: '/admin/upload/file',\n        name: 'file',\n        autoSubmit: true,\n        responseType: \"json\",\n        onSubmit: function (file, extension) {\n            if (!(extension && /^(jpg|jpeg|png|gif)$/.test(extension.toLowerCase()))) {\n                Swal.fire({\n                    text: \"只支持jpg、png、gif格式的文件！\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n                return false;\n            }\n        },\n        onComplete: function (file, r) {\n            if (r != null && r.resultCode == 200) {\n                $(\"#carouselImg\").attr(\"src\", r.data);\n                $(\"#carouselImg\").attr(\"style\", \"width: 128px;height: 128px;display:block;\");\n                return false;\n            } else {\n                Swal.fire({\n                    text: r.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        }\n    });\n});\n\n/**\n * jqGrid重新加载\n */\nfunction reload() {\n    var page = $(\"#jqGrid\").jqGrid('getGridParam', 'page');\n    $(\"#jqGrid\").jqGrid('setGridParam', {\n        page: page\n    }).trigger(\"reloadGrid\");\n}\n\nfunction carouselAdd() {\n    reset();\n    $('.modal-title').html('轮播图添加');\n    $('#carouselModal').modal('show');\n}\n\n//绑定modal上的保存按钮\n$('#saveButton').click(function () {\n    var redirectUrl = $(\"#redirectUrl\").val();\n    var carouselRank = $(\"#carouselRank\").val();\n    var carouselUrl = $('#carouselImg')[0].src;\n    var data = {\n        \"carouselUrl\": carouselUrl,\n        \"carouselRank\": carouselRank,\n        \"redirectUrl\": redirectUrl\n    };\n    var url = '/admin/carousels/save';\n    var id = getSelectedRowWithoutAlert();\n    if (id != null) {\n        url = '/admin/carousels/update';\n        data = {\n            \"carouselId\": id,\n            \"carouselUrl\": carouselUrl,\n            \"carouselRank\": carouselRank,\n            \"redirectUrl\": redirectUrl\n        };\n    }\n    $.ajax({\n        type: 'POST',//方法类型\n        url: url,\n        contentType: 'application/json',\n        data: JSON.stringify(data),\n        success: function (result) {\n            if (result.resultCode == 200) {\n                $('#carouselModal').modal('hide');\n                Swal.fire({\n                    text: \"保存成功\",\n                    icon: \"success\",iconColor:\"#1d953f\",\n                });\n                reload();\n            } else {\n                $('#carouselModal').modal('hide');\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n            ;\n        },\n        error: function () {\n            Swal.fire({\n                text: \"操作失败\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n        }\n    });\n});\n\nfunction carouselEdit() {\n    reset();\n    var id = getSelectedRow();\n    if (id == null) {\n        return;\n    }\n    //请求数据\n    $.get(\"/admin/carousels/info/\" + id, function (r) {\n        if (r.resultCode == 200 && r.data != null) {\n            //填充数据至modal\n            $(\"#carouselImg\").attr(\"src\", r.data.carouselUrl);\n            $(\"#carouselImg\").attr(\"style\", \"height: 64px;width: 64px;display:block;\");\n            $(\"#redirectUrl\").val(r.data.redirectUrl);\n            $(\"#carouselRank\").val(r.data.carouselRank);\n        }\n    });\n    $('.modal-title').html('轮播图编辑');\n    $('#carouselModal').modal('show');\n}\n\nfunction deleteCarousel() {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要删除数据吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/carousels/delete\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"删除成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\n\nfunction reset() {\n    $(\"#redirectUrl\").val('##');\n    $(\"#carouselRank\").val(0);\n    $(\"#carouselImg\").attr(\"src\", '/admin/dist/img/img-upload.png');\n    $(\"#carouselImg\").attr(\"style\", \"height: 64px;width: 64px;display:block;\");\n    $('#edit-error-msg').css(\"display\", \"none\");\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_category.js",
    "content": "$(function () {\n    var categoryLevel = $(\"#categoryLevel\").val();\n    var parentId = $(\"#parentId\").val();\n\n    $(\"#jqGrid\").jqGrid({\n        url: '/admin/categories/list?categoryLevel=' + categoryLevel + '&parentId=' + parentId,\n        datatype: \"json\",\n        colModel: [\n            {label: 'id', name: 'categoryId', index: 'categoryId', width: 50, key: true, hidden: true},\n            {label: '分类名称', name: 'categoryName', index: 'categoryName', width: 240},\n            {label: '排序值', name: 'categoryRank', index: 'categoryRank', width: 120},\n            {label: '添加时间', name: 'createTime', index: 'createTime', width: 120}\n        ],\n        height: 560,\n        rowNum: 10,\n        rowList: [10, 20, 50],\n        styleUI: 'Bootstrap',\n        loadtext: '信息读取中...',\n        rownumbers: false,\n        rownumWidth: 20,\n        autowidth: true,\n        multiselect: true,\n        pager: \"#jqGridPager\",\n        jsonReader: {\n            root: \"data.list\",\n            page: \"data.currPage\",\n            total: \"data.totalPage\",\n            records: \"data.totalCount\"\n        },\n        prmNames: {\n            page: \"page\",\n            rows: \"limit\",\n            order: \"order\",\n        },\n        gridComplete: function () {\n            //隐藏grid底部滚动条\n            $(\"#jqGrid\").closest(\".ui-jqgrid-bdiv\").css({\"overflow-x\": \"hidden\"});\n        }\n    });\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n});\n\n/**\n * jqGrid重新加载\n */\nfunction reload() {\n    var page = $(\"#jqGrid\").jqGrid('getGridParam', 'page');\n    $(\"#jqGrid\").jqGrid('setGridParam', {\n        page: page\n    }).trigger(\"reloadGrid\");\n}\n\nfunction categoryAdd() {\n    reset();\n    $('.modal-title').html('分类添加');\n    $('#categoryModal').modal('show');\n}\n\n/**\n * 管理下级分类\n */\nfunction categoryManage() {\n    var categoryLevel = parseInt($(\"#categoryLevel\").val());\n    var parentId = $(\"#parentId\").val();\n    var id = getSelectedRow();\n    if (id == undefined || id < 0) {\n        return false;\n    }\n    if (categoryLevel == 1 || categoryLevel == 2) {\n        categoryLevel = categoryLevel + 1;\n        window.location.href = '/admin/categories?categoryLevel=' + categoryLevel + '&parentId=' + id + '&backParentId=' + parentId;\n    } else {\n        Swal.fire({\n            text: \"无下级分类\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n        });\n    }\n}\n\n/**\n * 返回上一层级\n */\nfunction categoryBack() {\n    var categoryLevel = parseInt($(\"#categoryLevel\").val());\n    var backParentId = $(\"#backParentId\").val();\n    if (categoryLevel == 2 || categoryLevel == 3) {\n        categoryLevel = categoryLevel - 1;\n        window.location.href = '/admin/categories?categoryLevel=' + categoryLevel + '&parentId=' + backParentId + '&backParentId=0';\n    } else {\n        Swal.fire({\n            text: \"无上级分类\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n        });\n    }\n}\n\n//绑定modal上的保存按钮\n$('#saveButton').click(function () {\n    var categoryName = $(\"#categoryName\").val();\n    var categoryLevel = $(\"#categoryLevel\").val();\n    var parentId = $(\"#parentId\").val();\n    var categoryRank = $(\"#categoryRank\").val();\n    if (!validCN_ENString2_18(categoryName)) {\n        $('#edit-error-msg').css(\"display\", \"block\");\n        $('#edit-error-msg').html(\"请输入符合规范的分类名称！\");\n    } else {\n        var data = {\n            \"categoryName\": categoryName,\n            \"categoryLevel\": categoryLevel,\n            \"parentId\": parentId,\n            \"categoryRank\": categoryRank\n        };\n        var url = '/admin/categories/save';\n        var id = getSelectedRowWithoutAlert();\n        if (id != null) {\n            url = '/admin/categories/update';\n            data = {\n                \"categoryId\": id,\n                \"categoryName\": categoryName,\n                \"categoryLevel\": categoryLevel,\n                \"parentId\": parentId,\n                \"categoryRank\": categoryRank\n            };\n        }\n        $.ajax({\n            type: 'POST',//方法类型\n            url: url,\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    $('#categoryModal').modal('hide');\n                    Swal.fire({\n                        text: \"保存成功\",\n                        icon: \"success\",iconColor:\"#1d953f\",\n                    });\n                    reload();\n                } else {\n                    $('#categoryModal').modal('hide');\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n                ;\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n});\n\nfunction categoryEdit() {\n    reset();\n    var id = getSelectedRow();\n    if (id == null) {\n        return;\n    }\n    var rowData = $(\"#jqGrid\").jqGrid(\"getRowData\", id);\n    $('.modal-title').html('分类编辑');\n    $('#categoryModal').modal('show');\n    $(\"#categoryId\").val(id);\n    $(\"#categoryName\").val(rowData.categoryName);\n    $(\"#categoryRank\").val(rowData.categoryRank);\n}\n\n/**\n * 分类的删除会牵涉到多级分类的修改和商品数据的修改，请谨慎删除分类数据，\n * 如果在商城页面不想显示相关分类可以通过调整rank值来调整显示顺序，\n * 不过代码我也写了一部分，如果想保留删除功能的话可以在此代码的基础上进行修改。\n */\nfunction deleteCagegory() {\n\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要删除数据吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/categories/delete\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"删除成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\n\nfunction reset() {\n    $(\"#categoryName\").val('');\n    $(\"#categoryRank\").val(0);\n    $('#edit-error-msg').css(\"display\", \"none\");\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_goods.js",
    "content": "$(function () {\n    $(\"#jqGrid\").jqGrid({\n        url: '/admin/goods/list',\n        datatype: \"json\",\n        colModel: [\n            {label: '商品编号', name: 'goodsId', index: 'goodsId', width: 60, key: true},\n            {label: '商品名', name: 'goodsName', index: 'goodsName', width: 120},\n            {label: '商品简介', name: 'goodsIntro', index: 'goodsIntro', width: 120},\n            {label: '商品图片', name: 'goodsCoverImg', index: 'goodsCoverImg', width: 120, formatter: coverImageFormatter},\n            {label: '商品库存', name: 'stockNum', index: 'stockNum', width: 60},\n            {label: '商品售价', name: 'sellingPrice', index: 'sellingPrice', width: 60},\n            {\n                label: '上架状态',\n                name: 'goodsSellStatus',\n                index: 'goodsSellStatus',\n                width: 80,\n                formatter: goodsSellStatusFormatter\n            },\n            {label: '创建时间', name: 'createTime', index: 'createTime', width: 60}\n        ],\n        height: 760,\n        rowNum: 20,\n        rowList: [20, 50, 80],\n        styleUI: 'Bootstrap',\n        loadtext: '信息读取中...',\n        rownumbers: false,\n        rownumWidth: 20,\n        autowidth: true,\n        multiselect: true,\n        pager: \"#jqGridPager\",\n        jsonReader: {\n            root: \"data.list\",\n            page: \"data.currPage\",\n            total: \"data.totalPage\",\n            records: \"data.totalCount\"\n        },\n        prmNames: {\n            page: \"page\",\n            rows: \"limit\",\n            order: \"order\",\n        },\n        gridComplete: function () {\n            //隐藏grid底部滚动条\n            $(\"#jqGrid\").closest(\".ui-jqgrid-bdiv\").css({\"overflow-x\": \"hidden\"});\n        }\n    });\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n\n    function goodsSellStatusFormatter(cellvalue) {\n        //商品上架状态 0-上架 1-下架\n        if (cellvalue == 0) {\n            return \"<button type=\\\"button\\\" class=\\\"btn btn-block btn-success btn-sm\\\" style=\\\"width: 80%;\\\">销售中</button>\";\n        }\n        if (cellvalue == 1) {\n            return \"<button type=\\\"button\\\" class=\\\"btn btn-block btn-secondary btn-sm\\\" style=\\\"width: 80%;\\\">已下架</button>\";\n        }\n    }\n\n    function coverImageFormatter(cellvalue) {\n        return \"<img src='\" + cellvalue + \"' height=\\\"80\\\" width=\\\"80\\\" alt='商品主图'/>\";\n    }\n\n});\n\n/**\n * jqGrid重新加载\n */\nfunction reload() {\n    initFlatPickr();\n    var page = $(\"#jqGrid\").jqGrid('getGridParam', 'page');\n    $(\"#jqGrid\").jqGrid('setGridParam', {\n        page: page\n    }).trigger(\"reloadGrid\");\n}\n\n/**\n * 添加商品\n */\nfunction addGoods() {\n    window.location.href = \"/admin/goods/edit\";\n}\n\n/**\n * 修改商品\n */\nfunction editGoods() {\n    var id = getSelectedRow();\n    if (id == null) {\n        return;\n    }\n    window.location.href = \"/admin/goods/edit/\" + id;\n}\n\n/**\n * 上架\n */\nfunction putUpGoods() {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要执行上架操作吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"PUT\",\n                    url: \"/admin/goods/status/0\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"上架成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\n/**\n * 下架\n */\nfunction putDownGoods() {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要执行下架操作吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"PUT\",\n                    url: \"/admin/goods/status/1\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"下架成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_goods_edit.js",
    "content": "var editor;\n\n$(function () {\n\n    //富文本编辑器 用于商品详情编辑\n    const E = window.wangEditor;\n\n    const editorConfig = { MENU_CONF: {} }\n    editorConfig.MENU_CONF['uploadImage'] = {\n          //配置服务端图片上传地址\n          server: '/admin/upload/files',\n          // 超时时间5s\n          timeout: 5 * 1000,\n          fieldName: 'files',\n          // 选择文件时的类型限制，默认为 ['image/*']\n          allowedFileTypes: ['image/*'],\n          // 限制图片大小 4M\n          maxFileSize: 4 * 1024 * 1024,\n          base64LimitSize: 5 * 1024,\n\n          onBeforeUpload(file) {\n            console.log('onBeforeUpload', file)\n\n            return file // will upload this file\n            // return false // prevent upload\n          },\n          onProgress(progress) {\n            console.log('onProgress', progress)\n          },\n          onSuccess(file, res) {\n            console.log('onSuccess', file, res)\n          },\n          onFailed(file, res) {\n            alert(res.message)\n            console.log('onFailed', file, res)\n          },\n          onError(file, err, res) {\n            alert(err.message)\n            console.error('onError', file, err, res)\n          },\n          customInsert: function (result,insertImgFn) {\n            if (result != null && result.resultCode == 200) {\n                // insertImgFn 可把图片插入到编辑器，传入图片 src ，执行函数即可\n                result.data.forEach(img => {\n                    insertImgFn(img)\n                });\n            } else if (result != null && result.resultCode != 200) {\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            } else {\n                Swal.fire({\n                    text: \"error\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n          }\n    }\n\n    editor = E.createEditor({\n      selector: '#editor-text-area',\n      html: $(\".editor-text\").val(),\n      config: editorConfig\n    })\n\n    const toolbar = E.createToolbar({\n      editor,\n      selector: '#editor-toolbar',\n    })\n\n    //图片上传插件初始化 用于商品预览图上传\n    new AjaxUpload('#uploadGoodsCoverImg', {\n        action: '/admin/upload/file',\n        name: 'file',\n        autoSubmit: true,\n        responseType: \"json\",\n        onSubmit: function (file, extension) {\n            if (!(extension && /^(jpg|jpeg|png|gif)$/.test(extension.toLowerCase()))) {\n                Swal.fire({\n                    text: \"只支持jpg、png、gif格式的文件！\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n                return false;\n            }\n        },\n        onComplete: function (file, r) {\n            if (r != null && r.resultCode == 200) {\n                $(\"#goodsCoverImg\").attr(\"src\", r.data);\n                $(\"#goodsCoverImg\").attr(\"style\", \"width: 128px;height: 128px;display:block;\");\n                return false;\n            } else if (r != null && r.resultCode != 200) {\n                Swal.fire({\n                    text: r.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n                return false;\n            }\n            else {\n                Swal.fire({\n                    text: \"error\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        }\n    });\n});\n\n$('#saveButton').click(function () {\n    var goodsId = $('#goodsId').val();\n    var goodsCategoryId = $('#levelThree option:selected').val();\n    var goodsName = $('#goodsName').val();\n    var tag = $('#tag').val();\n    var originalPrice = $('#originalPrice').val();\n    var sellingPrice = $('#sellingPrice').val();\n    var goodsIntro = $('#goodsIntro').val();\n    var stockNum = $('#stockNum').val();\n    var goodsSellStatus = $(\"input[name='goodsSellStatus']:checked\").val();\n    var goodsDetailContent = editor.getHtml();\n    var goodsCoverImg = $('#goodsCoverImg')[0].src;\n    if (isNull(goodsCategoryId)) {\n        Swal.fire({\n            text: \"请选择分类\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(goodsName)) {\n        Swal.fire({\n            text: \"请输入商品名称\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (!validLength(goodsName, 100)) {\n        Swal.fire({\n            text: \"商品名称过长\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(tag)) {\n        Swal.fire({\n            text: \"请输入商品小标签\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (!validLength(tag, 100)) {\n        Swal.fire({\n            text: \"标签过长\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(goodsIntro)) {\n        Swal.fire({\n            text: \"请输入商品简介\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (!validLength(goodsIntro, 100)) {\n        Swal.fire({\n            text: \"简介过长\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(originalPrice) || originalPrice < 1) {\n        Swal.fire({\n            text: \"请输入商品价格\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(sellingPrice) || sellingPrice < 1) {\n        Swal.fire({\n            text: \"请输入商品售卖价\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(stockNum) || sellingPrice < 0) {\n        Swal.fire({\n            text: \"请输入商品库存数\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(goodsSellStatus)) {\n        Swal.fire({\n            text: \"请选择上架状态\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(goodsDetailContent)) {\n        Swal.fire({\n            text: \"请输入商品介绍\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n        if (!validLength(goodsDetailContent, 50000)) {\n        Swal.fire({\n            text: \"商品介绍内容过长\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (isNull(goodsCoverImg) || goodsCoverImg.indexOf('img-upload') != -1) {\n        Swal.fire({\n            text: \"封面图片不能为空\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    var url = '/admin/goods/save';\n    var swlMessage = '保存成功';\n    var data = {\n        \"goodsName\": goodsName,\n        \"goodsIntro\": goodsIntro,\n        \"goodsCategoryId\": goodsCategoryId,\n        \"tag\": tag,\n        \"originalPrice\": originalPrice,\n        \"sellingPrice\": sellingPrice,\n        \"stockNum\": stockNum,\n        \"goodsDetailContent\": goodsDetailContent,\n        \"goodsCoverImg\": goodsCoverImg,\n        \"goodsCarousel\": goodsCoverImg,\n        \"goodsSellStatus\": goodsSellStatus\n    };\n    if (goodsId > 0) {\n        url = '/admin/goods/update';\n        swlMessage = '修改成功';\n        data = {\n            \"goodsId\": goodsId,\n            \"goodsName\": goodsName,\n            \"goodsIntro\": goodsIntro,\n            \"goodsCategoryId\": goodsCategoryId,\n            \"tag\": tag,\n            \"originalPrice\": originalPrice,\n            \"sellingPrice\": sellingPrice,\n            \"stockNum\": stockNum,\n            \"goodsDetailContent\": goodsDetailContent,\n            \"goodsCoverImg\": goodsCoverImg,\n            \"goodsCarousel\": goodsCoverImg,\n            \"goodsSellStatus\": goodsSellStatus\n        };\n    }\n    console.log(data);\n    $.ajax({\n        type: 'POST',//方法类型\n        url: url,\n        contentType: 'application/json',\n        data: JSON.stringify(data),\n        success: function (result) {\n            if (result.resultCode == 200) {\n                Swal.fire({\n                    text: swlMessage,\n                    icon: \"success\",iconColor:\"#1d953f\",\n                    showCancelButton: false,\n                    confirmButtonColor: '#1baeae',\n                    confirmButtonText: '返回商品列表',\n                    confirmButtonClass: 'btn btn-success',\n                    buttonsStyling: false\n                }).then(function () {\n                    window.location.href = \"/admin/goods\";\n                })\n            } else {\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n            ;\n        },\n        error: function () {\n            Swal.fire({\n                text: \"操作失败\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n        }\n    });\n});\n\n$('#cancelButton').click(function () {\n    window.location.href = \"/admin/goods\";\n});\n\n$('#levelOne').on('change', function () {\n    $.ajax({\n        url: '/admin/categories/listForSelect?categoryId=' + $(this).val(),\n        type: 'GET',\n        success: function (result) {\n            if (result.resultCode == 200) {\n                var levelTwoSelect = '';\n                var secondLevelCategories = result.data.secondLevelCategories;\n                var length2 = secondLevelCategories.length;\n                for (var i = 0; i < length2; i++) {\n                    levelTwoSelect += '<option value=\\\"' + secondLevelCategories[i].categoryId + '\\\">' + secondLevelCategories[i].categoryName + '</option>';\n                }\n                $('#levelTwo').html(levelTwoSelect);\n                var levelThreeSelect = '';\n                var thirdLevelCategories = result.data.thirdLevelCategories;\n                var length3 = thirdLevelCategories.length;\n                for (var i = 0; i < length3; i++) {\n                    levelThreeSelect += '<option value=\\\"' + thirdLevelCategories[i].categoryId + '\\\">' + thirdLevelCategories[i].categoryName + '</option>';\n                }\n                $('#levelThree').html(levelThreeSelect);\n            } else {\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n            ;\n        },\n        error: function () {\n            Swal.fire({\n                text: \"操作失败\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n        }\n    });\n});\n\n$('#levelTwo').on('change', function () {\n    $.ajax({\n        url: '/admin/categories/listForSelect?categoryId=' + $(this).val(),\n        type: 'GET',\n        success: function (result) {\n            if (result.resultCode == 200) {\n                var levelThreeSelect = '';\n                var thirdLevelCategories = result.data.thirdLevelCategories;\n                var length = thirdLevelCategories.length;\n                for (var i = 0; i < length; i++) {\n                    levelThreeSelect += '<option value=\\\"' + thirdLevelCategories[i].categoryId + '\\\">' + thirdLevelCategories[i].categoryName + '</option>';\n                }\n                $('#levelThree').html(levelThreeSelect);\n            } else {\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n            ;\n        },\n        error: function () {\n            Swal.fire({\n                text: \"操作失败\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n        }\n    });\n});\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_index_config.js",
    "content": "$(function () {\n    var configType = $(\"#configType\").val();\n\n    $(\"#jqGrid\").jqGrid({\n        url: '/admin/indexConfigs/list?configType=' + configType,\n        datatype: \"json\",\n        colModel: [\n            {label: 'id', name: 'configId', index: 'configId', width: 50, key: true, hidden: true},\n            {label: '配置项名称', name: 'configName', index: 'configName', width: 180},\n            {label: '跳转链接', name: 'redirectUrl', index: 'redirectUrl', width: 120},\n            {label: '排序值', name: 'configRank', index: 'configRank', width: 120},\n            {label: '商品编号', name: 'goodsId', index: 'goodsId', width: 120},\n            {label: '添加时间', name: 'createTime', index: 'createTime', width: 120}\n        ],\n        height: 560,\n        rowNum: 10,\n        rowList: [10, 20, 50],\n        styleUI: 'Bootstrap',\n        loadtext: '信息读取中...',\n        rownumbers: false,\n        rownumWidth: 20,\n        autowidth: true,\n        multiselect: true,\n        pager: \"#jqGridPager\",\n        jsonReader: {\n            root: \"data.list\",\n            page: \"data.currPage\",\n            total: \"data.totalPage\",\n            records: \"data.totalCount\"\n        },\n        prmNames: {\n            page: \"page\",\n            rows: \"limit\",\n            order: \"order\",\n        },\n        gridComplete: function () {\n            //隐藏grid底部滚动条\n            $(\"#jqGrid\").closest(\".ui-jqgrid-bdiv\").css({\"overflow-x\": \"hidden\"});\n        }\n    });\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n});\n\n/**\n * jqGrid重新加载\n */\nfunction reload() {\n    var page = $(\"#jqGrid\").jqGrid('getGridParam', 'page');\n    $(\"#jqGrid\").jqGrid('setGridParam', {\n        page: page\n    }).trigger(\"reloadGrid\");\n}\n\nfunction configAdd() {\n    reset();\n    $('.modal-title').html('首页配置项添加');\n    $('#indexConfigModal').modal('show');\n}\n\n//绑定modal上的保存按钮\n$('#saveButton').click(function () {\n    var configName = $(\"#configName\").val();\n    var configType = $(\"#configType\").val();\n    var redirectUrl = $(\"#redirectUrl\").val();\n    var goodsId = $(\"#goodsId\").val();\n    var configRank = $(\"#configRank\").val();\n    if (!validCN_ENString2_18(configName)) {\n        $('#edit-error-msg').css(\"display\", \"block\");\n        $('#edit-error-msg').html(\"请输入符合规范的配置项名称！\");\n    } else {\n        var data = {\n            \"configName\": configName,\n            \"configType\": configType,\n            \"redirectUrl\": redirectUrl,\n            \"goodsId\": goodsId,\n            \"configRank\": configRank\n        };\n        var url = '/admin/indexConfigs/save';\n        var id = getSelectedRowWithoutAlert();\n        if (id != null) {\n            url = '/admin/indexConfigs/update';\n            data = {\n                \"configId\": id,\n                \"configName\": configName,\n                \"configType\": configType,\n                \"redirectUrl\": redirectUrl,\n                \"goodsId\": goodsId,\n                \"configRank\": configRank\n            };\n        }\n        $.ajax({\n            type: 'POST',//方法类型\n            url: url,\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    $('#indexConfigModal').modal('hide');\n                    Swal.fire({\n                        text: \"保存成功\",\n                        icon: \"success\",iconColor:\"#1d953f\",\n                    });\n                    reload();\n                } else {\n                    $('#indexConfigModal').modal('hide');\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n                ;\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n});\n\nfunction configEdit() {\n    reset();\n    var id = getSelectedRow();\n    if (id == null) {\n        return;\n    }\n    var rowData = $(\"#jqGrid\").jqGrid(\"getRowData\", id);\n    $('.modal-title').html('首页配置项编辑');\n    $('#indexConfigModal').modal('show');\n    $(\"#configId\").val(id);\n    $(\"#configName\").val(rowData.configName);\n    $(\"#redirectUrl\").val(rowData.redirectUrl);\n    $(\"#goodsId\").val(rowData.goodsId);\n    $(\"#configRank\").val(rowData.configRank);\n}\n\nfunction deleteConfig () {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要删除数据吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/indexConfigs/delete\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"删除成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\n\nfunction reset() {\n    $(\"#configName\").val('');\n    $(\"#redirectUrl\").val('##');\n    $(\"#configRank\").val(0);\n    $(\"#goodsId\").val(0);\n    $('#edit-error-msg').css(\"display\", \"none\");\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_order.js",
    "content": "$(function () {\n    $(\"#jqGrid\").jqGrid({\n        url: '/admin/orders/list',\n        datatype: \"json\",\n        colModel: [\n            {label: 'id', name: 'orderId', index: 'orderId', width: 50, key: true, hidden: true},\n            {label: '订单号', name: 'orderNo', index: 'orderNo', width: 120},\n            {label: '订单总价', name: 'totalPrice', index: 'totalPrice', width: 60},\n            {label: '订单状态', name: 'orderStatus', index: 'orderStatus', width: 80, formatter: orderStatusFormatter},\n            {label: '支付方式', name: 'payType', index: 'payType', width: 80,formatter:payTypeFormatter},\n            {label: '收件人地址', name: 'userAddress', index: 'userAddress', width: 10, hidden: true},\n            {label: '创建时间', name: 'createTime', index: 'createTime', width: 120},\n            {label: '操作', name: 'createTime', index: 'createTime', width: 120, formatter: operateFormatter}\n        ],\n        height: 760,\n        rowNum: 20,\n        rowList: [20, 50, 80],\n        styleUI: 'Bootstrap',\n        loadtext: '信息读取中...',\n        rownumbers: false,\n        rownumWidth: 20,\n        autowidth: true,\n        multiselect: true,\n        pager: \"#jqGridPager\",\n        jsonReader: {\n            root: \"data.list\",\n            page: \"data.currPage\",\n            total: \"data.totalPage\",\n            records: \"data.totalCount\"\n        },\n        prmNames: {\n            page: \"page\",\n            rows: \"limit\",\n            order: \"order\",\n        },\n        gridComplete: function () {\n            //隐藏grid底部滚动条\n            $(\"#jqGrid\").closest(\".ui-jqgrid-bdiv\").css({\"overflow-x\": \"hidden\"});\n        }\n    });\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n\n    function operateFormatter(cellvalue, rowObject) {\n        return \"<a href=\\'##\\' onclick=openOrderItems(\" + rowObject.rowId + \")>查看订单信息</a>\" +\n            \"<br>\" +\n            \"<a href=\\'##\\' onclick=openExpressInfo(\" + rowObject.rowId + \")>查看收件人信息</a>\";\n    }\n\n    function orderStatusFormatter(cellvalue) {\n        //订单状态:0.待支付 1.已支付 2.配货完成 3:出库成功 4.交易成功 -1.手动关闭 -2.超时关闭 -3.商家关闭\n        if (cellvalue == 0) {\n            return \"待支付\";\n        }\n        if (cellvalue == 1) {\n            return \"已支付\";\n        }\n        if (cellvalue == 2) {\n            return \"配货完成\";\n        }\n        if (cellvalue == 3) {\n            return \"出库成功\";\n        }\n        if (cellvalue == 4) {\n            return \"交易成功\";\n        }\n        if (cellvalue == -1) {\n            return \"手动关闭\";\n        }\n        if (cellvalue == -2) {\n            return \"超时关闭\";\n        }\n        if (cellvalue == -3) {\n            return \"商家关闭\";\n        }\n    }\n\n    function payTypeFormatter(cellvalue) {\n        //支付类型:0.无 1.支付宝支付 2.微信支付\n        if (cellvalue == 0) {\n            return \"无\";\n        }\n        if (cellvalue == 1) {\n            return \"支付宝支付\";\n        }\n        if (cellvalue == 2) {\n            return \"微信支付\";\n        }\n    }\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n\n});\n\n/**\n * jqGrid重新加载\n */\nfunction reload() {\n    initFlatPickr();\n    var page = $(\"#jqGrid\").jqGrid('getGridParam', 'page');\n    $(\"#jqGrid\").jqGrid('setGridParam', {\n        page: page\n    }).trigger(\"reloadGrid\");\n}\n\n/**\n * 查看订单项信息\n * @param orderId\n */\nfunction openOrderItems(orderId) {\n    $('.modal-title').html('订单详情');\n    $.ajax({\n        type: 'GET',//方法类型\n        url: '/admin/order-items/' + orderId,\n        contentType: 'application/json',\n        success: function (result) {\n            if (result.resultCode == 200) {\n                $('#orderItemModal').modal('show');\n                var itemString = '';\n                for (i = 0; i < result.data.length; i++) {\n                    itemString += result.data[i].goodsName + ' x ' + result.data[i].goodsCount + ' 商品编号 ' + result.data[i].goodsId + \";<br>\";\n                }\n                $(\"#orderItemString\").html(itemString);\n            } else {\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n            ;\n        },\n        error: function () {\n            Swal.fire({\n                text: \"操作失败\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n        }\n    });\n}\n\n/**\n * 查看收件人信息\n * @param orderId\n */\nfunction openExpressInfo(orderId) {\n    var rowData = $(\"#jqGrid\").jqGrid(\"getRowData\", orderId);\n    $('.modal-title').html('收件信息');\n    $('#expressInfoModal').modal('show');\n    $(\"#userAddressInfo\").html(rowData.userAddress);\n}\n\n/**\n * 订单编辑\n */\nfunction orderEdit() {\n    reset();\n    var id = getSelectedRow();\n    if (id == null) {\n        return;\n    }\n    var rowData = $(\"#jqGrid\").jqGrid(\"getRowData\", id);\n    $('.modal-title').html('订单编辑');\n    $('#orderInfoModal').modal('show');\n    $(\"#orderId\").val(id);\n    $(\"#userAddress\").val(rowData.userAddress);\n    $(\"#totalPrice\").val(rowData.totalPrice);\n}\n\n\n//绑定modal上的保存按钮\n$('#saveButton').click(function () {\n    var totalPrice = $(\"#totalPrice\").val();\n    var userName = $(\"#userName\").val();\n    var userPhone = $(\"#userPhone\").val();\n    var userAddress = $(\"#userAddress\").val();\n    var id = getSelectedRowWithoutAlert();\n    var url = '/admin/orders/update';\n    var data = {\n        \"orderId\": id,\n        \"totalPrice\": totalPrice,\n        \"userName\": userName,\n        \"userPhone\": userPhone,\n        \"userAddress\": userAddress\n    };\n    $.ajax({\n        type: 'POST',//方法类型\n        url: url,\n        contentType: 'application/json',\n        data: JSON.stringify(data),\n        success: function (result) {\n            if (result.resultCode == 200) {\n                $('#orderInfoModal').modal('hide');\n                Swal.fire({\n                    text: \"保存成功\",\n                    icon: \"success\",iconColor:\"#1d953f\",\n                });\n                reload();\n            } else {\n                $('#orderInfoModal').modal('hide');\n                Swal.fire({\n                    text: result.message,\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n            ;\n        },\n        error: function () {\n            Swal.fire({\n                text: \"操作失败\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n        }\n    });\n});\n\n/**\n * 订单拣货完成\n */\nfunction orderCheckDone() {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    var orderNos = '';\n    for (i = 0; i < ids.length; i++) {\n        var rowData = $(\"#jqGrid\").jqGrid(\"getRowData\", ids[i]);\n        if (rowData.orderStatus != '已支付') {\n            orderNos += rowData.orderNo + \" \";\n        }\n    }\n    if (orderNos.length > 0 & orderNos.length < 100) {\n        Swal.fire({\n            text: orderNos + \"订单的状态不是支付成功无法执行配货完成操作\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (orderNos.length >= 100) {\n        Swal.fire({\n            text: \"你选择了太多状态不是支付成功的订单，无法执行配货完成操作\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要执行配货完成操作吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/orders/checkDone\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"配货完成\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\n/**\n * 订单出库\n */\nfunction orderCheckOut() {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    var orderNos = '';\n    for (i = 0; i < ids.length; i++) {\n        var rowData = $(\"#jqGrid\").jqGrid(\"getRowData\", ids[i]);\n        if (rowData.orderStatus != '已支付' && rowData.orderStatus != '配货完成') {\n            orderNos += rowData.orderNo + \" \";\n        }\n    }\n    if (orderNos.length > 0 & orderNos.length < 100) {\n        Swal.fire({\n            text: orderNos + \"订单的状态不是支付成功或配货完成无法执行出库操作\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    if (orderNos.length >= 100) {\n        Swal.fire({\n            text: \"你选择了太多状态不是支付成功或配货完成的订单，无法执行出库操作\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要执行出库操作吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/orders/checkOut\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"出库成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\nfunction closeOrder() {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要关闭订单吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/orders/close\",\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"关闭成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}\n\n\nfunction reset() {\n    $(\"#totalPrice\").val(0);\n    $(\"#userAddress\").val('');\n    $('#edit-error-msg').css(\"display\", \"none\");\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/newbee_mall_user.js",
    "content": "$(function () {\n    $(\"#jqGrid\").jqGrid({\n        url: '/admin/users/list',\n        datatype: \"json\",\n        colModel: [\n            {label: 'id', name: 'userId', index: 'userId', width: 50, key: true, hidden: true},\n            {label: '昵称', name: 'nickName', index: 'nickName', width: 180},\n            {label: '登录名', name: 'loginName', index: 'loginName', width: 120},\n            {label: '身份状态', name: 'lockedFlag', index: 'lockedFlag', width: 60, formatter: lockedFormatter},\n            {label: '是否注销', name: 'isDeleted', index: 'isDeleted', width: 60, formatter: deletedFormatter},\n            {label: '注册时间', name: 'createTime', index: 'createTime', width: 120}\n        ],\n        height: 560,\n        rowNum: 10,\n        rowList: [10, 20, 50],\n        styleUI: 'Bootstrap',\n        loadtext: '信息读取中...',\n        rownumbers: false,\n        rownumWidth: 20,\n        autowidth: true,\n        multiselect: true,\n        pager: \"#jqGridPager\",\n        jsonReader: {\n            root: \"data.list\",\n            page: \"data.currPage\",\n            total: \"data.totalPage\",\n            records: \"data.totalCount\"\n        },\n        prmNames: {\n            page: \"page\",\n            rows: \"limit\",\n            order: \"order\",\n        },\n        gridComplete: function () {\n            //隐藏grid底部滚动条\n            $(\"#jqGrid\").closest(\".ui-jqgrid-bdiv\").css({\"overflow-x\": \"hidden\"});\n        }\n    });\n\n    $(window).resize(function () {\n        $(\"#jqGrid\").setGridWidth($(\".card-body\").width());\n    });\n\n    function lockedFormatter(cellvalue) {\n        if (cellvalue == 1) {\n            return \"<button type=\\\"button\\\" class=\\\"btn btn-block btn-secondary btn-sm\\\" style=\\\"width: 50%;\\\">锁定</button>\";\n        } else if (cellvalue == 0) {\n            return \"<button type=\\\"button\\\" class=\\\"btn btn-block btn-success btn-sm\\\" style=\\\"width: 50%;\\\">正常</button>\";\n        }\n    }\n\n    function deletedFormatter(cellvalue) {\n        if (cellvalue == 1) {\n            return \"<button type=\\\"button\\\" class=\\\"btn btn-block btn-secondary btn-sm\\\" style=\\\"width: 50%;\\\">注销</button>\";\n        } else if (cellvalue == 0) {\n            return \"<button type=\\\"button\\\" class=\\\"btn btn-block btn-success btn-sm\\\" style=\\\"width: 50%;\\\">正常</button>\";\n        }\n    }\n});\n\n/**\n * jqGrid重新加载\n */\nfunction reload() {\n    var page = $(\"#jqGrid\").jqGrid('getGridParam', 'page');\n    $(\"#jqGrid\").jqGrid('setGridParam', {\n        page: page\n    }).trigger(\"reloadGrid\");\n}\n\n\nfunction lockUser(lockStatus) {\n    var ids = getSelectedRows();\n    if (ids == null) {\n        return;\n    }\n    if (lockStatus != 0 && lockStatus != 1) {\n        Swal.fire({\n            text: '非法操作',\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n    }\n    Swal.fire({\n        title: \"确认弹框\",\n        text: \"确认要修改账号状态吗?\",\n        icon: \"warning\",iconColor:\"#dea32c\",\n        showCancelButton: true,\n        confirmButtonText: '确认',\n        cancelButtonText: '取消'\n    }).then((flag) => {\n            if (flag.value) {\n                $.ajax({\n                    type: \"POST\",\n                    url: \"/admin/users/lock/\" + lockStatus,\n                    contentType: \"application/json\",\n                    data: JSON.stringify(ids),\n                    success: function (r) {\n                        if (r.resultCode == 200) {\n                            Swal.fire({\n                                text: \"操作成功\",\n                                icon: \"success\",iconColor:\"#1d953f\",\n                            });\n                            $(\"#jqGrid\").trigger(\"reloadGrid\");\n                        } else {\n                            Swal.fire({\n                                text: r.message,\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    }\n                });\n            }\n        }\n    )\n    ;\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/bootstrap/css/bootstrap-grid.css",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/bootstrap/css/bootstrap-reboot.css",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/bootstrap/css/bootstrap.css",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/bootstrap/js/bootstrap.bundle.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/bootstrap/js/bootstrap.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chart.js",
    "content": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.1\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(o,s){if(!n[o]){if(!e[o]){var l=\"function\"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);var u=new Error(\"Cannot find module '\"+o+\"'\");throw u.code=\"MODULE_NOT_FOUND\",u}var d=n[o]={exports:{}};e[o][0].call(d.exports,function(t){var n=e[o][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[o].exports}for(var r=\"function\"==typeof require&&require,o=0;o<i.length;o++)a(i[o]);return a}({1:[function(t,e,n){function i(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3})$/i);if(i){i=i[1];for(a=0;a<e.length;a++)e[a]=parseInt(i[a]+i[a],16)}else if(i=t.match(/^#([a-fA-F0-9]{6})$/i)){i=i[1];for(a=0;a<e.length;a++)e[a]=parseInt(i.slice(2*a,2*a+2),16)}else if(i=t.match(/^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i)){for(a=0;a<e.length;a++)e[a]=parseInt(i[a+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i)){for(a=0;a<e.length;a++)e[a]=Math.round(2.55*parseFloat(i[a+1]));n=parseFloat(i[4])}else if(i=t.match(/(\\w+)/)){if(\"transparent\"==i[1])return[0,0,0,0];if(!(e=c[i[1]]))return}for(var a=0;a<e.length;a++)e[a]=u(e[a],0,255);return n=n||0==n?u(n,0,1):1,e[3]=n,e}}function a(t){if(t){var e=t.match(/^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/);if(e){var n=parseFloat(e[4]);return[u(parseInt(e[1]),0,360),u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}}}function r(t){if(t){var e=t.match(/^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/);if(e){var n=parseFloat(e[4]);return[u(parseInt(e[1]),0,360),u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}}}function o(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"rgba(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+e+\")\"}function s(t,e){return\"rgba(\"+Math.round(t[0]/255*100)+\"%, \"+Math.round(t[1]/255*100)+\"%, \"+Math.round(t[2]/255*100)+\"%, \"+(e||t[3]||1)+\")\"}function l(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"hsla(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%, \"+e+\")\"}function u(t,e,n){return Math.min(Math.max(e,t),n)}function d(t){var e=t.toString(16).toUpperCase();return e.length<2?\"0\"+e:e}var c=t(5);e.exports={getRgba:i,getHsla:a,getRgb:function(t){var e=i(t);return e&&e.slice(0,3)},getHsl:function(t){var e=a(t);return e&&e.slice(0,3)},getHwb:r,getAlpha:function(t){var e=i(t);return e?e[3]:(e=a(t))?e[3]:(e=r(t))?e[3]:void 0},hexString:function(t){return\"#\"+d(t[0])+d(t[1])+d(t[2])},rgbString:function(t,e){return e<1||t[3]&&t[3]<1?o(t,e):\"rgb(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},rgbaString:o,percentString:function(t,e){return e<1||t[3]&&t[3]<1?s(t,e):\"rgb(\"+Math.round(t[0]/255*100)+\"%, \"+Math.round(t[1]/255*100)+\"%, \"+Math.round(t[2]/255*100)+\"%)\"},percentaString:s,hslString:function(t,e){return e<1||t[3]&&t[3]<1?l(t,e):\"hsl(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%)\"},hslaString:l,hwbString:function(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"hwb(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%\"+(void 0!==e&&1!==e?\", \"+e:\"\")+\")\"},keyword:function(t){return h[t.slice(0,3)]}};var h={};for(var f in c)h[c[f]]=f},{5:5}],2:[function(t,e,n){var i=t(4),a=t(1),r=function(t){if(t instanceof r)return t;if(!(this instanceof r))return new r(t);this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;\"string\"==typeof t?(e=a.getRgba(t))?this.setValues(\"rgb\",e):(e=a.getHsla(t))?this.setValues(\"hsl\",e):(e=a.getHwb(t))&&this.setValues(\"hwb\",e):\"object\"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues(\"rgb\",e):void 0!==e.l||void 0!==e.lightness?this.setValues(\"hsl\",e):void 0!==e.v||void 0!==e.value?this.setValues(\"hsv\",e):void 0!==e.w||void 0!==e.whiteness?this.setValues(\"hwb\",e):void 0===e.c&&void 0===e.cyan||this.setValues(\"cmyk\",e))};r.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace(\"rgb\",arguments)},hsl:function(){return this.setSpace(\"hsl\",arguments)},hsv:function(){return this.setSpace(\"hsv\",arguments)},hwb:function(){return this.setSpace(\"hwb\",arguments)},cmyk:function(){return this.setSpace(\"cmyk\",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues(\"alpha\",t),this)},red:function(t){return this.setChannel(\"rgb\",0,t)},green:function(t){return this.setChannel(\"rgb\",1,t)},blue:function(t){return this.setChannel(\"rgb\",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel(\"hsl\",0,t)},saturation:function(t){return this.setChannel(\"hsl\",1,t)},lightness:function(t){return this.setChannel(\"hsl\",2,t)},saturationv:function(t){return this.setChannel(\"hsv\",1,t)},whiteness:function(t){return this.setChannel(\"hwb\",1,t)},blackness:function(t){return this.setChannel(\"hwb\",2,t)},value:function(t){return this.setChannel(\"hsv\",2,t)},cyan:function(t){return this.setChannel(\"cmyk\",0,t)},magenta:function(t){return this.setChannel(\"cmyk\",1,t)},yellow:function(t){return this.setChannel(\"cmyk\",2,t)},black:function(t){return this.setChannel(\"cmyk\",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?\"AAA\":e>=4.5?\"AA\":\"\"},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues(\"rgb\",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues(\"hsl\",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues(\"hsl\",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues(\"hsl\",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues(\"hsl\",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues(\"hwb\",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues(\"hwb\",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues(\"rgb\",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues(\"alpha\",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues(\"alpha\",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues(\"hsl\",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,r=2*a-1,o=n.alpha()-i.alpha(),s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*n.red()+l*i.red(),s*n.green()+l*i.green(),s*n.blue()+l*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new r,i=this.values,a=n.values;for(var o in i)i.hasOwnProperty(o)&&(t=i[o],\"[object Array]\"===(e={}.toString.call(t))?a[o]=t.slice(0):\"[object Number]\"===e?a[o]=t:console.error(\"unexpected color value:\",t));return n}},r.prototype.spaces={rgb:[\"red\",\"green\",\"blue\"],hsl:[\"hue\",\"saturation\",\"lightness\"],hsv:[\"hue\",\"saturation\",\"value\"],hwb:[\"hue\",\"whiteness\",\"blackness\"],cmyk:[\"cyan\",\"magenta\",\"yellow\",\"black\"]},r.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},r.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},r.prototype.setValues=function(t,e){var n,a=this.values,r=this.spaces,o=this.maxes,s=1;if(this.valid=!0,\"alpha\"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];s=e.a}else if(void 0!==e[r[t][0]]){var l=r[t];for(n=0;n<t.length;n++)a[t][n]=e[l[n]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),\"alpha\"===t)return!1;var u;for(n=0;n<t.length;n++)u=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(u);for(var d in r)d!==t&&(a[d]=i[t][d](a[t]));return!0},r.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):(\"number\"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},r.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},\"undefined\"!=typeof window&&(window.Color=r),e.exports=r},{1:1,4:4}],3:[function(t,e,n){function i(t){var e,n,i,a=t[0]/255,r=t[1]/255,o=t[2]/255,s=Math.min(a,r,o),l=Math.max(a,r,o),u=l-s;return l==s?e=0:a==l?e=(r-o)/u:r==l?e=2+(o-a)/u:o==l&&(e=4+(a-r)/u),(e=Math.min(60*e,360))<0&&(e+=360),i=(s+l)/2,n=l==s?0:i<=.5?u/(l+s):u/(2-l-s),[e,100*n,100*i]}function a(t){var e,n,i,a=t[0],r=t[1],o=t[2],s=Math.min(a,r,o),l=Math.max(a,r,o),u=l-s;return n=0==l?0:u/l*1e3/10,l==s?e=0:a==l?e=(r-o)/u:r==l?e=2+(o-a)/u:o==l&&(e=4+(a-r)/u),(e=Math.min(60*e,360))<0&&(e+=360),i=l/255*1e3/10,[e,n,i]}function o(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function s(t){var e,n,i,a,r=t[0]/255,o=t[1]/255,s=t[2]/255;return a=Math.min(1-r,1-o,1-s),e=(1-r-a)/(1-a)||0,n=(1-o-a)/(1-a)||0,i=(1-s-a)/(1-a)||0,[100*e,100*n,100*i,100*a]}function l(t){return S[JSON.stringify(t)]}function u(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),r=a[0],o=a[1],s=a[2];return r/=95.047,o/=100,s/=108.883,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*o-16,n=500*(r-o),i=200*(o-s),[e,n,i]}function c(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return r=255*l,[r,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r)),i=255*i;switch(a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}}function f(t){var e,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),e=Math.floor(6*o),n=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),a=s+i*(n-s),e){default:case 6:case 0:r=n,g=a,b=s;break;case 1:r=a,g=n,b=s;break;case 2:r=s,g=n,b=a;break;case 3:r=s,g=a,b=n;break;case 4:r=a,g=s,b=n;break;case 5:r=n,g=s,b=a}return[255*r,255*g,255*b]}function m(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100,s=t[3]/100;return e=1-Math.min(1,a*(1-s)+s),n=1-Math.min(1,r*(1-s)+s),i=1-Math.min(1,o*(1-s)+s),[255*e,255*n,255*i]}function p(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return e=3.2406*a+-1.5372*r+-.4986*o,n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0],r=t[1],o=t[2];return a/=95.047,r/=100,o/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,e=116*r-16,n=500*(a-r),i=200*(r-o),[e,n,i]}function y(t){var e,n,i,a,r=t[0],o=t[1],s=t[2];return r<=8?a=(n=100*r/903.3)/100*7.787+16/116:(n=100*Math.pow((r+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i=i/108.883<=.008859?i=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3),[e,n,i]}function x(t){var e,n,i,a=t[0],r=t[1],o=t[2];return e=Math.atan2(o,r),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(r*r+o*o),[a,i,n]}function _(t){return p(y(t))}function k(t){var e,n,i,a=t[0],r=t[1];return i=t[2]/360*2*Math.PI,e=r*Math.cos(i),n=r*Math.sin(i),[a,e,n]}function w(t){return M[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return 0===r?[0,0,0]:(r*=2,a*=r<=1?r:2-r,n=(r+a)/2,e=2*a/(r+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return s(c(t))},hsl2keyword:function(t){return l(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return n=(2-a)*r,e=a*r,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return s(h(t))},hsv2keyword:function(t){return l(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return s(f(t))},hwb2keyword:function(t){return l(f(t))},cmyk2rgb:m,cmyk2hsl:function(t){return i(m(t))},cmyk2hsv:function(t){return a(m(t))},cmyk2hwb:function(t){return o(m(t))},cmyk2keyword:function(t){return l(m(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return a(w(t))},keyword2hwb:function(t){return o(w(t))},keyword2cmyk:function(t){return s(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return u(w(t))},xyz2rgb:p,xyz2lab:v,xyz2lch:function(t){return x(v(t))},lab2xyz:y,lab2rgb:_,lab2lch:x,lch2lab:k,lch2xyz:function(t){return y(k(t))},lch2rgb:function(t){return _(k(t))}};var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},S={};for(var D in M)S[JSON.stringify(M[D])]=D},{}],4:[function(t,e,n){var i=t(3),a=function(){return new u};for(var r in i){a[r+\"Raw\"]=function(t){return function(e){return\"number\"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(r);var o=/(\\w+)2(\\w+)/.exec(r),s=o[1],l=o[2];(a[s]=a[s]||{})[l]=a[r]=function(t){return function(e){\"number\"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if(\"string\"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(r)}var u=function(){this.convs={}};u.prototype.routeSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):(\"number\"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n))},u.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},u.prototype.getValues=function(t){var e=this.convs[t];if(!e){var n=this.space,i=this.convs[n];e=a[n][t](i),this.convs[t]=e}return e},[\"rgb\",\"hsl\",\"hsv\",\"cmyk\",\"keyword\"].forEach(function(t){u.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{3:3}],5:[function(t,e,n){\"use strict\";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],6:[function(t,e,n){!function(t,i){\"object\"==typeof n&&void 0!==e?e.exports=i():t.moment=i()}(this,function(){\"use strict\";function n(){return xe.apply(null,arguments)}function i(t){return t instanceof Array||\"[object Array]\"===Object.prototype.toString.call(t)}function a(t){return null!=t&&\"[object Object]\"===Object.prototype.toString.call(t)}function r(t){var e;for(e in t)return!1;return!0}function o(t){return void 0===t}function s(t){return\"number\"==typeof t||\"[object Number]\"===Object.prototype.toString.call(t)}function l(t){return t instanceof Date||\"[object Date]\"===Object.prototype.toString.call(t)}function u(t,e){var n,i=[];for(n=0;n<t.length;++n)i.push(e(t[n],n));return i}function d(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){for(var n in e)d(e,n)&&(t[n]=e[n]);return d(e,\"toString\")&&(t.toString=e.toString),d(e,\"valueOf\")&&(t.valueOf=e.valueOf),t}function h(t,e,n,i){return Yt(t,e,n,i,!0).utc()}function f(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function g(t){return null==t._pf&&(t._pf=f()),t._pf}function m(t){if(null==t._isValid){var e=g(t),n=ke.call(e.parsedDateParts,function(t){return null!=t}),i=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(i=i&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return i;t._isValid=i}return t._isValid}function p(t){var e=h(NaN);return null!=t?c(g(e),t):g(e).userInvalidated=!0,e}function v(t,e){var n,i,a;if(o(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),o(e._i)||(t._i=e._i),o(e._f)||(t._f=e._f),o(e._l)||(t._l=e._l),o(e._strict)||(t._strict=e._strict),o(e._tzm)||(t._tzm=e._tzm),o(e._isUTC)||(t._isUTC=e._isUTC),o(e._offset)||(t._offset=e._offset),o(e._pf)||(t._pf=g(e)),o(e._locale)||(t._locale=e._locale),we.length>0)for(n=0;n<we.length;n++)o(a=e[i=we[n]])||(t[i]=a);return t}function y(t){v(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===Me&&(Me=!0,n.updateOffset(this),Me=!1)}function b(t){return t instanceof y||null!=t&&null!=t._isAMomentObject}function x(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function _(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=x(e)),n}function k(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;i<a;i++)(n&&t[i]!==e[i]||!n&&_(t[i])!==_(e[i]))&&o++;return o+r}function w(t){!1===n.suppressDeprecationWarnings&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"Deprecation warning: \"+t)}function M(t,e){var i=!0;return c(function(){if(null!=n.deprecationHandler&&n.deprecationHandler(null,t),i){for(var a,r=[],o=0;o<arguments.length;o++){if(a=\"\",\"object\"==typeof arguments[o]){a+=\"\\n[\"+o+\"] \";for(var s in arguments[0])a+=s+\": \"+arguments[0][s]+\", \";a=a.slice(0,-2)}else a=arguments[o];r.push(a)}w(t+\"\\nArguments: \"+Array.prototype.slice.call(r).join(\"\")+\"\\n\"+(new Error).stack),i=!1}return e.apply(this,arguments)},e)}function S(t,e){null!=n.deprecationHandler&&n.deprecationHandler(t,e),Se[t]||(w(e),Se[t]=!0)}function D(t){return t instanceof Function||\"[object Function]\"===Object.prototype.toString.call(t)}function C(t,e){var n,i=c({},t);for(n in e)d(e,n)&&(a(t[n])&&a(e[n])?(i[n]={},c(i[n],t[n]),c(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)d(t,n)&&!d(e,n)&&a(t[n])&&(i[n]=c({},i[n]));return i}function P(t){null!=t&&this.set(t)}function T(t,e){var n=t.toLowerCase();Te[n]=Te[n+\"s\"]=Te[e]=t}function A(t){return\"string\"==typeof t?Te[t]||Te[t.toLowerCase()]:void 0}function I(t){var e,n,i={};for(n in t)d(t,n)&&(e=A(n))&&(i[e]=t[n]);return i}function O(t,e){Ae[t]=e}function F(t){var e=[];for(var n in t)e.push({unit:n,priority:Ae[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function R(t,e){return function(i){return null!=i?(W(this,t,i),n.updateOffset(this,e),this):L(this,t)}}function L(t,e){return t.isValid()?t._d[\"get\"+(t._isUTC?\"UTC\":\"\")+e]():NaN}function W(t,e,n){t.isValid()&&t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+e](n)}function Y(t,e,n){var i=\"\"+Math.abs(t),a=e-i.length;return(t>=0?n?\"+\":\"\":\"-\")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}function N(t,e,n,i){var a=i;\"string\"==typeof i&&(a=function(){return this[i]()}),t&&(Re[t]=a),e&&(Re[e[0]]=function(){return Y(a.apply(this,arguments),e[1],e[2])}),n&&(Re[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function z(t){return t.match(/\\[[\\s\\S]/)?t.replace(/^\\[|\\]$/g,\"\"):t.replace(/\\\\/g,\"\")}function B(t){var e,n,i=t.match(Ie);for(e=0,n=i.length;e<n;e++)Re[i[e]]?i[e]=Re[i[e]]:i[e]=z(i[e]);return function(e){var a,r=\"\";for(a=0;a<n;a++)r+=D(i[a])?i[a].call(e,t):i[a];return r}}function V(t,e){return t.isValid()?(e=H(e,t.localeData()),Fe[e]=Fe[e]||B(e),Fe[e](t)):t.localeData().invalidDate()}function H(t,e){var n=5;for(Oe.lastIndex=0;n>=0&&Oe.test(t);)t=t.replace(Oe,function(t){return e.longDateFormat(t)||t}),Oe.lastIndex=0,n-=1;return t}function E(t,e,n){Ke[t]=D(e)?e:function(t,i){return t&&n?n:e}}function j(t,e){return d(Ke,t)?Ke[t](e._strict,e._locale):new RegExp(U(t))}function U(t){return q(t.replace(\"\\\\\",\"\").replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(t,e,n,i,a){return e||n||i||a}))}function q(t){return t.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}function G(t,e){var n,i=e;for(\"string\"==typeof t&&(t=[t]),s(e)&&(i=function(t,n){n[e]=_(t)}),n=0;n<t.length;n++)Qe[t[n]]=i}function Z(t,e){G(t,function(t,n,i,a){i._w=i._w||{},e(t,i._w,i,a)})}function X(t,e,n){null!=e&&d(Qe,t)&&Qe[t](e,n._a,n,t)}function J(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function K(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)r=h([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(r,\"\").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(r,\"\").toLocaleLowerCase();return n?\"MMM\"===e?-1!==(a=un.call(this._shortMonthsParse,o))?a:null:-1!==(a=un.call(this._longMonthsParse,o))?a:null:\"MMM\"===e?-1!==(a=un.call(this._shortMonthsParse,o))?a:-1!==(a=un.call(this._longMonthsParse,o))?a:null:-1!==(a=un.call(this._longMonthsParse,o))?a:-1!==(a=un.call(this._shortMonthsParse,o))?a:null}function Q(t,e){var n;if(!t.isValid())return t;if(\"string\"==typeof e)if(/^\\d+$/.test(e))e=_(e);else if(e=t.localeData().monthsParse(e),!s(e))return t;return n=Math.min(t.date(),J(t.year(),e)),t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+\"Month\"](e,n),t}function $(t){return null!=t?(Q(this,t),n.updateOffset(this,!0),this):L(this,\"Month\")}function tt(){function t(t,e){return e.length-t.length}var e,n,i=[],a=[],r=[];for(e=0;e<12;e++)n=h([2e3,e]),i.push(this.monthsShort(n,\"\")),a.push(this.months(n,\"\")),r.push(this.months(n,\"\")),r.push(this.monthsShort(n,\"\"));for(i.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)i[e]=q(i[e]),a[e]=q(a[e]);for(e=0;e<24;e++)r[e]=q(r[e]);this._monthsRegex=new RegExp(\"^(\"+r.join(\"|\")+\")\",\"i\"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp(\"^(\"+a.join(\"|\")+\")\",\"i\"),this._monthsShortStrictRegex=new RegExp(\"^(\"+i.join(\"|\")+\")\",\"i\")}function et(t){return nt(t)?366:365}function nt(t){return t%4==0&&t%100!=0||t%400==0}function it(t,e,n,i,a,r,o){var s=new Date(t,e,n,i,a,r,o);return t<100&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function at(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function rt(t,e,n){var i=7+e-n;return-((7+at(t,0,i).getUTCDay()-e)%7)+i-1}function ot(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+rt(t,i,a);return s<=0?o=et(r=t-1)+s:s>et(t)?(r=t+1,o=s-et(t)):(r=t,o=s),{year:r,dayOfYear:o}}function st(t,e,n){var i,a,r=rt(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+lt(a=t.year()-1,e,n):o>lt(t.year(),e,n)?(i=o-lt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function lt(t,e,n){var i=rt(t,e,n),a=rt(t+1,e,n);return(et(t)-i+a)/7}function ut(t,e){return\"string\"!=typeof t?t:isNaN(t)?\"number\"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}function dt(t,e){return\"string\"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function ct(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=h([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,\"\").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,\"\").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,\"\").toLocaleLowerCase();return n?\"dddd\"===e?-1!==(a=un.call(this._weekdaysParse,o))?a:null:\"ddd\"===e?-1!==(a=un.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:\"dddd\"===e?-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._shortWeekdaysParse,o))?a:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:\"ddd\"===e?-1!==(a=un.call(this._shortWeekdaysParse,o))?a:-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:-1!==(a=un.call(this._minWeekdaysParse,o))?a:-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._shortWeekdaysParse,o))?a:null}function ht(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=h([2e3,1]).day(e),i=this.weekdaysMin(n,\"\"),a=this.weekdaysShort(n,\"\"),r=this.weekdays(n,\"\"),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=q(s[e]),l[e]=q(l[e]),u[e]=q(u[e]);this._weekdaysRegex=new RegExp(\"^(\"+u.join(\"|\")+\")\",\"i\"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp(\"^(\"+l.join(\"|\")+\")\",\"i\"),this._weekdaysShortStrictRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\"),this._weekdaysMinStrictRegex=new RegExp(\"^(\"+o.join(\"|\")+\")\",\"i\")}function ft(){return this.hours()%12||12}function gt(t,e){N(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function mt(t,e){return e._meridiemParse}function pt(t){return t?t.toLowerCase().replace(\"_\",\"-\"):t}function vt(t){for(var e,n,i,a,r=0;r<t.length;){for(e=(a=pt(t[r]).split(\"-\")).length,n=(n=pt(t[r+1]))?n.split(\"-\"):null;e>0;){if(i=yt(a.slice(0,e).join(\"-\")))return i;if(n&&n.length>=e&&k(a,n,!0)>=e-1)break;e--}r++}return null}function yt(n){var i=null;if(!Sn[n]&&void 0!==e&&e&&e.exports)try{i=kn._abbr,t(\"./locale/\"+n),bt(i)}catch(t){}return Sn[n]}function bt(t,e){var n;return t&&(n=o(e)?_t(t):xt(t,e))&&(kn=n),kn._abbr}function xt(t,e){if(null!==e){var n=Mn;if(e.abbr=t,null!=Sn[t])S(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\"),n=Sn[t]._config;else if(null!=e.parentLocale){if(null==Sn[e.parentLocale])return Dn[e.parentLocale]||(Dn[e.parentLocale]=[]),Dn[e.parentLocale].push({name:t,config:e}),null;n=Sn[e.parentLocale]._config}return Sn[t]=new P(C(n,e)),Dn[t]&&Dn[t].forEach(function(t){xt(t.name,t.config)}),bt(t),Sn[t]}return delete Sn[t],null}function _t(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return kn;if(!i(t)){if(e=yt(t))return e;t=[t]}return vt(t)}function kt(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[tn]<0||n[tn]>11?tn:n[en]<1||n[en]>J(n[$e],n[tn])?en:n[nn]<0||n[nn]>24||24===n[nn]&&(0!==n[an]||0!==n[rn]||0!==n[on])?nn:n[an]<0||n[an]>59?an:n[rn]<0||n[rn]>59?rn:n[on]<0||n[on]>999?on:-1,g(t)._overflowDayOfYear&&(e<$e||e>en)&&(e=en),g(t)._overflowWeeks&&-1===e&&(e=sn),g(t)._overflowWeekday&&-1===e&&(e=ln),g(t).overflow=e),t}function wt(t){var e,n,i,a,r,o,s=t._i,l=Cn.exec(s)||Pn.exec(s);if(l){for(g(t).iso=!0,e=0,n=An.length;e<n;e++)if(An[e][1].exec(l[1])){a=An[e][0],i=!1!==An[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,n=In.length;e<n;e++)if(In[e][1].exec(l[3])){r=(l[2]||\" \")+In[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(l[4]){if(!Tn.exec(l[4]))return void(t._isValid=!1);o=\"Z\"}t._f=a+(r||\"\")+(o||\"\"),At(t)}else t._isValid=!1}function Mt(t){var e,n,i,a,r,o,s,l,u={\" GMT\":\" +0000\",\" EDT\":\" -0400\",\" EST\":\" -0500\",\" CDT\":\" -0500\",\" CST\":\" -0600\",\" MDT\":\" -0600\",\" MST\":\" -0700\",\" PDT\":\" -0700\",\" PST\":\" -0800\"};if(e=t._i.replace(/\\([^\\)]*\\)|[\\n\\t]/g,\" \").replace(/(\\s\\s+)/g,\" \").replace(/^\\s|\\s$/g,\"\"),n=Fn.exec(e)){if(i=n[1]?\"ddd\"+(5===n[1].length?\", \":\" \"):\"\",a=\"D MMM \"+(n[2].length>10?\"YYYY \":\"YY \"),r=\"HH:mm\"+(n[4]?\":ss\":\"\"),n[1]){var d=[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"][new Date(n[2]).getDay()];if(n[1].substr(0,3)!==d)return g(t).weekdayMismatch=!0,void(t._isValid=!1)}switch(n[5].length){case 2:s=0===l?\" +0000\":((l=\"YXWVUTSRQPONZABCDEFGHIKLM\".indexOf(n[5][1].toUpperCase())-12)<0?\" -\":\" +\")+(\"\"+l).replace(/^-?/,\"0\").match(/..$/)[0]+\"00\";break;case 4:s=u[n[5]];break;default:s=u[\" GMT\"]}n[5]=s,t._i=n.splice(1).join(\"\"),o=\" ZZ\",t._f=i+a+r+o,At(t),g(t).rfc2822=!0}else t._isValid=!1}function St(t){var e=On.exec(t._i);null===e?(wt(t),!1===t._isValid&&(delete t._isValid,Mt(t),!1===t._isValid&&(delete t._isValid,n.createFromInputFallback(t)))):t._d=new Date(+e[1])}function Dt(t,e,n){return null!=t?t:null!=e?e:n}function Ct(t){var e=new Date(n.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Pt(t){var e,n,i,a,r=[];if(!t._d){for(i=Ct(t),t._w&&null==t._a[en]&&null==t._a[tn]&&Tt(t),null!=t._dayOfYear&&(a=Dt(t._a[$e],i[$e]),(t._dayOfYear>et(a)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=at(a,0,t._dayOfYear),t._a[tn]=n.getUTCMonth(),t._a[en]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=r[e]=i[e];for(;e<7;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[nn]&&0===t._a[an]&&0===t._a[rn]&&0===t._a[on]&&(t._nextDay=!0,t._a[nn]=0),t._d=(t._useUTC?at:it).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[nn]=24)}}function Tt(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=Dt(e.GG,t._a[$e],st(Nt(),1,4).year),i=Dt(e.W,1),((a=Dt(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=st(Nt(),r,o);n=Dt(e.gg,t._a[$e],u.year),i=Dt(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>lt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=ot(n,i,a,r,o),t._a[$e]=s.year,t._dayOfYear=s.dayOfYear)}function At(t){if(t._f!==n.ISO_8601)if(t._f!==n.RFC_2822){t._a=[],g(t).empty=!0;var e,i,a,r,o,s=\"\"+t._i,l=s.length,u=0;for(a=H(t._f,t._locale).match(Ie)||[],e=0;e<a.length;e++)r=a[e],(i=(s.match(j(r,t))||[])[0])&&((o=s.substr(0,s.indexOf(i))).length>0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(i)+i.length),u+=i.length),Re[r]?(i?g(t).empty=!1:g(t).unusedTokens.push(r),X(r,i,t)):t._strict&&!i&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[nn]<=12&&!0===g(t).bigHour&&t._a[nn]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[nn]=It(t._locale,t._a[nn],t._meridiem),Pt(t),kt(t)}else Mt(t);else wt(t)}function It(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function Ot(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=v({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],At(e),m(e)&&(r+=g(e).charsLeftOver,r+=10*g(e).unusedTokens.length,g(e).score=r,(null==i||r<i)&&(i=r,n=e));c(t,n||e)}function Ft(t){if(!t._d){var e=I(t._i);t._a=u([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),Pt(t)}}function Rt(t){var e=new y(kt(Lt(t)));return e._nextDay&&(e.add(1,\"d\"),e._nextDay=void 0),e}function Lt(t){var e=t._i,n=t._f;return t._locale=t._locale||_t(t._l),null===e||void 0===n&&\"\"===e?p({nullInput:!0}):(\"string\"==typeof e&&(t._i=e=t._locale.preparse(e)),b(e)?new y(kt(e)):(l(e)?t._d=e:i(n)?Ot(t):n?At(t):Wt(t),m(t)||(t._d=null),t))}function Wt(t){var e=t._i;o(e)?t._d=new Date(n.now()):l(e)?t._d=new Date(e.valueOf()):\"string\"==typeof e?St(t):i(e)?(t._a=u(e.slice(0),function(t){return parseInt(t,10)}),Pt(t)):a(e)?Ft(t):s(e)?t._d=new Date(e):n.createFromInputFallback(t)}function Yt(t,e,n,o,s){var l={};return!0!==n&&!1!==n||(o=n,n=void 0),(a(t)&&r(t)||i(t)&&0===t.length)&&(t=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=s,l._l=n,l._i=t,l._f=e,l._strict=o,Rt(l)}function Nt(t,e,n,i){return Yt(t,e,n,i,!1)}function zt(t,e){var n,a;if(1===e.length&&i(e[0])&&(e=e[0]),!e.length)return Nt();for(n=e[0],a=1;a<e.length;++a)e[a].isValid()&&!e[a][t](n)||(n=e[a]);return n}function Bt(t){for(var e in t)if(-1===Wn.indexOf(e)||null!=t[e]&&isNaN(t[e]))return!1;for(var n=!1,i=0;i<Wn.length;++i)if(t[Wn[i]]){if(n)return!1;parseFloat(t[Wn[i]])!==_(t[Wn[i]])&&(n=!0)}return!0}function Vt(t){var e=I(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=Bt(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=_t(),this._bubble()}function Ht(t){return t instanceof Vt}function Et(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function jt(t,e){N(t,0,0,function(){var t=this.utcOffset(),n=\"+\";return t<0&&(t=-t,n=\"-\"),n+Y(~~(t/60),2)+e+Y(~~t%60,2)})}function Ut(t,e){var n=(e||\"\").match(t);if(null===n)return null;var i=((n[n.length-1]||[])+\"\").match(Yn)||[\"-\",0,0],a=60*i[1]+_(i[2]);return 0===a?0:\"+\"===i[0]?a:-a}function qt(t,e){var i,a;return e._isUTC?(i=e.clone(),a=(b(t)||l(t)?t.valueOf():Nt(t).valueOf())-i.valueOf(),i._d.setTime(i._d.valueOf()+a),n.updateOffset(i,!1),i):Nt(t).local()}function Gt(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Zt(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Xt(t,e){var n,i,a,r=t,o=null;return Ht(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:s(t)?(r={},e?r[e]=t:r.milliseconds=t):(o=Nn.exec(t))?(n=\"-\"===o[1]?-1:1,r={y:0,d:_(o[en])*n,h:_(o[nn])*n,m:_(o[an])*n,s:_(o[rn])*n,ms:_(Et(1e3*o[on]))*n}):(o=zn.exec(t))?(n=\"-\"===o[1]?-1:1,r={y:Jt(o[2],n),M:Jt(o[3],n),w:Jt(o[4],n),d:Jt(o[5],n),h:Jt(o[6],n),m:Jt(o[7],n),s:Jt(o[8],n)}):null==r?r={}:\"object\"==typeof r&&(\"from\"in r||\"to\"in r)&&(a=Qt(Nt(r.from),Nt(r.to)),(r={}).ms=a.milliseconds,r.M=a.months),i=new Vt(r),Ht(t)&&d(t,\"_locale\")&&(i._locale=t._locale),i}function Jt(t,e){var n=t&&parseFloat(t.replace(\",\",\".\"));return(isNaN(n)?0:n)*e}function Kt(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,\"M\").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,\"M\"),n}function Qt(t,e){var n;return t.isValid()&&e.isValid()?(e=qt(e,t),t.isBefore(e)?n=Kt(t,e):((n=Kt(e,t)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function $t(t,e){return function(n,i){var a,r;return null===i||isNaN(+i)||(S(e,\"moment().\"+e+\"(period, number) is deprecated. Please use moment().\"+e+\"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.\"),r=n,n=i,i=r),n=\"string\"==typeof n?+n:n,a=Xt(n,i),te(this,a,t),this}}function te(t,e,i,a){var r=e._milliseconds,o=Et(e._days),s=Et(e._months);t.isValid()&&(a=null==a||a,r&&t._d.setTime(t._d.valueOf()+r*i),o&&W(t,\"Date\",L(t,\"Date\")+o*i),s&&Q(t,L(t,\"Month\")+s*i),a&&n.updateOffset(t,o||s))}function ee(t,e){var n,i=12*(e.year()-t.year())+(e.month()-t.month()),a=t.clone().add(i,\"months\");return n=e-a<0?(e-a)/(a-t.clone().add(i-1,\"months\")):(e-a)/(t.clone().add(i+1,\"months\")-a),-(i+n)||0}function ne(t){var e;return void 0===t?this._locale._abbr:(null!=(e=_t(t))&&(this._locale=e),this)}function ie(){return this._locale}function ae(t,e){N(0,[t,t.length],0,e)}function re(t,e,n,i,a){var r;return null==t?st(this,i,a).year:(r=lt(t,i,a),e>r&&(e=r),oe.call(this,t,e,n,i,a))}function oe(t,e,n,i,a){var r=ot(t,e,n,i,a),o=at(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function se(t){return t}function le(t,e,n,i){var a=_t(),r=h().set(i,e);return a[n](r,t)}function ue(t,e,n){if(s(t)&&(e=t,t=void 0),t=t||\"\",null!=e)return le(t,e,n,\"month\");var i,a=[];for(i=0;i<12;i++)a[i]=le(t,i,n,\"month\");return a}function de(t,e,n,i){\"boolean\"==typeof t?(s(e)&&(n=e,e=void 0),e=e||\"\"):(n=e=t,t=!1,s(e)&&(n=e,e=void 0),e=e||\"\");var a=_t(),r=t?a._week.dow:0;if(null!=n)return le(e,(n+r)%7,i,\"day\");var o,l=[];for(o=0;o<7;o++)l[o]=le(e,(o+r)%7,i,\"day\");return l}function ce(t,e,n,i){var a=Xt(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function he(t){return t<0?Math.floor(t):Math.ceil(t)}function fe(t){return 4800*t/146097}function ge(t){return 146097*t/4800}function me(t){return function(){return this.as(t)}}function pe(t){return function(){return this.isValid()?this._data[t]:NaN}}function ve(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function ye(t,e,n){var i=Xt(t).abs(),a=hi(i.as(\"s\")),r=hi(i.as(\"m\")),o=hi(i.as(\"h\")),s=hi(i.as(\"d\")),l=hi(i.as(\"M\")),u=hi(i.as(\"y\")),d=a<=fi.ss&&[\"s\",a]||a<fi.s&&[\"ss\",a]||r<=1&&[\"m\"]||r<fi.m&&[\"mm\",r]||o<=1&&[\"h\"]||o<fi.h&&[\"hh\",o]||s<=1&&[\"d\"]||s<fi.d&&[\"dd\",s]||l<=1&&[\"M\"]||l<fi.M&&[\"MM\",l]||u<=1&&[\"y\"]||[\"yy\",u];return d[2]=e,d[3]=+t>0,d[4]=n,ve.apply(null,d)}function be(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=gi(this._milliseconds)/1e3,a=gi(this._days),r=gi(this._months);e=x((t=x(i/60))/60),i%=60,t%=60;var o=n=x(r/12),s=r%=12,l=a,u=e,d=t,c=i,h=this.asSeconds();return h?(h<0?\"-\":\"\")+\"P\"+(o?o+\"Y\":\"\")+(s?s+\"M\":\"\")+(l?l+\"D\":\"\")+(u||d||c?\"T\":\"\")+(u?u+\"H\":\"\")+(d?d+\"M\":\"\")+(c?c+\"S\":\"\"):\"P0D\"}var xe,_e,ke=_e=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1},we=n.momentProperties=[],Me=!1,Se={};n.suppressDeprecationWarnings=!1,n.deprecationHandler=null;var De,Ce,Pe=De=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)d(t,e)&&n.push(e);return n},Te={},Ae={},Ie=/(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Oe=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Fe={},Re={},Le=/\\d/,We=/\\d\\d/,Ye=/\\d{3}/,Ne=/\\d{4}/,ze=/[+-]?\\d{6}/,Be=/\\d\\d?/,Ve=/\\d\\d\\d\\d?/,He=/\\d\\d\\d\\d\\d\\d?/,Ee=/\\d{1,3}/,je=/\\d{1,4}/,Ue=/[+-]?\\d{1,6}/,qe=/\\d+/,Ge=/[+-]?\\d+/,Ze=/Z|[+-]\\d\\d:?\\d\\d/gi,Xe=/Z|[+-]\\d\\d(?::?\\d\\d)?/gi,Je=/[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i,Ke={},Qe={},$e=0,tn=1,en=2,nn=3,an=4,rn=5,on=6,sn=7,ln=8,un=Ce=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1};N(\"M\",[\"MM\",2],\"Mo\",function(){return this.month()+1}),N(\"MMM\",0,0,function(t){return this.localeData().monthsShort(this,t)}),N(\"MMMM\",0,0,function(t){return this.localeData().months(this,t)}),T(\"month\",\"M\"),O(\"month\",8),E(\"M\",Be),E(\"MM\",Be,We),E(\"MMM\",function(t,e){return e.monthsShortRegex(t)}),E(\"MMMM\",function(t,e){return e.monthsRegex(t)}),G([\"M\",\"MM\"],function(t,e){e[tn]=_(t)-1}),G([\"MMM\",\"MMMM\"],function(t,e,n,i){var a=n._locale.monthsParse(t,i,n._strict);null!=a?e[tn]=a:g(n).invalidMonth=t});var dn=/D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,cn=\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),hn=\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),fn=Je,gn=Je;N(\"Y\",0,0,function(){var t=this.year();return t<=9999?\"\"+t:\"+\"+t}),N(0,[\"YY\",2],0,function(){return this.year()%100}),N(0,[\"YYYY\",4],0,\"year\"),N(0,[\"YYYYY\",5],0,\"year\"),N(0,[\"YYYYYY\",6,!0],0,\"year\"),T(\"year\",\"y\"),O(\"year\",1),E(\"Y\",Ge),E(\"YY\",Be,We),E(\"YYYY\",je,Ne),E(\"YYYYY\",Ue,ze),E(\"YYYYYY\",Ue,ze),G([\"YYYYY\",\"YYYYYY\"],$e),G(\"YYYY\",function(t,e){e[$e]=2===t.length?n.parseTwoDigitYear(t):_(t)}),G(\"YY\",function(t,e){e[$e]=n.parseTwoDigitYear(t)}),G(\"Y\",function(t,e){e[$e]=parseInt(t,10)}),n.parseTwoDigitYear=function(t){return _(t)+(_(t)>68?1900:2e3)};var mn=R(\"FullYear\",!0);N(\"w\",[\"ww\",2],\"wo\",\"week\"),N(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\"),T(\"week\",\"w\"),T(\"isoWeek\",\"W\"),O(\"week\",5),O(\"isoWeek\",5),E(\"w\",Be),E(\"ww\",Be,We),E(\"W\",Be),E(\"WW\",Be,We),Z([\"w\",\"ww\",\"W\",\"WW\"],function(t,e,n,i){e[i.substr(0,1)]=_(t)});N(\"d\",0,\"do\",\"day\"),N(\"dd\",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),N(\"ddd\",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),N(\"dddd\",0,0,function(t){return this.localeData().weekdays(this,t)}),N(\"e\",0,0,\"weekday\"),N(\"E\",0,0,\"isoWeekday\"),T(\"day\",\"d\"),T(\"weekday\",\"e\"),T(\"isoWeekday\",\"E\"),O(\"day\",11),O(\"weekday\",11),O(\"isoWeekday\",11),E(\"d\",Be),E(\"e\",Be),E(\"E\",Be),E(\"dd\",function(t,e){return e.weekdaysMinRegex(t)}),E(\"ddd\",function(t,e){return e.weekdaysShortRegex(t)}),E(\"dddd\",function(t,e){return e.weekdaysRegex(t)}),Z([\"dd\",\"ddd\",\"dddd\"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t}),Z([\"d\",\"e\",\"E\"],function(t,e,n,i){e[i]=_(t)});var pn=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),vn=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),yn=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),bn=Je,xn=Je,_n=Je;N(\"H\",[\"HH\",2],0,\"hour\"),N(\"h\",[\"hh\",2],0,ft),N(\"k\",[\"kk\",2],0,function(){return this.hours()||24}),N(\"hmm\",0,0,function(){return\"\"+ft.apply(this)+Y(this.minutes(),2)}),N(\"hmmss\",0,0,function(){return\"\"+ft.apply(this)+Y(this.minutes(),2)+Y(this.seconds(),2)}),N(\"Hmm\",0,0,function(){return\"\"+this.hours()+Y(this.minutes(),2)}),N(\"Hmmss\",0,0,function(){return\"\"+this.hours()+Y(this.minutes(),2)+Y(this.seconds(),2)}),gt(\"a\",!0),gt(\"A\",!1),T(\"hour\",\"h\"),O(\"hour\",13),E(\"a\",mt),E(\"A\",mt),E(\"H\",Be),E(\"h\",Be),E(\"k\",Be),E(\"HH\",Be,We),E(\"hh\",Be,We),E(\"kk\",Be,We),E(\"hmm\",Ve),E(\"hmmss\",He),E(\"Hmm\",Ve),E(\"Hmmss\",He),G([\"H\",\"HH\"],nn),G([\"k\",\"kk\"],function(t,e,n){var i=_(t);e[nn]=24===i?0:i}),G([\"a\",\"A\"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),G([\"h\",\"hh\"],function(t,e,n){e[nn]=_(t),g(n).bigHour=!0}),G(\"hmm\",function(t,e,n){var i=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i)),g(n).bigHour=!0}),G(\"hmmss\",function(t,e,n){var i=t.length-4,a=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i,2)),e[rn]=_(t.substr(a)),g(n).bigHour=!0}),G(\"Hmm\",function(t,e,n){var i=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i))}),G(\"Hmmss\",function(t,e,n){var i=t.length-4,a=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i,2)),e[rn]=_(t.substr(a))});var kn,wn=R(\"Hours\",!0),Mn={calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},longDateFormat:{LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},invalidDate:\"Invalid date\",ordinal:\"%d\",dayOfMonthOrdinalParse:/\\d{1,2}/,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},months:cn,monthsShort:hn,week:{dow:0,doy:6},weekdays:pn,weekdaysMin:yn,weekdaysShort:vn,meridiemParse:/[ap]\\.?m?\\.?/i},Sn={},Dn={},Cn=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,Pn=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,Tn=/Z|[+-]\\d\\d(?::?\\d\\d)?/,An=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,!1],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,!1],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,!1],[\"YYYYDDD\",/\\d{7}/]],In=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]],On=/^\\/?Date\\((\\-?\\d+)/i,Fn=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;n.createFromInputFallback=M(\"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.\",function(t){t._d=new Date(t._i+(t._useUTC?\" UTC\":\"\"))}),n.ISO_8601=function(){},n.RFC_2822=function(){};var Rn=M(\"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var t=Nt.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:p()}),Ln=M(\"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var t=Nt.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:p()}),Wn=[\"year\",\"quarter\",\"month\",\"week\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"];jt(\"Z\",\":\"),jt(\"ZZ\",\"\"),E(\"Z\",Xe),E(\"ZZ\",Xe),G([\"Z\",\"ZZ\"],function(t,e,n){n._useUTC=!0,n._tzm=Ut(Xe,t)});var Yn=/([\\+\\-]|\\d\\d)/gi;n.updateOffset=function(){};var Nn=/^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/,zn=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Xt.fn=Vt.prototype,Xt.invalid=function(){return Xt(NaN)};var Bn=$t(1,\"add\"),Vn=$t(-1,\"subtract\");n.defaultFormat=\"YYYY-MM-DDTHH:mm:ssZ\",n.defaultFormatUtc=\"YYYY-MM-DDTHH:mm:ss[Z]\";var Hn=M(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(t){return void 0===t?this.localeData():this.locale(t)});N(0,[\"gg\",2],0,function(){return this.weekYear()%100}),N(0,[\"GG\",2],0,function(){return this.isoWeekYear()%100}),ae(\"gggg\",\"weekYear\"),ae(\"ggggg\",\"weekYear\"),ae(\"GGGG\",\"isoWeekYear\"),ae(\"GGGGG\",\"isoWeekYear\"),T(\"weekYear\",\"gg\"),T(\"isoWeekYear\",\"GG\"),O(\"weekYear\",1),O(\"isoWeekYear\",1),E(\"G\",Ge),E(\"g\",Ge),E(\"GG\",Be,We),E(\"gg\",Be,We),E(\"GGGG\",je,Ne),E(\"gggg\",je,Ne),E(\"GGGGG\",Ue,ze),E(\"ggggg\",Ue,ze),Z([\"gggg\",\"ggggg\",\"GGGG\",\"GGGGG\"],function(t,e,n,i){e[i.substr(0,2)]=_(t)}),Z([\"gg\",\"GG\"],function(t,e,i,a){e[a]=n.parseTwoDigitYear(t)}),N(\"Q\",0,\"Qo\",\"quarter\"),T(\"quarter\",\"Q\"),O(\"quarter\",7),E(\"Q\",Le),G(\"Q\",function(t,e){e[tn]=3*(_(t)-1)}),N(\"D\",[\"DD\",2],\"Do\",\"date\"),T(\"date\",\"D\"),O(\"date\",9),E(\"D\",Be),E(\"DD\",Be,We),E(\"Do\",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),G([\"D\",\"DD\"],en),G(\"Do\",function(t,e){e[en]=_(t.match(Be)[0],10)});var En=R(\"Date\",!0);N(\"DDD\",[\"DDDD\",3],\"DDDo\",\"dayOfYear\"),T(\"dayOfYear\",\"DDD\"),O(\"dayOfYear\",4),E(\"DDD\",Ee),E(\"DDDD\",Ye),G([\"DDD\",\"DDDD\"],function(t,e,n){n._dayOfYear=_(t)}),N(\"m\",[\"mm\",2],0,\"minute\"),T(\"minute\",\"m\"),O(\"minute\",14),E(\"m\",Be),E(\"mm\",Be,We),G([\"m\",\"mm\"],an);var jn=R(\"Minutes\",!1);N(\"s\",[\"ss\",2],0,\"second\"),T(\"second\",\"s\"),O(\"second\",15),E(\"s\",Be),E(\"ss\",Be,We),G([\"s\",\"ss\"],rn);var Un=R(\"Seconds\",!1);N(\"S\",0,0,function(){return~~(this.millisecond()/100)}),N(0,[\"SS\",2],0,function(){return~~(this.millisecond()/10)}),N(0,[\"SSS\",3],0,\"millisecond\"),N(0,[\"SSSS\",4],0,function(){return 10*this.millisecond()}),N(0,[\"SSSSS\",5],0,function(){return 100*this.millisecond()}),N(0,[\"SSSSSS\",6],0,function(){return 1e3*this.millisecond()}),N(0,[\"SSSSSSS\",7],0,function(){return 1e4*this.millisecond()}),N(0,[\"SSSSSSSS\",8],0,function(){return 1e5*this.millisecond()}),N(0,[\"SSSSSSSSS\",9],0,function(){return 1e6*this.millisecond()}),T(\"millisecond\",\"ms\"),O(\"millisecond\",16),E(\"S\",Ee,Le),E(\"SS\",Ee,We),E(\"SSS\",Ee,Ye);var qn;for(qn=\"SSSS\";qn.length<=9;qn+=\"S\")E(qn,qe);for(qn=\"S\";qn.length<=9;qn+=\"S\")G(qn,function(t,e){e[on]=_(1e3*(\"0.\"+t))});var Gn=R(\"Milliseconds\",!1);N(\"z\",0,0,\"zoneAbbr\"),N(\"zz\",0,0,\"zoneName\");var Zn=y.prototype;Zn.add=Bn,Zn.calendar=function(t,e){var i=t||Nt(),a=qt(i,this).startOf(\"day\"),r=n.calendarFormat(this,a)||\"sameElse\",o=e&&(D(e[r])?e[r].call(this,i):e[r]);return this.format(o||this.localeData().calendar(r,this,Nt(i)))},Zn.clone=function(){return new y(this)},Zn.diff=function(t,e,n){var i,a,r,o;return this.isValid()&&(i=qt(t,this)).isValid()?(a=6e4*(i.utcOffset()-this.utcOffset()),\"year\"===(e=A(e))||\"month\"===e||\"quarter\"===e?(o=ee(this,i),\"quarter\"===e?o/=3:\"year\"===e&&(o/=12)):(r=this-i,o=\"second\"===e?r/1e3:\"minute\"===e?r/6e4:\"hour\"===e?r/36e5:\"day\"===e?(r-a)/864e5:\"week\"===e?(r-a)/6048e5:r),n?o:x(o)):NaN},Zn.endOf=function(t){return void 0===(t=A(t))||\"millisecond\"===t?this:(\"date\"===t&&(t=\"day\"),this.startOf(t).add(1,\"isoWeek\"===t?\"week\":t).subtract(1,\"ms\"))},Zn.format=function(t){t||(t=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var e=V(this,t);return this.localeData().postformat(e)},Zn.from=function(t,e){return this.isValid()&&(b(t)&&t.isValid()||Nt(t).isValid())?Xt({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Zn.fromNow=function(t){return this.from(Nt(),t)},Zn.to=function(t,e){return this.isValid()&&(b(t)&&t.isValid()||Nt(t).isValid())?Xt({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Zn.toNow=function(t){return this.to(Nt(),t)},Zn.get=function(t){return t=A(t),D(this[t])?this[t]():this},Zn.invalidAt=function(){return g(this).overflow},Zn.isAfter=function(t,e){var n=b(t)?t:Nt(t);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(e=A(o(e)?\"millisecond\":e))?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf())},Zn.isBefore=function(t,e){var n=b(t)?t:Nt(t);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(e=A(o(e)?\"millisecond\":e))?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf())},Zn.isBetween=function(t,e,n,i){return(\"(\"===(i=i||\"()\")[0]?this.isAfter(t,n):!this.isBefore(t,n))&&(\")\"===i[1]?this.isBefore(e,n):!this.isAfter(e,n))},Zn.isSame=function(t,e){var n,i=b(t)?t:Nt(t);return!(!this.isValid()||!i.isValid())&&(\"millisecond\"===(e=A(e||\"millisecond\"))?this.valueOf()===i.valueOf():(n=i.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf()))},Zn.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},Zn.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},Zn.isValid=function(){return m(this)},Zn.lang=Hn,Zn.locale=ne,Zn.localeData=ie,Zn.max=Ln,Zn.min=Rn,Zn.parsingFlags=function(){return c({},g(this))},Zn.set=function(t,e){if(\"object\"==typeof t)for(var n=F(t=I(t)),i=0;i<n.length;i++)this[n[i].unit](t[n[i].unit]);else if(t=A(t),D(this[t]))return this[t](e);return this},Zn.startOf=function(t){switch(t=A(t)){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":case\"date\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}return\"week\"===t&&this.weekday(0),\"isoWeek\"===t&&this.isoWeekday(1),\"quarter\"===t&&this.month(3*Math.floor(this.month()/3)),this},Zn.subtract=Vn,Zn.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},Zn.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},Zn.toDate=function(){return new Date(this.valueOf())},Zn.toISOString=function(){if(!this.isValid())return null;var t=this.clone().utc();return t.year()<0||t.year()>9999?V(t,\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\"):D(Date.prototype.toISOString)?this.toDate().toISOString():V(t,\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")},Zn.inspect=function(){if(!this.isValid())return\"moment.invalid(/* \"+this._i+\" */)\";var t=\"moment\",e=\"\";this.isLocal()||(t=0===this.utcOffset()?\"moment.utc\":\"moment.parseZone\",e=\"Z\");var n=\"[\"+t+'(\"]',i=0<=this.year()&&this.year()<=9999?\"YYYY\":\"YYYYYY\",a=e+'[\")]';return this.format(n+i+\"-MM-DD[T]HH:mm:ss.SSS\"+a)},Zn.toJSON=function(){return this.isValid()?this.toISOString():null},Zn.toString=function(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")},Zn.unix=function(){return Math.floor(this.valueOf()/1e3)},Zn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Zn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Zn.year=mn,Zn.isLeapYear=function(){return nt(this.year())},Zn.weekYear=function(t){return re.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Zn.isoWeekYear=function(t){return re.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Zn.quarter=Zn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Zn.month=$,Zn.daysInMonth=function(){return J(this.year(),this.month())},Zn.week=Zn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),\"d\")},Zn.isoWeek=Zn.isoWeeks=function(t){var e=st(this,1,4).week;return null==t?e:this.add(7*(t-e),\"d\")},Zn.weeksInYear=function(){var t=this.localeData()._week;return lt(this.year(),t.dow,t.doy)},Zn.isoWeeksInYear=function(){return lt(this.year(),1,4)},Zn.date=En,Zn.day=Zn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=ut(t,this.localeData()),this.add(t-e,\"d\")):e},Zn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,\"d\")},Zn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=dt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Zn.dayOfYear=function(t){var e=Math.round((this.clone().startOf(\"day\")-this.clone().startOf(\"year\"))/864e5)+1;return null==t?e:this.add(t-e,\"d\")},Zn.hour=Zn.hours=wn,Zn.minute=Zn.minutes=jn,Zn.second=Zn.seconds=Un,Zn.millisecond=Zn.milliseconds=Gn,Zn.utcOffset=function(t,e,i){var a,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if(\"string\"==typeof t){if(null===(t=Ut(Xe,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(a=Gt(this)),this._offset=t,this._isUTC=!0,null!=a&&this.add(a,\"m\"),r!==t&&(!e||this._changeInProgress?te(this,Xt(t-r,\"m\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,n.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Gt(this)},Zn.utc=function(t){return this.utcOffset(0,t)},Zn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Gt(this),\"m\")),this},Zn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if(\"string\"==typeof this._i){var t=Ut(Ze,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Zn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Nt(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Zn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Zn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Zn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Zn.isUtc=Zt,Zn.isUTC=Zt,Zn.zoneAbbr=function(){return this._isUTC?\"UTC\":\"\"},Zn.zoneName=function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},Zn.dates=M(\"dates accessor is deprecated. Use date instead.\",En),Zn.months=M(\"months accessor is deprecated. Use month instead\",$),Zn.years=M(\"years accessor is deprecated. Use year instead\",mn),Zn.zone=M(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",function(t,e){return null!=t?(\"string\"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),Zn.isDSTShifted=M(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),(t=Lt(t))._a){var e=t._isUTC?h(t._a):Nt(t._a);this._isDSTShifted=this.isValid()&&k(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var Xn=P.prototype;Xn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return D(i)?i.call(e,n):i},Xn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},Xn.invalidDate=function(){return this._invalidDate},Xn.ordinal=function(t){return this._ordinal.replace(\"%d\",t)},Xn.preparse=se,Xn.postformat=se,Xn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return D(a)?a(t,e,n,i):a.replace(/%d/i,t)},Xn.pastFuture=function(t,e){var n=this._relativeTime[t>0?\"future\":\"past\"];return D(n)?n(e):n.replace(/%s/i,e)},Xn.set=function(t){var e,n;for(n in t)D(e=t[n])?this[n]=e:this[\"_\"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+\"|\"+/\\d{1,2}/.source)},Xn.months=function(t,e){return t?i(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||dn).test(e)?\"format\":\"standalone\"][t.month()]:i(this._months)?this._months:this._months.standalone},Xn.monthsShort=function(t,e){return t?i(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[dn.test(e)?\"format\":\"standalone\"][t.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Xn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return K.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=h([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp(\"^\"+this.months(a,\"\").replace(\".\",\"\")+\"$\",\"i\"),this._shortMonthsParse[i]=new RegExp(\"^\"+this.monthsShort(a,\"\").replace(\".\",\"\")+\"$\",\"i\")),n||this._monthsParse[i]||(r=\"^\"+this.months(a,\"\")+\"|^\"+this.monthsShort(a,\"\"),this._monthsParse[i]=new RegExp(r.replace(\".\",\"\"),\"i\")),n&&\"MMMM\"===e&&this._longMonthsParse[i].test(t))return i;if(n&&\"MMM\"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Xn.monthsRegex=function(t){return this._monthsParseExact?(d(this,\"_monthsRegex\")||tt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,\"_monthsRegex\")||(this._monthsRegex=gn),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Xn.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,\"_monthsRegex\")||tt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,\"_monthsShortRegex\")||(this._monthsShortRegex=fn),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Xn.week=function(t){return st(t,this._week.dow,this._week.doy).week},Xn.firstDayOfYear=function(){return this._week.doy},Xn.firstDayOfWeek=function(){return this._week.dow},Xn.weekdays=function(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?\"format\":\"standalone\"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone},Xn.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},Xn.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},Xn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return ct.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=h([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp(\"^\"+this.weekdays(a,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._shortWeekdaysParse[i]=new RegExp(\"^\"+this.weekdaysShort(a,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._minWeekdaysParse[i]=new RegExp(\"^\"+this.weekdaysMin(a,\"\").replace(\".\",\".?\")+\"$\",\"i\")),this._weekdaysParse[i]||(r=\"^\"+this.weekdays(a,\"\")+\"|^\"+this.weekdaysShort(a,\"\")+\"|^\"+this.weekdaysMin(a,\"\"),this._weekdaysParse[i]=new RegExp(r.replace(\".\",\"\"),\"i\")),n&&\"dddd\"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&\"ddd\"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&\"dd\"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Xn.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,\"_weekdaysRegex\")||ht.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,\"_weekdaysRegex\")||(this._weekdaysRegex=bn),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Xn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,\"_weekdaysRegex\")||ht.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,\"_weekdaysShortRegex\")||(this._weekdaysShortRegex=xn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Xn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,\"_weekdaysRegex\")||ht.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,\"_weekdaysMinRegex\")||(this._weekdaysMinRegex=_n),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Xn.isPM=function(t){return\"p\"===(t+\"\").toLowerCase().charAt(0)},Xn.meridiem=function(t,e,n){return t>11?n?\"pm\":\"PM\":n?\"am\":\"AM\"},bt(\"en\",{dayOfMonthOrdinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?\"th\":1===e?\"st\":2===e?\"nd\":3===e?\"rd\":\"th\")}}),n.lang=M(\"moment.lang is deprecated. Use moment.locale instead.\",bt),n.langData=M(\"moment.langData is deprecated. Use moment.localeData instead.\",_t);var Jn=Math.abs,Kn=me(\"ms\"),Qn=me(\"s\"),$n=me(\"m\"),ti=me(\"h\"),ei=me(\"d\"),ni=me(\"w\"),ii=me(\"M\"),ai=me(\"y\"),ri=pe(\"milliseconds\"),oi=pe(\"seconds\"),si=pe(\"minutes\"),li=pe(\"hours\"),ui=pe(\"days\"),di=pe(\"months\"),ci=pe(\"years\"),hi=Math.round,fi={ss:44,s:45,m:45,h:22,d:26,M:11},gi=Math.abs,mi=Vt.prototype;return mi.isValid=function(){return this._isValid},mi.abs=function(){var t=this._data;return this._milliseconds=Jn(this._milliseconds),this._days=Jn(this._days),this._months=Jn(this._months),t.milliseconds=Jn(t.milliseconds),t.seconds=Jn(t.seconds),t.minutes=Jn(t.minutes),t.hours=Jn(t.hours),t.months=Jn(t.months),t.years=Jn(t.years),this},mi.add=function(t,e){return ce(this,t,e,1)},mi.subtract=function(t,e){return ce(this,t,e,-1)},mi.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(\"month\"===(t=A(t))||\"year\"===t)return e=this._days+i/864e5,n=this._months+fe(e),\"month\"===t?n:n/12;switch(e=this._days+Math.round(ge(this._months)),t){case\"week\":return e/7+i/6048e5;case\"day\":return e+i/864e5;case\"hour\":return 24*e+i/36e5;case\"minute\":return 1440*e+i/6e4;case\"second\":return 86400*e+i/1e3;case\"millisecond\":return Math.floor(864e5*e)+i;default:throw new Error(\"Unknown unit \"+t)}},mi.asMilliseconds=Kn,mi.asSeconds=Qn,mi.asMinutes=$n,mi.asHours=ti,mi.asDays=ei,mi.asWeeks=ni,mi.asMonths=ii,mi.asYears=ai,mi.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN},mi._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*he(ge(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=x(r/1e3),l.seconds=t%60,e=x(t/60),l.minutes=e%60,n=x(e/60),l.hours=n%24,o+=x(n/24),a=x(fe(o)),s+=a,o-=he(ge(a)),i=x(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},mi.get=function(t){return t=A(t),this.isValid()?this[t+\"s\"]():NaN},mi.milliseconds=ri,mi.seconds=oi,mi.minutes=si,mi.hours=li,mi.days=ui,mi.weeks=function(){return x(this.days()/7)},mi.months=di,mi.years=ci,mi.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=ye(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},mi.toISOString=be,mi.toString=be,mi.toJSON=be,mi.locale=ne,mi.localeData=ie,mi.toIsoString=M(\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\",be),mi.lang=Hn,N(\"X\",0,0,\"unix\"),N(\"x\",0,0,\"valueOf\"),E(\"x\",Ge),E(\"X\",/[+-]?\\d+(\\.\\d{1,3})?/),G(\"X\",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),G(\"x\",function(t,e,n){n._d=new Date(_(t))}),n.version=\"2.18.1\",function(t){xe=t}(Nt),n.fn=Zn,n.min=function(){return zt(\"isBefore\",[].slice.call(arguments,0))},n.max=function(){return zt(\"isAfter\",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=h,n.unix=function(t){return Nt(1e3*t)},n.months=function(t,e){return ue(t,e,\"months\")},n.isDate=l,n.locale=bt,n.invalid=p,n.duration=Xt,n.isMoment=b,n.weekdays=function(t,e,n){return de(t,e,n,\"weekdays\")},n.parseZone=function(){return Nt.apply(null,arguments).parseZone()},n.localeData=_t,n.isDuration=Ht,n.monthsShort=function(t,e){return ue(t,e,\"monthsShort\")},n.weekdaysMin=function(t,e,n){return de(t,e,n,\"weekdaysMin\")},n.defineLocale=xt,n.updateLocale=function(t,e){if(null!=e){var n,i=Mn;null!=Sn[t]&&(i=Sn[t]._config),(n=new P(e=C(i,e))).parentLocale=Sn[t],Sn[t]=n,bt(t)}else null!=Sn[t]&&(null!=Sn[t].parentLocale?Sn[t]=Sn[t].parentLocale:null!=Sn[t]&&delete Sn[t]);return Sn[t]},n.locales=function(){return Pe(Sn)},n.weekdaysShort=function(t,e,n){return de(t,e,n,\"weekdaysShort\")},n.normalizeUnits=A,n.relativeTimeRounding=function(t){return void 0===t?hi:\"function\"==typeof t&&(hi=t,!0)},n.relativeTimeThreshold=function(t,e){return void 0!==fi[t]&&(void 0===e?fi[t]:(fi[t]=e,\"s\"===t&&(fi.ss=e-1),!0))},n.calendarFormat=function(t,e){var n=t.diff(e,\"days\",!0);return n<-6?\"sameElse\":n<-1?\"lastWeek\":n<0?\"lastDay\":n<1?\"sameDay\":n<2?\"nextDay\":n<7?\"nextWeek\":\"sameElse\"},n.prototype=Zn,n})},{}],7:[function(t,e,n){var i=t(29)();i.helpers=t(45),t(27)(i),i.defaults=t(25),i.Element=t(26),i.elements=t(40),i.Interaction=t(28),i.platform=t(48),t(31)(i),t(22)(i),t(23)(i),t(24)(i),t(30)(i),t(33)(i),t(32)(i),t(35)(i),t(54)(i),t(52)(i),t(53)(i),t(55)(i),t(56)(i),t(57)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(21)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i);var a=[];a.push(t(49)(i),t(50)(i),t(51)(i)),i.plugins.register(a),i.platform.initialize(),e.exports=i,\"undefined\"!=typeof window&&(window.Chart=i),i.canvasHelpers=i.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(t,e,n){\"use strict\";e.exports=function(t){t.Bar=function(e,n){return n.type=\"bar\",new t(e,n)}}},{}],9:[function(t,e,n){\"use strict\";e.exports=function(t){t.Bubble=function(e,n){return n.type=\"bubble\",new t(e,n)}}},{}],10:[function(t,e,n){\"use strict\";e.exports=function(t){t.Doughnut=function(e,n){return n.type=\"doughnut\",new t(e,n)}}},{}],11:[function(t,e,n){\"use strict\";e.exports=function(t){t.Line=function(e,n){return n.type=\"line\",new t(e,n)}}},{}],12:[function(t,e,n){\"use strict\";e.exports=function(t){t.PolarArea=function(e,n){return n.type=\"polarArea\",new t(e,n)}}},{}],13:[function(t,e,n){\"use strict\";e.exports=function(t){t.Radar=function(e,n){return n.type=\"radar\",new t(e,n)}}},{}],14:[function(t,e,n){\"use strict\";e.exports=function(t){t.Scatter=function(e,n){return n.type=\"scatter\",new t(e,n)}}},{}],15:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"bar\",{hover:{mode:\"label\"},scales:{xAxes:[{type:\"category\",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:\"linear\"}]}}),i._set(\"horizontalBar\",{hover:{mode:\"index\",axis:\"y\"},scales:{xAxes:[{type:\"linear\",position:\"bottom\"}],yAxes:[{position:\"left\",type:\"category\",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:\"left\"}},tooltips:{callbacks:{title:function(t,e){var n=\"\";return t.length>0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(n=e.labels[t[0].index])),n},label:function(t,e){return(e.datasets[t.datasetIndex].label||\"\")+\": \"+t.xLabel}},mode:\"index\",axis:\"y\"}}),e.exports=function(t){t.controllers.bar=t.DatasetController.extend({dataElementType:a.Rectangle,initialize:function(){var e,n=this;t.DatasetController.prototype.initialize.apply(n,arguments),(e=n.getMeta()).stack=n.getDataset().stack,e.bar=!0},update:function(t){var e,n,i=this,a=i.getMeta().data;for(i._ruler=i.getRuler(),e=0,n=a.length;e<n;++e)i.updateElement(a[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.chart,o=i.getMeta(),s=i.getDataset(),l=t.custom||{},u=a.options.elements.rectangle;t._xScale=i.getScaleForId(o.xAxisID),t._yScale=i.getScaleForId(o.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={datasetLabel:s.label,label:a.data.labels[e],borderSkipped:l.borderSkipped?l.borderSkipped:u.borderSkipped,backgroundColor:l.backgroundColor?l.backgroundColor:r.valueAtIndexOrDefault(s.backgroundColor,e,u.backgroundColor),borderColor:l.borderColor?l.borderColor:r.valueAtIndexOrDefault(s.borderColor,e,u.borderColor),borderWidth:l.borderWidth?l.borderWidth:r.valueAtIndexOrDefault(s.borderWidth,e,u.borderWidth)},i.updateElementGeometry(t,e,n),t.pivot()},updateElementGeometry:function(t,e,n){var i=this,a=t._model,r=i.getValueScale(),o=r.getBasePixel(),s=r.isHorizontal(),l=i._ruler||i.getRuler(),u=i.calculateBarValuePixels(i.index,e),d=i.calculateBarIndexPixels(i.index,e,l);a.horizontal=s,a.base=n?o:u.base,a.x=s?n?o:u.head:d.center,a.y=s?d.center:n?o:u.head,a.height=s?d.size:void 0,a.width=s?void 0:d.size},getValueScaleId:function(){return this.getMeta().yAxisID},getIndexScaleId:function(){return this.getMeta().xAxisID},getValueScale:function(){return this.getScaleForId(this.getValueScaleId())},getIndexScale:function(){return this.getScaleForId(this.getIndexScaleId())},getStackCount:function(t){var e,n,i=this,a=i.chart,r=i.getIndexScale().options.stacked,o=void 0===t?a.data.datasets.length:t+1,s=[];for(e=0;e<o;++e)(n=a.getDatasetMeta(e)).bar&&a.isDatasetVisible(e)&&(!1===r||!0===r&&-1===s.indexOf(n.stack)||void 0===r&&(void 0===n.stack||-1===s.indexOf(n.stack)))&&s.push(n.stack);return s.length},getStackIndex:function(t){return this.getStackCount(t)-1},getRuler:function(){var t,e,n=this,i=n.getIndexScale(),a=n.getStackCount(),r=n.index,o=[],s=i.isHorizontal(),l=s?i.left:i.top,u=l+(s?i.width:i.height);for(t=0,e=n.getMeta().data.length;t<e;++t)o.push(i.getPixelForValue(null,t,r));return{pixels:o,start:l,end:u,stackCount:a,scale:i}},calculateBarValuePixels:function(t,e){var n,i,a,r,o,s,l=this,u=l.chart,d=l.getMeta(),c=l.getValueScale(),h=u.data.datasets,f=c.getRightValue(h[t].data[e]),g=c.options.stacked,m=d.stack,p=0;if(g||void 0===g&&void 0!==m)for(n=0;n<t;++n)(i=u.getDatasetMeta(n)).bar&&i.stack===m&&i.controller.getValueScaleId()===c.id&&u.isDatasetVisible(n)&&(a=c.getRightValue(h[n].data[e]),(f<0&&a<0||f>=0&&a>0)&&(p+=a));return r=c.getPixelForValue(p),o=c.getPixelForValue(p+f),s=(o-r)/2,{size:s,base:r,head:o,center:o+s/2}},calculateBarIndexPixels:function(t,e,n){var i,a,o,s,l,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],m=f.length,p=n.start,v=n.end;return 1===m?(i=g>p?g-p:v-g,a=g<v?v-g:g-p):(e>0&&(i=(g-f[e-1])/2,e===m-1&&(a=i)),e<m-1&&(a=(f[e+1]-g)/2,0===e&&(i=a))),o=i*c.categoryPercentage,s=a*c.categoryPercentage,l=(o+s)/n.stackCount,u=l*c.barPercentage,u=Math.min(r.valueOrDefault(c.barThickness,u),r.valueOrDefault(c.maxBarThickness,1/0)),g-=o,g+=l*h,g+=(l-u)/2,{size:u,base:g,head:g+u,center:g+u/2}},draw:function(){var t=this,e=t.chart,n=t.getValueScale(),i=t.getMeta().data,a=t.getDataset(),o=i.length,s=0;for(r.canvas.clipArea(e.ctx,e.chartArea);s<o;++s)isNaN(n.getRightValue(a.data[s]))||i[s].draw();r.canvas.unclipArea(e.ctx)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model;a.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:r.valueAtIndexOrDefault(e.hoverBackgroundColor,n,r.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor?i.hoverBorderColor:r.valueAtIndexOrDefault(e.hoverBorderColor,n,r.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:r.valueAtIndexOrDefault(e.hoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,o=this.chart.options.elements.rectangle;a.backgroundColor=i.backgroundColor?i.backgroundColor:r.valueAtIndexOrDefault(e.backgroundColor,n,o.backgroundColor),a.borderColor=i.borderColor?i.borderColor:r.valueAtIndexOrDefault(e.borderColor,n,o.borderColor),a.borderWidth=i.borderWidth?i.borderWidth:r.valueAtIndexOrDefault(e.borderWidth,n,o.borderWidth)}}),t.controllers.horizontalBar=t.controllers.bar.extend({getValueScaleId:function(){return this.getMeta().xAxisID},getIndexScaleId:function(){return this.getMeta().yAxisID}})}},{25:25,40:40,45:45}],16:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"bubble\",{hover:{mode:\"single\"},scales:{xAxes:[{type:\"linear\",position:\"bottom\",id:\"x-axis-0\"}],yAxes:[{type:\"linear\",position:\"left\",id:\"y-axis-0\"}]},tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){var n=e.datasets[t.datasetIndex].label||\"\",i=e.datasets[t.datasetIndex].data[t.index];return n+\": (\"+t.xLabel+\", \"+t.yLabel+\", \"+i.r+\")\"}}}}),e.exports=function(t){t.controllers.bubble=t.DatasetController.extend({dataElementType:a.Point,update:function(t){var e=this,n=e.getMeta().data;r.each(n,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveElementOptions(t,e),u=i.getDataset().data[e],d=i.index,c=n?o.getPixelForDecimal(.5):o.getPixelForValue(\"object\"==typeof u?u:NaN,e,d),h=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,radius:n?0:l.radius,skip:r.skip||isNaN(c)||isNaN(h),x:c,y:h},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options;e.backgroundColor=r.valueOrDefault(n.hoverBackgroundColor,r.getHoverColor(n.backgroundColor)),e.borderColor=r.valueOrDefault(n.hoverBorderColor,r.getHoverColor(n.borderColor)),e.borderWidth=r.valueOrDefault(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},removeHoverStyle:function(t){var e=t._model,n=t._options;e.backgroundColor=n.backgroundColor,e.borderColor=n.borderColor,e.borderWidth=n.borderWidth,e.radius=n.radius},_resolveElementOptions:function(t,e){var n,i,a,o=this,s=o.chart,l=s.data.datasets[o.index],u=t.custom||{},d=s.options.elements.point,c=r.options.resolve,h=l.data[e],f={},g={chart:s,dataIndex:e,dataset:l,datasetIndex:o.index},m=[\"backgroundColor\",\"borderColor\",\"borderWidth\",\"hoverBackgroundColor\",\"hoverBorderColor\",\"hoverBorderWidth\",\"hoverRadius\",\"hitRadius\",\"pointStyle\"];for(n=0,i=m.length;n<i;++n)f[a=m[n]]=c([u[a],l[a],d[a]],g,e);return f.radius=c([u.radius,h?h.r:void 0,l.radius,d.radius],g,e),f}})}},{25:25,40:40,45:45}],17:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"doughnut\",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:\"single\"},legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r<i[0].data.length;++r)e.push('<li><span style=\"background-color:'+i[0].backgroundColor[r]+'\"></span>'),a[r]&&e.push(a[r]),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[i],l=s&&s.custom||{},u=r.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:u(o.backgroundColor,i,d.backgroundColor),strokeStyle:l.borderColor?l.borderColor:u(o.borderColor,i,d.borderColor),lineWidth:l.borderWidth?l.borderWidth:u(o.borderWidth,i,d.borderWidth),hidden:isNaN(o.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){var n=e.labels[t.index],i=\": \"+e.datasets[t.datasetIndex].data[t.index];return r.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}}),i._set(\"pie\",r.clone(i.doughnut)),i._set(\"pie\",{cutoutPercentage:0}),e.exports=function(t){t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:a.Arc,linkScales:r.noop,getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e=this,n=e.chart,i=n.chartArea,a=n.options,o=a.elements.arc,s=i.right-i.left-o.borderWidth,l=i.bottom-i.top-o.borderWidth,u=Math.min(s,l),d={x:0,y:0},c=e.getMeta(),h=a.cutoutPercentage,f=a.circumference;if(f<2*Math.PI){var g=a.rotation%(2*Math.PI),m=(g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0))+f,p={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(m),y:Math.sin(m)},y=g<=0&&m>=0||g<=2*Math.PI&&2*Math.PI<=m,b=g<=.5*Math.PI&&.5*Math.PI<=m||g<=2.5*Math.PI&&2.5*Math.PI<=m,x=g<=-Math.PI&&-Math.PI<=m||g<=Math.PI&&Math.PI<=m,_=g<=.5*-Math.PI&&.5*-Math.PI<=m||g<=1.5*Math.PI&&1.5*Math.PI<=m,k=h/100,w={x:x?-1:Math.min(p.x*(p.x<0?1:k),v.x*(v.x<0?1:k)),y:_?-1:Math.min(p.y*(p.y<0?1:k),v.y*(v.y<0?1:k))},M={x:y?1:Math.max(p.x*(p.x>0?1:k),v.x*(v.x>0?1:k)),y:b?1:Math.max(p.y*(p.y>0?1:k),v.y*(v.y>0?1:k))},S={width:.5*(M.x-w.x),height:.5*(M.y-w.y)};u=Math.min(s/S.width,l/S.height),d={x:-.5*(M.x+w.x),y:-.5*(M.y+w.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),r.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,o=a.chartArea,s=a.options,l=s.animation,u=(o.left+o.right)/2,d=(o.top+o.bottom)/2,c=s.rotation,h=s.rotation,f=i.getDataset(),g=n&&l.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(s.circumference/(2*Math.PI)),m=n&&l.animateScale?0:i.innerRadius,p=n&&l.animateScale?0:i.outerRadius,v=r.valueAtIndexOrDefault;r.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:p,innerRadius:m,label:v(f.label,e,a.data.labels[e])}});var y=t._model;this.removeHoverStyle(t),n&&l.animateRotate||(y.startAngle=0===e?s.rotation:i.getMeta().data[e-1]._model.endAngle,y.endAngle=y.startAngle+y.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return r.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,r=t.length,o=0;o<r;o++)e=t[o]._model?t[o]._model.borderWidth:0,i=(n=t[o]._chart?t[o]._chart.config.data.datasets[a].hoverBorderWidth:0)>(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"line\",{showLines:!0,spanGaps:!1,hover:{mode:\"label\"},scales:{xAxes:[{type:\"category\",id:\"x-axis-0\"}],yAxes:[{type:\"linear\",id:\"y-axis-0\"}]}}),e.exports=function(t){function e(t,e){return r.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,o=this,s=o.getMeta(),l=s.dataset,u=s.data||[],d=o.chart.options,c=d.elements.line,h=o.getScaleForId(s.yAxisID),f=o.getDataset(),g=e(f,d);for(g&&(a=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=o.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:r.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:r.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:r.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},l.pivot()),n=0,i=u.length;n<i;++n)o.updateElement(u[n],n,t);for(g&&0!==l._model.tension&&o.updateBezierControlPoints(),n=0,i=u.length;n<i;++n)u[n].pivot()},getPointBackgroundColor:function(t,e){var n=this.chart.options.elements.point.backgroundColor,i=this.getDataset(),a=t.custom||{};return a.backgroundColor?n=a.backgroundColor:i.pointBackgroundColor?n=r.valueAtIndexOrDefault(i.pointBackgroundColor,e,n):i.backgroundColor&&(n=i.backgroundColor),n},getPointBorderColor:function(t,e){var n=this.chart.options.elements.point.borderColor,i=this.getDataset(),a=t.custom||{};return a.borderColor?n=a.borderColor:i.pointBorderColor?n=r.valueAtIndexOrDefault(i.pointBorderColor,e,n):i.borderColor&&(n=i.borderColor),n},getPointBorderWidth:function(t,e){var n=this.chart.options.elements.point.borderWidth,i=this.getDataset(),a=t.custom||{};return isNaN(a.borderWidth)?!isNaN(i.pointBorderWidth)||r.isArray(i.pointBorderWidth)?n=r.valueAtIndexOrDefault(i.pointBorderWidth,e,n):isNaN(i.borderWidth)||(n=i.borderWidth):n=a.borderWidth,n},updateElement:function(t,e,n){var i,a,o=this,s=o.getMeta(),l=t.custom||{},u=o.getDataset(),d=o.index,c=u.data[e],h=o.getScaleForId(s.yAxisID),f=o.getScaleForId(s.xAxisID),g=o.chart.options.elements.point;void 0!==u.radius&&void 0===u.pointRadius&&(u.pointRadius=u.radius),void 0!==u.hitRadius&&void 0===u.pointHitRadius&&(u.pointHitRadius=u.hitRadius),i=f.getPixelForValue(\"object\"==typeof c?c:NaN,e,d),a=n?h.getBasePixel():o.calculatePointY(c,e,d),t._xScale=f,t._yScale=h,t._datasetIndex=d,t._index=e,t._model={x:i,y:a,skip:l.skip||isNaN(i)||isNaN(a),radius:l.radius||r.valueAtIndexOrDefault(u.pointRadius,e,g.radius),pointStyle:l.pointStyle||r.valueAtIndexOrDefault(u.pointStyle,e,g.pointStyle),backgroundColor:o.getPointBackgroundColor(t,e),borderColor:o.getPointBorderColor(t,e),borderWidth:o.getPointBorderWidth(t,e),tension:s.dataset._model?s.dataset._model.tension:0,steppedLine:!!s.dataset._model&&s.dataset._model.steppedLine,hitRadius:l.hitRadius||r.valueAtIndexOrDefault(u.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,n){var i,a,r,o=this,s=o.chart,l=o.getMeta(),u=o.getScaleForId(l.yAxisID),d=0,c=0;if(u.options.stacked){for(i=0;i<n;i++)if(a=s.data.datasets[i],\"line\"===(r=s.getDatasetMeta(i)).type&&r.yAxisID===u.id&&s.isDatasetVisible(i)){var h=Number(u.getRightValue(a.data[e]));h<0?c+=h||0:d+=h||0}var f=Number(u.getRightValue(t));return f<0?u.getPixelForValue(c+f):u.getPixelForValue(d+f)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){function t(t,e,n){return Math.max(Math.min(t,n),e)}var e,n,i,a,o=this,s=o.getMeta(),l=o.chart.chartArea,u=s.data||[];if(s.dataset._model.spanGaps&&(u=u.filter(function(t){return!t._model.skip})),\"monotone\"===s.dataset._model.cubicInterpolationMode)r.splineCurveMonotone(u);else for(e=0,n=u.length;e<n;++e)i=u[e]._model,a=r.splineCurve(r.previousItem(u,e)._model,i,r.nextItem(u,e)._model,s.dataset._model.tension),i.controlPointPreviousX=a.previous.x,i.controlPointPreviousY=a.previous.y,i.controlPointNextX=a.next.x,i.controlPointNextY=a.next.y;if(o.chart.options.elements.line.capBezierPoints)for(e=0,n=u.length;e<n;++e)(i=u[e]._model).controlPointPreviousX=t(i.controlPointPreviousX,l.left,l.right),i.controlPointPreviousY=t(i.controlPointPreviousY,l.top,l.bottom),i.controlPointNextX=t(i.controlPointNextX,l.left,l.right),i.controlPointNextY=t(i.controlPointNextY,l.top,l.bottom)},draw:function(){var t=this,n=t.chart,i=t.getMeta(),a=i.data||[],o=n.chartArea,s=a.length,l=0;for(r.canvas.clipArea(n.ctx,o),e(t.getDataset(),n.options)&&i.dataset.draw(),r.canvas.unclipArea(n.ctx);l<s;++l)a[l].draw(o)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model;a.radius=i.hoverRadius||r.valueAtIndexOrDefault(e.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),a.backgroundColor=i.hoverBackgroundColor||r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,n,r.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor||r.valueAtIndexOrDefault(e.pointHoverBorderColor,n,r.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth||r.valueAtIndexOrDefault(e.pointHoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this,n=e.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},o=t._model;void 0!==n.radius&&void 0===n.pointRadius&&(n.pointRadius=n.radius),o.radius=a.radius||r.valueAtIndexOrDefault(n.pointRadius,i,e.chart.options.elements.point.radius),o.backgroundColor=e.getPointBackgroundColor(t,i),o.borderColor=e.getPointBorderColor(t,i),o.borderWidth=e.getPointBorderWidth(t,i)}})}},{25:25,40:40,45:45}],19:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"polarArea\",{scale:{type:\"radialLinear\",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r<i[0].data.length;++r)e.push('<li><span style=\"background-color:'+i[0].backgroundColor[r]+'\"></span>'),a[r]&&e.push(a[r]),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[i].custom||{},l=r.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:l(o.backgroundColor,i,u.backgroundColor),strokeStyle:s.borderColor?s.borderColor:l(o.borderColor,i,u.borderColor),lineWidth:s.borderWidth?s.borderWidth:l(o.borderWidth,i,u.borderWidth),hidden:isNaN(o.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){return e.labels[t.index]+\": \"+t.yLabel}}}}),e.exports=function(t){t.controllers.polarArea=t.DatasetController.extend({dataElementType:a.Arc,linkScales:r.noop,update:function(t){var e=this,n=e.chart,i=n.chartArea,a=e.getMeta(),o=n.options,s=o.elements.arc,l=Math.min(i.right-i.left,i.bottom-i.top);n.outerRadius=Math.max((l-s.borderWidth/2)/2,0),n.innerRadius=Math.max(o.cutoutPercentage?n.outerRadius/100*o.cutoutPercentage:1,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),e.outerRadius=n.outerRadius-n.radiusLength*e.index,e.innerRadius=e.outerRadius-n.radiusLength,a.count=e.countVisibleElements(),r.each(a.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){for(var i=this,a=i.chart,o=i.getDataset(),s=a.options,l=s.animation,u=a.scale,d=a.data.labels,c=i.calculateCircumference(o.data[e]),h=u.xCenter,f=u.yCenter,g=0,m=i.getMeta(),p=0;p<e;++p)isNaN(o.data[p])||m.data[p].hidden||++g;var v=s.startAngle,y=t.hidden?0:u.getDistanceFromCenterForValue(o.data[e]),b=v+c*g,x=b+(t.hidden?0:c),_=l.animateScale?0:u.getDistanceFromCenterForValue(o.data[e]);r.extend(t,{_datasetIndex:i.index,_index:e,_scale:u,_model:{x:h,y:f,innerRadius:0,outerRadius:n?_:y,startAngle:n&&l.animateRotate?v:b,endAngle:n&&l.animateRotate?v:x,label:r.valueAtIndexOrDefault(d,e,d[e])}}),i.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return r.each(e.data,function(e,i){isNaN(t.data[i])||e.hidden||n++}),n},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"radar\",{scale:{type:\"radialLinear\"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:r.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,o=i.custom||{},s=e.getDataset(),l=e.chart.options.elements.line,u=e.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),r.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:o.tension?o.tension:r.valueOrDefault(s.lineTension,l.tension),backgroundColor:o.backgroundColor?o.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:s.borderWidth||l.borderWidth,borderColor:o.borderColor?o.borderColor:s.borderColor||l.borderColor,fill:o.fill?o.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:o.borderDash?o.borderDash:s.borderDash||l.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle}}),n.dataset.pivot(),r.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},o=i.getDataset(),s=i.chart.scale,l=i.chart.options.elements.point,u=s.getPointPositionForValue(e,o.data[e]);void 0!==o.radius&&void 0===o.pointRadius&&(o.pointRadius=o.radius),void 0!==o.hitRadius&&void 0===o.pointHitRadius&&(o.pointHitRadius=o.hitRadius),r.extend(t,{_datasetIndex:i.index,_index:e,_scale:s,_model:{x:n?s.xCenter:u.x,y:n?s.yCenter:u.y,tension:a.tension?a.tension:r.valueOrDefault(o.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:r.valueAtIndexOrDefault(o.pointRadius,e,l.radius),backgroundColor:a.backgroundColor?a.backgroundColor:r.valueAtIndexOrDefault(o.pointBackgroundColor,e,l.backgroundColor),borderColor:a.borderColor?a.borderColor:r.valueAtIndexOrDefault(o.pointBorderColor,e,l.borderColor),borderWidth:a.borderWidth?a.borderWidth:r.valueAtIndexOrDefault(o.pointBorderWidth,e,l.borderWidth),pointStyle:a.pointStyle?a.pointStyle:r.valueAtIndexOrDefault(o.pointStyle,e,l.pointStyle),hitRadius:a.hitRadius?a.hitRadius:r.valueAtIndexOrDefault(o.pointHitRadius,e,l.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();r.each(e.data,function(n,i){var a=n._model,o=r.splineCurve(r.previousItem(e.data,i,!0)._model,a,r.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(o.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(o.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(o.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(o.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:r.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,r.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:r.valueAtIndexOrDefault(e.pointHoverBorderColor,i,r.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:r.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,o=this.chart.options.elements.point;a.radius=n.radius?n.radius:r.valueAtIndexOrDefault(e.pointRadius,i,o.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:r.valueAtIndexOrDefault(e.pointBackgroundColor,i,o.backgroundColor),a.borderColor=n.borderColor?n.borderColor:r.valueAtIndexOrDefault(e.pointBorderColor,i,o.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:r.valueAtIndexOrDefault(e.pointBorderWidth,i,o.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){\"use strict\";t(25)._set(\"scatter\",{hover:{mode:\"single\"},scales:{xAxes:[{id:\"x-axis-1\",type:\"linear\",position:\"bottom\"}],yAxes:[{id:\"y-axis-1\",type:\"linear\",position:\"left\"}]},showLines:!1,tooltips:{callbacks:{title:function(){return\"\"},label:function(t){return\"(\"+t.xLabel+\", \"+t.yLabel+\")\"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{animation:{duration:1e3,easing:\"easeOutQuart\",onProgress:r.noop,onComplete:r.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:\"\",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=r.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=r.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),n=0;t.dropFrames>1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a<i.length;)n=(e=i[a]).chart,e.currentStep=(e.currentStep||0)+t,e.currentStep=Math.min(e.currentStep,e.numSteps),r.callback(e.render,[n,e],n),r.callback(e.onAnimationProgress,[e],n),e.currentStep>=e.numSteps?(r.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,\"animationObject\",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,\"chartInstance\",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){\"use strict\";var i=t(25),a=t(45),r=t(28),o=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function s(t){return\"top\"===t||\"bottom\"===t}var l=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var r=this;i=e(i);var s=o.acquireContext(n,i),l=s&&s.canvas,u=l&&l.height,d=l&&l.width;r.id=a.uid(),r.ctx=s,r.canvas=l,r.config=i,r.width=d,r.height=u,r.aspectRatio=u?d/u:null,r.options=i.options,r._bufferedRender=!1,r.chart=r,r.controller=r,t.instances[r.id]=r,Object.defineProperty(r,\"data\",{get:function(){return r.config.data},set:function(t){r.config.data=t}}),s&&l?(r.initialize(),r.update()):console.error(\"Failed to create chart: can't acquire context from the given item\")},initialize:function(){var t=this;return l.notify(t,\"beforeInit\"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),l.notify(t,\"afterInit\"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,r=n.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(a.getMaximumWidth(i))),s=Math.max(0,Math.floor(r?o/r:a.getMaximumHeight(i)));if((e.width!==o||e.height!==s)&&(i.width=e.width=o,i.height=e.height=s,i.style.width=o+\"px\",i.style.height=s+\"px\",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:o,height:s};l.notify(e,\"resize\",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||\"x-axis-\"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||\"y-axis-\"+e}),n&&(n.id=n.id||\"scale\")},buildScales:function(){var e=this,n=e.options,i=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:\"category\",dposition:\"bottom\"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:\"linear\",dposition:\"left\"}}))),n.scale&&r.push({options:n.scale,dtype:\"radialLinear\",isDefault:!0,dposition:\"chartArea\"}),a.each(r,function(n){var r=n.options,o=a.valueOrDefault(r.type,n.dtype),l=t.scaleService.getScaleConstructor(o);if(l){s(r.position)!==s(n.dposition)&&(r.position=n.dposition);var u=new l({id:r.id,options:r,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,r){var o=e.getDatasetMeta(r),s=a.type||e.config.type;if(o.type&&o.type!==s&&(e.destroyDatasetMeta(r),o=e.getDatasetMeta(r)),o.type=s,n.push(o.type),o.controller)o.controller.updateIndex(r);else{var l=t.controllers[o.type];if(void 0===l)throw new Error('\"'+o.type+'\" is not a chart type.');o.controller=new l(e,r),i.push(o.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&\"object\"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==l.notify(e,\"beforeUpdate\")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],l.notify(e,\"afterUpdate\"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==l.notify(e,\"beforeLayout\")&&(t.layoutService.update(this,this.width,this.height),l.notify(e,\"afterScaleUpdate\"),l.notify(e,\"afterLayout\"))},updateDatasets:function(){var t=this;if(!1!==l.notify(t,\"beforeDatasetsUpdate\")){for(var e=0,n=t.data.datasets.length;e<n;++e)t.updateDataset(e);l.notify(t,\"afterDatasetsUpdate\")}},updateDataset:function(t){var e=this,n=e.getDatasetMeta(t),i={meta:n,index:t};!1!==l.notify(e,\"beforeDatasetUpdate\",[i])&&(n.controller.update(),l.notify(e,\"afterDatasetUpdate\",[i]))},render:function(e){var n=this;e&&\"object\"==typeof e||(e={duration:e,lazy:arguments[1]});var i=e.duration,r=e.lazy;if(!1!==l.notify(n,\"beforeRender\")){var o=n.options.animation,s=function(t){l.notify(n,\"afterRender\"),a.callback(o&&o.onComplete,[t],n)};if(o&&(void 0!==i&&0!==i||void 0===i&&0!==o.duration)){var u=new t.Animation({numSteps:(i||o.duration)/16.66,easing:e.easing||o.easing,render:function(t,e){var n=a.easing.effects[e.easing],i=e.currentStep,r=i/e.numSteps;t.draw(n(r),r,i)},onAnimationProgress:o.onProgress,onAnimationComplete:s});t.animationService.addAnimation(n,u,i,r)}else n.draw(),s(new t.Animation({numSteps:0,chart:n}));return n}},draw:function(t){var e=this;e.clear(),a.isNullOrUndef(t)&&(t=1),e.transition(t),!1!==l.notify(e,\"beforeDraw\",[t])&&(a.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.scale&&e.scale.draw(),e.drawDatasets(t),e._drawTooltip(t),l.notify(e,\"afterDraw\",[t]))},transition:function(t){for(var e=this,n=0,i=(e.data.datasets||[]).length;n<i;++n)e.isDatasetVisible(n)&&e.getDatasetMeta(n).controller.transition(t);e.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==l.notify(e,\"beforeDatasetsDraw\",[t])){for(var n=(e.data.datasets||[]).length-1;n>=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);l.notify(e,\"afterDatasetsDraw\",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==l.notify(n,\"beforeDatasetDraw\",[a])&&(i.controller.draw(e),l.notify(n,\"afterDatasetDraw\",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==l.notify(e,\"beforeTooltipDraw\",[i])&&(n.draw(),l.notify(e,\"afterTooltipDraw\",[i]))},getElementAtEvent:function(t){return r.modes.single(this,t)},getElementsAtEvent:function(t){return r.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return r.modes[\"x-axis\"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=r.modes[e];return\"function\"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return r.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return\"boolean\"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var e,n,i=this,r=i.canvas;for(i.stop(),e=0,n=i.data.datasets.length;e<n;++e)i.destroyDatasetMeta(e);r&&(i.unbindEvents(),a.canvas.clear(i),o.releaseContext(i.ctx),i.canvas=null,i.ctx=null),l.notify(i,\"destroy\"),delete t.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};a.each(t.options.events,function(i){o.addEventListener(t,i,n),e[i]=n}),t.options.responsive&&(n=function(){t.resize()},o.addEventListener(t,\"resize\",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,a.each(e,function(e,n){o.removeEventListener(t,n,e)}))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?\"setHoverStyle\":\"removeHoverStyle\";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o](i)},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==l.notify(e,\"beforeEvent\",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);i|=n&&n.handleEvent(t),l.notify(e,\"afterEvent\",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render(e.options.hover.animationDuration,!0)),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e=this,n=e.options||{},i=n.hover,r=!1;return e.lastActive=e.lastActive||[],\"mouseout\"===t.type?e.active=[]:e.active=e.getElementsAtEventForMode(t,i.mode,i),a.callback(n.onHover||n.hover.onHover,[t.native,e.active],e),\"mouseup\"!==t.type&&\"click\"!==t.type||n.onClick&&n.onClick.call(e,t.native,e.active),e.lastActive.length&&e.updateHoverStyle(e.lastActive,i.mode,!1),e.active.length&&i.mode&&e.updateHoverStyle(e.active,i.mode,!0),r=!a.arrayEquals(e.active,e.lastActive),e.lastActive=e.active,r}}),t.Controller=t}},{25:25,28:28,45:45,48:48}],24:[function(t,e,n){\"use strict\";var i=t(45);e.exports=function(t){function e(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),a.forEach(function(e){var n=\"onData\"+e.charAt(0).toUpperCase()+e.slice(1),a=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),r=a.apply(this,e);return i.each(t._chartjs.listeners,function(t){\"function\"==typeof t[n]&&t[n].apply(t,e)}),r}})}))}function n(t,e){var n=t._chartjs;if(n){var i=n.listeners,r=i.indexOf(e);-1!==r&&i.splice(r,1),i.length>0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],r=i.data;for(t=0,e=a.length;t<e;++t)r[t]=r[t]||n.createMetaData(t);i.dataset=i.dataset||n.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t=this,i=t.getDataset(),a=i.data||(i.data=[]);t._data!==a&&(t._data&&n(t._data,t),e(a,t),t._data=a),t.resyncElements()},update:i.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},removeHoverStyle:function(t,e){var n=this.chart.data.datasets[t._datasetIndex],a=t._index,r=t.custom||{},o=i.valueAtIndexOrDefault,s=t._model;s.backgroundColor=r.backgroundColor?r.backgroundColor:o(n.backgroundColor,a,e.backgroundColor),s.borderColor=r.borderColor?r.borderColor:o(n.borderColor,a,e.borderColor),s.borderWidth=r.borderWidth?r.borderWidth:o(n.borderWidth,a,e.borderWidth)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},r=i.valueAtIndexOrDefault,o=i.getHoverColor,s=t._model;s.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:r(e.hoverBackgroundColor,n,o(s.backgroundColor)),s.borderColor=a.hoverBorderColor?a.hoverBorderColor:r(e.hoverBorderColor,n,o(s.borderColor)),s.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:r(e.hoverBorderWidth,n,s.borderWidth)},resyncElements:function(){var t=this,e=t.getMeta(),n=t.getDataset().data,i=e.data.length,a=n.length;a<i?e.data.splice(a,i-a):a>i&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){this.insertElements(this.getDataset().data.length-1,arguments.length)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),t.DatasetController.extend=i.inherits}},{45:45}],25:[function(t,e,n){\"use strict\";var i=t(45);e.exports={_set:function(t,e){return i.merge(this[t]||(this[t]={}),e)}}},{45:45}],26:[function(t,e,n){\"use strict\";function i(t,e,n,i){var r,o,s,l,u,d,c,h,f,g=Object.keys(n);for(r=0,o=g.length;r<o;++r)if(s=g[r],d=n[s],e.hasOwnProperty(s)||(e[s]=d),(l=e[s])!==d&&\"_\"!==s[0]){if(t.hasOwnProperty(s)||(t[s]=l),u=t[s],(c=typeof d)===typeof u)if(\"string\"===c){if((h=a(u)).valid&&(f=a(d)).valid){e[s]=f.mix(h,i).rgbString();continue}}else if(\"number\"===c&&isFinite(u)&&isFinite(d)){e[s]=u+(d-u)*i;continue}e[s]=d}}var a=t(2),r=t(45),o=function(t){r.extend(this,t),this.initialize.apply(this,arguments)};r.extend(o.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=r.clone(t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,a=e._start,r=e._view;return n&&1!==t?(r||(r=e._view={}),a||(a=e._start={}),i(a,r,n,t),e):(e._view=n,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return r.isNumber(this._model.x)&&r.isNumber(this._model.y)}}),o.extend=r.inherits,e.exports=o},{2:2,45:45}],27:[function(t,e,n){\"use strict\";var i=t(2),a=t(25),r=t(45);e.exports=function(t){function e(t,e,n){var i;return\"string\"==typeof t?(i=parseInt(t,10),-1!==t.indexOf(\"%\")&&(i=i/100*e.parentNode[n])):i=t,i}function n(t){return void 0!==t&&null!==t&&\"none\"!==t}function o(t,i,a){var r=document.defaultView,o=t.parentNode,s=r.getComputedStyle(t)[i],l=r.getComputedStyle(o)[i],u=n(s),d=n(l),c=Number.POSITIVE_INFINITY;return u||d?Math.min(u?e(s,t,a):c,d?e(l,o,a):c):\"none\"}r.configMerge=function(){return r.merge(r.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,n,i,a){var o=n[e]||{},s=i[e];\"scales\"===e?n[e]=r.scaleMerge(o,s):\"scale\"===e?n[e]=r.merge(o,[t.scaleService.getScaleDefaults(s.type),s]):r._merger(e,n,i,a)}})},r.scaleMerge=function(){return r.merge(r.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,n,i,a){if(\"xAxes\"===e||\"yAxes\"===e){var o,s,l,u=i[e].length;for(n[e]||(n[e]=[]),o=0;o<u;++o)l=i[e][o],s=r.valueOrDefault(l.type,\"xAxes\"===e?\"category\":\"linear\"),o>=n[e].length&&n[e].push({}),!n[e][o].type||l.type&&l.type!==n[e][o].type?r.merge(n[e][o],[t.scaleService.getScaleDefaults(s),l]):r.merge(n[e][o],l)}else r._merger(e,n,i,a)}})},r.where=function(t,e){if(r.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return r.each(t,function(t){e(t)&&n.push(t)}),n},r.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},r.findNextWhere=function(t,e,n){r.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},r.findPreviousWhere=function(t,e,n){r.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},r.almostEquals=function(t,e,n){return Math.abs(t-e)<n},r.almostWhole=function(t,e){var n=Math.round(t);return n-e<t&&n+e>t},r.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},r.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},r.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},r.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},r.toRadians=function(t){return t*(Math.PI/180)},r.toDegrees=function(t){return t*(180/Math.PI)},r.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},r.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},r.aliasPixel=function(t){return t%2==0?0:.5},r.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-c*(o.x-a.x),y:r.y-c*(o.y-a.y)},next:{x:r.x+h*(o.x-a.x),y:r.y+h*(o.y-a.y)}}},r.EPSILON=Number.EPSILON||1e-14,r.splineCurveMonotone=function(t){var e,n,i,a,o=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),s=o.length;for(e=0;e<s;++e)if(!(i=o[e]).model.skip){if(n=e>0?o[e-1]:null,(a=e<s-1?o[e+1]:null)&&!a.model.skip){var l=a.model.x-i.model.x;i.deltaK=0!==l?(a.model.y-i.model.y)/l:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}var u,d,c,h;for(e=0;e<s-1;++e)i=o[e],a=o[e+1],i.model.skip||a.model.skip||(r.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(u=i.mK/i.deltaK,d=a.mK/i.deltaK,(h=Math.pow(u,2)+Math.pow(d,2))<=9||(c=3/Math.sqrt(h),i.mK=u*c*i.deltaK,a.mK=d*c*i.deltaK)));var f;for(e=0;e<s;++e)(i=o[e]).model.skip||(n=e>0?o[e-1]:null,a=e<s-1?o[e+1]:null,n&&!n.model.skip&&(f=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-f,i.model.controlPointPreviousY=i.model.y-f*i.mK),a&&!a.model.skip&&(f=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+f,i.model.controlPointNextY=i.model.y+f*i.mK))},r.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},r.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},r.niceNum=function(t,e){var n=Math.floor(r.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},r.requestAnimFrame=\"undefined\"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},r.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,o=t.currentTarget||t.srcElement,s=o.getBoundingClientRect(),l=a.touches;l&&l.length>0?(n=l[0].clientX,i=l[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(r.getStyle(o,\"padding-left\")),d=parseFloat(r.getStyle(o,\"padding-top\")),c=parseFloat(r.getStyle(o,\"padding-right\")),h=parseFloat(r.getStyle(o,\"padding-bottom\")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return n=Math.round((n-s.left-u)/f*o.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-d)/g*o.height/e.currentDevicePixelRatio),{x:n,y:i}},r.getConstraintWidth=function(t){return o(t,\"max-width\",\"clientWidth\")},r.getConstraintHeight=function(t){return o(t,\"max-height\",\"clientHeight\")},r.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(r.getStyle(e,\"padding-left\"),10),i=parseInt(r.getStyle(e,\"padding-right\"),10),a=e.clientWidth-n-i,o=r.getConstraintWidth(t);return isNaN(o)?a:Math.min(a,o)},r.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(r.getStyle(e,\"padding-top\"),10),i=parseInt(r.getStyle(e,\"padding-bottom\"),10),a=e.clientHeight-n-i,o=r.getConstraintHeight(t);return isNaN(o)?a:Math.min(a,o)},r.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},r.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height=a+\"px\",i.style.width=r+\"px\"}},r.fontString=function(t,e,n){return e+\" \"+t+\"px \"+n},r.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},o=i.garbageCollect=[],i.font=e),t.font=e;var s=0;r.each(n,function(e){void 0!==e&&null!==e&&!0!==r.isArray(e)?s=r.measureText(t,a,o,s,e):r.isArray(e)&&r.each(e,function(e){void 0===e||null===e||r.isArray(e)||(s=r.measureText(t,a,o,s,e))})});var l=o.length/2;if(l>n.length){for(var u=0;u<l;u++)delete a[o[u]];o.splice(0,l)}return s},r.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},r.numberOfLabelLines=function(t){var e=1;return r.each(t,function(t){r.isArray(t)&&t.length>e&&(e=t.length)}),e},r.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error(\"Color.js not found!\"),t},r.getHoverColor=function(t){return t instanceof CanvasPattern?t:r.color(t).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(t,e,n){\"use strict\";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,r,o;for(i=0,r=t.data.datasets.length;i<r;++i)if(t.isDatasetVisible(i))for(a=0,o=(n=t.getDatasetMeta(i)).data.length;a<o;++a){var s=n.data[a];s._view.skip||e(s)}}function r(t,e){var n=[];return a(t,function(t){t.inRange(e.x,e.y)&&n.push(t)}),n}function o(t,e,n,i){var r=Number.POSITIVE_INFINITY,o=[];return a(t,function(t){if(!n||t.inRange(e.x,e.y)){var a=t.getCenterPoint(),s=i(e,a);s<r?(o=[t],r=s):s===r&&o.push(t)}}),o}function s(t){var e=-1!==t.indexOf(\"x\"),n=-1!==t.indexOf(\"y\");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function l(t,e,n){var a=i(e,t);n.axis=n.axis||\"x\";var l=s(n.axis),u=n.intersect?r(t,a):o(t,a,!1,l),d=[];return u.length?(t.data.datasets.forEach(function(e,n){if(t.isDatasetVisible(n)){var i=t.getDatasetMeta(n).data[u[0]._index];i&&!i._view.skip&&d.push(i)}}),d):[]}var u=t(45);e.exports={modes:{single:function(t,e){var n=i(e,t),r=[];return a(t,function(t){if(t.inRange(n.x,n.y))return r.push(t),r}),r.slice(0,1)},label:l,index:l,dataset:function(t,e,n){var a=i(e,t);n.axis=n.axis||\"xy\";var l=s(n.axis),u=n.intersect?r(t,a):o(t,a,!1,l);return u.length>0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},\"x-axis\":function(t,e){return l(t,e,{intersect:!1})},point:function(t,e){return r(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||\"xy\";var r=s(n.axis),l=o(t,a,n.intersect,r);return l.length>1&&l.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),l.slice(0,1)},x:function(t,e,n){var r=i(e,t),o=[],s=!1;return a(t,function(t){t.inXRange(r.x)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),n.intersect&&!s&&(o=[]),o},y:function(t,e,n){var r=i(e,t),o=[],s=!1;return a(t,function(t){t.inYRange(r.y)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),n.intersect&&!s&&(o=[]),o}}}},{45:45}],29:[function(t,e,n){\"use strict\";t(25)._set(\"global\",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],hover:{onHover:null,mode:\"nearest\",intersect:!0,animationDuration:400},onClick:null,defaultColor:\"rgba(0,0,0,0.1)\",defaultFontColor:\"#666\",defaultFontFamily:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",defaultFontSize:12,defaultFontStyle:\"normal\",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){\"use strict\";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||\"top\",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=[\"fullWidth\",\"position\",\"weight\"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,a,r){function o(t){var e=i.findNextWhere(D,function(e){return e.box===t});if(e)if(t.isHorizontal()){var n={left:Math.max(I,C),right:Math.max(O,P),top:0,bottom:0};t.update(t.fullWidth?b:M,x/2,n)}else t.update(e.minSize.width,S)}function s(t){t.isHorizontal()?(t.left=t.fullWidth?d:I,t.right=t.fullWidth?a-c:I+M,t.top=B,t.bottom=B+t.height,B=t.bottom):(t.left=z,t.right=z+t.width,t.top=F,t.bottom=F+S,z=t.right)}if(t){var l=t.options.layout||{},u=i.options.toPadding(l.padding),d=u.left,c=u.right,h=u.top,f=u.bottom,g=e(t.boxes,\"left\"),m=e(t.boxes,\"right\"),p=e(t.boxes,\"top\"),v=e(t.boxes,\"bottom\"),y=e(t.boxes,\"chartArea\");n(g,!0),n(m,!1),n(p,!0),n(v,!1);var b=a-d-c,x=r-h-f,_=x/2,k=(a-b/2)/(g.length+m.length),w=(r-_)/(p.length+v.length),M=b,S=x,D=[];i.each(g.concat(m,p,v),function(t){var e,n=t.isHorizontal();n?(e=t.update(t.fullWidth?b:M,w),S-=e.height):(e=t.update(k,_),M-=e.width),D.push({horizontal:n,minSize:e,box:t})});var C=0,P=0,T=0,A=0;i.each(p.concat(v),function(t){if(t.getPadding){var e=t.getPadding();C=Math.max(C,e.left),P=Math.max(P,e.right)}}),i.each(g.concat(m),function(t){if(t.getPadding){var e=t.getPadding();T=Math.max(T,e.top),A=Math.max(A,e.bottom)}});var I=d,O=c,F=h,R=f;i.each(g.concat(m),o),i.each(g,function(t){I+=t.width}),i.each(m,function(t){O+=t.width}),i.each(p.concat(v),o),i.each(p,function(t){F+=t.height}),i.each(v,function(t){R+=t.height}),i.each(g.concat(m),function(t){var e=i.findNextWhere(D,function(e){return e.box===t}),n={left:0,right:0,top:F,bottom:R};e&&t.update(e.minSize.width,S,n)}),I=d,O=c,F=h,R=f,i.each(g,function(t){I+=t.width}),i.each(m,function(t){O+=t.width}),i.each(p,function(t){F+=t.height}),i.each(v,function(t){R+=t.height});var L=Math.max(C-I,0);I+=L,O+=Math.max(P-O,0);var W=Math.max(T-F,0);F+=W,R+=Math.max(A-R,0);var Y=r-F-R,N=a-I-O;N===M&&Y===S||(i.each(g,function(t){t.height=Y}),i.each(m,function(t){t.height=Y}),i.each(p,function(t){t.fullWidth||(t.width=N)}),i.each(v,function(t){t.fullWidth||(t.width=N)}),S=Y,M=N);var z=d+L,B=h+W;i.each(g.concat(p),s),z+=M,B+=S,i.each(m,s),i.each(v,s),t.chartArea={left:I,top:F,right:I+M,bottom:F+S},i.each(y,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(M,S)})}}}}},{45:45}],31:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{plugins:{}}),e.exports=function(t){t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if(a=l[i],r=a.plugin,\"function\"==typeof(s=r[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t._plugins||(t._plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],a=[],o=t&&t.config||{},s=o.options&&o.options.plugins||{};return this._plugins.concat(o.plugins||[]).forEach(function(t){if(-1===n.indexOf(t)){var e=t.id,o=s[e];!1!==o&&(!0===o&&(o=r.clone(i.global.plugins[e])),n.push(t),a.push({plugin:t,options:o||{}}))}}),e.descriptors=a,e.id=this._cacheId,a}},t.pluginService=t.plugins,t.PluginBase=a.extend({})}},{25:25,26:26,45:45}],32:[function(t,e,n){\"use strict\";function i(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(t[e].label);return i}function a(t,e,n){var i=t.getPixelForTick(e);return n&&(i-=0===e?(t.getPixelForTick(1)-i)/2:(i-t.getPixelForTick(e-1))/2),i}var r=t(25),o=t(26),s=t(45),l=t(34);r._set(\"scale\",{display:!0,position:\"left\",offset:!1,gridLines:{display:!0,color:\"rgba(0, 0, 0, 0.1)\",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:\"rgba(0,0,0,0.25)\",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:\"\",lineHeight:1.2,padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:l.formatters.values,minor:{},major:{}}}),e.exports=function(t){function e(t,e,n){return s.isArray(e)?s.longestText(t,n,e):t.measureText(e).width}function n(t){var e=s.valueOrDefault,n=r.global,i=e(t.fontSize,n.defaultFontSize),a=e(t.fontStyle,n.defaultFontStyle),o=e(t.fontFamily,n.defaultFontFamily);return{size:i,style:a,family:o,font:s.fontString(i,a,o)}}function l(t){return s.options.toLineHeight(s.valueOrDefault(t.lineHeight,1.2),s.valueOrDefault(t.fontSize,r.global.defaultFontSize))}t.Scale=o.extend({getPadding:function(){var t=this;return{left:t.paddingLeft||0,top:t.paddingTop||0,right:t.paddingRight||0,bottom:t.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1});for(var e in t)\"major\"!==e&&\"minor\"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){s.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,l,u,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=s.extend({left:0,right:0,top:0,bottom:0},n),d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),l=d.buildTicks()||[],d.afterBuildTicks(),d.beforeTickToLabelConversion(),r=d.convertTicksToLabels(l)||d.ticks,d.afterTickToLabelConversion(),d.ticks=r,i=0,a=r.length;i<a;++i)o=r[i],(u=l[i])?u.label=o:l.push(u={label:o,major:!1});return d._ticks=l,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){s.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){s.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){s.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){s.callback(this.options.beforeDataLimits,[this])},determineDataLimits:s.noop,afterDataLimits:function(){s.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){s.callback(this.options.beforeBuildTicks,[this])},buildTicks:s.noop,afterBuildTicks:function(){s.callback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){s.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this,e=t.options.ticks;t.ticks=t.ticks.map(e.userCallback||e.callback,this)},afterTickToLabelConversion:function(){s.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){s.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,a=t.options.ticks,r=i(t._ticks),o=n(a);e.font=o.font;var l=a.minRotation||0;if(r.length&&t.options.display&&t.isHorizontal())for(var u,d=s.longestText(e,o.font,r,t.longestTextCache),c=d,h=t.getPixelForTick(1)-t.getPixelForTick(0)-6;c>h&&l<a.maxRotation;){var f=s.toRadians(l);if(u=Math.cos(f),Math.sin(f)*d>t.maxHeight){l--;break}l++,c=u*d}t.labelRotation=l},afterCalculateTickRotation:function(){s.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){s.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},r=i(t._ticks),o=t.options,u=o.ticks,d=o.scaleLabel,c=o.gridLines,h=o.display,f=t.isHorizontal(),g=n(u),m=o.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?m:0,a.height=f?h&&c.drawTicks?m:0:t.maxHeight,d.display&&h){var p=l(d)+s.options.toPadding(d.padding).height;f?a.height+=p:a.width+=p}if(u.display&&h){var v=s.longestText(t.ctx,g.font,r,t.longestTextCache),y=s.numberOfLabelLines(r),b=.5*g.size,x=t.options.ticks.padding;if(f){t.longestLabelWidth=v;var _=s.toRadians(t.labelRotation),k=Math.cos(_),w=Math.sin(_)*v+g.size*y+b*(y-1)+b;a.height=Math.min(t.maxHeight,a.height+w+x),t.ctx.font=g.font;var M=e(t.ctx,r[0],g.font),S=e(t.ctx,r[r.length-1],g.font);0!==t.labelRotation?(t.paddingLeft=\"bottom\"===o.position?k*M+3:k*b+3,t.paddingRight=\"bottom\"===o.position?k*b+3:k*S+3):(t.paddingLeft=M/2+3,t.paddingRight=S/2+3)}else u.mirror?v=0:v+=x+b,a.width=Math.min(t.maxWidth,a.width+v),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){s.callback(this.options.afterFit,[this])},isHorizontal:function(){return\"top\"===this.options.position||\"bottom\"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(s.isNullOrUndef(t))return NaN;if(\"number\"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:s.noop,getPixelForValue:s.noop,getValueForPixel:s.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var r=e.left+Math.round(a);return r+=e.isFullWidth()?e.margins.left:0}var o=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(o/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,r=this,o=r.isHorizontal(),l=r.options.ticks.minor,u=t.length,d=s.toRadians(r.labelRotation),c=Math.cos(d),h=r.longestLabelWidth*c,f=[];for(l.maxTicksLimit&&(a=l.maxTicksLimit),o&&(e=!1,(h+l.autoSkipPadding)*u>r.width-(r.paddingLeft+r.paddingRight)&&(e=1+Math.floor((h+l.autoSkipPadding)*u/(r.width-(r.paddingLeft+r.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n<u;n++)i=t[n],(e>1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var o=e.ctx,u=r.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,m=e.isHorizontal(),p=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),v=s.valueOrDefault(d.fontColor,u.defaultFontColor),y=n(d),b=s.valueOrDefault(c.fontColor,u.defaultFontColor),x=n(c),_=h.drawTicks?h.tickMarkLength:0,k=s.valueOrDefault(f.fontColor,u.defaultFontColor),w=n(f),M=s.options.toPadding(f.padding),S=s.toRadians(e.labelRotation),D=[],C=\"right\"===i.position?e.left:e.right-_,P=\"right\"===i.position?e.left+_:e.right,T=\"bottom\"===i.position?e.top:e.bottom-_,A=\"bottom\"===i.position?e.top+_:e.bottom;if(s.each(p,function(n,r){if(!s.isNullOrUndef(n.label)){var o,l,c,f,v=n.label;r===e.zeroLineIndex&&i.offset===h.offsetGridLines?(o=h.zeroLineWidth,l=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(o=s.valueAtIndexOrDefault(h.lineWidth,r),l=s.valueAtIndexOrDefault(h.color,r),c=s.valueOrDefault(h.borderDash,u.borderDash),f=s.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var y,b,x,k,w,M,I,O,F,R,L=\"middle\",W=\"middle\",Y=d.padding;if(m){var N=_+Y;\"bottom\"===i.position?(W=g?\"middle\":\"top\",L=g?\"right\":\"center\",R=e.top+N):(W=g?\"middle\":\"bottom\",L=g?\"left\":\"center\",R=e.bottom-N);var z=a(e,r,h.offsetGridLines&&p.length>1);z<e.left&&(l=\"rgba(0,0,0,0)\"),z+=s.aliasPixel(o),F=e.getPixelForTick(r)+d.labelOffset,y=x=w=I=z,b=T,k=A,M=t.top,O=t.bottom}else{var B,V=\"left\"===i.position;d.mirror?(L=V?\"left\":\"right\",B=Y):(L=V?\"right\":\"left\",B=_+Y),F=V?e.right-B:e.left+B;var H=a(e,r,h.offsetGridLines&&p.length>1);H<e.top&&(l=\"rgba(0,0,0,0)\"),H+=s.aliasPixel(o),R=e.getPixelForTick(r)+d.labelOffset,y=C,x=P,w=t.left,I=t.right,b=k=M=O=H}D.push({tx1:y,ty1:b,tx2:x,ty2:k,x1:w,y1:M,x2:I,y2:O,labelX:F,labelY:R,glWidth:o,glColor:l,glBorderDash:c,glBorderDashOffset:f,rotation:-1*S,label:v,major:n.major,textBaseline:W,textAlign:L})}}),s.each(D,function(t){if(h.display&&(o.save(),o.lineWidth=t.glWidth,o.strokeStyle=t.glColor,o.setLineDash&&(o.setLineDash(t.glBorderDash),o.lineDashOffset=t.glBorderDashOffset),o.beginPath(),h.drawTicks&&(o.moveTo(t.tx1,t.ty1),o.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(o.moveTo(t.x1,t.y1),o.lineTo(t.x2,t.y2)),o.stroke(),o.restore()),d.display){o.save(),o.translate(t.labelX,t.labelY),o.rotate(t.rotation),o.font=t.major?x.font:y.font,o.fillStyle=t.major?b:v,o.textBaseline=t.textBaseline,o.textAlign=t.textAlign;var e=t.label;if(s.isArray(e))for(var n=0,i=0;n<e.length;++n)o.fillText(\"\"+e[n],0,i),i+=1.5*y.size;else o.fillText(e,0,0);o.restore()}}),f.display){var I,O,F=0,R=l(f)/2;if(m)I=e.left+(e.right-e.left)/2,O=\"bottom\"===i.position?e.bottom-R-M.bottom:e.top+R+M.top;else{var L=\"left\"===i.position;I=L?e.left+R+M.top:e.right-R-M.top,O=e.top+(e.bottom-e.top)/2,F=L?-.5*Math.PI:.5*Math.PI}o.save(),o.translate(I,O),o.rotate(F),o.textAlign=\"center\",o.textBaseline=\"middle\",o.fillStyle=k,o.font=w.font,o.fillText(f.labelString,0,0),o.restore()}if(h.drawBorder){o.lineWidth=s.valueAtIndexOrDefault(h.lineWidth,0),o.strokeStyle=s.valueAtIndexOrDefault(h.color,0);var W=e.left,Y=e.right,N=e.top,z=e.bottom,B=s.aliasPixel(o.lineWidth);m?(N=z=\"top\"===i.position?e.bottom:e.top,N+=B,z+=B):(W=Y=\"left\"===i.position?e.right:e.left,W+=B,Y+=B),o.beginPath(),o.moveTo(W,N),o.lineTo(Y,z),o.stroke()}}}})}},{25:25,26:26,34:34,45:45}],33:[function(t,e,n){\"use strict\";var i=t(25),a=t(45);e.exports=function(t){t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=a.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?a.merge({},[i.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){var n=this;n.defaults.hasOwnProperty(t)&&(n.defaults[t]=a.extend(n.defaults[t],e))},addScalesToLayout:function(e){a.each(e.scales,function(n){n.fullWidth=n.options.fullWidth,n.position=n.options.position,n.weight=n.options.weight,t.layoutService.addBox(e,n)})}}}},{25:25,45:45}],34:[function(t,e,n){\"use strict\";var i=t(45);e.exports={generators:{linear:function(t,e){var n,a=[];if(t.stepSize&&t.stepSize>0)n=t.stepSize;else{var r=i.niceNum(e.max-e.min,!1);n=i.niceNum(r/(t.maxTicks-1),!0)}var o=Math.floor(e.min/n)*n,s=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(o=t.min,s=t.max);var l=(s-o)/n;l=i.almostEquals(l,Math.round(l),n/1e3)?Math.round(l):Math.ceil(l),a.push(void 0!==t.min?t.min:o);for(var u=1;u<l;++u)a.push(o+u*n);return a.push(void 0!==t.max?t.max:s),a},logarithmic:function(t,e){var n,a,r=[],o=i.valueOrDefault,s=o(t.min,Math.pow(10,Math.floor(i.log10(e.min)))),l=Math.floor(i.log10(e.max)),u=Math.ceil(e.max/Math.pow(10,l));0===s?(n=Math.floor(i.log10(e.minNotZero)),a=Math.floor(e.minNotZero/Math.pow(10,n)),r.push(s),s=a*Math.pow(10,n)):(n=Math.floor(i.log10(s)),a=Math.floor(s/Math.pow(10,n)));do{r.push(s),10===++a&&(a=1,++n),s=a*Math.pow(10,n)}while(n<l||n===l&&a<u);var d=o(t.max,s);return r.push(d),r}},formatters:{values:function(t){return i.isArray(t)?t:\"\"+t},linear:function(t,e,n){var a=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var r=i.log10(Math.abs(a)),o=\"\";if(0!==t){var s=-1*Math.floor(r);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o=\"0\";return o},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?\"0\":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():\"\"}}}},{45:45}],35:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{tooltips:{enabled:!0,custom:null,mode:\"nearest\",position:\"average\",intersect:!0,backgroundColor:\"rgba(0,0,0,0.8)\",titleFontStyle:\"bold\",titleSpacing:2,titleMarginBottom:6,titleFontColor:\"#fff\",titleAlign:\"left\",bodySpacing:2,bodyFontColor:\"#fff\",bodyAlign:\"left\",footerFontStyle:\"bold\",footerSpacing:2,footerMarginTop:6,footerFontColor:\"#fff\",footerAlign:\"left\",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:\"#fff\",displayColors:!0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,callbacks:{beforeTitle:r.noop,title:function(t,e){var n=\"\",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:r.noop,beforeBody:r.noop,beforeLabel:r.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||\"\";return n&&(n+=\": \"),n+=t.yLabel},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:r.noop,afterBody:r.noop,beforeFooter:r.noop,footer:r.noop,afterFooter:r.noop}}}),e.exports=function(t){function e(t,e){var n=r.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(r.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function o(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):\"\",yLabel:n?n.getLabelForIndex(i,a):\"\",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function s(t){var e=i.global,n=r.valueOrDefault;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:n(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:n(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:n(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:n(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:n(t.titleFontStyle,e.defaultFontStyle),titleFontSize:n(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:n(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:n(t.footerFontStyle,e.defaultFontStyle),footerFontSize:n(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function l(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,o=e.body,s=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);s+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=l*d,i+=l?(l-1)*e.titleSpacing:0,i+=l?e.titleMarginBottom:0,i+=s*c,i+=s?(s-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=r.fontString(d,e._titleFontStyle,e._titleFontFamily),r.each(e.title,g),n.font=r.fontString(c,e._bodyFontStyle,e._bodyFontFamily),r.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,r.each(o,function(t){r.each(t.before,g),r.each(t.lines,g),r.each(t.after,g)}),f=0,n.font=r.fontString(h,e._footerFontStyle,e._footerFontFamily),r.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function u(t,e){var n=t._model,i=t._chart,a=t._chart.chartArea,r=\"center\",o=\"center\";n.y<e.height?o=\"top\":n.y>i.height-e.height&&(o=\"bottom\");var s,l,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;\"center\"===o?(s=function(t){return t<=h},l=function(t){return t>h}):(s=function(t){return t<=e.width/2},l=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?\"top\":\"bottom\"},s(n.x)?(r=\"left\",u(n.x)&&(r=\"center\",o=c(n.y))):l(n.x)&&(r=\"right\",d(n.x)&&(r=\"center\",o=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:r,yAlign:g.yAlign?g.yAlign:o}}function d(t,e,n){var i=t.x,a=t.y,r=t.caretSize,o=t.caretPadding,s=t.cornerRadius,l=n.xAlign,u=n.yAlign,d=r+o,c=s+o;return\"right\"===l?i-=e.width:\"center\"===l&&(i-=e.width/2),\"top\"===u?a+=d:a-=\"bottom\"===u?e.height+d:e.height/2,\"center\"===u?\"left\"===l?i+=d:\"right\"===l&&(i-=d):\"left\"===l?i-=c:\"right\"===l&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=s(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),r=e.afterTitle.apply(t,arguments),o=[];return o=n(o,i),o=n(o,a),o=n(o,r)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,o=[];return r.each(t,function(t){var r={before:[],lines:[],after:[]};n(r.before,a.beforeLabel.call(i,t,e)),n(r.lines,a.label.call(i,t,e)),n(r.after,a.afterLabel.call(i,t,e)),o.push(r)}),o},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),r=e.afterFooter.apply(t,arguments),o=[];return o=n(o,i),o=n(o,a),o=n(o,r)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=s(c),g=a._active,m=a._data,p={xAlign:h.xAlign,yAlign:h.yAlign},v={x:h.x,y:h.y},y={width:h.width,height:h.height},b={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var x=[],_=[];b=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var k=[];for(n=0,i=g.length;n<i;++n)k.push(o(g[n]));c.filter&&(k=k.filter(function(t){return c.filter(t,m)})),c.itemSort&&(k=k.sort(function(t,e){return c.itemSort(t,e,m)})),r.each(k,function(t){x.push(c.callbacks.labelColor.call(a,t,a._chart)),_.push(c.callbacks.labelTextColor.call(a,t,a._chart))}),f.title=a.getTitle(k,m),f.beforeBody=a.getBeforeBody(k,m),f.body=a.getBody(k,m),f.afterBody=a.getAfterBody(k,m),f.footer=a.getFooter(k,m),f.x=Math.round(b.x),f.y=Math.round(b.y),f.caretPadding=c.caretPadding,f.labelColors=x,f.labelTextColors=_,f.dataPoints=k,v=d(f,y=l(this,f),p=u(this,y))}else f.opacity=0;return f.xAlign=p.xAlign,f.yAlign=p.yAlign,f.x=v.x,f.y=v.y,f.width=y.width,f.height=y.height,f.caretX=b.x,f.caretY=b.y,a._model=f,e&&c.custom&&c.custom.call(a,f),a},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,c=n.xAlign,h=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if(\"center\"===h)s=g+p/2,\"left\"===c?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if(\"left\"===c?(i=(a=f+d+u)-u,r=a+u):\"right\"===c?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=f+m/2)-u,r=a+u),\"top\"===h)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,n,i,a){var o=n.title;if(o.length){i.textAlign=n._titleAlign,i.textBaseline=\"top\";var s=n.titleFontSize,l=n.titleSpacing;i.fillStyle=e(n.titleFontColor,a),i.font=r.fontString(s,n._titleFontStyle,n._titleFontFamily);var u,d;for(u=0,d=o.length;u<d;++u)i.fillText(o[u],t.x,t.y),t.y+=s+l,u+1===o.length&&(t.y+=n.titleMarginBottom-l)}},drawBody:function(t,n,i,a){var o=n.bodyFontSize,s=n.bodySpacing,l=n.body;i.textAlign=n._bodyAlign,i.textBaseline=\"top\",i.font=r.fontString(o,n._bodyFontStyle,n._bodyFontFamily);var u=0,d=function(e){i.fillText(e,t.x+u,t.y),t.y+=o+s};i.fillStyle=e(n.bodyFontColor,a),r.each(n.beforeBody,d);var c=n.displayColors;u=c?o+2:0,r.each(l,function(s,l){var u=e(n.labelTextColors[l],a);i.fillStyle=u,r.each(s.before,d),r.each(s.lines,function(r){c&&(i.fillStyle=e(n.legendColorBackground,a),i.fillRect(t.x,t.y,o,o),i.lineWidth=1,i.strokeStyle=e(n.labelColors[l].borderColor,a),i.strokeRect(t.x,t.y,o,o),i.fillStyle=e(n.labelColors[l].backgroundColor,a),i.fillRect(t.x+1,t.y+1,o-2,o-2),i.fillStyle=u),d(r)}),r.each(s.after,d)}),u=0,r.each(n.afterBody,d),t.y-=s},drawFooter:function(t,n,i,a){var o=n.footer;o.length&&(t.y+=n.footerMarginTop,i.textAlign=n._footerAlign,i.textBaseline=\"top\",i.fillStyle=e(n.footerFontColor,a),i.font=r.fontString(n.footerFontSize,n._footerFontStyle,n._footerFontFamily),r.each(o,function(e){i.fillText(e,t.x,t.y),t.y+=n.footerFontSize+n.footerSpacing}))},drawBackground:function(t,n,i,a,r){i.fillStyle=e(n.backgroundColor,r),i.strokeStyle=e(n.borderColor,r),i.lineWidth=n.borderWidth;var o=n.xAlign,s=n.yAlign,l=t.x,u=t.y,d=a.width,c=a.height,h=n.cornerRadius;i.beginPath(),i.moveTo(l+h,u),\"top\"===s&&this.drawCaret(t,a),i.lineTo(l+d-h,u),i.quadraticCurveTo(l+d,u,l+d,u+h),\"center\"===s&&\"right\"===o&&this.drawCaret(t,a),i.lineTo(l+d,u+c-h),i.quadraticCurveTo(l+d,u+c,l+d-h,u+c),\"bottom\"===s&&this.drawCaret(t,a),i.lineTo(l+h,u+c),i.quadraticCurveTo(l,u+c,l,u+c-h),\"center\"===s&&\"left\"===o&&this.drawCaret(t,a),i.lineTo(l,u+h),i.quadraticCurveTo(l,u,l+h,u),i.closePath(),i.fill(),n.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],\"mouseout\"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!r.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:Math.round(i/r),y:Math.round(a/r)}},nearest:function(t,e){var n,i,a,o=e.x,s=e.y,l=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var u=t[n];if(u&&u.hasValue()){var d=u.getCenterPoint(),c=r.distanceBetweenPoints(e,d);c<l&&(l=c,a=u)}}if(a){var h=a.tooltipPosition();o=h.x,s=h.y}return{x:o,y:s}}}}},{25:25,26:26,45:45}],36:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{elements:{arc:{backgroundColor:i.global.defaultColor,borderColor:\"#fff\",borderWidth:2}}}),e.exports=a.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=r.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,o=i.distance,s=n.startAngle,l=n.endAngle;l<s;)l+=2*Math.PI;for(;a>l;)a-=2*Math.PI;for(;a<s;)a+=2*Math.PI;var u=a>=s&&a<=l,d=o>=n.innerRadius&&o<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin=\"bevel\",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45),o=i.global;i._set(\"global\",{elements:{line:{tension:.4,backgroundColor:o.defaultColor,borderWidth:3,borderColor:o.defaultColor,borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,s=a._view,l=a._chart.ctx,u=s.spanGaps,d=a._children.slice(),c=o.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),l.save(),l.lineCap=s.borderCapStyle||c.borderCapStyle,l.setLineDash&&l.setLineDash(s.borderDash||c.borderDash),l.lineDashOffset=s.borderDashOffset||c.borderDashOffset,l.lineJoin=s.borderJoinStyle||c.borderJoinStyle,l.lineWidth=s.borderWidth||c.borderWidth,l.strokeStyle=s.borderColor||o.defaultColor,l.beginPath(),h=-1,t=0;t<d.length;++t)e=d[t],n=r.previousItem(d,t),i=e._view,0===t?i.skip||(l.moveTo(i.x,i.y),h=t):(n=-1===h?n:d[h],i.skip||(h!==t-1&&!u||-1===h?l.moveTo(i.x,i.y):r.canvas.lineTo(l,n._view,e._view),h=t));l.stroke(),l.restore()}})},{25:25,26:26,45:45}],38:[function(t,e,n){\"use strict\";function i(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2)}var a=t(25),r=t(26),o=t(45),s=a.global.defaultColor;a._set(\"global\",{elements:{point:{radius:3,pointStyle:\"circle\",backgroundColor:s,borderColor:s,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}}),e.exports=r.extend({inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:i,inXRange:i,inYRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.y,2)<Math.pow(e.radius+e.hitRadius,2)},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._model,i=this._chart.ctx,r=e.pointStyle,l=e.radius,u=e.x,d=e.y,c=o.color,h=0;e.skip||(i.strokeStyle=e.borderColor||s,i.lineWidth=o.valueOrDefault(e.borderWidth,a.global.elements.point.borderWidth),i.fillStyle=e.backgroundColor||s,void 0!==t&&(n.x<t.left||1.01*t.right<n.x||n.y<t.top||1.01*t.bottom<n.y)&&(n.x<t.left?h=(u-n.x)/(t.left-n.x):1.01*t.right<n.x?h=(n.x-u)/(n.x-t.right):n.y<t.top?h=(d-n.y)/(t.top-n.y):1.01*t.bottom<n.y&&(h=(n.y-d)/(n.y-t.bottom)),h=Math.round(100*h)/100,i.strokeStyle=c(i.strokeStyle).alpha(h).rgbString(),i.fillStyle=c(i.fillStyle).alpha(h).rgbString()),o.canvas.drawPoint(i,r,l,u,d))}})},{25:25,26:26,45:45}],39:[function(t,e,n){\"use strict\";function i(t){return void 0!==t._view.width}function a(t){var e,n,a,r,o=t._view;if(i(t)){var s=o.width/2;e=o.x-s,n=o.x+s,a=Math.min(o.y,o.base),r=Math.max(o.y,o.base)}else{var l=o.height/2;e=Math.min(o.x,o.base),n=Math.max(o.x,o.base),a=o.y-l,r=o.y+l}return{left:e,top:a,right:n,bottom:r}}var r=t(25),o=t(26);r._set(\"global\",{elements:{rectangle:{backgroundColor:r.global.defaultColor,borderColor:r.global.defaultColor,borderSkipped:\"bottom\",borderWidth:0}}}),e.exports=o.extend({draw:function(){function t(t){return v[(y+t)%4]}var e,n,i,a,r,o,s,l=this._chart.ctx,u=this._view,d=u.borderWidth;if(u.horizontal?(e=u.base,n=u.x,i=u.y-u.height/2,a=u.y+u.height/2,r=n>e?1:-1,o=1,s=u.borderSkipped||\"left\"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,r=1,o=(a=u.base)>i?1:-1,s=u.borderSkipped||\"bottom\"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+(\"left\"!==s?h*r:0),g=n+(\"right\"!==s?-h*r:0),m=i+(\"top\"!==s?h*o:0),p=a+(\"bottom\"!==s?-h*o:0);f!==g&&(i=m,a=p),m!==p&&(e=f,n=g)}l.beginPath(),l.fillStyle=u.backgroundColor,l.strokeStyle=u.borderColor,l.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],y=[\"bottom\",\"left\",\"top\",\"right\"].indexOf(s,0);-1===y&&(y=0);var b=t(0);l.moveTo(b[0],b[1]);for(var x=1;x<4;x++)b=t(x),l.lineTo(b[0],b[1]);l.fill(),d&&l.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var r=a(n);return i(n)?t>=r.left&&t<=r.right:e>=r.top&&e<=r.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){\"use strict\";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){\"use strict\";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,i/2),s=Math.min(r,a/2);t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.quadraticCurveTo(e+i,n,e+i,n+s),t.lineTo(e+i,n+a-s),t.quadraticCurveTo(e+i,n+a,e+i-o,n+a),t.lineTo(e+o,n+a),t.quadraticCurveTo(e,n+a,e,n+a-s),t.lineTo(e,n+s),t.quadraticCurveTo(e,n,e+o,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var r,o,s,l,u,d;if(!e||\"object\"!=typeof e||\"[object HTMLImageElement]\"!==(r=e.toString())&&\"[object HTMLCanvasElement]\"!==r){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case\"triangle\":t.beginPath(),u=(o=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-o/2,a+u/3),t.lineTo(i+o/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case\"rect\":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case\"rectRounded\":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case\"rectRot\":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case\"cross\":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case\"crossRot\":t.beginPath(),s=Math.cos(Math.PI/4)*n,l=Math.sin(Math.PI/4)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i-s,a+l),t.lineTo(i+s,a-l),t.closePath();break;case\"star\":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),s=Math.cos(Math.PI/4)*n,l=Math.sin(Math.PI/4)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i-s,a+l),t.lineTo(i+s,a-l),t.closePath();break;case\"line\":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case\"dash\":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return\"after\"===n.steppedLine&&!i||\"after\"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){\"use strict\";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return\"[object Array]\"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&\"[object Object]\"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&\"function\"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var r,o,s;if(i.isArray(t))if(o=t.length,a)for(r=o-1;r>=0;r--)e.call(n,t[r],r);else for(r=0;r<o;r++)e.call(n,t[r],r);else if(i.isObject(t))for(o=(s=Object.keys(t)).length,r=0;r<o;r++)e.call(n,t[s[r]],s[r])},arrayEquals:function(t,e){var n,a,r,o;if(!t||!e||t.length!==e.length)return!1;for(n=0,a=t.length;n<a;++n)if(r=t[n],o=e[n],r instanceof Array&&o instanceof Array){if(!i.arrayEquals(r,o))return!1}else if(r!==o)return!1;return!0},clone:function(t){if(i.isArray(t))return t.map(i.clone);if(i.isObject(t)){for(var e={},n=Object.keys(t),a=n.length,r=0;r<a;++r)e[n[r]]=i.clone(t[n[r]]);return e}return t},_merger:function(t,e,n,a){var r=e[t],o=n[t];i.isObject(r)&&i.isObject(o)?i.merge(r,o,a):e[t]=i.clone(o)},_mergerIf:function(t,e,n){var a=e[t],r=n[t];i.isObject(a)&&i.isObject(r)?i.mergeIf(a,r):e.hasOwnProperty(t)||(e[t]=i.clone(r))},merge:function(t,e,n){var a,r,o,s,l,u=i.isArray(e)?e:[e],d=u.length;if(!i.isObject(t))return t;for(a=(n=n||{}).merger||i._merger,r=0;r<d;++r)if(e=u[r],i.isObject(e))for(l=0,s=(o=Object.keys(e)).length;l<s;++l)a(o[l],t,e,n);return t},mergeIf:function(t,e){return i.merge(t,e,{merger:i._mergerIf})},extend:function(t){for(var e=1,n=arguments.length;e<n;++e)i.each(arguments[e],function(e,n){t[n]=e});return t},inherits:function(t){var e=this,n=t&&t.hasOwnProperty(\"constructor\")?t.constructor:function(){return e.apply(this,arguments)},a=function(){this.constructor=n};return a.prototype=e.prototype,n.prototype=new a,n.extend=i.inherits,t&&i.extend(n.prototype,t),n.__super__=e.prototype,n}};e.exports=i,i.callCallback=i.callback,i.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},i.getValueOrDefault=i.valueOrDefault,i.getValueAtIndexOrDefault=i.valueAtIndexOrDefault},{}],43:[function(t,e,n){\"use strict\";var i=t(42),a={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){\"use strict\";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(\"\"+t).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);if(!n||\"normal\"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case\"px\":return t;case\"%\":t/=100}return e*t},toPadding:function(t){var e,n,a,r;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,r=+t.left||0):e=n=a=r=+t||0,{top:e,right:n,bottom:a,left:r,height:e+a,width:r+n}},resolve:function(t,e,n){var a,r,o;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&\"function\"==typeof o&&(o=o(e)),void 0!==n&&i.isArray(o)&&(o=o[n]),void 0!==o))return o}}},{42:42}],45:[function(t,e,n){\"use strict\";e.exports=t(42),e.exports.easing=t(43),e.exports.canvas=t(41),e.exports.options=t(44)},{41:41,42:42,43:43,44:44}],46:[function(t,e,n){e.exports={acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext(\"2d\")||null}}},{}],47:[function(t,e,n){\"use strict\";function i(t,e){var n=p.getStyle(t,e),i=n&&n.match(/^(\\d+)(\\.\\d+)?px$/);return i?Number(i[1]):void 0}function a(t,e){var n=t.style,a=t.getAttribute(\"height\"),r=t.getAttribute(\"width\");if(t[v]={initial:{height:a,width:r,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||\"block\",null===r||\"\"===r){var o=i(t,\"width\");void 0!==o&&(t.width=o)}if(null===a||\"\"===a)if(\"\"===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var s=i(t,\"height\");void 0!==o&&(t.height=s)}return t}function r(t,e,n){t.addEventListener(e,n,w)}function o(t,e,n){t.removeEventListener(e,n,w)}function s(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function l(t,e){var n=k[t.type]||t.type,i=p.getRelativePosition(t,e);return s(n,e,i.x,i.y,t)}function u(t,e){var n=!1,i=[];return function(){i=Array.prototype.slice.call(arguments),e=e||this,n||(n=!0,p.requestAnimFrame.call(window,function(){n=!1,t.apply(e,i)}))}}function d(t){var e=document.createElement(\"div\"),n=y+\"size-monitor\",i=\"position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;\";e.style.cssText=i,e.className=n,e.innerHTML='<div class=\"'+n+'-expand\" style=\"'+i+'\"><div style=\"position:absolute;width:1000000px;height:1000000px;left:0;top:0\"></div></div><div class=\"'+n+'-shrink\" style=\"'+i+'\"><div style=\"position:absolute;width:200%;height:200%;left:0; top:0\"></div></div>';var a=e.childNodes[0],o=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,o.scrollLeft=1e6,o.scrollTop=1e6};var s=function(){e._reset(),t()};return r(a,\"scroll\",s.bind(a,\"expand\")),r(o,\"scroll\",s.bind(o,\"shrink\")),e}function c(t,e){var n=t[v]||(t[v]={}),i=n.renderProxy=function(t){t.animationName===x&&e()};p.each(_,function(e){r(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(b)}function h(t){var e=t[v]||{},n=e.renderProxy;n&&(p.each(_,function(e){o(t,e,n)}),delete e.renderProxy),t.classList.remove(b)}function f(t,e,n){var i=t[v]||(t[v]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(s(\"resize\",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[v]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function m(t,e){var n=t._style||document.createElement(\"style\");t._style||(t._style=n,e=\"/* Chart.js */\\n\"+e,n.setAttribute(\"type\",\"text/css\"),document.getElementsByTagName(\"head\")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var p=t(45),v=\"$chartjs\",y=\"chartjs-\",b=y+\"render-monitor\",x=y+\"render-animation\",_=[\"animationstart\",\"webkitAnimationStart\"],k={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"},w=!!function(){var t=!1;try{var e=Object.defineProperty({},\"passive\",{get:function(){t=!0}});window.addEventListener(\"e\",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:\"undefined\"!=typeof window&&\"undefined\"!=typeof document,initialize:function(){var t=\"from{opacity:0.99}to{opacity:1}\";m(this,\"@-webkit-keyframes \"+x+\"{\"+t+\"}@keyframes \"+x+\"{\"+t+\"}.\"+b+\"{-webkit-animation:\"+x+\" 0.001s;animation:\"+x+\" 0.001s;}\")},acquireContext:function(t,e){\"string\"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext(\"2d\");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[v]){var n=e[v].initial;[\"height\",\"width\"].forEach(function(t){var i=n[t];p.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),p.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[v]}},addEventListener:function(t,e,n){var i=t.canvas;if(\"resize\"!==e){var a=n[v]||(n[v]={});r(i,e,(a.proxies||(a.proxies={}))[t.id+\"_\"+e]=function(e){n(l(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if(\"resize\"!==e){var a=((n[v]||{}).proxies||{})[t.id+\"_\"+e];a&&o(i,e,a)}else g(i)}},p.addEvent=r,p.removeEvent=o},{45:45}],48:[function(t,e,n){\"use strict\";var i=t(45),a=t(46),r=t(47),o=r._enabled?r:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},o)},{45:45,46:46,47:47}],49:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"global\",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return\"origin\";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return\"-\"!==r[0]&&\"+\"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case\"bottom\":return\"start\";case\"top\":return\"end\";case\"zero\":return\"origin\";case\"origin\":case\"start\":case\"end\":return r;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if(\"start\"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:\"end\"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePosition?r=i.getBasePosition():i.getBasePixel&&(r=i.getBasePixel()),void 0!==r&&null!==r){if(void 0!==r.x&&void 0!==r.y)return r;if(\"number\"==typeof r&&isFinite(r))return e=i.isHorizontal(),{x:e?r:null,y:e?null:r}}return null}function n(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function o(t){var e=t.fill,n=\"dataset\";return!1===e?null:(isFinite(e)||(n=\"boundary\"),d[n](t))}function s(t){return t&&!t.skip}function l(t,e,n,i,a){var o;if(i&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<i;++o)r.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(n[a-1].x,n[a-1].y),o=a-1;o>0;--o)r.canvas.lineTo(t,n[o],n[o-1],!0)}}function u(t,e,n,i,a,r){var o,u,d,c,h,f,g,m=e.length,p=i.spanGaps,v=[],y=[],b=0,x=0;for(t.beginPath(),o=0,u=m+!!r;o<u;++o)h=n(c=e[d=o%m]._view,d,i),f=s(c),g=s(h),f&&g?(b=v.push(c),x=y.push(h)):b&&x&&(p?(f&&v.push(c),g&&y.push(h)):(l(t,v,y,b,x),b=x=0,v=[],y=[]));l(t,v,y,b,x),t.closePath(),t.fillStyle=a,t.fill()}var d={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};return{id:\"filler\",afterDatasetsUpdate:function(i,r){var s,l,u,d,c=(i.data.datasets||[]).length,h=r.propagate,f=[];for(l=0;l<c;++l)d=null,(u=(s=i.getDatasetMeta(l)).dataset)&&u._model&&u instanceof a.Line&&(d={visible:i.isDatasetVisible(l),fill:t(u,l,c),chart:i,el:u}),s.$filler=d,f.push(d);for(l=0;l<c;++l)(d=f[l])&&(d.fill=n(f,l,h),d.boundary=e(d),d.mapper=o(d))},beforeDatasetDraw:function(t,e){var n=e.meta.$filler;if(n){var a=t.ctx,o=n.el,s=o._view,l=o._children||[],d=n.mapper,c=s.backgroundColor||i.global.defaultColor;d&&c&&l.length&&(r.canvas.clipArea(a,t.chartArea),u(a,l,d,s,c,o._loop),r.canvas.unclipArea(a))}}}}},{25:25,40:40,45:45}],50:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{legend:{display:!0,position:\"top\",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return r.isArray(e.datasets)?e.datasets.map(function(e,n){return{text:e.label,fillStyle:r.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(n),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:n}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');for(var n=0;n<t.data.datasets.length;n++)e.push('<li><span style=\"background-color:'+t.data.datasets[n].backgroundColor+'\"></span>'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});o.configure(e,i,n),o.addBox(e,i),e.legend=i}var o=t.layoutService,s=r.noop;return t.Legend=a.extend({initialize:function(t){r.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:s,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:function(){var t=this,e=t.options.labels||{},n=r.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:s,beforeFit:s,fit:function(){var t=this,n=t.options,a=n.labels,o=n.display,s=t.ctx,l=i.global,u=r.valueOrDefault,d=u(a.fontSize,l.defaultFontSize),c=u(a.fontStyle,l.defaultFontStyle),h=u(a.fontFamily,l.defaultFontFamily),f=r.fontString(d,c,h),g=t.legendHitBoxes=[],m=t.minSize,p=t.isHorizontal();if(p?(m.width=t.maxWidth,m.height=o?10:0):(m.width=o?10:0,m.height=t.maxHeight),o)if(s.font=f,p){var v=t.lineWidths=[0],y=t.legendItems.length?d+a.padding:0;s.textAlign=\"left\",s.textBaseline=\"top\",r.each(t.legendItems,function(n,i){var r=e(a,d)+d/2+s.measureText(n.text).width;v[v.length-1]+r+a.padding>=t.width&&(y+=d+a.padding,v[v.length]=t.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+a.padding}),m.height+=y}else{var b=a.padding,x=t.columnWidths=[],_=a.padding,k=0,w=0,M=d+b;r.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+s.measureText(t.text).width;w+M>m.height&&(_+=k+a.padding,x.push(k),k=0,w=0),k=Math.max(k,i),w+=M,g[n]={left:0,top:0,width:i,height:d}}),_+=k,x.push(k),m.width+=_}t.width=m.width,t.height=m.height},afterFit:s,isHorizontal:function(){return\"top\"===this.options.position||\"bottom\"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,o=i.global,s=o.elements.line,l=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=r.valueOrDefault,f=h(a.fontColor,o.defaultFontColor),g=h(a.fontSize,o.defaultFontSize),m=h(a.fontStyle,o.defaultFontStyle),p=h(a.fontFamily,o.defaultFontFamily),v=r.fontString(g,m,p);c.textAlign=\"left\",c.textBaseline=\"middle\",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var y=e(a,g),b=t.legendHitBoxes,x=function(t,e,i){if(!(isNaN(y)||y<=0)){c.save(),c.fillStyle=h(i.fillStyle,o.defaultColor),c.lineCap=h(i.lineCap,s.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,s.borderDashOffset),c.lineJoin=h(i.lineJoin,s.borderJoinStyle),c.lineWidth=h(i.lineWidth,s.borderWidth),c.strokeStyle=h(i.strokeStyle,o.defaultColor);var a=0===h(i.lineWidth,s.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,s.borderDash)),n.labels&&n.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=t+u,f=e+u;r.canvas.drawPoint(c,i.pointStyle,l,d,f)}else a||c.strokeRect(t,e,y,g),c.fillRect(t,e,y,g);c.restore()}},_=function(t,e,n,i){var a=g/2,r=y+a+t,o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(r+i,o),c.stroke())},k=t.isHorizontal();d=k?{x:t.left+(l-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var w=g+a.padding;r.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,r=y+g/2+i,o=d.x,s=d.y;k?o+r>=l&&(s=d.y+=w,d.line++,o=d.x=t.left+(l-u[d.line])/2):s+w>t.bottom&&(o=d.x=o+t.columnWidths[d.line]+a.padding,s=d.y=t.top+a.padding,d.line++),x(o,s,e),b[n].left=o,b[n].top=s,_(o,s,e,i),k?d.x+=r+a.padding:d.y+=w})}},handleEvent:function(t){var e=this,n=e.options,i=\"mouseup\"===t.type?\"click\":t.type,a=!1;if(\"mousemove\"===i){if(!n.onHover)return}else{if(\"click\"!==i)return;if(!n.onClick)return}var r=t.x,o=t.y;if(r>=e.left&&r<=e.right&&o>=e.top&&o<=e.bottom)for(var s=e.legendHitBoxes,l=0;l<s.length;++l){var u=s[l];if(r>=u.left&&r<=u.left+u.width&&o>=u.top&&o<=u.top+u.height){if(\"click\"===i){n.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if(\"mousemove\"===i){n.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}}),{id:\"legend\",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(r.mergeIf(e,i.global.legend),a?(o.configure(t,a,e),a.options=e):n(t,e)):a&&(o.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{title:{display:!1,fontStyle:\"bold\",fullWidth:!0,lineHeight:1.2,padding:10,position:\"top\",text:\"\",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,o=r.noop;return t.Title=a.extend({initialize:function(t){var e=this;r.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:o,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:o,beforeSetDimensions:o,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:o,beforeBuildLabels:o,buildLabels:o,afterBuildLabels:o,beforeFit:o,fit:function(){var t=this,e=r.valueOrDefault,n=t.options,a=n.display,o=e(n.fontSize,i.global.defaultFontSize),s=t.minSize,l=r.isArray(n.text)?n.text.length:1,u=r.options.toLineHeight(n.lineHeight,o),d=a?l*u+2*n.padding:0;t.isHorizontal()?(s.width=t.maxWidth,s.height=d):(s.width=d,s.height=t.maxHeight),t.width=s.width,t.height=s.height},afterFit:o,isHorizontal:function(){var t=this.options.position;return\"top\"===t||\"bottom\"===t},draw:function(){var t=this,e=t.ctx,n=r.valueOrDefault,a=t.options,o=i.global;if(a.display){var s,l,u,d=n(a.fontSize,o.defaultFontSize),c=n(a.fontStyle,o.defaultFontStyle),h=n(a.fontFamily,o.defaultFontFamily),f=r.fontString(d,c,h),g=r.options.toLineHeight(a.lineHeight,d),m=g/2+a.padding,p=0,v=t.top,y=t.left,b=t.bottom,x=t.right;e.fillStyle=n(a.fontColor,o.defaultFontColor),e.font=f,t.isHorizontal()?(l=y+(x-y)/2,u=v+m,s=x-y):(l=\"left\"===a.position?y+m:x-m,u=v+(b-v)/2,s=b-v,p=Math.PI*(\"left\"===a.position?-.5:.5)),e.save(),e.translate(l,u),e.rotate(p),e.textAlign=\"center\",e.textBaseline=\"middle\";var _=a.text;if(r.isArray(_))for(var k=0,w=0;w<_.length;++w)e.fillText(_[w],0,k,s),k+=g;else e.fillText(_,0,0,s);e.restore()}}}),{id:\"title\",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var o=a.options.title,s=a.titleBlock;o?(r.mergeIf(o,i.global.title),s?(n.configure(a,s,o),s.options=o):e(a,o)):s&&(t.layoutService.removeBox(a,s),delete a.titleBlock)}}}},{25:25,26:26,45:45}],52:[function(t,e,n){\"use strict\";e.exports=function(t){var e=t.Scale.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,e=t.getLabels();t.minIndex=0,t.maxIndex=e.length-1;var n;void 0!==t.options.ticks.min&&(n=e.indexOf(t.options.ticks.min),t.minIndex=-1!==n?n:t.minIndex),void 0!==t.options.ticks.max&&(n=e.indexOf(t.options.ticks.max),t.maxIndex=-1!==n?n:t.maxIndex),t.min=e[t.minIndex],t.max=e[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e){var n,i=this,a=i.options.offset,r=Math.max(i.maxIndex+1-i.minIndex-(a?0:1),1);if(void 0!==t&&null!==t&&(n=i.isHorizontal()?t.x:t.y),void 0!==n||void 0!==t&&isNaN(e)){var o=i.getLabels();t=n||t;var s=o.indexOf(t);e=-1!==s?s:e}if(i.isHorizontal()){var l=i.width/r,u=l*(e-i.minIndex);return a&&(u+=l/2),i.left+Math.round(u)}var d=i.height/r,c=d*(e-i.minIndex);return a&&(c+=d/2),i.top+Math.round(c)},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,n=e.options.offset,i=Math.max(e._ticks.length-(n?0:1),1),a=e.isHorizontal(),r=(a?e.width:e.height)/i;return t-=a?e.left:e.top,n&&(t-=r/2),(t<=0?0:Math.round(t/r))+e.minIndex},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType(\"category\",e,{position:\"bottom\"})}},{}],53:[function(t,e,n){\"use strict\";var i=t(25),a=t(45),r=t(34);e.exports=function(t){var e={position:\"left\",ticks:{callback:r.formatters.linear}},n=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return o?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,i=e.chart,r=i.data.datasets,o=e.isHorizontal();e.min=null,e.max=null;var s=n.stacked;if(void 0===s&&a.each(r,function(e,n){if(!s){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&t(a)&&void 0!==a.stack&&(s=!0)}}),n.stacked||s){var l={};a.each(r,function(r,o){var s=i.getDatasetMeta(o),u=[s.type,void 0===n.stacked&&void 0===s.stack?o:\"\",s.stack].join(\".\");void 0===l[u]&&(l[u]={positiveValues:[],negativeValues:[]});var d=l[u].positiveValues,c=l[u].negativeValues;i.isDatasetVisible(o)&&t(s)&&a.each(r.data,function(t,i){var a=+e.getRightValue(t);isNaN(a)||s.data[i].hidden||(d[i]=d[i]||0,c[i]=c[i]||0,n.relativePoints?d[i]=100:a<0?c[i]+=a:d[i]+=a)})}),a.each(l,function(t){var n=t.positiveValues.concat(t.negativeValues),i=a.min(n),r=a.max(n);e.min=null===e.min?i:Math.min(e.min,i),e.max=null===e.max?r:Math.max(e.max,r)})}else a.each(r,function(n,r){var o=i.getDatasetMeta(r);i.isDatasetVisible(r)&&t(o)&&a.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||o.data[n].hidden||(null===e.min?e.min=i:i<e.min&&(e.min=i),null===e.max?e.max=i:i>e.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var r=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*r)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),r=n.end-i;return n.isHorizontal()?(e=n.left+n.width/r*(a-i),Math.round(e)):(e=n.bottom-n.height/r*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType(\"linear\",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){\"use strict\";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return\"string\"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var r=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),r!==o&&t.min>=t.max&&(r?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),r={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},o=t.ticks=a.generators.linear(r,t);t.handleDirectionalChanges(),t.max=i.max(o),t.min=i.min(o),e.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){\"use strict\";var i=t(45),a=t(34);e.exports=function(t){var e={position:\"left\",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,r=e.chart,o=r.data.datasets,s=i.valueOrDefault,l=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(o,function(e,n){if(!u){var i=r.getDatasetMeta(n);r.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(o,function(a,o){var s=r.getDatasetMeta(o),l=[s.type,void 0===n.stacked&&void 0===s.stack?o:\"\",s.stack].join(\".\");r.isDatasetVisible(o)&&t(s)&&(void 0===d[l]&&(d[l]=[]),i.each(a.data,function(t,i){var a=d[l],r=+e.getRightValue(t);isNaN(r)||s.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=r)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(o,function(n,a){var o=r.getDatasetMeta(a);r.isDatasetVisible(a)&&t(o)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||o.data[n].hidden||(null===e.min?e.min=i:i<e.min&&(e.min=i),null===e.max?e.max=i:i>e.max&&(e.max=i),0!==i&&(null===e.minNotZero||i<e.minNotZero)&&(e.minNotZero=i))})});e.min=s(a.min,e.min),e.max=s(a.max,e.max),e.min===e.max&&(0!==e.min&&null!==e.min?(e.min=Math.pow(10,Math.floor(i.log10(e.min))-1),e.max=Math.pow(10,Math.floor(i.log10(e.max))+1)):(e.min=1,e.max=10))},buildTicks:function(){var t=this,e=t.options.ticks,n={min:e.min,max:e.max},r=t.ticks=a.generators.logarithmic(n,t);t.isHorizontal()||r.reverse(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},getPixelForValue:function(t){var e,n,a,r=this,o=r.start,s=+r.getRightValue(t),l=r.options.ticks;return r.isHorizontal()?(a=i.log10(r.end)-i.log10(o),0===s?n=r.left:(e=r.width,n=r.left+e/a*(i.log10(s)-i.log10(o)))):(e=r.height,0!==o||l.reverse?0===r.end&&l.reverse?(a=i.log10(r.start)-i.log10(r.minNotZero),n=s===r.end?r.top:s===r.minNotZero?r.top+.02*e:r.top+.02*e+.98*e/a*(i.log10(s)-i.log10(r.minNotZero))):0===s?n=l.reverse?r.top:r.bottom:(a=i.log10(r.end)-i.log10(o),e=r.height,n=r.bottom-e/a*(i.log10(s)-i.log10(o))):(a=i.log10(r.end)-i.log10(r.minNotZero),n=s===o?r.bottom:s===r.minNotZero?r.bottom-.02*e:r.bottom-.02*e-.98*e/a*(i.log10(s)-i.log10(r.minNotZero)))),n},getValueForPixel:function(t){var e,n,a=this,r=i.log10(a.end)-i.log10(a.start);return a.isHorizontal()?(n=a.width,e=a.start*Math.pow(10,(t-a.left)*r/n)):(n=a.height,e=Math.pow(10,(a.bottom-t)*r/n)/a.start),e}});t.scaleService.registerScaleType(\"logarithmic\",n,e)}},{34:34,45:45}],56:[function(t,e,n){\"use strict\";var i=t(25),a=t(45),r=t(34);e.exports=function(t){function e(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function n(t){var e=t.options.pointLabels,n=a.valueOrDefault(e.fontSize,p.defaultFontSize),i=a.valueOrDefault(e.fontStyle,p.defaultFontStyle),r=a.valueOrDefault(e.fontFamily,p.defaultFontFamily);return{size:n,style:i,family:r,font:a.fontString(n,i,r)}}function o(t,e,n){return a.isArray(n)?{w:a.longestText(t,t.font,n),h:n.length*e+1.5*(n.length-1)*e}:{w:t.measureText(n).width,h:e}}function s(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function l(t){var i,r,l,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;i<f;i++){l=t.getPointPosition(i,d),r=o(t.ctx,u.size,t.pointLabels[i]||\"\"),t._pointLabelSizes[i]=r;var g=t.getIndexAngle(i),m=a.toDegrees(g)%360,p=s(m,l.x,r.w,0,180),v=s(m,l.y,r.h,90,270);p.start<c.l&&(c.l=p.start,h.l=g),p.end>c.r&&(c.r=p.end,h.r=g),v.start<c.t&&(c.t=v.start,h.t=g),v.end>c.b&&(c.b=v.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?\"center\":t<180?\"left\":\"right\"}function c(t,e,n,i){if(a.isArray(e))for(var r=n.y,o=1.5*i,s=0;s<e.length;++s)t.fillText(e[s],n.x,r),r+=o;else t.fillText(e,n.x,n.y)}function h(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,r=a.valueOrDefault,o=t.options,s=o.angleLines,l=o.pointLabels;i.lineWidth=s.lineWidth,i.strokeStyle=s.color;var u=t.getDistanceFromCenterForValue(o.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline=\"top\";for(var g=e(t)-1;g>=0;g--){if(s.display){var m=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}if(l.display){var v=t.getPointPosition(g,u+5),y=r(l.fontColor,p.defaultFontColor);i.font=f.font,i.fillStyle=y;var b=t.getIndexAngle(g),x=a.toDegrees(b);i.textAlign=d(x),h(x,t._pointLabelSizes[g],v),c(i,t.pointLabels[g]||\"\",v,f.size)}}}function g(t,n,i,r){var o=t.ctx;if(o.strokeStyle=a.valueAtIndexOrDefault(n.color,r-1),o.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,r-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var s=e(t);if(0===s)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var u=1;u<s;u++)l=t.getPointPosition(u,i),o.lineTo(l.x,l.y);o.closePath(),o.stroke()}}function m(t){return a.isNumber(t)?t:0}var p=i.global,v={display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,color:\"rgba(0, 0, 0, 0.1)\",lineWidth:1},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:\"rgba(255,255,255,0.75)\",backdropPaddingY:2,backdropPaddingX:2,callback:r.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}},y=t.LinearScaleBase.extend({setDimensions:function(){var t=this,e=t.options,n=e.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var i=a.min([t.height,t.width]),r=a.valueOrDefault(n.fontSize,p.defaultFontSize);t.drawingArea=e.display?i/2-(r/2+n.backdropPaddingY):i/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;a.each(e.data.datasets,function(r,o){if(e.isDatasetVisible(o)){var s=e.getDatasetMeta(o);a.each(r.data,function(e,a){var r=+t.getRightValue(e);isNaN(r)||s.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))})}}),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,e=a.valueOrDefault(t.fontSize,p.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*e)))},convertTicksToLabels:function(){var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){this.options.pointLabels.display?l(this):u(this)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-i.height,0)/Math.cos(n.b);a=m(a),r=m(r),o=m(o),s=m(s),i.drawingArea=Math.min(Math.round(t-(a+r)/2),Math.round(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-i-a.drawingArea;a.xCenter=Math.round((o+r)/2+a.left),a.yCenter=Math.round((s+l)/2+a.top)},getIndexAngle:function(t){return t*(2*Math.PI/e(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this,i=n.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(i)*e)+n.xCenter,y:Math.round(Math.sin(i)*e)+n.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,n=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,r=a.valueOrDefault;if(e.display){var o=t.ctx,s=this.getIndexAngle(0),l=r(i.fontSize,p.defaultFontSize),u=r(i.fontStyle,p.defaultFontStyle),d=r(i.fontFamily,p.defaultFontFamily),c=a.fontString(l,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=r(i.fontColor,p.defaultFontColor);if(o.font=c,o.save(),o.translate(t.xCenter,t.yCenter),o.rotate(s),i.showLabelBackdrop){var h=o.measureText(e).width;o.fillStyle=i.backdropColor,o.fillRect(-h/2-i.backdropPaddingX,-u-l/2-i.backdropPaddingY,h+2*i.backdropPaddingX,l+2*i.backdropPaddingY)}o.textAlign=\"center\",o.textBaseline=\"middle\",o.fillStyle=d,o.fillText(e,0,-u),o.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType(\"radialLinear\",y,v)}},{25:25,34:34,45:45}],57:[function(t,e,n){\"use strict\";function i(t,e){return t-e}function a(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}function r(t,e,n,i){if(\"linear\"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}function o(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(i=o+s>>1,a=t[i-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}function s(t,e,n,i){var a=o(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],s=a.lo?a.hi?a.hi:t[t.length-1]:t[1],l=s[e]-r[e],u=l?(n-r[e])/l:0,d=(s[i]-r[i])*u;return r[i]+d}function l(t,e){var n=e.parser,i=e.parser||e.format;return\"function\"==typeof n?n(t):\"string\"==typeof t&&\"string\"==typeof i?v(t,i):(t instanceof v||(t=v(t)),t.isValid()?t:\"function\"==typeof i?i(t):t)}function u(t,e){if(b.isNullOrUndef(t))return null;var n=e.options.time,i=l(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,r,o,s=e-t,l=k[n],u=l.size,d=l.steps;if(!d)return Math.ceil(s/((i||1)*u));for(a=0,r=d.length;a<r&&(o=d[a],!(Math.ceil(s/(u*o))<=i));++a);return o}function c(t,e,n,i){var a,r,o,s=w.length;for(a=w.indexOf(t);a<s-1;++a)if(r=k[w[a]],o=r.steps?r.steps[r.steps.length-1]:_,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return w[a];return w[s-1]}function h(t,e,n,i){var a,r,o=v.duration(v(i).diff(v(n)));for(a=w.length-1;a>=w.indexOf(e);a--)if(r=w[a],k[r].common&&o.as(r)>=t.length)return r;return w[e?w.indexOf(e):0]}function f(t){for(var e=w.indexOf(t)+1,n=w.length;e<n;++e)if(k[w[e]].common)return w[e]}function g(t,e,n,i){var a,r=i.time,o=r.unit||c(r.minUnit,t,e,n),s=f(o),l=b.valueOrDefault(r.stepSize,r.unitStepSize),u=\"week\"===o&&r.isoWeekday,h=i.ticks.major.enabled,g=k[o],m=v(t),p=v(e),y=[];for(l||(l=d(t,e,o,n)),u&&(m=m.isoWeekday(u),p=p.isoWeekday(u)),m=m.startOf(u?\"day\":o),(p=p.startOf(u?\"day\":o))<e&&p.add(1,o),a=v(m),h&&s&&!u&&!r.round&&(a.startOf(s),a.add(~~((m-a)/(g.size*l))*l,o));a<p;a.add(l,o))y.push(+a);return y.push(+a),y}function m(t,e,n,i,a){var r,o,l=0,u=0;return a.offset&&e.length&&(a.time.min||(r=e.length>1?e[1]:i,o=e[0],l=(s(t,\"time\",r,\"pos\")-s(t,\"time\",o,\"pos\"))/2),a.time.max||(r=e[e.length-1],o=e.length>1?e[e.length-2]:n,u=(s(t,\"time\",r,\"pos\")-s(t,\"time\",o,\"pos\"))/2)),{left:l,right:u}}function p(t,e){var n,i,a,r,o=[];for(n=0,i=t.length;n<i;++n)a=t[n],r=!!e&&a===+v(a).startOf(e),o.push({value:a,major:r});return o}var v=t(6);v=\"function\"==typeof v?v:window.moment;var y=t(25),b=t(45),x=Number.MIN_SAFE_INTEGER||-9007199254740991,_=Number.MAX_SAFE_INTEGER||9007199254740991,k={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},w=Object.keys(k);e.exports=function(t){var e=t.Scale.extend({initialize:function(){if(!v)throw new Error(\"Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com\");this.mergeTicksOptions(),t.Scale.prototype.initialize.call(this)},update:function(){var e=this,n=e.options;return n.time&&n.time.format&&console.warn(\"options.time.format is deprecated and replaced by options.time.parser.\"),t.Scale.prototype.update.apply(e,arguments)},getRightValue:function(e){return e&&void 0!==e.t&&(e=e.t),t.Scale.prototype.getRightValue.call(this,e)},determineDataLimits:function(){var t,e,n,r,o,s,l=this,d=l.chart,c=l.options.time,h=_,f=x,g=[],m=[],p=[];for(t=0,n=d.data.labels.length;t<n;++t)p.push(u(d.data.labels[t],l));for(t=0,n=(d.data.datasets||[]).length;t<n;++t)if(d.isDatasetVisible(t))if(o=d.data.datasets[t].data,b.isObject(o[0]))for(m[t]=[],e=0,r=o.length;e<r;++e)s=u(o[e],l),g.push(s),m[t][e]=s;else g.push.apply(g,p),m[t]=p.slice(0);else m[t]=[];p.length&&(p=a(p).sort(i),h=Math.min(h,p[0]),f=Math.max(f,p[p.length-1])),g.length&&(g=a(g).sort(i),h=Math.min(h,g[0]),f=Math.max(f,g[g.length-1])),h=u(c.min,l)||h,f=u(c.max,l)||f,h=h===_?+v().startOf(\"day\"):h,f=f===x?+v().endOf(\"day\")+1:f,l.min=Math.min(h,f),l.max=Math.max(h+1,f),l._horizontal=l.isHorizontal(),l._table=[],l._timestamps={data:g,datasets:m,labels:p}},buildTicks:function(){var t,e,n,i=this,a=i.min,o=i.max,s=i.options,l=s.time,d=[],c=[];switch(s.ticks.source){case\"data\":d=i._timestamps.data;break;case\"labels\":d=i._timestamps.labels;break;case\"auto\":default:d=g(a,o,i.getLabelCapacity(a),s)}for(\"ticks\"===s.bounds&&d.length&&(a=d[0],o=d[d.length-1]),a=u(l.min,i)||a,o=u(l.max,i)||o,t=0,e=d.length;t<e;++t)(n=d[t])>=a&&n<=o&&c.push(n);return i.min=a,i.max=o,i._unit=l.unit||h(c,l.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=r(i._timestamps.data,a,o,s.distribution),i._offsets=m(i._table,c,a,o,s),p(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,r=i.labels&&t<i.labels.length?i.labels[t]:\"\",o=i.datasets[e].data[t];return b.isObject(o)&&(r=n.getRightValue(o)),a.tooltipFormat&&(r=l(r,a).format(a.tooltipFormat)),r},tickFormatFunction:function(t,e,n,i){var a=this,r=a.options,o=t.valueOf(),s=r.time.displayFormats,l=s[a._unit],u=a._majorUnit,d=s[u],c=t.clone().startOf(u).valueOf(),h=r.ticks.major,f=h.enabled&&u&&d&&o===c,g=t.format(i||(f?d:l)),m=f?h:r.ticks.minor,p=b.valueOrDefault(m.callback,m.userCallback);return p?p(g,e,n):g},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(v(t[e].value),e,t));return i},getPixelForOffset:function(t){var e=this,n=e._horizontal?e.width:e.height,i=e._horizontal?e.left:e.top,a=s(e._table,\"time\",t,\"pos\");return i+n*(e._offsets.left+a)/(e._offsets.left+1+e._offsets.right)},getPixelForValue:function(t,e,n){var i=this,a=null;if(void 0!==e&&void 0!==n&&(a=i._timestamps.datasets[n][e]),null===a&&(a=u(t,i)),null!==a)return i.getPixelForOffset(a)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,n=e._horizontal?e.width:e.height,i=e._horizontal?e.left:e.top,a=(n?(t-i)/n:0)*(e._offsets.left+1+e._offsets.left)-e._offsets.right,r=s(e._table,\"pos\",a,\"time\");return v(r)},getLabelWidth:function(t){var e=this,n=e.options.ticks,i=e.ctx.measureText(t).width,a=b.toRadians(n.maxRotation),r=Math.cos(a),o=Math.sin(a);return i*r+b.valueOrDefault(n.fontSize,y.global.defaultFontSize)*o},getLabelCapacity:function(t){var e=this,n=e.options.time.displayFormats.millisecond,i=e.tickFormatFunction(v(t),0,[],n),a=e.getLabelWidth(i),r=e.isHorizontal()?e.width:e.height;return Math.floor(r/a)}});t.scaleService.registerScaleType(\"time\",e,{position:\"bottom\",distribution:\"linear\",bounds:\"data\",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{millisecond:\"h:mm:ss.SSS a\",second:\"h:mm:ss a\",minute:\"h:mm a\",hour:\"hA\",day:\"MMM D\",week:\"ll\",month:\"MMM YYYY\",quarter:\"[Q]Q - YYYY\",year:\"YYYY\"}},ticks:{autoSkip:!1,source:\"auto\",major:{enabled:!1}}})}},{25:25,45:45,6:6}]},{},[7])(7)});"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chart.js2",
    "content": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.1\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(o,s){if(!n[o]){if(!e[o]){var l=\"function\"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);var u=new Error(\"Cannot find module '\"+o+\"'\");throw u.code=\"MODULE_NOT_FOUND\",u}var d=n[o]={exports:{}};e[o][0].call(d.exports,function(t){var n=e[o][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[o].exports}for(var r=\"function\"==typeof require&&require,o=0;o<i.length;o++)a(i[o]);return a}({1:[function(t,e,n){function i(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3})$/i);if(i){i=i[1];for(a=0;a<e.length;a++)e[a]=parseInt(i[a]+i[a],16)}else if(i=t.match(/^#([a-fA-F0-9]{6})$/i)){i=i[1];for(a=0;a<e.length;a++)e[a]=parseInt(i.slice(2*a,2*a+2),16)}else if(i=t.match(/^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i)){for(a=0;a<e.length;a++)e[a]=parseInt(i[a+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i)){for(a=0;a<e.length;a++)e[a]=Math.round(2.55*parseFloat(i[a+1]));n=parseFloat(i[4])}else if(i=t.match(/(\\w+)/)){if(\"transparent\"==i[1])return[0,0,0,0];if(!(e=c[i[1]]))return}for(var a=0;a<e.length;a++)e[a]=u(e[a],0,255);return n=n||0==n?u(n,0,1):1,e[3]=n,e}}function a(t){if(t){var e=t.match(/^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/);if(e){var n=parseFloat(e[4]);return[u(parseInt(e[1]),0,360),u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}}}function r(t){if(t){var e=t.match(/^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/);if(e){var n=parseFloat(e[4]);return[u(parseInt(e[1]),0,360),u(parseFloat(e[2]),0,100),u(parseFloat(e[3]),0,100),u(isNaN(n)?1:n,0,1)]}}}function o(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"rgba(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+e+\")\"}function s(t,e){return\"rgba(\"+Math.round(t[0]/255*100)+\"%, \"+Math.round(t[1]/255*100)+\"%, \"+Math.round(t[2]/255*100)+\"%, \"+(e||t[3]||1)+\")\"}function l(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"hsla(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%, \"+e+\")\"}function u(t,e,n){return Math.min(Math.max(e,t),n)}function d(t){var e=t.toString(16).toUpperCase();return e.length<2?\"0\"+e:e}var c=t(5);e.exports={getRgba:i,getHsla:a,getRgb:function(t){var e=i(t);return e&&e.slice(0,3)},getHsl:function(t){var e=a(t);return e&&e.slice(0,3)},getHwb:r,getAlpha:function(t){var e=i(t);return e?e[3]:(e=a(t))?e[3]:(e=r(t))?e[3]:void 0},hexString:function(t){return\"#\"+d(t[0])+d(t[1])+d(t[2])},rgbString:function(t,e){return e<1||t[3]&&t[3]<1?o(t,e):\"rgb(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},rgbaString:o,percentString:function(t,e){return e<1||t[3]&&t[3]<1?s(t,e):\"rgb(\"+Math.round(t[0]/255*100)+\"%, \"+Math.round(t[1]/255*100)+\"%, \"+Math.round(t[2]/255*100)+\"%)\"},percentaString:s,hslString:function(t,e){return e<1||t[3]&&t[3]<1?l(t,e):\"hsl(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%)\"},hslaString:l,hwbString:function(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"hwb(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%\"+(void 0!==e&&1!==e?\", \"+e:\"\")+\")\"},keyword:function(t){return h[t.slice(0,3)]}};var h={};for(var f in c)h[c[f]]=f},{5:5}],2:[function(t,e,n){var i=t(4),a=t(1),r=function(t){if(t instanceof r)return t;if(!(this instanceof r))return new r(t);this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;\"string\"==typeof t?(e=a.getRgba(t))?this.setValues(\"rgb\",e):(e=a.getHsla(t))?this.setValues(\"hsl\",e):(e=a.getHwb(t))&&this.setValues(\"hwb\",e):\"object\"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues(\"rgb\",e):void 0!==e.l||void 0!==e.lightness?this.setValues(\"hsl\",e):void 0!==e.v||void 0!==e.value?this.setValues(\"hsv\",e):void 0!==e.w||void 0!==e.whiteness?this.setValues(\"hwb\",e):void 0===e.c&&void 0===e.cyan||this.setValues(\"cmyk\",e))};r.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace(\"rgb\",arguments)},hsl:function(){return this.setSpace(\"hsl\",arguments)},hsv:function(){return this.setSpace(\"hsv\",arguments)},hwb:function(){return this.setSpace(\"hwb\",arguments)},cmyk:function(){return this.setSpace(\"cmyk\",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues(\"alpha\",t),this)},red:function(t){return this.setChannel(\"rgb\",0,t)},green:function(t){return this.setChannel(\"rgb\",1,t)},blue:function(t){return this.setChannel(\"rgb\",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel(\"hsl\",0,t)},saturation:function(t){return this.setChannel(\"hsl\",1,t)},lightness:function(t){return this.setChannel(\"hsl\",2,t)},saturationv:function(t){return this.setChannel(\"hsv\",1,t)},whiteness:function(t){return this.setChannel(\"hwb\",1,t)},blackness:function(t){return this.setChannel(\"hwb\",2,t)},value:function(t){return this.setChannel(\"hsv\",2,t)},cyan:function(t){return this.setChannel(\"cmyk\",0,t)},magenta:function(t){return this.setChannel(\"cmyk\",1,t)},yellow:function(t){return this.setChannel(\"cmyk\",2,t)},black:function(t){return this.setChannel(\"cmyk\",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?\"AAA\":e>=4.5?\"AA\":\"\"},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues(\"rgb\",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues(\"hsl\",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues(\"hsl\",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues(\"hsl\",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues(\"hsl\",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues(\"hwb\",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues(\"hwb\",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues(\"rgb\",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues(\"alpha\",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues(\"alpha\",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues(\"hsl\",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,r=2*a-1,o=n.alpha()-i.alpha(),s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*n.red()+l*i.red(),s*n.green()+l*i.green(),s*n.blue()+l*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new r,i=this.values,a=n.values;for(var o in i)i.hasOwnProperty(o)&&(t=i[o],\"[object Array]\"===(e={}.toString.call(t))?a[o]=t.slice(0):\"[object Number]\"===e?a[o]=t:console.error(\"unexpected color value:\",t));return n}},r.prototype.spaces={rgb:[\"red\",\"green\",\"blue\"],hsl:[\"hue\",\"saturation\",\"lightness\"],hsv:[\"hue\",\"saturation\",\"value\"],hwb:[\"hue\",\"whiteness\",\"blackness\"],cmyk:[\"cyan\",\"magenta\",\"yellow\",\"black\"]},r.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},r.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},r.prototype.setValues=function(t,e){var n,a=this.values,r=this.spaces,o=this.maxes,s=1;if(this.valid=!0,\"alpha\"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];s=e.a}else if(void 0!==e[r[t][0]]){var l=r[t];for(n=0;n<t.length;n++)a[t][n]=e[l[n]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),\"alpha\"===t)return!1;var u;for(n=0;n<t.length;n++)u=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(u);for(var d in r)d!==t&&(a[d]=i[t][d](a[t]));return!0},r.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):(\"number\"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},r.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},\"undefined\"!=typeof window&&(window.Color=r),e.exports=r},{1:1,4:4}],3:[function(t,e,n){function i(t){var e,n,i,a=t[0]/255,r=t[1]/255,o=t[2]/255,s=Math.min(a,r,o),l=Math.max(a,r,o),u=l-s;return l==s?e=0:a==l?e=(r-o)/u:r==l?e=2+(o-a)/u:o==l&&(e=4+(a-r)/u),(e=Math.min(60*e,360))<0&&(e+=360),i=(s+l)/2,n=l==s?0:i<=.5?u/(l+s):u/(2-l-s),[e,100*n,100*i]}function a(t){var e,n,i,a=t[0],r=t[1],o=t[2],s=Math.min(a,r,o),l=Math.max(a,r,o),u=l-s;return n=0==l?0:u/l*1e3/10,l==s?e=0:a==l?e=(r-o)/u:r==l?e=2+(o-a)/u:o==l&&(e=4+(a-r)/u),(e=Math.min(60*e,360))<0&&(e+=360),i=l/255*1e3/10,[e,n,i]}function o(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function s(t){var e,n,i,a,r=t[0]/255,o=t[1]/255,s=t[2]/255;return a=Math.min(1-r,1-o,1-s),e=(1-r-a)/(1-a)||0,n=(1-o-a)/(1-a)||0,i=(1-s-a)/(1-a)||0,[100*e,100*n,100*i,100*a]}function l(t){return S[JSON.stringify(t)]}function u(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),r=a[0],o=a[1],s=a[2];return r/=95.047,o/=100,s/=108.883,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*o-16,n=500*(r-o),i=200*(o-s),[e,n,i]}function c(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return r=255*l,[r,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r)),i=255*i;switch(a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}}function f(t){var e,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),e=Math.floor(6*o),n=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),a=s+i*(n-s),e){default:case 6:case 0:r=n,g=a,b=s;break;case 1:r=a,g=n,b=s;break;case 2:r=s,g=n,b=a;break;case 3:r=s,g=a,b=n;break;case 4:r=a,g=s,b=n;break;case 5:r=n,g=s,b=a}return[255*r,255*g,255*b]}function m(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100,s=t[3]/100;return e=1-Math.min(1,a*(1-s)+s),n=1-Math.min(1,r*(1-s)+s),i=1-Math.min(1,o*(1-s)+s),[255*e,255*n,255*i]}function p(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return e=3.2406*a+-1.5372*r+-.4986*o,n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0],r=t[1],o=t[2];return a/=95.047,r/=100,o/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,e=116*r-16,n=500*(a-r),i=200*(r-o),[e,n,i]}function y(t){var e,n,i,a,r=t[0],o=t[1],s=t[2];return r<=8?a=(n=100*r/903.3)/100*7.787+16/116:(n=100*Math.pow((r+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i=i/108.883<=.008859?i=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3),[e,n,i]}function x(t){var e,n,i,a=t[0],r=t[1],o=t[2];return e=Math.atan2(o,r),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(r*r+o*o),[a,i,n]}function _(t){return p(y(t))}function k(t){var e,n,i,a=t[0],r=t[1];return i=t[2]/360*2*Math.PI,e=r*Math.cos(i),n=r*Math.sin(i),[a,e,n]}function w(t){return M[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return 0===r?[0,0,0]:(r*=2,a*=r<=1?r:2-r,n=(r+a)/2,e=2*a/(r+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return s(c(t))},hsl2keyword:function(t){return l(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return n=(2-a)*r,e=a*r,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return s(h(t))},hsv2keyword:function(t){return l(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return s(f(t))},hwb2keyword:function(t){return l(f(t))},cmyk2rgb:m,cmyk2hsl:function(t){return i(m(t))},cmyk2hsv:function(t){return a(m(t))},cmyk2hwb:function(t){return o(m(t))},cmyk2keyword:function(t){return l(m(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return a(w(t))},keyword2hwb:function(t){return o(w(t))},keyword2cmyk:function(t){return s(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return u(w(t))},xyz2rgb:p,xyz2lab:v,xyz2lch:function(t){return x(v(t))},lab2xyz:y,lab2rgb:_,lab2lch:x,lch2lab:k,lch2xyz:function(t){return y(k(t))},lch2rgb:function(t){return _(k(t))}};var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},S={};for(var D in M)S[JSON.stringify(M[D])]=D},{}],4:[function(t,e,n){var i=t(3),a=function(){return new u};for(var r in i){a[r+\"Raw\"]=function(t){return function(e){return\"number\"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(r);var o=/(\\w+)2(\\w+)/.exec(r),s=o[1],l=o[2];(a[s]=a[s]||{})[l]=a[r]=function(t){return function(e){\"number\"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if(\"string\"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(r)}var u=function(){this.convs={}};u.prototype.routeSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):(\"number\"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n))},u.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},u.prototype.getValues=function(t){var e=this.convs[t];if(!e){var n=this.space,i=this.convs[n];e=a[n][t](i),this.convs[t]=e}return e},[\"rgb\",\"hsl\",\"hsv\",\"cmyk\",\"keyword\"].forEach(function(t){u.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{3:3}],5:[function(t,e,n){\"use strict\";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],6:[function(t,e,n){!function(t,i){\"object\"==typeof n&&void 0!==e?e.exports=i():t.moment=i()}(this,function(){\"use strict\";function n(){return xe.apply(null,arguments)}function i(t){return t instanceof Array||\"[object Array]\"===Object.prototype.toString.call(t)}function a(t){return null!=t&&\"[object Object]\"===Object.prototype.toString.call(t)}function r(t){var e;for(e in t)return!1;return!0}function o(t){return void 0===t}function s(t){return\"number\"==typeof t||\"[object Number]\"===Object.prototype.toString.call(t)}function l(t){return t instanceof Date||\"[object Date]\"===Object.prototype.toString.call(t)}function u(t,e){var n,i=[];for(n=0;n<t.length;++n)i.push(e(t[n],n));return i}function d(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){for(var n in e)d(e,n)&&(t[n]=e[n]);return d(e,\"toString\")&&(t.toString=e.toString),d(e,\"valueOf\")&&(t.valueOf=e.valueOf),t}function h(t,e,n,i){return Yt(t,e,n,i,!0).utc()}function f(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function g(t){return null==t._pf&&(t._pf=f()),t._pf}function m(t){if(null==t._isValid){var e=g(t),n=ke.call(e.parsedDateParts,function(t){return null!=t}),i=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(i=i&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return i;t._isValid=i}return t._isValid}function p(t){var e=h(NaN);return null!=t?c(g(e),t):g(e).userInvalidated=!0,e}function v(t,e){var n,i,a;if(o(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),o(e._i)||(t._i=e._i),o(e._f)||(t._f=e._f),o(e._l)||(t._l=e._l),o(e._strict)||(t._strict=e._strict),o(e._tzm)||(t._tzm=e._tzm),o(e._isUTC)||(t._isUTC=e._isUTC),o(e._offset)||(t._offset=e._offset),o(e._pf)||(t._pf=g(e)),o(e._locale)||(t._locale=e._locale),we.length>0)for(n=0;n<we.length;n++)o(a=e[i=we[n]])||(t[i]=a);return t}function y(t){v(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===Me&&(Me=!0,n.updateOffset(this),Me=!1)}function b(t){return t instanceof y||null!=t&&null!=t._isAMomentObject}function x(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function _(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=x(e)),n}function k(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;i<a;i++)(n&&t[i]!==e[i]||!n&&_(t[i])!==_(e[i]))&&o++;return o+r}function w(t){!1===n.suppressDeprecationWarnings&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"Deprecation warning: \"+t)}function M(t,e){var i=!0;return c(function(){if(null!=n.deprecationHandler&&n.deprecationHandler(null,t),i){for(var a,r=[],o=0;o<arguments.length;o++){if(a=\"\",\"object\"==typeof arguments[o]){a+=\"\\n[\"+o+\"] \";for(var s in arguments[0])a+=s+\": \"+arguments[0][s]+\", \";a=a.slice(0,-2)}else a=arguments[o];r.push(a)}w(t+\"\\nArguments: \"+Array.prototype.slice.call(r).join(\"\")+\"\\n\"+(new Error).stack),i=!1}return e.apply(this,arguments)},e)}function S(t,e){null!=n.deprecationHandler&&n.deprecationHandler(t,e),Se[t]||(w(e),Se[t]=!0)}function D(t){return t instanceof Function||\"[object Function]\"===Object.prototype.toString.call(t)}function C(t,e){var n,i=c({},t);for(n in e)d(e,n)&&(a(t[n])&&a(e[n])?(i[n]={},c(i[n],t[n]),c(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)d(t,n)&&!d(e,n)&&a(t[n])&&(i[n]=c({},i[n]));return i}function P(t){null!=t&&this.set(t)}function T(t,e){var n=t.toLowerCase();Te[n]=Te[n+\"s\"]=Te[e]=t}function A(t){return\"string\"==typeof t?Te[t]||Te[t.toLowerCase()]:void 0}function I(t){var e,n,i={};for(n in t)d(t,n)&&(e=A(n))&&(i[e]=t[n]);return i}function O(t,e){Ae[t]=e}function F(t){var e=[];for(var n in t)e.push({unit:n,priority:Ae[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function R(t,e){return function(i){return null!=i?(W(this,t,i),n.updateOffset(this,e),this):L(this,t)}}function L(t,e){return t.isValid()?t._d[\"get\"+(t._isUTC?\"UTC\":\"\")+e]():NaN}function W(t,e,n){t.isValid()&&t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+e](n)}function Y(t,e,n){var i=\"\"+Math.abs(t),a=e-i.length;return(t>=0?n?\"+\":\"\":\"-\")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}function N(t,e,n,i){var a=i;\"string\"==typeof i&&(a=function(){return this[i]()}),t&&(Re[t]=a),e&&(Re[e[0]]=function(){return Y(a.apply(this,arguments),e[1],e[2])}),n&&(Re[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function z(t){return t.match(/\\[[\\s\\S]/)?t.replace(/^\\[|\\]$/g,\"\"):t.replace(/\\\\/g,\"\")}function B(t){var e,n,i=t.match(Ie);for(e=0,n=i.length;e<n;e++)Re[i[e]]?i[e]=Re[i[e]]:i[e]=z(i[e]);return function(e){var a,r=\"\";for(a=0;a<n;a++)r+=D(i[a])?i[a].call(e,t):i[a];return r}}function V(t,e){return t.isValid()?(e=H(e,t.localeData()),Fe[e]=Fe[e]||B(e),Fe[e](t)):t.localeData().invalidDate()}function H(t,e){var n=5;for(Oe.lastIndex=0;n>=0&&Oe.test(t);)t=t.replace(Oe,function(t){return e.longDateFormat(t)||t}),Oe.lastIndex=0,n-=1;return t}function E(t,e,n){Ke[t]=D(e)?e:function(t,i){return t&&n?n:e}}function j(t,e){return d(Ke,t)?Ke[t](e._strict,e._locale):new RegExp(U(t))}function U(t){return q(t.replace(\"\\\\\",\"\").replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(t,e,n,i,a){return e||n||i||a}))}function q(t){return t.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}function G(t,e){var n,i=e;for(\"string\"==typeof t&&(t=[t]),s(e)&&(i=function(t,n){n[e]=_(t)}),n=0;n<t.length;n++)Qe[t[n]]=i}function Z(t,e){G(t,function(t,n,i,a){i._w=i._w||{},e(t,i._w,i,a)})}function X(t,e,n){null!=e&&d(Qe,t)&&Qe[t](e,n._a,n,t)}function J(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function K(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)r=h([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(r,\"\").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(r,\"\").toLocaleLowerCase();return n?\"MMM\"===e?-1!==(a=un.call(this._shortMonthsParse,o))?a:null:-1!==(a=un.call(this._longMonthsParse,o))?a:null:\"MMM\"===e?-1!==(a=un.call(this._shortMonthsParse,o))?a:-1!==(a=un.call(this._longMonthsParse,o))?a:null:-1!==(a=un.call(this._longMonthsParse,o))?a:-1!==(a=un.call(this._shortMonthsParse,o))?a:null}function Q(t,e){var n;if(!t.isValid())return t;if(\"string\"==typeof e)if(/^\\d+$/.test(e))e=_(e);else if(e=t.localeData().monthsParse(e),!s(e))return t;return n=Math.min(t.date(),J(t.year(),e)),t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+\"Month\"](e,n),t}function $(t){return null!=t?(Q(this,t),n.updateOffset(this,!0),this):L(this,\"Month\")}function tt(){function t(t,e){return e.length-t.length}var e,n,i=[],a=[],r=[];for(e=0;e<12;e++)n=h([2e3,e]),i.push(this.monthsShort(n,\"\")),a.push(this.months(n,\"\")),r.push(this.months(n,\"\")),r.push(this.monthsShort(n,\"\"));for(i.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)i[e]=q(i[e]),a[e]=q(a[e]);for(e=0;e<24;e++)r[e]=q(r[e]);this._monthsRegex=new RegExp(\"^(\"+r.join(\"|\")+\")\",\"i\"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp(\"^(\"+a.join(\"|\")+\")\",\"i\"),this._monthsShortStrictRegex=new RegExp(\"^(\"+i.join(\"|\")+\")\",\"i\")}function et(t){return nt(t)?366:365}function nt(t){return t%4==0&&t%100!=0||t%400==0}function it(t,e,n,i,a,r,o){var s=new Date(t,e,n,i,a,r,o);return t<100&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function at(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function rt(t,e,n){var i=7+e-n;return-((7+at(t,0,i).getUTCDay()-e)%7)+i-1}function ot(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+rt(t,i,a);return s<=0?o=et(r=t-1)+s:s>et(t)?(r=t+1,o=s-et(t)):(r=t,o=s),{year:r,dayOfYear:o}}function st(t,e,n){var i,a,r=rt(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+lt(a=t.year()-1,e,n):o>lt(t.year(),e,n)?(i=o-lt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function lt(t,e,n){var i=rt(t,e,n),a=rt(t+1,e,n);return(et(t)-i+a)/7}function ut(t,e){return\"string\"!=typeof t?t:isNaN(t)?\"number\"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}function dt(t,e){return\"string\"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function ct(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=h([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,\"\").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,\"\").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,\"\").toLocaleLowerCase();return n?\"dddd\"===e?-1!==(a=un.call(this._weekdaysParse,o))?a:null:\"ddd\"===e?-1!==(a=un.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:\"dddd\"===e?-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._shortWeekdaysParse,o))?a:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:\"ddd\"===e?-1!==(a=un.call(this._shortWeekdaysParse,o))?a:-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:-1!==(a=un.call(this._minWeekdaysParse,o))?a:-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._shortWeekdaysParse,o))?a:null}function ht(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=h([2e3,1]).day(e),i=this.weekdaysMin(n,\"\"),a=this.weekdaysShort(n,\"\"),r=this.weekdays(n,\"\"),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=q(s[e]),l[e]=q(l[e]),u[e]=q(u[e]);this._weekdaysRegex=new RegExp(\"^(\"+u.join(\"|\")+\")\",\"i\"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp(\"^(\"+l.join(\"|\")+\")\",\"i\"),this._weekdaysShortStrictRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\"),this._weekdaysMinStrictRegex=new RegExp(\"^(\"+o.join(\"|\")+\")\",\"i\")}function ft(){return this.hours()%12||12}function gt(t,e){N(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function mt(t,e){return e._meridiemParse}function pt(t){return t?t.toLowerCase().replace(\"_\",\"-\"):t}function vt(t){for(var e,n,i,a,r=0;r<t.length;){for(e=(a=pt(t[r]).split(\"-\")).length,n=(n=pt(t[r+1]))?n.split(\"-\"):null;e>0;){if(i=yt(a.slice(0,e).join(\"-\")))return i;if(n&&n.length>=e&&k(a,n,!0)>=e-1)break;e--}r++}return null}function yt(n){var i=null;if(!Sn[n]&&void 0!==e&&e&&e.exports)try{i=kn._abbr,t(\"./locale/\"+n),bt(i)}catch(t){}return Sn[n]}function bt(t,e){var n;return t&&(n=o(e)?_t(t):xt(t,e))&&(kn=n),kn._abbr}function xt(t,e){if(null!==e){var n=Mn;if(e.abbr=t,null!=Sn[t])S(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\"),n=Sn[t]._config;else if(null!=e.parentLocale){if(null==Sn[e.parentLocale])return Dn[e.parentLocale]||(Dn[e.parentLocale]=[]),Dn[e.parentLocale].push({name:t,config:e}),null;n=Sn[e.parentLocale]._config}return Sn[t]=new P(C(n,e)),Dn[t]&&Dn[t].forEach(function(t){xt(t.name,t.config)}),bt(t),Sn[t]}return delete Sn[t],null}function _t(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return kn;if(!i(t)){if(e=yt(t))return e;t=[t]}return vt(t)}function kt(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[tn]<0||n[tn]>11?tn:n[en]<1||n[en]>J(n[$e],n[tn])?en:n[nn]<0||n[nn]>24||24===n[nn]&&(0!==n[an]||0!==n[rn]||0!==n[on])?nn:n[an]<0||n[an]>59?an:n[rn]<0||n[rn]>59?rn:n[on]<0||n[on]>999?on:-1,g(t)._overflowDayOfYear&&(e<$e||e>en)&&(e=en),g(t)._overflowWeeks&&-1===e&&(e=sn),g(t)._overflowWeekday&&-1===e&&(e=ln),g(t).overflow=e),t}function wt(t){var e,n,i,a,r,o,s=t._i,l=Cn.exec(s)||Pn.exec(s);if(l){for(g(t).iso=!0,e=0,n=An.length;e<n;e++)if(An[e][1].exec(l[1])){a=An[e][0],i=!1!==An[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,n=In.length;e<n;e++)if(In[e][1].exec(l[3])){r=(l[2]||\" \")+In[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(l[4]){if(!Tn.exec(l[4]))return void(t._isValid=!1);o=\"Z\"}t._f=a+(r||\"\")+(o||\"\"),At(t)}else t._isValid=!1}function Mt(t){var e,n,i,a,r,o,s,l,u={\" GMT\":\" +0000\",\" EDT\":\" -0400\",\" EST\":\" -0500\",\" CDT\":\" -0500\",\" CST\":\" -0600\",\" MDT\":\" -0600\",\" MST\":\" -0700\",\" PDT\":\" -0700\",\" PST\":\" -0800\"};if(e=t._i.replace(/\\([^\\)]*\\)|[\\n\\t]/g,\" \").replace(/(\\s\\s+)/g,\" \").replace(/^\\s|\\s$/g,\"\"),n=Fn.exec(e)){if(i=n[1]?\"ddd\"+(5===n[1].length?\", \":\" \"):\"\",a=\"D MMM \"+(n[2].length>10?\"YYYY \":\"YY \"),r=\"HH:mm\"+(n[4]?\":ss\":\"\"),n[1]){var d=[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"][new Date(n[2]).getDay()];if(n[1].substr(0,3)!==d)return g(t).weekdayMismatch=!0,void(t._isValid=!1)}switch(n[5].length){case 2:s=0===l?\" +0000\":((l=\"YXWVUTSRQPONZABCDEFGHIKLM\".indexOf(n[5][1].toUpperCase())-12)<0?\" -\":\" +\")+(\"\"+l).replace(/^-?/,\"0\").match(/..$/)[0]+\"00\";break;case 4:s=u[n[5]];break;default:s=u[\" GMT\"]}n[5]=s,t._i=n.splice(1).join(\"\"),o=\" ZZ\",t._f=i+a+r+o,At(t),g(t).rfc2822=!0}else t._isValid=!1}function St(t){var e=On.exec(t._i);null===e?(wt(t),!1===t._isValid&&(delete t._isValid,Mt(t),!1===t._isValid&&(delete t._isValid,n.createFromInputFallback(t)))):t._d=new Date(+e[1])}function Dt(t,e,n){return null!=t?t:null!=e?e:n}function Ct(t){var e=new Date(n.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Pt(t){var e,n,i,a,r=[];if(!t._d){for(i=Ct(t),t._w&&null==t._a[en]&&null==t._a[tn]&&Tt(t),null!=t._dayOfYear&&(a=Dt(t._a[$e],i[$e]),(t._dayOfYear>et(a)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=at(a,0,t._dayOfYear),t._a[tn]=n.getUTCMonth(),t._a[en]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=r[e]=i[e];for(;e<7;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[nn]&&0===t._a[an]&&0===t._a[rn]&&0===t._a[on]&&(t._nextDay=!0,t._a[nn]=0),t._d=(t._useUTC?at:it).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[nn]=24)}}function Tt(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=Dt(e.GG,t._a[$e],st(Nt(),1,4).year),i=Dt(e.W,1),((a=Dt(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=st(Nt(),r,o);n=Dt(e.gg,t._a[$e],u.year),i=Dt(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>lt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=ot(n,i,a,r,o),t._a[$e]=s.year,t._dayOfYear=s.dayOfYear)}function At(t){if(t._f!==n.ISO_8601)if(t._f!==n.RFC_2822){t._a=[],g(t).empty=!0;var e,i,a,r,o,s=\"\"+t._i,l=s.length,u=0;for(a=H(t._f,t._locale).match(Ie)||[],e=0;e<a.length;e++)r=a[e],(i=(s.match(j(r,t))||[])[0])&&((o=s.substr(0,s.indexOf(i))).length>0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(i)+i.length),u+=i.length),Re[r]?(i?g(t).empty=!1:g(t).unusedTokens.push(r),X(r,i,t)):t._strict&&!i&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[nn]<=12&&!0===g(t).bigHour&&t._a[nn]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[nn]=It(t._locale,t._a[nn],t._meridiem),Pt(t),kt(t)}else Mt(t);else wt(t)}function It(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function Ot(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=v({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],At(e),m(e)&&(r+=g(e).charsLeftOver,r+=10*g(e).unusedTokens.length,g(e).score=r,(null==i||r<i)&&(i=r,n=e));c(t,n||e)}function Ft(t){if(!t._d){var e=I(t._i);t._a=u([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),Pt(t)}}function Rt(t){var e=new y(kt(Lt(t)));return e._nextDay&&(e.add(1,\"d\"),e._nextDay=void 0),e}function Lt(t){var e=t._i,n=t._f;return t._locale=t._locale||_t(t._l),null===e||void 0===n&&\"\"===e?p({nullInput:!0}):(\"string\"==typeof e&&(t._i=e=t._locale.preparse(e)),b(e)?new y(kt(e)):(l(e)?t._d=e:i(n)?Ot(t):n?At(t):Wt(t),m(t)||(t._d=null),t))}function Wt(t){var e=t._i;o(e)?t._d=new Date(n.now()):l(e)?t._d=new Date(e.valueOf()):\"string\"==typeof e?St(t):i(e)?(t._a=u(e.slice(0),function(t){return parseInt(t,10)}),Pt(t)):a(e)?Ft(t):s(e)?t._d=new Date(e):n.createFromInputFallback(t)}function Yt(t,e,n,o,s){var l={};return!0!==n&&!1!==n||(o=n,n=void 0),(a(t)&&r(t)||i(t)&&0===t.length)&&(t=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=s,l._l=n,l._i=t,l._f=e,l._strict=o,Rt(l)}function Nt(t,e,n,i){return Yt(t,e,n,i,!1)}function zt(t,e){var n,a;if(1===e.length&&i(e[0])&&(e=e[0]),!e.length)return Nt();for(n=e[0],a=1;a<e.length;++a)e[a].isValid()&&!e[a][t](n)||(n=e[a]);return n}function Bt(t){for(var e in t)if(-1===Wn.indexOf(e)||null!=t[e]&&isNaN(t[e]))return!1;for(var n=!1,i=0;i<Wn.length;++i)if(t[Wn[i]]){if(n)return!1;parseFloat(t[Wn[i]])!==_(t[Wn[i]])&&(n=!0)}return!0}function Vt(t){var e=I(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=Bt(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=_t(),this._bubble()}function Ht(t){return t instanceof Vt}function Et(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function jt(t,e){N(t,0,0,function(){var t=this.utcOffset(),n=\"+\";return t<0&&(t=-t,n=\"-\"),n+Y(~~(t/60),2)+e+Y(~~t%60,2)})}function Ut(t,e){var n=(e||\"\").match(t);if(null===n)return null;var i=((n[n.length-1]||[])+\"\").match(Yn)||[\"-\",0,0],a=60*i[1]+_(i[2]);return 0===a?0:\"+\"===i[0]?a:-a}function qt(t,e){var i,a;return e._isUTC?(i=e.clone(),a=(b(t)||l(t)?t.valueOf():Nt(t).valueOf())-i.valueOf(),i._d.setTime(i._d.valueOf()+a),n.updateOffset(i,!1),i):Nt(t).local()}function Gt(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Zt(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Xt(t,e){var n,i,a,r=t,o=null;return Ht(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:s(t)?(r={},e?r[e]=t:r.milliseconds=t):(o=Nn.exec(t))?(n=\"-\"===o[1]?-1:1,r={y:0,d:_(o[en])*n,h:_(o[nn])*n,m:_(o[an])*n,s:_(o[rn])*n,ms:_(Et(1e3*o[on]))*n}):(o=zn.exec(t))?(n=\"-\"===o[1]?-1:1,r={y:Jt(o[2],n),M:Jt(o[3],n),w:Jt(o[4],n),d:Jt(o[5],n),h:Jt(o[6],n),m:Jt(o[7],n),s:Jt(o[8],n)}):null==r?r={}:\"object\"==typeof r&&(\"from\"in r||\"to\"in r)&&(a=Qt(Nt(r.from),Nt(r.to)),(r={}).ms=a.milliseconds,r.M=a.months),i=new Vt(r),Ht(t)&&d(t,\"_locale\")&&(i._locale=t._locale),i}function Jt(t,e){var n=t&&parseFloat(t.replace(\",\",\".\"));return(isNaN(n)?0:n)*e}function Kt(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,\"M\").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,\"M\"),n}function Qt(t,e){var n;return t.isValid()&&e.isValid()?(e=qt(e,t),t.isBefore(e)?n=Kt(t,e):((n=Kt(e,t)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function $t(t,e){return function(n,i){var a,r;return null===i||isNaN(+i)||(S(e,\"moment().\"+e+\"(period, number) is deprecated. Please use moment().\"+e+\"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.\"),r=n,n=i,i=r),n=\"string\"==typeof n?+n:n,a=Xt(n,i),te(this,a,t),this}}function te(t,e,i,a){var r=e._milliseconds,o=Et(e._days),s=Et(e._months);t.isValid()&&(a=null==a||a,r&&t._d.setTime(t._d.valueOf()+r*i),o&&W(t,\"Date\",L(t,\"Date\")+o*i),s&&Q(t,L(t,\"Month\")+s*i),a&&n.updateOffset(t,o||s))}function ee(t,e){var n,i=12*(e.year()-t.year())+(e.month()-t.month()),a=t.clone().add(i,\"months\");return n=e-a<0?(e-a)/(a-t.clone().add(i-1,\"months\")):(e-a)/(t.clone().add(i+1,\"months\")-a),-(i+n)||0}function ne(t){var e;return void 0===t?this._locale._abbr:(null!=(e=_t(t))&&(this._locale=e),this)}function ie(){return this._locale}function ae(t,e){N(0,[t,t.length],0,e)}function re(t,e,n,i,a){var r;return null==t?st(this,i,a).year:(r=lt(t,i,a),e>r&&(e=r),oe.call(this,t,e,n,i,a))}function oe(t,e,n,i,a){var r=ot(t,e,n,i,a),o=at(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function se(t){return t}function le(t,e,n,i){var a=_t(),r=h().set(i,e);return a[n](r,t)}function ue(t,e,n){if(s(t)&&(e=t,t=void 0),t=t||\"\",null!=e)return le(t,e,n,\"month\");var i,a=[];for(i=0;i<12;i++)a[i]=le(t,i,n,\"month\");return a}function de(t,e,n,i){\"boolean\"==typeof t?(s(e)&&(n=e,e=void 0),e=e||\"\"):(n=e=t,t=!1,s(e)&&(n=e,e=void 0),e=e||\"\");var a=_t(),r=t?a._week.dow:0;if(null!=n)return le(e,(n+r)%7,i,\"day\");var o,l=[];for(o=0;o<7;o++)l[o]=le(e,(o+r)%7,i,\"day\");return l}function ce(t,e,n,i){var a=Xt(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function he(t){return t<0?Math.floor(t):Math.ceil(t)}function fe(t){return 4800*t/146097}function ge(t){return 146097*t/4800}function me(t){return function(){return this.as(t)}}function pe(t){return function(){return this.isValid()?this._data[t]:NaN}}function ve(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function ye(t,e,n){var i=Xt(t).abs(),a=hi(i.as(\"s\")),r=hi(i.as(\"m\")),o=hi(i.as(\"h\")),s=hi(i.as(\"d\")),l=hi(i.as(\"M\")),u=hi(i.as(\"y\")),d=a<=fi.ss&&[\"s\",a]||a<fi.s&&[\"ss\",a]||r<=1&&[\"m\"]||r<fi.m&&[\"mm\",r]||o<=1&&[\"h\"]||o<fi.h&&[\"hh\",o]||s<=1&&[\"d\"]||s<fi.d&&[\"dd\",s]||l<=1&&[\"M\"]||l<fi.M&&[\"MM\",l]||u<=1&&[\"y\"]||[\"yy\",u];return d[2]=e,d[3]=+t>0,d[4]=n,ve.apply(null,d)}function be(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=gi(this._milliseconds)/1e3,a=gi(this._days),r=gi(this._months);e=x((t=x(i/60))/60),i%=60,t%=60;var o=n=x(r/12),s=r%=12,l=a,u=e,d=t,c=i,h=this.asSeconds();return h?(h<0?\"-\":\"\")+\"P\"+(o?o+\"Y\":\"\")+(s?s+\"M\":\"\")+(l?l+\"D\":\"\")+(u||d||c?\"T\":\"\")+(u?u+\"H\":\"\")+(d?d+\"M\":\"\")+(c?c+\"S\":\"\"):\"P0D\"}var xe,_e,ke=_e=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1},we=n.momentProperties=[],Me=!1,Se={};n.suppressDeprecationWarnings=!1,n.deprecationHandler=null;var De,Ce,Pe=De=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)d(t,e)&&n.push(e);return n},Te={},Ae={},Ie=/(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Oe=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Fe={},Re={},Le=/\\d/,We=/\\d\\d/,Ye=/\\d{3}/,Ne=/\\d{4}/,ze=/[+-]?\\d{6}/,Be=/\\d\\d?/,Ve=/\\d\\d\\d\\d?/,He=/\\d\\d\\d\\d\\d\\d?/,Ee=/\\d{1,3}/,je=/\\d{1,4}/,Ue=/[+-]?\\d{1,6}/,qe=/\\d+/,Ge=/[+-]?\\d+/,Ze=/Z|[+-]\\d\\d:?\\d\\d/gi,Xe=/Z|[+-]\\d\\d(?::?\\d\\d)?/gi,Je=/[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i,Ke={},Qe={},$e=0,tn=1,en=2,nn=3,an=4,rn=5,on=6,sn=7,ln=8,un=Ce=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1};N(\"M\",[\"MM\",2],\"Mo\",function(){return this.month()+1}),N(\"MMM\",0,0,function(t){return this.localeData().monthsShort(this,t)}),N(\"MMMM\",0,0,function(t){return this.localeData().months(this,t)}),T(\"month\",\"M\"),O(\"month\",8),E(\"M\",Be),E(\"MM\",Be,We),E(\"MMM\",function(t,e){return e.monthsShortRegex(t)}),E(\"MMMM\",function(t,e){return e.monthsRegex(t)}),G([\"M\",\"MM\"],function(t,e){e[tn]=_(t)-1}),G([\"MMM\",\"MMMM\"],function(t,e,n,i){var a=n._locale.monthsParse(t,i,n._strict);null!=a?e[tn]=a:g(n).invalidMonth=t});var dn=/D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,cn=\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),hn=\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),fn=Je,gn=Je;N(\"Y\",0,0,function(){var t=this.year();return t<=9999?\"\"+t:\"+\"+t}),N(0,[\"YY\",2],0,function(){return this.year()%100}),N(0,[\"YYYY\",4],0,\"year\"),N(0,[\"YYYYY\",5],0,\"year\"),N(0,[\"YYYYYY\",6,!0],0,\"year\"),T(\"year\",\"y\"),O(\"year\",1),E(\"Y\",Ge),E(\"YY\",Be,We),E(\"YYYY\",je,Ne),E(\"YYYYY\",Ue,ze),E(\"YYYYYY\",Ue,ze),G([\"YYYYY\",\"YYYYYY\"],$e),G(\"YYYY\",function(t,e){e[$e]=2===t.length?n.parseTwoDigitYear(t):_(t)}),G(\"YY\",function(t,e){e[$e]=n.parseTwoDigitYear(t)}),G(\"Y\",function(t,e){e[$e]=parseInt(t,10)}),n.parseTwoDigitYear=function(t){return _(t)+(_(t)>68?1900:2e3)};var mn=R(\"FullYear\",!0);N(\"w\",[\"ww\",2],\"wo\",\"week\"),N(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\"),T(\"week\",\"w\"),T(\"isoWeek\",\"W\"),O(\"week\",5),O(\"isoWeek\",5),E(\"w\",Be),E(\"ww\",Be,We),E(\"W\",Be),E(\"WW\",Be,We),Z([\"w\",\"ww\",\"W\",\"WW\"],function(t,e,n,i){e[i.substr(0,1)]=_(t)});N(\"d\",0,\"do\",\"day\"),N(\"dd\",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),N(\"ddd\",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),N(\"dddd\",0,0,function(t){return this.localeData().weekdays(this,t)}),N(\"e\",0,0,\"weekday\"),N(\"E\",0,0,\"isoWeekday\"),T(\"day\",\"d\"),T(\"weekday\",\"e\"),T(\"isoWeekday\",\"E\"),O(\"day\",11),O(\"weekday\",11),O(\"isoWeekday\",11),E(\"d\",Be),E(\"e\",Be),E(\"E\",Be),E(\"dd\",function(t,e){return e.weekdaysMinRegex(t)}),E(\"ddd\",function(t,e){return e.weekdaysShortRegex(t)}),E(\"dddd\",function(t,e){return e.weekdaysRegex(t)}),Z([\"dd\",\"ddd\",\"dddd\"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t}),Z([\"d\",\"e\",\"E\"],function(t,e,n,i){e[i]=_(t)});var pn=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),vn=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),yn=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),bn=Je,xn=Je,_n=Je;N(\"H\",[\"HH\",2],0,\"hour\"),N(\"h\",[\"hh\",2],0,ft),N(\"k\",[\"kk\",2],0,function(){return this.hours()||24}),N(\"hmm\",0,0,function(){return\"\"+ft.apply(this)+Y(this.minutes(),2)}),N(\"hmmss\",0,0,function(){return\"\"+ft.apply(this)+Y(this.minutes(),2)+Y(this.seconds(),2)}),N(\"Hmm\",0,0,function(){return\"\"+this.hours()+Y(this.minutes(),2)}),N(\"Hmmss\",0,0,function(){return\"\"+this.hours()+Y(this.minutes(),2)+Y(this.seconds(),2)}),gt(\"a\",!0),gt(\"A\",!1),T(\"hour\",\"h\"),O(\"hour\",13),E(\"a\",mt),E(\"A\",mt),E(\"H\",Be),E(\"h\",Be),E(\"k\",Be),E(\"HH\",Be,We),E(\"hh\",Be,We),E(\"kk\",Be,We),E(\"hmm\",Ve),E(\"hmmss\",He),E(\"Hmm\",Ve),E(\"Hmmss\",He),G([\"H\",\"HH\"],nn),G([\"k\",\"kk\"],function(t,e,n){var i=_(t);e[nn]=24===i?0:i}),G([\"a\",\"A\"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),G([\"h\",\"hh\"],function(t,e,n){e[nn]=_(t),g(n).bigHour=!0}),G(\"hmm\",function(t,e,n){var i=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i)),g(n).bigHour=!0}),G(\"hmmss\",function(t,e,n){var i=t.length-4,a=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i,2)),e[rn]=_(t.substr(a)),g(n).bigHour=!0}),G(\"Hmm\",function(t,e,n){var i=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i))}),G(\"Hmmss\",function(t,e,n){var i=t.length-4,a=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i,2)),e[rn]=_(t.substr(a))});var kn,wn=R(\"Hours\",!0),Mn={calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},longDateFormat:{LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},invalidDate:\"Invalid date\",ordinal:\"%d\",dayOfMonthOrdinalParse:/\\d{1,2}/,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},months:cn,monthsShort:hn,week:{dow:0,doy:6},weekdays:pn,weekdaysMin:yn,weekdaysShort:vn,meridiemParse:/[ap]\\.?m?\\.?/i},Sn={},Dn={},Cn=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,Pn=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,Tn=/Z|[+-]\\d\\d(?::?\\d\\d)?/,An=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,!1],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,!1],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,!1],[\"YYYYDDD\",/\\d{7}/]],In=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]],On=/^\\/?Date\\((\\-?\\d+)/i,Fn=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;n.createFromInputFallback=M(\"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.\",function(t){t._d=new Date(t._i+(t._useUTC?\" UTC\":\"\"))}),n.ISO_8601=function(){},n.RFC_2822=function(){};var Rn=M(\"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var t=Nt.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:p()}),Ln=M(\"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var t=Nt.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:p()}),Wn=[\"year\",\"quarter\",\"month\",\"week\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"];jt(\"Z\",\":\"),jt(\"ZZ\",\"\"),E(\"Z\",Xe),E(\"ZZ\",Xe),G([\"Z\",\"ZZ\"],function(t,e,n){n._useUTC=!0,n._tzm=Ut(Xe,t)});var Yn=/([\\+\\-]|\\d\\d)/gi;n.updateOffset=function(){};var Nn=/^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/,zn=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Xt.fn=Vt.prototype,Xt.invalid=function(){return Xt(NaN)};var Bn=$t(1,\"add\"),Vn=$t(-1,\"subtract\");n.defaultFormat=\"YYYY-MM-DDTHH:mm:ssZ\",n.defaultFormatUtc=\"YYYY-MM-DDTHH:mm:ss[Z]\";var Hn=M(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(t){return void 0===t?this.localeData():this.locale(t)});N(0,[\"gg\",2],0,function(){return this.weekYear()%100}),N(0,[\"GG\",2],0,function(){return this.isoWeekYear()%100}),ae(\"gggg\",\"weekYear\"),ae(\"ggggg\",\"weekYear\"),ae(\"GGGG\",\"isoWeekYear\"),ae(\"GGGGG\",\"isoWeekYear\"),T(\"weekYear\",\"gg\"),T(\"isoWeekYear\",\"GG\"),O(\"weekYear\",1),O(\"isoWeekYear\",1),E(\"G\",Ge),E(\"g\",Ge),E(\"GG\",Be,We),E(\"gg\",Be,We),E(\"GGGG\",je,Ne),E(\"gggg\",je,Ne),E(\"GGGGG\",Ue,ze),E(\"ggggg\",Ue,ze),Z([\"gggg\",\"ggggg\",\"GGGG\",\"GGGGG\"],function(t,e,n,i){e[i.substr(0,2)]=_(t)}),Z([\"gg\",\"GG\"],function(t,e,i,a){e[a]=n.parseTwoDigitYear(t)}),N(\"Q\",0,\"Qo\",\"quarter\"),T(\"quarter\",\"Q\"),O(\"quarter\",7),E(\"Q\",Le),G(\"Q\",function(t,e){e[tn]=3*(_(t)-1)}),N(\"D\",[\"DD\",2],\"Do\",\"date\"),T(\"date\",\"D\"),O(\"date\",9),E(\"D\",Be),E(\"DD\",Be,We),E(\"Do\",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),G([\"D\",\"DD\"],en),G(\"Do\",function(t,e){e[en]=_(t.match(Be)[0],10)});var En=R(\"Date\",!0);N(\"DDD\",[\"DDDD\",3],\"DDDo\",\"dayOfYear\"),T(\"dayOfYear\",\"DDD\"),O(\"dayOfYear\",4),E(\"DDD\",Ee),E(\"DDDD\",Ye),G([\"DDD\",\"DDDD\"],function(t,e,n){n._dayOfYear=_(t)}),N(\"m\",[\"mm\",2],0,\"minute\"),T(\"minute\",\"m\"),O(\"minute\",14),E(\"m\",Be),E(\"mm\",Be,We),G([\"m\",\"mm\"],an);var jn=R(\"Minutes\",!1);N(\"s\",[\"ss\",2],0,\"second\"),T(\"second\",\"s\"),O(\"second\",15),E(\"s\",Be),E(\"ss\",Be,We),G([\"s\",\"ss\"],rn);var Un=R(\"Seconds\",!1);N(\"S\",0,0,function(){return~~(this.millisecond()/100)}),N(0,[\"SS\",2],0,function(){return~~(this.millisecond()/10)}),N(0,[\"SSS\",3],0,\"millisecond\"),N(0,[\"SSSS\",4],0,function(){return 10*this.millisecond()}),N(0,[\"SSSSS\",5],0,function(){return 100*this.millisecond()}),N(0,[\"SSSSSS\",6],0,function(){return 1e3*this.millisecond()}),N(0,[\"SSSSSSS\",7],0,function(){return 1e4*this.millisecond()}),N(0,[\"SSSSSSSS\",8],0,function(){return 1e5*this.millisecond()}),N(0,[\"SSSSSSSSS\",9],0,function(){return 1e6*this.millisecond()}),T(\"millisecond\",\"ms\"),O(\"millisecond\",16),E(\"S\",Ee,Le),E(\"SS\",Ee,We),E(\"SSS\",Ee,Ye);var qn;for(qn=\"SSSS\";qn.length<=9;qn+=\"S\")E(qn,qe);for(qn=\"S\";qn.length<=9;qn+=\"S\")G(qn,function(t,e){e[on]=_(1e3*(\"0.\"+t))});var Gn=R(\"Milliseconds\",!1);N(\"z\",0,0,\"zoneAbbr\"),N(\"zz\",0,0,\"zoneName\");var Zn=y.prototype;Zn.add=Bn,Zn.calendar=function(t,e){var i=t||Nt(),a=qt(i,this).startOf(\"day\"),r=n.calendarFormat(this,a)||\"sameElse\",o=e&&(D(e[r])?e[r].call(this,i):e[r]);return this.format(o||this.localeData().calendar(r,this,Nt(i)))},Zn.clone=function(){return new y(this)},Zn.diff=function(t,e,n){var i,a,r,o;return this.isValid()&&(i=qt(t,this)).isValid()?(a=6e4*(i.utcOffset()-this.utcOffset()),\"year\"===(e=A(e))||\"month\"===e||\"quarter\"===e?(o=ee(this,i),\"quarter\"===e?o/=3:\"year\"===e&&(o/=12)):(r=this-i,o=\"second\"===e?r/1e3:\"minute\"===e?r/6e4:\"hour\"===e?r/36e5:\"day\"===e?(r-a)/864e5:\"week\"===e?(r-a)/6048e5:r),n?o:x(o)):NaN},Zn.endOf=function(t){return void 0===(t=A(t))||\"millisecond\"===t?this:(\"date\"===t&&(t=\"day\"),this.startOf(t).add(1,\"isoWeek\"===t?\"week\":t).subtract(1,\"ms\"))},Zn.format=function(t){t||(t=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var e=V(this,t);return this.localeData().postformat(e)},Zn.from=function(t,e){return this.isValid()&&(b(t)&&t.isValid()||Nt(t).isValid())?Xt({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Zn.fromNow=function(t){return this.from(Nt(),t)},Zn.to=function(t,e){return this.isValid()&&(b(t)&&t.isValid()||Nt(t).isValid())?Xt({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Zn.toNow=function(t){return this.to(Nt(),t)},Zn.get=function(t){return t=A(t),D(this[t])?this[t]():this},Zn.invalidAt=function(){return g(this).overflow},Zn.isAfter=function(t,e){var n=b(t)?t:Nt(t);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(e=A(o(e)?\"millisecond\":e))?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf())},Zn.isBefore=function(t,e){var n=b(t)?t:Nt(t);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(e=A(o(e)?\"millisecond\":e))?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf())},Zn.isBetween=function(t,e,n,i){return(\"(\"===(i=i||\"()\")[0]?this.isAfter(t,n):!this.isBefore(t,n))&&(\")\"===i[1]?this.isBefore(e,n):!this.isAfter(e,n))},Zn.isSame=function(t,e){var n,i=b(t)?t:Nt(t);return!(!this.isValid()||!i.isValid())&&(\"millisecond\"===(e=A(e||\"millisecond\"))?this.valueOf()===i.valueOf():(n=i.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf()))},Zn.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},Zn.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},Zn.isValid=function(){return m(this)},Zn.lang=Hn,Zn.locale=ne,Zn.localeData=ie,Zn.max=Ln,Zn.min=Rn,Zn.parsingFlags=function(){return c({},g(this))},Zn.set=function(t,e){if(\"object\"==typeof t)for(var n=F(t=I(t)),i=0;i<n.length;i++)this[n[i].unit](t[n[i].unit]);else if(t=A(t),D(this[t]))return this[t](e);return this},Zn.startOf=function(t){switch(t=A(t)){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":case\"date\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}return\"week\"===t&&this.weekday(0),\"isoWeek\"===t&&this.isoWeekday(1),\"quarter\"===t&&this.month(3*Math.floor(this.month()/3)),this},Zn.subtract=Vn,Zn.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},Zn.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},Zn.toDate=function(){return new Date(this.valueOf())},Zn.toISOString=function(){if(!this.isValid())return null;var t=this.clone().utc();return t.year()<0||t.year()>9999?V(t,\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\"):D(Date.prototype.toISOString)?this.toDate().toISOString():V(t,\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")},Zn.inspect=function(){if(!this.isValid())return\"moment.invalid(/* \"+this._i+\" */)\";var t=\"moment\",e=\"\";this.isLocal()||(t=0===this.utcOffset()?\"moment.utc\":\"moment.parseZone\",e=\"Z\");var n=\"[\"+t+'(\"]',i=0<=this.year()&&this.year()<=9999?\"YYYY\":\"YYYYYY\",a=e+'[\")]';return this.format(n+i+\"-MM-DD[T]HH:mm:ss.SSS\"+a)},Zn.toJSON=function(){return this.isValid()?this.toISOString():null},Zn.toString=function(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")},Zn.unix=function(){return Math.floor(this.valueOf()/1e3)},Zn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Zn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Zn.year=mn,Zn.isLeapYear=function(){return nt(this.year())},Zn.weekYear=function(t){return re.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Zn.isoWeekYear=function(t){return re.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Zn.quarter=Zn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Zn.month=$,Zn.daysInMonth=function(){return J(this.year(),this.month())},Zn.week=Zn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),\"d\")},Zn.isoWeek=Zn.isoWeeks=function(t){var e=st(this,1,4).week;return null==t?e:this.add(7*(t-e),\"d\")},Zn.weeksInYear=function(){var t=this.localeData()._week;return lt(this.year(),t.dow,t.doy)},Zn.isoWeeksInYear=function(){return lt(this.year(),1,4)},Zn.date=En,Zn.day=Zn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=ut(t,this.localeData()),this.add(t-e,\"d\")):e},Zn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,\"d\")},Zn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=dt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Zn.dayOfYear=function(t){var e=Math.round((this.clone().startOf(\"day\")-this.clone().startOf(\"year\"))/864e5)+1;return null==t?e:this.add(t-e,\"d\")},Zn.hour=Zn.hours=wn,Zn.minute=Zn.minutes=jn,Zn.second=Zn.seconds=Un,Zn.millisecond=Zn.milliseconds=Gn,Zn.utcOffset=function(t,e,i){var a,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if(\"string\"==typeof t){if(null===(t=Ut(Xe,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(a=Gt(this)),this._offset=t,this._isUTC=!0,null!=a&&this.add(a,\"m\"),r!==t&&(!e||this._changeInProgress?te(this,Xt(t-r,\"m\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,n.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Gt(this)},Zn.utc=function(t){return this.utcOffset(0,t)},Zn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Gt(this),\"m\")),this},Zn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if(\"string\"==typeof this._i){var t=Ut(Ze,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Zn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Nt(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Zn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Zn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Zn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Zn.isUtc=Zt,Zn.isUTC=Zt,Zn.zoneAbbr=function(){return this._isUTC?\"UTC\":\"\"},Zn.zoneName=function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},Zn.dates=M(\"dates accessor is deprecated. Use date instead.\",En),Zn.months=M(\"months accessor is deprecated. Use month instead\",$),Zn.years=M(\"years accessor is deprecated. Use year instead\",mn),Zn.zone=M(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",function(t,e){return null!=t?(\"string\"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),Zn.isDSTShifted=M(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),(t=Lt(t))._a){var e=t._isUTC?h(t._a):Nt(t._a);this._isDSTShifted=this.isValid()&&k(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var Xn=P.prototype;Xn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return D(i)?i.call(e,n):i},Xn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},Xn.invalidDate=function(){return this._invalidDate},Xn.ordinal=function(t){return this._ordinal.replace(\"%d\",t)},Xn.preparse=se,Xn.postformat=se,Xn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return D(a)?a(t,e,n,i):a.replace(/%d/i,t)},Xn.pastFuture=function(t,e){var n=this._relativeTime[t>0?\"future\":\"past\"];return D(n)?n(e):n.replace(/%s/i,e)},Xn.set=function(t){var e,n;for(n in t)D(e=t[n])?this[n]=e:this[\"_\"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+\"|\"+/\\d{1,2}/.source)},Xn.months=function(t,e){return t?i(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||dn).test(e)?\"format\":\"standalone\"][t.month()]:i(this._months)?this._months:this._months.standalone},Xn.monthsShort=function(t,e){return t?i(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[dn.test(e)?\"format\":\"standalone\"][t.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Xn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return K.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=h([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp(\"^\"+this.months(a,\"\").replace(\".\",\"\")+\"$\",\"i\"),this._shortMonthsParse[i]=new RegExp(\"^\"+this.monthsShort(a,\"\").replace(\".\",\"\")+\"$\",\"i\")),n||this._monthsParse[i]||(r=\"^\"+this.months(a,\"\")+\"|^\"+this.monthsShort(a,\"\"),this._monthsParse[i]=new RegExp(r.replace(\".\",\"\"),\"i\")),n&&\"MMMM\"===e&&this._longMonthsParse[i].test(t))return i;if(n&&\"MMM\"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Xn.monthsRegex=function(t){return this._monthsParseExact?(d(this,\"_monthsRegex\")||tt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,\"_monthsRegex\")||(this._monthsRegex=gn),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Xn.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,\"_monthsRegex\")||tt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,\"_monthsShortRegex\")||(this._monthsShortRegex=fn),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Xn.week=function(t){return st(t,this._week.dow,this._week.doy).week},Xn.firstDayOfYear=function(){return this._week.doy},Xn.firstDayOfWeek=function(){return this._week.dow},Xn.weekdays=function(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?\"format\":\"standalone\"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone},Xn.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},Xn.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},Xn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return ct.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=h([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp(\"^\"+this.weekdays(a,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._shortWeekdaysParse[i]=new RegExp(\"^\"+this.weekdaysShort(a,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._minWeekdaysParse[i]=new RegExp(\"^\"+this.weekdaysMin(a,\"\").replace(\".\",\".?\")+\"$\",\"i\")),this._weekdaysParse[i]||(r=\"^\"+this.weekdays(a,\"\")+\"|^\"+this.weekdaysShort(a,\"\")+\"|^\"+this.weekdaysMin(a,\"\"),this._weekdaysParse[i]=new RegExp(r.replace(\".\",\"\"),\"i\")),n&&\"dddd\"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&\"ddd\"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&\"dd\"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Xn.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,\"_weekdaysRegex\")||ht.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,\"_weekdaysRegex\")||(this._weekdaysRegex=bn),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Xn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,\"_weekdaysRegex\")||ht.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,\"_weekdaysShortRegex\")||(this._weekdaysShortRegex=xn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Xn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,\"_weekdaysRegex\")||ht.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,\"_weekdaysMinRegex\")||(this._weekdaysMinRegex=_n),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Xn.isPM=function(t){return\"p\"===(t+\"\").toLowerCase().charAt(0)},Xn.meridiem=function(t,e,n){return t>11?n?\"pm\":\"PM\":n?\"am\":\"AM\"},bt(\"en\",{dayOfMonthOrdinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?\"th\":1===e?\"st\":2===e?\"nd\":3===e?\"rd\":\"th\")}}),n.lang=M(\"moment.lang is deprecated. Use moment.locale instead.\",bt),n.langData=M(\"moment.langData is deprecated. Use moment.localeData instead.\",_t);var Jn=Math.abs,Kn=me(\"ms\"),Qn=me(\"s\"),$n=me(\"m\"),ti=me(\"h\"),ei=me(\"d\"),ni=me(\"w\"),ii=me(\"M\"),ai=me(\"y\"),ri=pe(\"milliseconds\"),oi=pe(\"seconds\"),si=pe(\"minutes\"),li=pe(\"hours\"),ui=pe(\"days\"),di=pe(\"months\"),ci=pe(\"years\"),hi=Math.round,fi={ss:44,s:45,m:45,h:22,d:26,M:11},gi=Math.abs,mi=Vt.prototype;return mi.isValid=function(){return this._isValid},mi.abs=function(){var t=this._data;return this._milliseconds=Jn(this._milliseconds),this._days=Jn(this._days),this._months=Jn(this._months),t.milliseconds=Jn(t.milliseconds),t.seconds=Jn(t.seconds),t.minutes=Jn(t.minutes),t.hours=Jn(t.hours),t.months=Jn(t.months),t.years=Jn(t.years),this},mi.add=function(t,e){return ce(this,t,e,1)},mi.subtract=function(t,e){return ce(this,t,e,-1)},mi.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(\"month\"===(t=A(t))||\"year\"===t)return e=this._days+i/864e5,n=this._months+fe(e),\"month\"===t?n:n/12;switch(e=this._days+Math.round(ge(this._months)),t){case\"week\":return e/7+i/6048e5;case\"day\":return e+i/864e5;case\"hour\":return 24*e+i/36e5;case\"minute\":return 1440*e+i/6e4;case\"second\":return 86400*e+i/1e3;case\"millisecond\":return Math.floor(864e5*e)+i;default:throw new Error(\"Unknown unit \"+t)}},mi.asMilliseconds=Kn,mi.asSeconds=Qn,mi.asMinutes=$n,mi.asHours=ti,mi.asDays=ei,mi.asWeeks=ni,mi.asMonths=ii,mi.asYears=ai,mi.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN},mi._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*he(ge(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=x(r/1e3),l.seconds=t%60,e=x(t/60),l.minutes=e%60,n=x(e/60),l.hours=n%24,o+=x(n/24),a=x(fe(o)),s+=a,o-=he(ge(a)),i=x(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},mi.get=function(t){return t=A(t),this.isValid()?this[t+\"s\"]():NaN},mi.milliseconds=ri,mi.seconds=oi,mi.minutes=si,mi.hours=li,mi.days=ui,mi.weeks=function(){return x(this.days()/7)},mi.months=di,mi.years=ci,mi.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=ye(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},mi.toISOString=be,mi.toString=be,mi.toJSON=be,mi.locale=ne,mi.localeData=ie,mi.toIsoString=M(\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\",be),mi.lang=Hn,N(\"X\",0,0,\"unix\"),N(\"x\",0,0,\"valueOf\"),E(\"x\",Ge),E(\"X\",/[+-]?\\d+(\\.\\d{1,3})?/),G(\"X\",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),G(\"x\",function(t,e,n){n._d=new Date(_(t))}),n.version=\"2.18.1\",function(t){xe=t}(Nt),n.fn=Zn,n.min=function(){return zt(\"isBefore\",[].slice.call(arguments,0))},n.max=function(){return zt(\"isAfter\",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=h,n.unix=function(t){return Nt(1e3*t)},n.months=function(t,e){return ue(t,e,\"months\")},n.isDate=l,n.locale=bt,n.invalid=p,n.duration=Xt,n.isMoment=b,n.weekdays=function(t,e,n){return de(t,e,n,\"weekdays\")},n.parseZone=function(){return Nt.apply(null,arguments).parseZone()},n.localeData=_t,n.isDuration=Ht,n.monthsShort=function(t,e){return ue(t,e,\"monthsShort\")},n.weekdaysMin=function(t,e,n){return de(t,e,n,\"weekdaysMin\")},n.defineLocale=xt,n.updateLocale=function(t,e){if(null!=e){var n,i=Mn;null!=Sn[t]&&(i=Sn[t]._config),(n=new P(e=C(i,e))).parentLocale=Sn[t],Sn[t]=n,bt(t)}else null!=Sn[t]&&(null!=Sn[t].parentLocale?Sn[t]=Sn[t].parentLocale:null!=Sn[t]&&delete Sn[t]);return Sn[t]},n.locales=function(){return Pe(Sn)},n.weekdaysShort=function(t,e,n){return de(t,e,n,\"weekdaysShort\")},n.normalizeUnits=A,n.relativeTimeRounding=function(t){return void 0===t?hi:\"function\"==typeof t&&(hi=t,!0)},n.relativeTimeThreshold=function(t,e){return void 0!==fi[t]&&(void 0===e?fi[t]:(fi[t]=e,\"s\"===t&&(fi.ss=e-1),!0))},n.calendarFormat=function(t,e){var n=t.diff(e,\"days\",!0);return n<-6?\"sameElse\":n<-1?\"lastWeek\":n<0?\"lastDay\":n<1?\"sameDay\":n<2?\"nextDay\":n<7?\"nextWeek\":\"sameElse\"},n.prototype=Zn,n})},{}],7:[function(t,e,n){var i=t(29)();i.helpers=t(45),t(27)(i),i.defaults=t(25),i.Element=t(26),i.elements=t(40),i.Interaction=t(28),i.platform=t(48),t(31)(i),t(22)(i),t(23)(i),t(24)(i),t(30)(i),t(33)(i),t(32)(i),t(35)(i),t(54)(i),t(52)(i),t(53)(i),t(55)(i),t(56)(i),t(57)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(21)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i);var a=[];a.push(t(49)(i),t(50)(i),t(51)(i)),i.plugins.register(a),i.platform.initialize(),e.exports=i,\"undefined\"!=typeof window&&(window.Chart=i),i.canvasHelpers=i.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(t,e,n){\"use strict\";e.exports=function(t){t.Bar=function(e,n){return n.type=\"bar\",new t(e,n)}}},{}],9:[function(t,e,n){\"use strict\";e.exports=function(t){t.Bubble=function(e,n){return n.type=\"bubble\",new t(e,n)}}},{}],10:[function(t,e,n){\"use strict\";e.exports=function(t){t.Doughnut=function(e,n){return n.type=\"doughnut\",new t(e,n)}}},{}],11:[function(t,e,n){\"use strict\";e.exports=function(t){t.Line=function(e,n){return n.type=\"line\",new t(e,n)}}},{}],12:[function(t,e,n){\"use strict\";e.exports=function(t){t.PolarArea=function(e,n){return n.type=\"polarArea\",new t(e,n)}}},{}],13:[function(t,e,n){\"use strict\";e.exports=function(t){t.Radar=function(e,n){return n.type=\"radar\",new t(e,n)}}},{}],14:[function(t,e,n){\"use strict\";e.exports=function(t){t.Scatter=function(e,n){return n.type=\"scatter\",new t(e,n)}}},{}],15:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"bar\",{hover:{mode:\"label\"},scales:{xAxes:[{type:\"category\",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:\"linear\"}]}}),i._set(\"horizontalBar\",{hover:{mode:\"index\",axis:\"y\"},scales:{xAxes:[{type:\"linear\",position:\"bottom\"}],yAxes:[{position:\"left\",type:\"category\",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:\"left\"}},tooltips:{callbacks:{title:function(t,e){var n=\"\";return t.length>0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(n=e.labels[t[0].index])),n},label:function(t,e){return(e.datasets[t.datasetIndex].label||\"\")+\": \"+t.xLabel}},mode:\"index\",axis:\"y\"}}),e.exports=function(t){t.controllers.bar=t.DatasetController.extend({dataElementType:a.Rectangle,initialize:function(){var e,n=this;t.DatasetController.prototype.initialize.apply(n,arguments),(e=n.getMeta()).stack=n.getDataset().stack,e.bar=!0},update:function(t){var e,n,i=this,a=i.getMeta().data;for(i._ruler=i.getRuler(),e=0,n=a.length;e<n;++e)i.updateElement(a[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.chart,o=i.getMeta(),s=i.getDataset(),l=t.custom||{},u=a.options.elements.rectangle;t._xScale=i.getScaleForId(o.xAxisID),t._yScale=i.getScaleForId(o.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={datasetLabel:s.label,label:a.data.labels[e],borderSkipped:l.borderSkipped?l.borderSkipped:u.borderSkipped,backgroundColor:l.backgroundColor?l.backgroundColor:r.valueAtIndexOrDefault(s.backgroundColor,e,u.backgroundColor),borderColor:l.borderColor?l.borderColor:r.valueAtIndexOrDefault(s.borderColor,e,u.borderColor),borderWidth:l.borderWidth?l.borderWidth:r.valueAtIndexOrDefault(s.borderWidth,e,u.borderWidth)},i.updateElementGeometry(t,e,n),t.pivot()},updateElementGeometry:function(t,e,n){var i=this,a=t._model,r=i.getValueScale(),o=r.getBasePixel(),s=r.isHorizontal(),l=i._ruler||i.getRuler(),u=i.calculateBarValuePixels(i.index,e),d=i.calculateBarIndexPixels(i.index,e,l);a.horizontal=s,a.base=n?o:u.base,a.x=s?n?o:u.head:d.center,a.y=s?d.center:n?o:u.head,a.height=s?d.size:void 0,a.width=s?void 0:d.size},getValueScaleId:function(){return this.getMeta().yAxisID},getIndexScaleId:function(){return this.getMeta().xAxisID},getValueScale:function(){return this.getScaleForId(this.getValueScaleId())},getIndexScale:function(){return this.getScaleForId(this.getIndexScaleId())},getStackCount:function(t){var e,n,i=this,a=i.chart,r=i.getIndexScale().options.stacked,o=void 0===t?a.data.datasets.length:t+1,s=[];for(e=0;e<o;++e)(n=a.getDatasetMeta(e)).bar&&a.isDatasetVisible(e)&&(!1===r||!0===r&&-1===s.indexOf(n.stack)||void 0===r&&(void 0===n.stack||-1===s.indexOf(n.stack)))&&s.push(n.stack);return s.length},getStackIndex:function(t){return this.getStackCount(t)-1},getRuler:function(){var t,e,n=this,i=n.getIndexScale(),a=n.getStackCount(),r=n.index,o=[],s=i.isHorizontal(),l=s?i.left:i.top,u=l+(s?i.width:i.height);for(t=0,e=n.getMeta().data.length;t<e;++t)o.push(i.getPixelForValue(null,t,r));return{pixels:o,start:l,end:u,stackCount:a,scale:i}},calculateBarValuePixels:function(t,e){var n,i,a,r,o,s,l=this,u=l.chart,d=l.getMeta(),c=l.getValueScale(),h=u.data.datasets,f=c.getRightValue(h[t].data[e]),g=c.options.stacked,m=d.stack,p=0;if(g||void 0===g&&void 0!==m)for(n=0;n<t;++n)(i=u.getDatasetMeta(n)).bar&&i.stack===m&&i.controller.getValueScaleId()===c.id&&u.isDatasetVisible(n)&&(a=c.getRightValue(h[n].data[e]),(f<0&&a<0||f>=0&&a>0)&&(p+=a));return r=c.getPixelForValue(p),o=c.getPixelForValue(p+f),s=(o-r)/2,{size:s,base:r,head:o,center:o+s/2}},calculateBarIndexPixels:function(t,e,n){var i,a,o,s,l,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],m=f.length,p=n.start,v=n.end;return 1===m?(i=g>p?g-p:v-g,a=g<v?v-g:g-p):(e>0&&(i=(g-f[e-1])/2,e===m-1&&(a=i)),e<m-1&&(a=(f[e+1]-g)/2,0===e&&(i=a))),o=i*c.categoryPercentage,s=a*c.categoryPercentage,l=(o+s)/n.stackCount,u=l*c.barPercentage,u=Math.min(r.valueOrDefault(c.barThickness,u),r.valueOrDefault(c.maxBarThickness,1/0)),g-=o,g+=l*h,g+=(l-u)/2,{size:u,base:g,head:g+u,center:g+u/2}},draw:function(){var t=this,e=t.chart,n=t.getValueScale(),i=t.getMeta().data,a=t.getDataset(),o=i.length,s=0;for(r.canvas.clipArea(e.ctx,e.chartArea);s<o;++s)isNaN(n.getRightValue(a.data[s]))||i[s].draw();r.canvas.unclipArea(e.ctx)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model;a.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:r.valueAtIndexOrDefault(e.hoverBackgroundColor,n,r.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor?i.hoverBorderColor:r.valueAtIndexOrDefault(e.hoverBorderColor,n,r.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:r.valueAtIndexOrDefault(e.hoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,o=this.chart.options.elements.rectangle;a.backgroundColor=i.backgroundColor?i.backgroundColor:r.valueAtIndexOrDefault(e.backgroundColor,n,o.backgroundColor),a.borderColor=i.borderColor?i.borderColor:r.valueAtIndexOrDefault(e.borderColor,n,o.borderColor),a.borderWidth=i.borderWidth?i.borderWidth:r.valueAtIndexOrDefault(e.borderWidth,n,o.borderWidth)}}),t.controllers.horizontalBar=t.controllers.bar.extend({getValueScaleId:function(){return this.getMeta().xAxisID},getIndexScaleId:function(){return this.getMeta().yAxisID}})}},{25:25,40:40,45:45}],16:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"bubble\",{hover:{mode:\"single\"},scales:{xAxes:[{type:\"linear\",position:\"bottom\",id:\"x-axis-0\"}],yAxes:[{type:\"linear\",position:\"left\",id:\"y-axis-0\"}]},tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){var n=e.datasets[t.datasetIndex].label||\"\",i=e.datasets[t.datasetIndex].data[t.index];return n+\": (\"+t.xLabel+\", \"+t.yLabel+\", \"+i.r+\")\"}}}}),e.exports=function(t){t.controllers.bubble=t.DatasetController.extend({dataElementType:a.Point,update:function(t){var e=this,n=e.getMeta().data;r.each(n,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveElementOptions(t,e),u=i.getDataset().data[e],d=i.index,c=n?o.getPixelForDecimal(.5):o.getPixelForValue(\"object\"==typeof u?u:NaN,e,d),h=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,radius:n?0:l.radius,skip:r.skip||isNaN(c)||isNaN(h),x:c,y:h},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options;e.backgroundColor=r.valueOrDefault(n.hoverBackgroundColor,r.getHoverColor(n.backgroundColor)),e.borderColor=r.valueOrDefault(n.hoverBorderColor,r.getHoverColor(n.borderColor)),e.borderWidth=r.valueOrDefault(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},removeHoverStyle:function(t){var e=t._model,n=t._options;e.backgroundColor=n.backgroundColor,e.borderColor=n.borderColor,e.borderWidth=n.borderWidth,e.radius=n.radius},_resolveElementOptions:function(t,e){var n,i,a,o=this,s=o.chart,l=s.data.datasets[o.index],u=t.custom||{},d=s.options.elements.point,c=r.options.resolve,h=l.data[e],f={},g={chart:s,dataIndex:e,dataset:l,datasetIndex:o.index},m=[\"backgroundColor\",\"borderColor\",\"borderWidth\",\"hoverBackgroundColor\",\"hoverBorderColor\",\"hoverBorderWidth\",\"hoverRadius\",\"hitRadius\",\"pointStyle\"];for(n=0,i=m.length;n<i;++n)f[a=m[n]]=c([u[a],l[a],d[a]],g,e);return f.radius=c([u.radius,h?h.r:void 0,l.radius,d.radius],g,e),f}})}},{25:25,40:40,45:45}],17:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"doughnut\",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:\"single\"},legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r<i[0].data.length;++r)e.push('<li><span style=\"background-color:'+i[0].backgroundColor[r]+'\"></span>'),a[r]&&e.push(a[r]),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[i],l=s&&s.custom||{},u=r.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:u(o.backgroundColor,i,d.backgroundColor),strokeStyle:l.borderColor?l.borderColor:u(o.borderColor,i,d.borderColor),lineWidth:l.borderWidth?l.borderWidth:u(o.borderWidth,i,d.borderWidth),hidden:isNaN(o.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){var n=e.labels[t.index],i=\": \"+e.datasets[t.datasetIndex].data[t.index];return r.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}}),i._set(\"pie\",r.clone(i.doughnut)),i._set(\"pie\",{cutoutPercentage:0}),e.exports=function(t){t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:a.Arc,linkScales:r.noop,getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e=this,n=e.chart,i=n.chartArea,a=n.options,o=a.elements.arc,s=i.right-i.left-o.borderWidth,l=i.bottom-i.top-o.borderWidth,u=Math.min(s,l),d={x:0,y:0},c=e.getMeta(),h=a.cutoutPercentage,f=a.circumference;if(f<2*Math.PI){var g=a.rotation%(2*Math.PI),m=(g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0))+f,p={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(m),y:Math.sin(m)},y=g<=0&&m>=0||g<=2*Math.PI&&2*Math.PI<=m,b=g<=.5*Math.PI&&.5*Math.PI<=m||g<=2.5*Math.PI&&2.5*Math.PI<=m,x=g<=-Math.PI&&-Math.PI<=m||g<=Math.PI&&Math.PI<=m,_=g<=.5*-Math.PI&&.5*-Math.PI<=m||g<=1.5*Math.PI&&1.5*Math.PI<=m,k=h/100,w={x:x?-1:Math.min(p.x*(p.x<0?1:k),v.x*(v.x<0?1:k)),y:_?-1:Math.min(p.y*(p.y<0?1:k),v.y*(v.y<0?1:k))},M={x:y?1:Math.max(p.x*(p.x>0?1:k),v.x*(v.x>0?1:k)),y:b?1:Math.max(p.y*(p.y>0?1:k),v.y*(v.y>0?1:k))},S={width:.5*(M.x-w.x),height:.5*(M.y-w.y)};u=Math.min(s/S.width,l/S.height),d={x:-.5*(M.x+w.x),y:-.5*(M.y+w.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),r.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,o=a.chartArea,s=a.options,l=s.animation,u=(o.left+o.right)/2,d=(o.top+o.bottom)/2,c=s.rotation,h=s.rotation,f=i.getDataset(),g=n&&l.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(s.circumference/(2*Math.PI)),m=n&&l.animateScale?0:i.innerRadius,p=n&&l.animateScale?0:i.outerRadius,v=r.valueAtIndexOrDefault;r.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:p,innerRadius:m,label:v(f.label,e,a.data.labels[e])}});var y=t._model;this.removeHoverStyle(t),n&&l.animateRotate||(y.startAngle=0===e?s.rotation:i.getMeta().data[e-1]._model.endAngle,y.endAngle=y.startAngle+y.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return r.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,r=t.length,o=0;o<r;o++)e=t[o]._model?t[o]._model.borderWidth:0,i=(n=t[o]._chart?t[o]._chart.config.data.datasets[a].hoverBorderWidth:0)>(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"line\",{showLines:!0,spanGaps:!1,hover:{mode:\"label\"},scales:{xAxes:[{type:\"category\",id:\"x-axis-0\"}],yAxes:[{type:\"linear\",id:\"y-axis-0\"}]}}),e.exports=function(t){function e(t,e){return r.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,o=this,s=o.getMeta(),l=s.dataset,u=s.data||[],d=o.chart.options,c=d.elements.line,h=o.getScaleForId(s.yAxisID),f=o.getDataset(),g=e(f,d);for(g&&(a=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=o.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:r.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:r.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:r.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},l.pivot()),n=0,i=u.length;n<i;++n)o.updateElement(u[n],n,t);for(g&&0!==l._model.tension&&o.updateBezierControlPoints(),n=0,i=u.length;n<i;++n)u[n].pivot()},getPointBackgroundColor:function(t,e){var n=this.chart.options.elements.point.backgroundColor,i=this.getDataset(),a=t.custom||{};return a.backgroundColor?n=a.backgroundColor:i.pointBackgroundColor?n=r.valueAtIndexOrDefault(i.pointBackgroundColor,e,n):i.backgroundColor&&(n=i.backgroundColor),n},getPointBorderColor:function(t,e){var n=this.chart.options.elements.point.borderColor,i=this.getDataset(),a=t.custom||{};return a.borderColor?n=a.borderColor:i.pointBorderColor?n=r.valueAtIndexOrDefault(i.pointBorderColor,e,n):i.borderColor&&(n=i.borderColor),n},getPointBorderWidth:function(t,e){var n=this.chart.options.elements.point.borderWidth,i=this.getDataset(),a=t.custom||{};return isNaN(a.borderWidth)?!isNaN(i.pointBorderWidth)||r.isArray(i.pointBorderWidth)?n=r.valueAtIndexOrDefault(i.pointBorderWidth,e,n):isNaN(i.borderWidth)||(n=i.borderWidth):n=a.borderWidth,n},updateElement:function(t,e,n){var i,a,o=this,s=o.getMeta(),l=t.custom||{},u=o.getDataset(),d=o.index,c=u.data[e],h=o.getScaleForId(s.yAxisID),f=o.getScaleForId(s.xAxisID),g=o.chart.options.elements.point;void 0!==u.radius&&void 0===u.pointRadius&&(u.pointRadius=u.radius),void 0!==u.hitRadius&&void 0===u.pointHitRadius&&(u.pointHitRadius=u.hitRadius),i=f.getPixelForValue(\"object\"==typeof c?c:NaN,e,d),a=n?h.getBasePixel():o.calculatePointY(c,e,d),t._xScale=f,t._yScale=h,t._datasetIndex=d,t._index=e,t._model={x:i,y:a,skip:l.skip||isNaN(i)||isNaN(a),radius:l.radius||r.valueAtIndexOrDefault(u.pointRadius,e,g.radius),pointStyle:l.pointStyle||r.valueAtIndexOrDefault(u.pointStyle,e,g.pointStyle),backgroundColor:o.getPointBackgroundColor(t,e),borderColor:o.getPointBorderColor(t,e),borderWidth:o.getPointBorderWidth(t,e),tension:s.dataset._model?s.dataset._model.tension:0,steppedLine:!!s.dataset._model&&s.dataset._model.steppedLine,hitRadius:l.hitRadius||r.valueAtIndexOrDefault(u.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,n){var i,a,r,o=this,s=o.chart,l=o.getMeta(),u=o.getScaleForId(l.yAxisID),d=0,c=0;if(u.options.stacked){for(i=0;i<n;i++)if(a=s.data.datasets[i],\"line\"===(r=s.getDatasetMeta(i)).type&&r.yAxisID===u.id&&s.isDatasetVisible(i)){var h=Number(u.getRightValue(a.data[e]));h<0?c+=h||0:d+=h||0}var f=Number(u.getRightValue(t));return f<0?u.getPixelForValue(c+f):u.getPixelForValue(d+f)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){function t(t,e,n){return Math.max(Math.min(t,n),e)}var e,n,i,a,o=this,s=o.getMeta(),l=o.chart.chartArea,u=s.data||[];if(s.dataset._model.spanGaps&&(u=u.filter(function(t){return!t._model.skip})),\"monotone\"===s.dataset._model.cubicInterpolationMode)r.splineCurveMonotone(u);else for(e=0,n=u.length;e<n;++e)i=u[e]._model,a=r.splineCurve(r.previousItem(u,e)._model,i,r.nextItem(u,e)._model,s.dataset._model.tension),i.controlPointPreviousX=a.previous.x,i.controlPointPreviousY=a.previous.y,i.controlPointNextX=a.next.x,i.controlPointNextY=a.next.y;if(o.chart.options.elements.line.capBezierPoints)for(e=0,n=u.length;e<n;++e)(i=u[e]._model).controlPointPreviousX=t(i.controlPointPreviousX,l.left,l.right),i.controlPointPreviousY=t(i.controlPointPreviousY,l.top,l.bottom),i.controlPointNextX=t(i.controlPointNextX,l.left,l.right),i.controlPointNextY=t(i.controlPointNextY,l.top,l.bottom)},draw:function(){var t=this,n=t.chart,i=t.getMeta(),a=i.data||[],o=n.chartArea,s=a.length,l=0;for(r.canvas.clipArea(n.ctx,o),e(t.getDataset(),n.options)&&i.dataset.draw(),r.canvas.unclipArea(n.ctx);l<s;++l)a[l].draw(o)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model;a.radius=i.hoverRadius||r.valueAtIndexOrDefault(e.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),a.backgroundColor=i.hoverBackgroundColor||r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,n,r.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor||r.valueAtIndexOrDefault(e.pointHoverBorderColor,n,r.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth||r.valueAtIndexOrDefault(e.pointHoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this,n=e.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},o=t._model;void 0!==n.radius&&void 0===n.pointRadius&&(n.pointRadius=n.radius),o.radius=a.radius||r.valueAtIndexOrDefault(n.pointRadius,i,e.chart.options.elements.point.radius),o.backgroundColor=e.getPointBackgroundColor(t,i),o.borderColor=e.getPointBorderColor(t,i),o.borderWidth=e.getPointBorderWidth(t,i)}})}},{25:25,40:40,45:45}],19:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"polarArea\",{scale:{type:\"radialLinear\",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r<i[0].data.length;++r)e.push('<li><span style=\"background-color:'+i[0].backgroundColor[r]+'\"></span>'),a[r]&&e.push(a[r]),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[i].custom||{},l=r.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:l(o.backgroundColor,i,u.backgroundColor),strokeStyle:s.borderColor?s.borderColor:l(o.borderColor,i,u.borderColor),lineWidth:s.borderWidth?s.borderWidth:l(o.borderWidth,i,u.borderWidth),hidden:isNaN(o.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){return e.labels[t.index]+\": \"+t.yLabel}}}}),e.exports=function(t){t.controllers.polarArea=t.DatasetController.extend({dataElementType:a.Arc,linkScales:r.noop,update:function(t){var e=this,n=e.chart,i=n.chartArea,a=e.getMeta(),o=n.options,s=o.elements.arc,l=Math.min(i.right-i.left,i.bottom-i.top);n.outerRadius=Math.max((l-s.borderWidth/2)/2,0),n.innerRadius=Math.max(o.cutoutPercentage?n.outerRadius/100*o.cutoutPercentage:1,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),e.outerRadius=n.outerRadius-n.radiusLength*e.index,e.innerRadius=e.outerRadius-n.radiusLength,a.count=e.countVisibleElements(),r.each(a.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){for(var i=this,a=i.chart,o=i.getDataset(),s=a.options,l=s.animation,u=a.scale,d=a.data.labels,c=i.calculateCircumference(o.data[e]),h=u.xCenter,f=u.yCenter,g=0,m=i.getMeta(),p=0;p<e;++p)isNaN(o.data[p])||m.data[p].hidden||++g;var v=s.startAngle,y=t.hidden?0:u.getDistanceFromCenterForValue(o.data[e]),b=v+c*g,x=b+(t.hidden?0:c),_=l.animateScale?0:u.getDistanceFromCenterForValue(o.data[e]);r.extend(t,{_datasetIndex:i.index,_index:e,_scale:u,_model:{x:h,y:f,innerRadius:0,outerRadius:n?_:y,startAngle:n&&l.animateRotate?v:b,endAngle:n&&l.animateRotate?v:x,label:r.valueAtIndexOrDefault(d,e,d[e])}}),i.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return r.each(e.data,function(e,i){isNaN(t.data[i])||e.hidden||n++}),n},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"radar\",{scale:{type:\"radialLinear\"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:r.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,o=i.custom||{},s=e.getDataset(),l=e.chart.options.elements.line,u=e.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),r.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:o.tension?o.tension:r.valueOrDefault(s.lineTension,l.tension),backgroundColor:o.backgroundColor?o.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:s.borderWidth||l.borderWidth,borderColor:o.borderColor?o.borderColor:s.borderColor||l.borderColor,fill:o.fill?o.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:o.borderDash?o.borderDash:s.borderDash||l.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle}}),n.dataset.pivot(),r.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},o=i.getDataset(),s=i.chart.scale,l=i.chart.options.elements.point,u=s.getPointPositionForValue(e,o.data[e]);void 0!==o.radius&&void 0===o.pointRadius&&(o.pointRadius=o.radius),void 0!==o.hitRadius&&void 0===o.pointHitRadius&&(o.pointHitRadius=o.hitRadius),r.extend(t,{_datasetIndex:i.index,_index:e,_scale:s,_model:{x:n?s.xCenter:u.x,y:n?s.yCenter:u.y,tension:a.tension?a.tension:r.valueOrDefault(o.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:r.valueAtIndexOrDefault(o.pointRadius,e,l.radius),backgroundColor:a.backgroundColor?a.backgroundColor:r.valueAtIndexOrDefault(o.pointBackgroundColor,e,l.backgroundColor),borderColor:a.borderColor?a.borderColor:r.valueAtIndexOrDefault(o.pointBorderColor,e,l.borderColor),borderWidth:a.borderWidth?a.borderWidth:r.valueAtIndexOrDefault(o.pointBorderWidth,e,l.borderWidth),pointStyle:a.pointStyle?a.pointStyle:r.valueAtIndexOrDefault(o.pointStyle,e,l.pointStyle),hitRadius:a.hitRadius?a.hitRadius:r.valueAtIndexOrDefault(o.pointHitRadius,e,l.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();r.each(e.data,function(n,i){var a=n._model,o=r.splineCurve(r.previousItem(e.data,i,!0)._model,a,r.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(o.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(o.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(o.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(o.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:r.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,r.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:r.valueAtIndexOrDefault(e.pointHoverBorderColor,i,r.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:r.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,o=this.chart.options.elements.point;a.radius=n.radius?n.radius:r.valueAtIndexOrDefault(e.pointRadius,i,o.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:r.valueAtIndexOrDefault(e.pointBackgroundColor,i,o.backgroundColor),a.borderColor=n.borderColor?n.borderColor:r.valueAtIndexOrDefault(e.pointBorderColor,i,o.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:r.valueAtIndexOrDefault(e.pointBorderWidth,i,o.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){\"use strict\";t(25)._set(\"scatter\",{hover:{mode:\"single\"},scales:{xAxes:[{id:\"x-axis-1\",type:\"linear\",position:\"bottom\"}],yAxes:[{id:\"y-axis-1\",type:\"linear\",position:\"left\"}]},showLines:!1,tooltips:{callbacks:{title:function(){return\"\"},label:function(t){return\"(\"+t.xLabel+\", \"+t.yLabel+\")\"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{animation:{duration:1e3,easing:\"easeOutQuart\",onProgress:r.noop,onComplete:r.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:\"\",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=r.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=r.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),n=0;t.dropFrames>1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a<i.length;)n=(e=i[a]).chart,e.currentStep=(e.currentStep||0)+t,e.currentStep=Math.min(e.currentStep,e.numSteps),r.callback(e.render,[n,e],n),r.callback(e.onAnimationProgress,[e],n),e.currentStep>=e.numSteps?(r.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,\"animationObject\",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,\"chartInstance\",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){\"use strict\";var i=t(25),a=t(45),r=t(28),o=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function s(t){return\"top\"===t||\"bottom\"===t}var l=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var r=this;i=e(i);var s=o.acquireContext(n,i),l=s&&s.canvas,u=l&&l.height,d=l&&l.width;r.id=a.uid(),r.ctx=s,r.canvas=l,r.config=i,r.width=d,r.height=u,r.aspectRatio=u?d/u:null,r.options=i.options,r._bufferedRender=!1,r.chart=r,r.controller=r,t.instances[r.id]=r,Object.defineProperty(r,\"data\",{get:function(){return r.config.data},set:function(t){r.config.data=t}}),s&&l?(r.initialize(),r.update()):console.error(\"Failed to create chart: can't acquire context from the given item\")},initialize:function(){var t=this;return l.notify(t,\"beforeInit\"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),l.notify(t,\"afterInit\"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,r=n.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(a.getMaximumWidth(i))),s=Math.max(0,Math.floor(r?o/r:a.getMaximumHeight(i)));if((e.width!==o||e.height!==s)&&(i.width=e.width=o,i.height=e.height=s,i.style.width=o+\"px\",i.style.height=s+\"px\",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:o,height:s};l.notify(e,\"resize\",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||\"x-axis-\"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||\"y-axis-\"+e}),n&&(n.id=n.id||\"scale\")},buildScales:function(){var e=this,n=e.options,i=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:\"category\",dposition:\"bottom\"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:\"linear\",dposition:\"left\"}}))),n.scale&&r.push({options:n.scale,dtype:\"radialLinear\",isDefault:!0,dposition:\"chartArea\"}),a.each(r,function(n){var r=n.options,o=a.valueOrDefault(r.type,n.dtype),l=t.scaleService.getScaleConstructor(o);if(l){s(r.position)!==s(n.dposition)&&(r.position=n.dposition);var u=new l({id:r.id,options:r,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,r){var o=e.getDatasetMeta(r),s=a.type||e.config.type;if(o.type&&o.type!==s&&(e.destroyDatasetMeta(r),o=e.getDatasetMeta(r)),o.type=s,n.push(o.type),o.controller)o.controller.updateIndex(r);else{var l=t.controllers[o.type];if(void 0===l)throw new Error('\"'+o.type+'\" is not a chart type.');o.controller=new l(e,r),i.push(o.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&\"object\"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==l.notify(e,\"beforeUpdate\")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],l.notify(e,\"afterUpdate\"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==l.notify(e,\"beforeLayout\")&&(t.layoutService.update(this,this.width,this.height),l.notify(e,\"afterScaleUpdate\"),l.notify(e,\"afterLayout\"))},updateDatasets:function(){var t=this;if(!1!==l.notify(t,\"beforeDatasetsUpdate\")){for(var e=0,n=t.data.datasets.length;e<n;++e)t.updateDataset(e);l.notify(t,\"afterDatasetsUpdate\")}},updateDataset:function(t){var e=this,n=e.getDatasetMeta(t),i={meta:n,index:t};!1!==l.notify(e,\"beforeDatasetUpdate\",[i])&&(n.controller.update(),l.notify(e,\"afterDatasetUpdate\",[i]))},render:function(e){var n=this;e&&\"object\"==typeof e||(e={duration:e,lazy:arguments[1]});var i=e.duration,r=e.lazy;if(!1!==l.notify(n,\"beforeRender\")){var o=n.options.animation,s=function(t){l.notify(n,\"afterRender\"),a.callback(o&&o.onComplete,[t],n)};if(o&&(void 0!==i&&0!==i||void 0===i&&0!==o.duration)){var u=new t.Animation({numSteps:(i||o.duration)/16.66,easing:e.easing||o.easing,render:function(t,e){var n=a.easing.effects[e.easing],i=e.currentStep,r=i/e.numSteps;t.draw(n(r),r,i)},onAnimationProgress:o.onProgress,onAnimationComplete:s});t.animationService.addAnimation(n,u,i,r)}else n.draw(),s(new t.Animation({numSteps:0,chart:n}));return n}},draw:function(t){var e=this;e.clear(),a.isNullOrUndef(t)&&(t=1),e.transition(t),!1!==l.notify(e,\"beforeDraw\",[t])&&(a.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.scale&&e.scale.draw(),e.drawDatasets(t),e._drawTooltip(t),l.notify(e,\"afterDraw\",[t]))},transition:function(t){for(var e=this,n=0,i=(e.data.datasets||[]).length;n<i;++n)e.isDatasetVisible(n)&&e.getDatasetMeta(n).controller.transition(t);e.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==l.notify(e,\"beforeDatasetsDraw\",[t])){for(var n=(e.data.datasets||[]).length-1;n>=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);l.notify(e,\"afterDatasetsDraw\",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==l.notify(n,\"beforeDatasetDraw\",[a])&&(i.controller.draw(e),l.notify(n,\"afterDatasetDraw\",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==l.notify(e,\"beforeTooltipDraw\",[i])&&(n.draw(),l.notify(e,\"afterTooltipDraw\",[i]))},getElementAtEvent:function(t){return r.modes.single(this,t)},getElementsAtEvent:function(t){return r.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return r.modes[\"x-axis\"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=r.modes[e];return\"function\"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return r.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return\"boolean\"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var e,n,i=this,r=i.canvas;for(i.stop(),e=0,n=i.data.datasets.length;e<n;++e)i.destroyDatasetMeta(e);r&&(i.unbindEvents(),a.canvas.clear(i),o.releaseContext(i.ctx),i.canvas=null,i.ctx=null),l.notify(i,\"destroy\"),delete t.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};a.each(t.options.events,function(i){o.addEventListener(t,i,n),e[i]=n}),t.options.responsive&&(n=function(){t.resize()},o.addEventListener(t,\"resize\",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,a.each(e,function(e,n){o.removeEventListener(t,n,e)}))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?\"setHoverStyle\":\"removeHoverStyle\";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o](i)},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==l.notify(e,\"beforeEvent\",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);i|=n&&n.handleEvent(t),l.notify(e,\"afterEvent\",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render(e.options.hover.animationDuration,!0)),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e=this,n=e.options||{},i=n.hover,r=!1;return e.lastActive=e.lastActive||[],\"mouseout\"===t.type?e.active=[]:e.active=e.getElementsAtEventForMode(t,i.mode,i),a.callback(n.onHover||n.hover.onHover,[t.native,e.active],e),\"mouseup\"!==t.type&&\"click\"!==t.type||n.onClick&&n.onClick.call(e,t.native,e.active),e.lastActive.length&&e.updateHoverStyle(e.lastActive,i.mode,!1),e.active.length&&i.mode&&e.updateHoverStyle(e.active,i.mode,!0),r=!a.arrayEquals(e.active,e.lastActive),e.lastActive=e.active,r}}),t.Controller=t}},{25:25,28:28,45:45,48:48}],24:[function(t,e,n){\"use strict\";var i=t(45);e.exports=function(t){function e(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),a.forEach(function(e){var n=\"onData\"+e.charAt(0).toUpperCase()+e.slice(1),a=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),r=a.apply(this,e);return i.each(t._chartjs.listeners,function(t){\"function\"==typeof t[n]&&t[n].apply(t,e)}),r}})}))}function n(t,e){var n=t._chartjs;if(n){var i=n.listeners,r=i.indexOf(e);-1!==r&&i.splice(r,1),i.length>0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],r=i.data;for(t=0,e=a.length;t<e;++t)r[t]=r[t]||n.createMetaData(t);i.dataset=i.dataset||n.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t=this,i=t.getDataset(),a=i.data||(i.data=[]);t._data!==a&&(t._data&&n(t._data,t),e(a,t),t._data=a),t.resyncElements()},update:i.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},removeHoverStyle:function(t,e){var n=this.chart.data.datasets[t._datasetIndex],a=t._index,r=t.custom||{},o=i.valueAtIndexOrDefault,s=t._model;s.backgroundColor=r.backgroundColor?r.backgroundColor:o(n.backgroundColor,a,e.backgroundColor),s.borderColor=r.borderColor?r.borderColor:o(n.borderColor,a,e.borderColor),s.borderWidth=r.borderWidth?r.borderWidth:o(n.borderWidth,a,e.borderWidth)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},r=i.valueAtIndexOrDefault,o=i.getHoverColor,s=t._model;s.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:r(e.hoverBackgroundColor,n,o(s.backgroundColor)),s.borderColor=a.hoverBorderColor?a.hoverBorderColor:r(e.hoverBorderColor,n,o(s.borderColor)),s.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:r(e.hoverBorderWidth,n,s.borderWidth)},resyncElements:function(){var t=this,e=t.getMeta(),n=t.getDataset().data,i=e.data.length,a=n.length;a<i?e.data.splice(a,i-a):a>i&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){this.insertElements(this.getDataset().data.length-1,arguments.length)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),t.DatasetController.extend=i.inherits}},{45:45}],25:[function(t,e,n){\"use strict\";var i=t(45);e.exports={_set:function(t,e){return i.merge(this[t]||(this[t]={}),e)}}},{45:45}],26:[function(t,e,n){\"use strict\";function i(t,e,n,i){var r,o,s,l,u,d,c,h,f,g=Object.keys(n);for(r=0,o=g.length;r<o;++r)if(s=g[r],d=n[s],e.hasOwnProperty(s)||(e[s]=d),(l=e[s])!==d&&\"_\"!==s[0]){if(t.hasOwnProperty(s)||(t[s]=l),u=t[s],(c=typeof d)===typeof u)if(\"string\"===c){if((h=a(u)).valid&&(f=a(d)).valid){e[s]=f.mix(h,i).rgbString();continue}}else if(\"number\"===c&&isFinite(u)&&isFinite(d)){e[s]=u+(d-u)*i;continue}e[s]=d}}var a=t(2),r=t(45),o=function(t){r.extend(this,t),this.initialize.apply(this,arguments)};r.extend(o.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=r.clone(t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,a=e._start,r=e._view;return n&&1!==t?(r||(r=e._view={}),a||(a=e._start={}),i(a,r,n,t),e):(e._view=n,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return r.isNumber(this._model.x)&&r.isNumber(this._model.y)}}),o.extend=r.inherits,e.exports=o},{2:2,45:45}],27:[function(t,e,n){\"use strict\";var i=t(2),a=t(25),r=t(45);e.exports=function(t){function e(t,e,n){var i;return\"string\"==typeof t?(i=parseInt(t,10),-1!==t.indexOf(\"%\")&&(i=i/100*e.parentNode[n])):i=t,i}function n(t){return void 0!==t&&null!==t&&\"none\"!==t}function o(t,i,a){var r=document.defaultView,o=t.parentNode,s=r.getComputedStyle(t)[i],l=r.getComputedStyle(o)[i],u=n(s),d=n(l),c=Number.POSITIVE_INFINITY;return u||d?Math.min(u?e(s,t,a):c,d?e(l,o,a):c):\"none\"}r.configMerge=function(){return r.merge(r.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,n,i,a){var o=n[e]||{},s=i[e];\"scales\"===e?n[e]=r.scaleMerge(o,s):\"scale\"===e?n[e]=r.merge(o,[t.scaleService.getScaleDefaults(s.type),s]):r._merger(e,n,i,a)}})},r.scaleMerge=function(){return r.merge(r.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,n,i,a){if(\"xAxes\"===e||\"yAxes\"===e){var o,s,l,u=i[e].length;for(n[e]||(n[e]=[]),o=0;o<u;++o)l=i[e][o],s=r.valueOrDefault(l.type,\"xAxes\"===e?\"category\":\"linear\"),o>=n[e].length&&n[e].push({}),!n[e][o].type||l.type&&l.type!==n[e][o].type?r.merge(n[e][o],[t.scaleService.getScaleDefaults(s),l]):r.merge(n[e][o],l)}else r._merger(e,n,i,a)}})},r.where=function(t,e){if(r.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return r.each(t,function(t){e(t)&&n.push(t)}),n},r.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},r.findNextWhere=function(t,e,n){r.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},r.findPreviousWhere=function(t,e,n){r.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},r.almostEquals=function(t,e,n){return Math.abs(t-e)<n},r.almostWhole=function(t,e){var n=Math.round(t);return n-e<t&&n+e>t},r.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},r.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},r.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},r.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},r.toRadians=function(t){return t*(Math.PI/180)},r.toDegrees=function(t){return t*(180/Math.PI)},r.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},r.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},r.aliasPixel=function(t){return t%2==0?0:.5},r.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-c*(o.x-a.x),y:r.y-c*(o.y-a.y)},next:{x:r.x+h*(o.x-a.x),y:r.y+h*(o.y-a.y)}}},r.EPSILON=Number.EPSILON||1e-14,r.splineCurveMonotone=function(t){var e,n,i,a,o=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),s=o.length;for(e=0;e<s;++e)if(!(i=o[e]).model.skip){if(n=e>0?o[e-1]:null,(a=e<s-1?o[e+1]:null)&&!a.model.skip){var l=a.model.x-i.model.x;i.deltaK=0!==l?(a.model.y-i.model.y)/l:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}var u,d,c,h;for(e=0;e<s-1;++e)i=o[e],a=o[e+1],i.model.skip||a.model.skip||(r.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(u=i.mK/i.deltaK,d=a.mK/i.deltaK,(h=Math.pow(u,2)+Math.pow(d,2))<=9||(c=3/Math.sqrt(h),i.mK=u*c*i.deltaK,a.mK=d*c*i.deltaK)));var f;for(e=0;e<s;++e)(i=o[e]).model.skip||(n=e>0?o[e-1]:null,a=e<s-1?o[e+1]:null,n&&!n.model.skip&&(f=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-f,i.model.controlPointPreviousY=i.model.y-f*i.mK),a&&!a.model.skip&&(f=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+f,i.model.controlPointNextY=i.model.y+f*i.mK))},r.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},r.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},r.niceNum=function(t,e){var n=Math.floor(r.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},r.requestAnimFrame=\"undefined\"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},r.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,o=t.currentTarget||t.srcElement,s=o.getBoundingClientRect(),l=a.touches;l&&l.length>0?(n=l[0].clientX,i=l[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(r.getStyle(o,\"padding-left\")),d=parseFloat(r.getStyle(o,\"padding-top\")),c=parseFloat(r.getStyle(o,\"padding-right\")),h=parseFloat(r.getStyle(o,\"padding-bottom\")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return n=Math.round((n-s.left-u)/f*o.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-d)/g*o.height/e.currentDevicePixelRatio),{x:n,y:i}},r.getConstraintWidth=function(t){return o(t,\"max-width\",\"clientWidth\")},r.getConstraintHeight=function(t){return o(t,\"max-height\",\"clientHeight\")},r.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(r.getStyle(e,\"padding-left\"),10),i=parseInt(r.getStyle(e,\"padding-right\"),10),a=e.clientWidth-n-i,o=r.getConstraintWidth(t);return isNaN(o)?a:Math.min(a,o)},r.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(r.getStyle(e,\"padding-top\"),10),i=parseInt(r.getStyle(e,\"padding-bottom\"),10),a=e.clientHeight-n-i,o=r.getConstraintHeight(t);return isNaN(o)?a:Math.min(a,o)},r.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},r.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height=a+\"px\",i.style.width=r+\"px\"}},r.fontString=function(t,e,n){return e+\" \"+t+\"px \"+n},r.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},o=i.garbageCollect=[],i.font=e),t.font=e;var s=0;r.each(n,function(e){void 0!==e&&null!==e&&!0!==r.isArray(e)?s=r.measureText(t,a,o,s,e):r.isArray(e)&&r.each(e,function(e){void 0===e||null===e||r.isArray(e)||(s=r.measureText(t,a,o,s,e))})});var l=o.length/2;if(l>n.length){for(var u=0;u<l;u++)delete a[o[u]];o.splice(0,l)}return s},r.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},r.numberOfLabelLines=function(t){var e=1;return r.each(t,function(t){r.isArray(t)&&t.length>e&&(e=t.length)}),e},r.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error(\"Color.js not found!\"),t},r.getHoverColor=function(t){return t instanceof CanvasPattern?t:r.color(t).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(t,e,n){\"use strict\";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,r,o;for(i=0,r=t.data.datasets.length;i<r;++i)if(t.isDatasetVisible(i))for(a=0,o=(n=t.getDatasetMeta(i)).data.length;a<o;++a){var s=n.data[a];s._view.skip||e(s)}}function r(t,e){var n=[];return a(t,function(t){t.inRange(e.x,e.y)&&n.push(t)}),n}function o(t,e,n,i){var r=Number.POSITIVE_INFINITY,o=[];return a(t,function(t){if(!n||t.inRange(e.x,e.y)){var a=t.getCenterPoint(),s=i(e,a);s<r?(o=[t],r=s):s===r&&o.push(t)}}),o}function s(t){var e=-1!==t.indexOf(\"x\"),n=-1!==t.indexOf(\"y\");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function l(t,e,n){var a=i(e,t);n.axis=n.axis||\"x\";var l=s(n.axis),u=n.intersect?r(t,a):o(t,a,!1,l),d=[];return u.length?(t.data.datasets.forEach(function(e,n){if(t.isDatasetVisible(n)){var i=t.getDatasetMeta(n).data[u[0]._index];i&&!i._view.skip&&d.push(i)}}),d):[]}var u=t(45);e.exports={modes:{single:function(t,e){var n=i(e,t),r=[];return a(t,function(t){if(t.inRange(n.x,n.y))return r.push(t),r}),r.slice(0,1)},label:l,index:l,dataset:function(t,e,n){var a=i(e,t);n.axis=n.axis||\"xy\";var l=s(n.axis),u=n.intersect?r(t,a):o(t,a,!1,l);return u.length>0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},\"x-axis\":function(t,e){return l(t,e,{intersect:!1})},point:function(t,e){return r(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||\"xy\";var r=s(n.axis),l=o(t,a,n.intersect,r);return l.length>1&&l.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),l.slice(0,1)},x:function(t,e,n){var r=i(e,t),o=[],s=!1;return a(t,function(t){t.inXRange(r.x)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),n.intersect&&!s&&(o=[]),o},y:function(t,e,n){var r=i(e,t),o=[],s=!1;return a(t,function(t){t.inYRange(r.y)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),n.intersect&&!s&&(o=[]),o}}}},{45:45}],29:[function(t,e,n){\"use strict\";t(25)._set(\"global\",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],hover:{onHover:null,mode:\"nearest\",intersect:!0,animationDuration:400},onClick:null,defaultColor:\"rgba(0,0,0,0.1)\",defaultFontColor:\"#666\",defaultFontFamily:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",defaultFontSize:12,defaultFontStyle:\"normal\",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){\"use strict\";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||\"top\",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=[\"fullWidth\",\"position\",\"weight\"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,a,r){function o(t){var e=i.findNextWhere(D,function(e){return e.box===t});if(e)if(t.isHorizontal()){var n={left:Math.max(I,C),right:Math.max(O,P),top:0,bottom:0};t.update(t.fullWidth?b:M,x/2,n)}else t.update(e.minSize.width,S)}function s(t){t.isHorizontal()?(t.left=t.fullWidth?d:I,t.right=t.fullWidth?a-c:I+M,t.top=B,t.bottom=B+t.height,B=t.bottom):(t.left=z,t.right=z+t.width,t.top=F,t.bottom=F+S,z=t.right)}if(t){var l=t.options.layout||{},u=i.options.toPadding(l.padding),d=u.left,c=u.right,h=u.top,f=u.bottom,g=e(t.boxes,\"left\"),m=e(t.boxes,\"right\"),p=e(t.boxes,\"top\"),v=e(t.boxes,\"bottom\"),y=e(t.boxes,\"chartArea\");n(g,!0),n(m,!1),n(p,!0),n(v,!1);var b=a-d-c,x=r-h-f,_=x/2,k=(a-b/2)/(g.length+m.length),w=(r-_)/(p.length+v.length),M=b,S=x,D=[];i.each(g.concat(m,p,v),function(t){var e,n=t.isHorizontal();n?(e=t.update(t.fullWidth?b:M,w),S-=e.height):(e=t.update(k,_),M-=e.width),D.push({horizontal:n,minSize:e,box:t})});var C=0,P=0,T=0,A=0;i.each(p.concat(v),function(t){if(t.getPadding){var e=t.getPadding();C=Math.max(C,e.left),P=Math.max(P,e.right)}}),i.each(g.concat(m),function(t){if(t.getPadding){var e=t.getPadding();T=Math.max(T,e.top),A=Math.max(A,e.bottom)}});var I=d,O=c,F=h,R=f;i.each(g.concat(m),o),i.each(g,function(t){I+=t.width}),i.each(m,function(t){O+=t.width}),i.each(p.concat(v),o),i.each(p,function(t){F+=t.height}),i.each(v,function(t){R+=t.height}),i.each(g.concat(m),function(t){var e=i.findNextWhere(D,function(e){return e.box===t}),n={left:0,right:0,top:F,bottom:R};e&&t.update(e.minSize.width,S,n)}),I=d,O=c,F=h,R=f,i.each(g,function(t){I+=t.width}),i.each(m,function(t){O+=t.width}),i.each(p,function(t){F+=t.height}),i.each(v,function(t){R+=t.height});var L=Math.max(C-I,0);I+=L,O+=Math.max(P-O,0);var W=Math.max(T-F,0);F+=W,R+=Math.max(A-R,0);var Y=r-F-R,N=a-I-O;N===M&&Y===S||(i.each(g,function(t){t.height=Y}),i.each(m,function(t){t.height=Y}),i.each(p,function(t){t.fullWidth||(t.width=N)}),i.each(v,function(t){t.fullWidth||(t.width=N)}),S=Y,M=N);var z=d+L,B=h+W;i.each(g.concat(p),s),z+=M,B+=S,i.each(m,s),i.each(v,s),t.chartArea={left:I,top:F,right:I+M,bottom:F+S},i.each(y,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(M,S)})}}}}},{45:45}],31:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{plugins:{}}),e.exports=function(t){t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if(a=l[i],r=a.plugin,\"function\"==typeof(s=r[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t._plugins||(t._plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],a=[],o=t&&t.config||{},s=o.options&&o.options.plugins||{};return this._plugins.concat(o.plugins||[]).forEach(function(t){if(-1===n.indexOf(t)){var e=t.id,o=s[e];!1!==o&&(!0===o&&(o=r.clone(i.global.plugins[e])),n.push(t),a.push({plugin:t,options:o||{}}))}}),e.descriptors=a,e.id=this._cacheId,a}},t.pluginService=t.plugins,t.PluginBase=a.extend({})}},{25:25,26:26,45:45}],32:[function(t,e,n){\"use strict\";function i(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(t[e].label);return i}function a(t,e,n){var i=t.getPixelForTick(e);return n&&(i-=0===e?(t.getPixelForTick(1)-i)/2:(i-t.getPixelForTick(e-1))/2),i}var r=t(25),o=t(26),s=t(45),l=t(34);r._set(\"scale\",{display:!0,position:\"left\",offset:!1,gridLines:{display:!0,color:\"rgba(0, 0, 0, 0.1)\",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:\"rgba(0,0,0,0.25)\",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:\"\",lineHeight:1.2,padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:l.formatters.values,minor:{},major:{}}}),e.exports=function(t){function e(t,e,n){return s.isArray(e)?s.longestText(t,n,e):t.measureText(e).width}function n(t){var e=s.valueOrDefault,n=r.global,i=e(t.fontSize,n.defaultFontSize),a=e(t.fontStyle,n.defaultFontStyle),o=e(t.fontFamily,n.defaultFontFamily);return{size:i,style:a,family:o,font:s.fontString(i,a,o)}}function l(t){return s.options.toLineHeight(s.valueOrDefault(t.lineHeight,1.2),s.valueOrDefault(t.fontSize,r.global.defaultFontSize))}t.Scale=o.extend({getPadding:function(){var t=this;return{left:t.paddingLeft||0,top:t.paddingTop||0,right:t.paddingRight||0,bottom:t.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1});for(var e in t)\"major\"!==e&&\"minor\"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){s.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,l,u,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=s.extend({left:0,right:0,top:0,bottom:0},n),d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),l=d.buildTicks()||[],d.afterBuildTicks(),d.beforeTickToLabelConversion(),r=d.convertTicksToLabels(l)||d.ticks,d.afterTickToLabelConversion(),d.ticks=r,i=0,a=r.length;i<a;++i)o=r[i],(u=l[i])?u.label=o:l.push(u={label:o,major:!1});return d._ticks=l,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){s.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){s.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){s.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){s.callback(this.options.beforeDataLimits,[this])},determineDataLimits:s.noop,afterDataLimits:function(){s.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){s.callback(this.options.beforeBuildTicks,[this])},buildTicks:s.noop,afterBuildTicks:function(){s.callback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){s.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this,e=t.options.ticks;t.ticks=t.ticks.map(e.userCallback||e.callback,this)},afterTickToLabelConversion:function(){s.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){s.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,a=t.options.ticks,r=i(t._ticks),o=n(a);e.font=o.font;var l=a.minRotation||0;if(r.length&&t.options.display&&t.isHorizontal())for(var u,d=s.longestText(e,o.font,r,t.longestTextCache),c=d,h=t.getPixelForTick(1)-t.getPixelForTick(0)-6;c>h&&l<a.maxRotation;){var f=s.toRadians(l);if(u=Math.cos(f),Math.sin(f)*d>t.maxHeight){l--;break}l++,c=u*d}t.labelRotation=l},afterCalculateTickRotation:function(){s.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){s.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},r=i(t._ticks),o=t.options,u=o.ticks,d=o.scaleLabel,c=o.gridLines,h=o.display,f=t.isHorizontal(),g=n(u),m=o.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?m:0,a.height=f?h&&c.drawTicks?m:0:t.maxHeight,d.display&&h){var p=l(d)+s.options.toPadding(d.padding).height;f?a.height+=p:a.width+=p}if(u.display&&h){var v=s.longestText(t.ctx,g.font,r,t.longestTextCache),y=s.numberOfLabelLines(r),b=.5*g.size,x=t.options.ticks.padding;if(f){t.longestLabelWidth=v;var _=s.toRadians(t.labelRotation),k=Math.cos(_),w=Math.sin(_)*v+g.size*y+b*(y-1)+b;a.height=Math.min(t.maxHeight,a.height+w+x),t.ctx.font=g.font;var M=e(t.ctx,r[0],g.font),S=e(t.ctx,r[r.length-1],g.font);0!==t.labelRotation?(t.paddingLeft=\"bottom\"===o.position?k*M+3:k*b+3,t.paddingRight=\"bottom\"===o.position?k*b+3:k*S+3):(t.paddingLeft=M/2+3,t.paddingRight=S/2+3)}else u.mirror?v=0:v+=x+b,a.width=Math.min(t.maxWidth,a.width+v),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){s.callback(this.options.afterFit,[this])},isHorizontal:function(){return\"top\"===this.options.position||\"bottom\"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(s.isNullOrUndef(t))return NaN;if(\"number\"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:s.noop,getPixelForValue:s.noop,getValueForPixel:s.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var r=e.left+Math.round(a);return r+=e.isFullWidth()?e.margins.left:0}var o=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(o/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,r=this,o=r.isHorizontal(),l=r.options.ticks.minor,u=t.length,d=s.toRadians(r.labelRotation),c=Math.cos(d),h=r.longestLabelWidth*c,f=[];for(l.maxTicksLimit&&(a=l.maxTicksLimit),o&&(e=!1,(h+l.autoSkipPadding)*u>r.width-(r.paddingLeft+r.paddingRight)&&(e=1+Math.floor((h+l.autoSkipPadding)*u/(r.width-(r.paddingLeft+r.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n<u;n++)i=t[n],(e>1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var o=e.ctx,u=r.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,m=e.isHorizontal(),p=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),v=s.valueOrDefault(d.fontColor,u.defaultFontColor),y=n(d),b=s.valueOrDefault(c.fontColor,u.defaultFontColor),x=n(c),_=h.drawTicks?h.tickMarkLength:0,k=s.valueOrDefault(f.fontColor,u.defaultFontColor),w=n(f),M=s.options.toPadding(f.padding),S=s.toRadians(e.labelRotation),D=[],C=\"right\"===i.position?e.left:e.right-_,P=\"right\"===i.position?e.left+_:e.right,T=\"bottom\"===i.position?e.top:e.bottom-_,A=\"bottom\"===i.position?e.top+_:e.bottom;if(s.each(p,function(n,r){if(!s.isNullOrUndef(n.label)){var o,l,c,f,v=n.label;r===e.zeroLineIndex&&i.offset===h.offsetGridLines?(o=h.zeroLineWidth,l=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(o=s.valueAtIndexOrDefault(h.lineWidth,r),l=s.valueAtIndexOrDefault(h.color,r),c=s.valueOrDefault(h.borderDash,u.borderDash),f=s.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var y,b,x,k,w,M,I,O,F,R,L=\"middle\",W=\"middle\",Y=d.padding;if(m){var N=_+Y;\"bottom\"===i.position?(W=g?\"middle\":\"top\",L=g?\"right\":\"center\",R=e.top+N):(W=g?\"middle\":\"bottom\",L=g?\"left\":\"center\",R=e.bottom-N);var z=a(e,r,h.offsetGridLines&&p.length>1);z<e.left&&(l=\"rgba(0,0,0,0)\"),z+=s.aliasPixel(o),F=e.getPixelForTick(r)+d.labelOffset,y=x=w=I=z,b=T,k=A,M=t.top,O=t.bottom}else{var B,V=\"left\"===i.position;d.mirror?(L=V?\"left\":\"right\",B=Y):(L=V?\"right\":\"left\",B=_+Y),F=V?e.right-B:e.left+B;var H=a(e,r,h.offsetGridLines&&p.length>1);H<e.top&&(l=\"rgba(0,0,0,0)\"),H+=s.aliasPixel(o),R=e.getPixelForTick(r)+d.labelOffset,y=C,x=P,w=t.left,I=t.right,b=k=M=O=H}D.push({tx1:y,ty1:b,tx2:x,ty2:k,x1:w,y1:M,x2:I,y2:O,labelX:F,labelY:R,glWidth:o,glColor:l,glBorderDash:c,glBorderDashOffset:f,rotation:-1*S,label:v,major:n.major,textBaseline:W,textAlign:L})}}),s.each(D,function(t){if(h.display&&(o.save(),o.lineWidth=t.glWidth,o.strokeStyle=t.glColor,o.setLineDash&&(o.setLineDash(t.glBorderDash),o.lineDashOffset=t.glBorderDashOffset),o.beginPath(),h.drawTicks&&(o.moveTo(t.tx1,t.ty1),o.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(o.moveTo(t.x1,t.y1),o.lineTo(t.x2,t.y2)),o.stroke(),o.restore()),d.display){o.save(),o.translate(t.labelX,t.labelY),o.rotate(t.rotation),o.font=t.major?x.font:y.font,o.fillStyle=t.major?b:v,o.textBaseline=t.textBaseline,o.textAlign=t.textAlign;var e=t.label;if(s.isArray(e))for(var n=0,i=0;n<e.length;++n)o.fillText(\"\"+e[n],0,i),i+=1.5*y.size;else o.fillText(e,0,0);o.restore()}}),f.display){var I,O,F=0,R=l(f)/2;if(m)I=e.left+(e.right-e.left)/2,O=\"bottom\"===i.position?e.bottom-R-M.bottom:e.top+R+M.top;else{var L=\"left\"===i.position;I=L?e.left+R+M.top:e.right-R-M.top,O=e.top+(e.bottom-e.top)/2,F=L?-.5*Math.PI:.5*Math.PI}o.save(),o.translate(I,O),o.rotate(F),o.textAlign=\"center\",o.textBaseline=\"middle\",o.fillStyle=k,o.font=w.font,o.fillText(f.labelString,0,0),o.restore()}if(h.drawBorder){o.lineWidth=s.valueAtIndexOrDefault(h.lineWidth,0),o.strokeStyle=s.valueAtIndexOrDefault(h.color,0);var W=e.left,Y=e.right,N=e.top,z=e.bottom,B=s.aliasPixel(o.lineWidth);m?(N=z=\"top\"===i.position?e.bottom:e.top,N+=B,z+=B):(W=Y=\"left\"===i.position?e.right:e.left,W+=B,Y+=B),o.beginPath(),o.moveTo(W,N),o.lineTo(Y,z),o.stroke()}}}})}},{25:25,26:26,34:34,45:45}],33:[function(t,e,n){\"use strict\";var i=t(25),a=t(45);e.exports=function(t){t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=a.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?a.merge({},[i.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){var n=this;n.defaults.hasOwnProperty(t)&&(n.defaults[t]=a.extend(n.defaults[t],e))},addScalesToLayout:function(e){a.each(e.scales,function(n){n.fullWidth=n.options.fullWidth,n.position=n.options.position,n.weight=n.options.weight,t.layoutService.addBox(e,n)})}}}},{25:25,45:45}],34:[function(t,e,n){\"use strict\";var i=t(45);e.exports={generators:{linear:function(t,e){var n,a=[];if(t.stepSize&&t.stepSize>0)n=t.stepSize;else{var r=i.niceNum(e.max-e.min,!1);n=i.niceNum(r/(t.maxTicks-1),!0)}var o=Math.floor(e.min/n)*n,s=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(o=t.min,s=t.max);var l=(s-o)/n;l=i.almostEquals(l,Math.round(l),n/1e3)?Math.round(l):Math.ceil(l),a.push(void 0!==t.min?t.min:o);for(var u=1;u<l;++u)a.push(o+u*n);return a.push(void 0!==t.max?t.max:s),a},logarithmic:function(t,e){var n,a,r=[],o=i.valueOrDefault,s=o(t.min,Math.pow(10,Math.floor(i.log10(e.min)))),l=Math.floor(i.log10(e.max)),u=Math.ceil(e.max/Math.pow(10,l));0===s?(n=Math.floor(i.log10(e.minNotZero)),a=Math.floor(e.minNotZero/Math.pow(10,n)),r.push(s),s=a*Math.pow(10,n)):(n=Math.floor(i.log10(s)),a=Math.floor(s/Math.pow(10,n)));do{r.push(s),10===++a&&(a=1,++n),s=a*Math.pow(10,n)}while(n<l||n===l&&a<u);var d=o(t.max,s);return r.push(d),r}},formatters:{values:function(t){return i.isArray(t)?t:\"\"+t},linear:function(t,e,n){var a=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var r=i.log10(Math.abs(a)),o=\"\";if(0!==t){var s=-1*Math.floor(r);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o=\"0\";return o},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?\"0\":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():\"\"}}}},{45:45}],35:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{tooltips:{enabled:!0,custom:null,mode:\"nearest\",position:\"average\",intersect:!0,backgroundColor:\"rgba(0,0,0,0.8)\",titleFontStyle:\"bold\",titleSpacing:2,titleMarginBottom:6,titleFontColor:\"#fff\",titleAlign:\"left\",bodySpacing:2,bodyFontColor:\"#fff\",bodyAlign:\"left\",footerFontStyle:\"bold\",footerSpacing:2,footerMarginTop:6,footerFontColor:\"#fff\",footerAlign:\"left\",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:\"#fff\",displayColors:!0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,callbacks:{beforeTitle:r.noop,title:function(t,e){var n=\"\",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:r.noop,beforeBody:r.noop,beforeLabel:r.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||\"\";return n&&(n+=\": \"),n+=t.yLabel},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:r.noop,afterBody:r.noop,beforeFooter:r.noop,footer:r.noop,afterFooter:r.noop}}}),e.exports=function(t){function e(t,e){var n=r.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(r.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function o(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):\"\",yLabel:n?n.getLabelForIndex(i,a):\"\",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function s(t){var e=i.global,n=r.valueOrDefault;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:n(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:n(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:n(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:n(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:n(t.titleFontStyle,e.defaultFontStyle),titleFontSize:n(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:n(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:n(t.footerFontStyle,e.defaultFontStyle),footerFontSize:n(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function l(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,o=e.body,s=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);s+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=l*d,i+=l?(l-1)*e.titleSpacing:0,i+=l?e.titleMarginBottom:0,i+=s*c,i+=s?(s-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=r.fontString(d,e._titleFontStyle,e._titleFontFamily),r.each(e.title,g),n.font=r.fontString(c,e._bodyFontStyle,e._bodyFontFamily),r.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,r.each(o,function(t){r.each(t.before,g),r.each(t.lines,g),r.each(t.after,g)}),f=0,n.font=r.fontString(h,e._footerFontStyle,e._footerFontFamily),r.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function u(t,e){var n=t._model,i=t._chart,a=t._chart.chartArea,r=\"center\",o=\"center\";n.y<e.height?o=\"top\":n.y>i.height-e.height&&(o=\"bottom\");var s,l,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;\"center\"===o?(s=function(t){return t<=h},l=function(t){return t>h}):(s=function(t){return t<=e.width/2},l=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?\"top\":\"bottom\"},s(n.x)?(r=\"left\",u(n.x)&&(r=\"center\",o=c(n.y))):l(n.x)&&(r=\"right\",d(n.x)&&(r=\"center\",o=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:r,yAlign:g.yAlign?g.yAlign:o}}function d(t,e,n){var i=t.x,a=t.y,r=t.caretSize,o=t.caretPadding,s=t.cornerRadius,l=n.xAlign,u=n.yAlign,d=r+o,c=s+o;return\"right\"===l?i-=e.width:\"center\"===l&&(i-=e.width/2),\"top\"===u?a+=d:a-=\"bottom\"===u?e.height+d:e.height/2,\"center\"===u?\"left\"===l?i+=d:\"right\"===l&&(i-=d):\"left\"===l?i-=c:\"right\"===l&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=s(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),r=e.afterTitle.apply(t,arguments),o=[];return o=n(o,i),o=n(o,a),o=n(o,r)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,o=[];return r.each(t,function(t){var r={before:[],lines:[],after:[]};n(r.before,a.beforeLabel.call(i,t,e)),n(r.lines,a.label.call(i,t,e)),n(r.after,a.afterLabel.call(i,t,e)),o.push(r)}),o},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),r=e.afterFooter.apply(t,arguments),o=[];return o=n(o,i),o=n(o,a),o=n(o,r)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=s(c),g=a._active,m=a._data,p={xAlign:h.xAlign,yAlign:h.yAlign},v={x:h.x,y:h.y},y={width:h.width,height:h.height},b={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var x=[],_=[];b=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var k=[];for(n=0,i=g.length;n<i;++n)k.push(o(g[n]));c.filter&&(k=k.filter(function(t){return c.filter(t,m)})),c.itemSort&&(k=k.sort(function(t,e){return c.itemSort(t,e,m)})),r.each(k,function(t){x.push(c.callbacks.labelColor.call(a,t,a._chart)),_.push(c.callbacks.labelTextColor.call(a,t,a._chart))}),f.title=a.getTitle(k,m),f.beforeBody=a.getBeforeBody(k,m),f.body=a.getBody(k,m),f.afterBody=a.getAfterBody(k,m),f.footer=a.getFooter(k,m),f.x=Math.round(b.x),f.y=Math.round(b.y),f.caretPadding=c.caretPadding,f.labelColors=x,f.labelTextColors=_,f.dataPoints=k,v=d(f,y=l(this,f),p=u(this,y))}else f.opacity=0;return f.xAlign=p.xAlign,f.yAlign=p.yAlign,f.x=v.x,f.y=v.y,f.width=y.width,f.height=y.height,f.caretX=b.x,f.caretY=b.y,a._model=f,e&&c.custom&&c.custom.call(a,f),a},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,c=n.xAlign,h=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if(\"center\"===h)s=g+p/2,\"left\"===c?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if(\"left\"===c?(i=(a=f+d+u)-u,r=a+u):\"right\"===c?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=f+m/2)-u,r=a+u),\"top\"===h)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,n,i,a){var o=n.title;if(o.length){i.textAlign=n._titleAlign,i.textBaseline=\"top\";var s=n.titleFontSize,l=n.titleSpacing;i.fillStyle=e(n.titleFontColor,a),i.font=r.fontString(s,n._titleFontStyle,n._titleFontFamily);var u,d;for(u=0,d=o.length;u<d;++u)i.fillText(o[u],t.x,t.y),t.y+=s+l,u+1===o.length&&(t.y+=n.titleMarginBottom-l)}},drawBody:function(t,n,i,a){var o=n.bodyFontSize,s=n.bodySpacing,l=n.body;i.textAlign=n._bodyAlign,i.textBaseline=\"top\",i.font=r.fontString(o,n._bodyFontStyle,n._bodyFontFamily);var u=0,d=function(e){i.fillText(e,t.x+u,t.y),t.y+=o+s};i.fillStyle=e(n.bodyFontColor,a),r.each(n.beforeBody,d);var c=n.displayColors;u=c?o+2:0,r.each(l,function(s,l){var u=e(n.labelTextColors[l],a);i.fillStyle=u,r.each(s.before,d),r.each(s.lines,function(r){c&&(i.fillStyle=e(n.legendColorBackground,a),i.fillRect(t.x,t.y,o,o),i.lineWidth=1,i.strokeStyle=e(n.labelColors[l].borderColor,a),i.strokeRect(t.x,t.y,o,o),i.fillStyle=e(n.labelColors[l].backgroundColor,a),i.fillRect(t.x+1,t.y+1,o-2,o-2),i.fillStyle=u),d(r)}),r.each(s.after,d)}),u=0,r.each(n.afterBody,d),t.y-=s},drawFooter:function(t,n,i,a){var o=n.footer;o.length&&(t.y+=n.footerMarginTop,i.textAlign=n._footerAlign,i.textBaseline=\"top\",i.fillStyle=e(n.footerFontColor,a),i.font=r.fontString(n.footerFontSize,n._footerFontStyle,n._footerFontFamily),r.each(o,function(e){i.fillText(e,t.x,t.y),t.y+=n.footerFontSize+n.footerSpacing}))},drawBackground:function(t,n,i,a,r){i.fillStyle=e(n.backgroundColor,r),i.strokeStyle=e(n.borderColor,r),i.lineWidth=n.borderWidth;var o=n.xAlign,s=n.yAlign,l=t.x,u=t.y,d=a.width,c=a.height,h=n.cornerRadius;i.beginPath(),i.moveTo(l+h,u),\"top\"===s&&this.drawCaret(t,a),i.lineTo(l+d-h,u),i.quadraticCurveTo(l+d,u,l+d,u+h),\"center\"===s&&\"right\"===o&&this.drawCaret(t,a),i.lineTo(l+d,u+c-h),i.quadraticCurveTo(l+d,u+c,l+d-h,u+c),\"bottom\"===s&&this.drawCaret(t,a),i.lineTo(l+h,u+c),i.quadraticCurveTo(l,u+c,l,u+c-h),\"center\"===s&&\"left\"===o&&this.drawCaret(t,a),i.lineTo(l,u+h),i.quadraticCurveTo(l,u,l+h,u),i.closePath(),i.fill(),n.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],\"mouseout\"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!r.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:Math.round(i/r),y:Math.round(a/r)}},nearest:function(t,e){var n,i,a,o=e.x,s=e.y,l=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var u=t[n];if(u&&u.hasValue()){var d=u.getCenterPoint(),c=r.distanceBetweenPoints(e,d);c<l&&(l=c,a=u)}}if(a){var h=a.tooltipPosition();o=h.x,s=h.y}return{x:o,y:s}}}}},{25:25,26:26,45:45}],36:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{elements:{arc:{backgroundColor:i.global.defaultColor,borderColor:\"#fff\",borderWidth:2}}}),e.exports=a.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=r.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,o=i.distance,s=n.startAngle,l=n.endAngle;l<s;)l+=2*Math.PI;for(;a>l;)a-=2*Math.PI;for(;a<s;)a+=2*Math.PI;var u=a>=s&&a<=l,d=o>=n.innerRadius&&o<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin=\"bevel\",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45),o=i.global;i._set(\"global\",{elements:{line:{tension:.4,backgroundColor:o.defaultColor,borderWidth:3,borderColor:o.defaultColor,borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,s=a._view,l=a._chart.ctx,u=s.spanGaps,d=a._children.slice(),c=o.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),l.save(),l.lineCap=s.borderCapStyle||c.borderCapStyle,l.setLineDash&&l.setLineDash(s.borderDash||c.borderDash),l.lineDashOffset=s.borderDashOffset||c.borderDashOffset,l.lineJoin=s.borderJoinStyle||c.borderJoinStyle,l.lineWidth=s.borderWidth||c.borderWidth,l.strokeStyle=s.borderColor||o.defaultColor,l.beginPath(),h=-1,t=0;t<d.length;++t)e=d[t],n=r.previousItem(d,t),i=e._view,0===t?i.skip||(l.moveTo(i.x,i.y),h=t):(n=-1===h?n:d[h],i.skip||(h!==t-1&&!u||-1===h?l.moveTo(i.x,i.y):r.canvas.lineTo(l,n._view,e._view),h=t));l.stroke(),l.restore()}})},{25:25,26:26,45:45}],38:[function(t,e,n){\"use strict\";function i(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2)}var a=t(25),r=t(26),o=t(45),s=a.global.defaultColor;a._set(\"global\",{elements:{point:{radius:3,pointStyle:\"circle\",backgroundColor:s,borderColor:s,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}}),e.exports=r.extend({inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:i,inXRange:i,inYRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.y,2)<Math.pow(e.radius+e.hitRadius,2)},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._model,i=this._chart.ctx,r=e.pointStyle,l=e.radius,u=e.x,d=e.y,c=o.color,h=0;e.skip||(i.strokeStyle=e.borderColor||s,i.lineWidth=o.valueOrDefault(e.borderWidth,a.global.elements.point.borderWidth),i.fillStyle=e.backgroundColor||s,void 0!==t&&(n.x<t.left||1.01*t.right<n.x||n.y<t.top||1.01*t.bottom<n.y)&&(n.x<t.left?h=(u-n.x)/(t.left-n.x):1.01*t.right<n.x?h=(n.x-u)/(n.x-t.right):n.y<t.top?h=(d-n.y)/(t.top-n.y):1.01*t.bottom<n.y&&(h=(n.y-d)/(n.y-t.bottom)),h=Math.round(100*h)/100,i.strokeStyle=c(i.strokeStyle).alpha(h).rgbString(),i.fillStyle=c(i.fillStyle).alpha(h).rgbString()),o.canvas.drawPoint(i,r,l,u,d))}})},{25:25,26:26,45:45}],39:[function(t,e,n){\"use strict\";function i(t){return void 0!==t._view.width}function a(t){var e,n,a,r,o=t._view;if(i(t)){var s=o.width/2;e=o.x-s,n=o.x+s,a=Math.min(o.y,o.base),r=Math.max(o.y,o.base)}else{var l=o.height/2;e=Math.min(o.x,o.base),n=Math.max(o.x,o.base),a=o.y-l,r=o.y+l}return{left:e,top:a,right:n,bottom:r}}var r=t(25),o=t(26);r._set(\"global\",{elements:{rectangle:{backgroundColor:r.global.defaultColor,borderColor:r.global.defaultColor,borderSkipped:\"bottom\",borderWidth:0}}}),e.exports=o.extend({draw:function(){function t(t){return v[(y+t)%4]}var e,n,i,a,r,o,s,l=this._chart.ctx,u=this._view,d=u.borderWidth;if(u.horizontal?(e=u.base,n=u.x,i=u.y-u.height/2,a=u.y+u.height/2,r=n>e?1:-1,o=1,s=u.borderSkipped||\"left\"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,r=1,o=(a=u.base)>i?1:-1,s=u.borderSkipped||\"bottom\"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+(\"left\"!==s?h*r:0),g=n+(\"right\"!==s?-h*r:0),m=i+(\"top\"!==s?h*o:0),p=a+(\"bottom\"!==s?-h*o:0);f!==g&&(i=m,a=p),m!==p&&(e=f,n=g)}l.beginPath(),l.fillStyle=u.backgroundColor,l.strokeStyle=u.borderColor,l.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],y=[\"bottom\",\"left\",\"top\",\"right\"].indexOf(s,0);-1===y&&(y=0);var b=t(0);l.moveTo(b[0],b[1]);for(var x=1;x<4;x++)b=t(x),l.lineTo(b[0],b[1]);l.fill(),d&&l.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var r=a(n);return i(n)?t>=r.left&&t<=r.right:e>=r.top&&e<=r.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){\"use strict\";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){\"use strict\";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,i/2),s=Math.min(r,a/2);t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.quadraticCurveTo(e+i,n,e+i,n+s),t.lineTo(e+i,n+a-s),t.quadraticCurveTo(e+i,n+a,e+i-o,n+a),t.lineTo(e+o,n+a),t.quadraticCurveTo(e,n+a,e,n+a-s),t.lineTo(e,n+s),t.quadraticCurveTo(e,n,e+o,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var r,o,s,l,u,d;if(!e||\"object\"!=typeof e||\"[object HTMLImageElement]\"!==(r=e.toString())&&\"[object HTMLCanvasElement]\"!==r){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case\"triangle\":t.beginPath(),u=(o=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-o/2,a+u/3),t.lineTo(i+o/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case\"rect\":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case\"rectRounded\":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case\"rectRot\":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case\"cross\":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case\"crossRot\":t.beginPath(),s=Math.cos(Math.PI/4)*n,l=Math.sin(Math.PI/4)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i-s,a+l),t.lineTo(i+s,a-l),t.closePath();break;case\"star\":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),s=Math.cos(Math.PI/4)*n,l=Math.sin(Math.PI/4)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i-s,a+l),t.lineTo(i+s,a-l),t.closePath();break;case\"line\":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case\"dash\":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return\"after\"===n.steppedLine&&!i||\"after\"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){\"use strict\";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return\"[object Array]\"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&\"[object Object]\"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&\"function\"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var r,o,s;if(i.isArray(t))if(o=t.length,a)for(r=o-1;r>=0;r--)e.call(n,t[r],r);else for(r=0;r<o;r++)e.call(n,t[r],r);else if(i.isObject(t))for(o=(s=Object.keys(t)).length,r=0;r<o;r++)e.call(n,t[s[r]],s[r])},arrayEquals:function(t,e){var n,a,r,o;if(!t||!e||t.length!==e.length)return!1;for(n=0,a=t.length;n<a;++n)if(r=t[n],o=e[n],r instanceof Array&&o instanceof Array){if(!i.arrayEquals(r,o))return!1}else if(r!==o)return!1;return!0},clone:function(t){if(i.isArray(t))return t.map(i.clone);if(i.isObject(t)){for(var e={},n=Object.keys(t),a=n.length,r=0;r<a;++r)e[n[r]]=i.clone(t[n[r]]);return e}return t},_merger:function(t,e,n,a){var r=e[t],o=n[t];i.isObject(r)&&i.isObject(o)?i.merge(r,o,a):e[t]=i.clone(o)},_mergerIf:function(t,e,n){var a=e[t],r=n[t];i.isObject(a)&&i.isObject(r)?i.mergeIf(a,r):e.hasOwnProperty(t)||(e[t]=i.clone(r))},merge:function(t,e,n){var a,r,o,s,l,u=i.isArray(e)?e:[e],d=u.length;if(!i.isObject(t))return t;for(a=(n=n||{}).merger||i._merger,r=0;r<d;++r)if(e=u[r],i.isObject(e))for(l=0,s=(o=Object.keys(e)).length;l<s;++l)a(o[l],t,e,n);return t},mergeIf:function(t,e){return i.merge(t,e,{merger:i._mergerIf})},extend:function(t){for(var e=1,n=arguments.length;e<n;++e)i.each(arguments[e],function(e,n){t[n]=e});return t},inherits:function(t){var e=this,n=t&&t.hasOwnProperty(\"constructor\")?t.constructor:function(){return e.apply(this,arguments)},a=function(){this.constructor=n};return a.prototype=e.prototype,n.prototype=new a,n.extend=i.inherits,t&&i.extend(n.prototype,t),n.__super__=e.prototype,n}};e.exports=i,i.callCallback=i.callback,i.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},i.getValueOrDefault=i.valueOrDefault,i.getValueAtIndexOrDefault=i.valueAtIndexOrDefault},{}],43:[function(t,e,n){\"use strict\";var i=t(42),a={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){\"use strict\";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(\"\"+t).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);if(!n||\"normal\"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case\"px\":return t;case\"%\":t/=100}return e*t},toPadding:function(t){var e,n,a,r;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,r=+t.left||0):e=n=a=r=+t||0,{top:e,right:n,bottom:a,left:r,height:e+a,width:r+n}},resolve:function(t,e,n){var a,r,o;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&\"function\"==typeof o&&(o=o(e)),void 0!==n&&i.isArray(o)&&(o=o[n]),void 0!==o))return o}}},{42:42}],45:[function(t,e,n){\"use strict\";e.exports=t(42),e.exports.easing=t(43),e.exports.canvas=t(41),e.exports.options=t(44)},{41:41,42:42,43:43,44:44}],46:[function(t,e,n){e.exports={acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext(\"2d\")||null}}},{}],47:[function(t,e,n){\"use strict\";function i(t,e){var n=p.getStyle(t,e),i=n&&n.match(/^(\\d+)(\\.\\d+)?px$/);return i?Number(i[1]):void 0}function a(t,e){var n=t.style,a=t.getAttribute(\"height\"),r=t.getAttribute(\"width\");if(t[v]={initial:{height:a,width:r,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||\"block\",null===r||\"\"===r){var o=i(t,\"width\");void 0!==o&&(t.width=o)}if(null===a||\"\"===a)if(\"\"===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var s=i(t,\"height\");void 0!==o&&(t.height=s)}return t}function r(t,e,n){t.addEventListener(e,n,w)}function o(t,e,n){t.removeEventListener(e,n,w)}function s(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function l(t,e){var n=k[t.type]||t.type,i=p.getRelativePosition(t,e);return s(n,e,i.x,i.y,t)}function u(t,e){var n=!1,i=[];return function(){i=Array.prototype.slice.call(arguments),e=e||this,n||(n=!0,p.requestAnimFrame.call(window,function(){n=!1,t.apply(e,i)}))}}function d(t){var e=document.createElement(\"div\"),n=y+\"size-monitor\",i=\"position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;\";e.style.cssText=i,e.className=n,e.innerHTML='<div class=\"'+n+'-expand\" style=\"'+i+'\"><div style=\"position:absolute;width:1000000px;height:1000000px;left:0;top:0\"></div></div><div class=\"'+n+'-shrink\" style=\"'+i+'\"><div style=\"position:absolute;width:200%;height:200%;left:0; top:0\"></div></div>';var a=e.childNodes[0],o=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,o.scrollLeft=1e6,o.scrollTop=1e6};var s=function(){e._reset(),t()};return r(a,\"scroll\",s.bind(a,\"expand\")),r(o,\"scroll\",s.bind(o,\"shrink\")),e}function c(t,e){var n=t[v]||(t[v]={}),i=n.renderProxy=function(t){t.animationName===x&&e()};p.each(_,function(e){r(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(b)}function h(t){var e=t[v]||{},n=e.renderProxy;n&&(p.each(_,function(e){o(t,e,n)}),delete e.renderProxy),t.classList.remove(b)}function f(t,e,n){var i=t[v]||(t[v]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(s(\"resize\",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[v]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function m(t,e){var n=t._style||document.createElement(\"style\");t._style||(t._style=n,e=\"/* Chart.js */\\n\"+e,n.setAttribute(\"type\",\"text/css\"),document.getElementsByTagName(\"head\")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var p=t(45),v=\"$chartjs\",y=\"chartjs-\",b=y+\"render-monitor\",x=y+\"render-animation\",_=[\"animationstart\",\"webkitAnimationStart\"],k={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"},w=!!function(){var t=!1;try{var e=Object.defineProperty({},\"passive\",{get:function(){t=!0}});window.addEventListener(\"e\",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:\"undefined\"!=typeof window&&\"undefined\"!=typeof document,initialize:function(){var t=\"from{opacity:0.99}to{opacity:1}\";m(this,\"@-webkit-keyframes \"+x+\"{\"+t+\"}@keyframes \"+x+\"{\"+t+\"}.\"+b+\"{-webkit-animation:\"+x+\" 0.001s;animation:\"+x+\" 0.001s;}\")},acquireContext:function(t,e){\"string\"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext(\"2d\");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[v]){var n=e[v].initial;[\"height\",\"width\"].forEach(function(t){var i=n[t];p.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),p.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[v]}},addEventListener:function(t,e,n){var i=t.canvas;if(\"resize\"!==e){var a=n[v]||(n[v]={});r(i,e,(a.proxies||(a.proxies={}))[t.id+\"_\"+e]=function(e){n(l(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if(\"resize\"!==e){var a=((n[v]||{}).proxies||{})[t.id+\"_\"+e];a&&o(i,e,a)}else g(i)}},p.addEvent=r,p.removeEvent=o},{45:45}],48:[function(t,e,n){\"use strict\";var i=t(45),a=t(46),r=t(47),o=r._enabled?r:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},o)},{45:45,46:46,47:47}],49:[function(t,e,n){\"use strict\";var i=t(25),a=t(40),r=t(45);i._set(\"global\",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return\"origin\";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return\"-\"!==r[0]&&\"+\"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case\"bottom\":return\"start\";case\"top\":return\"end\";case\"zero\":return\"origin\";case\"origin\":case\"start\":case\"end\":return r;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if(\"start\"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:\"end\"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePosition?r=i.getBasePosition():i.getBasePixel&&(r=i.getBasePixel()),void 0!==r&&null!==r){if(void 0!==r.x&&void 0!==r.y)return r;if(\"number\"==typeof r&&isFinite(r))return e=i.isHorizontal(),{x:e?r:null,y:e?null:r}}return null}function n(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function o(t){var e=t.fill,n=\"dataset\";return!1===e?null:(isFinite(e)||(n=\"boundary\"),d[n](t))}function s(t){return t&&!t.skip}function l(t,e,n,i,a){var o;if(i&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<i;++o)r.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(n[a-1].x,n[a-1].y),o=a-1;o>0;--o)r.canvas.lineTo(t,n[o],n[o-1],!0)}}function u(t,e,n,i,a,r){var o,u,d,c,h,f,g,m=e.length,p=i.spanGaps,v=[],y=[],b=0,x=0;for(t.beginPath(),o=0,u=m+!!r;o<u;++o)h=n(c=e[d=o%m]._view,d,i),f=s(c),g=s(h),f&&g?(b=v.push(c),x=y.push(h)):b&&x&&(p?(f&&v.push(c),g&&y.push(h)):(l(t,v,y,b,x),b=x=0,v=[],y=[]));l(t,v,y,b,x),t.closePath(),t.fillStyle=a,t.fill()}var d={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};return{id:\"filler\",afterDatasetsUpdate:function(i,r){var s,l,u,d,c=(i.data.datasets||[]).length,h=r.propagate,f=[];for(l=0;l<c;++l)d=null,(u=(s=i.getDatasetMeta(l)).dataset)&&u._model&&u instanceof a.Line&&(d={visible:i.isDatasetVisible(l),fill:t(u,l,c),chart:i,el:u}),s.$filler=d,f.push(d);for(l=0;l<c;++l)(d=f[l])&&(d.fill=n(f,l,h),d.boundary=e(d),d.mapper=o(d))},beforeDatasetDraw:function(t,e){var n=e.meta.$filler;if(n){var a=t.ctx,o=n.el,s=o._view,l=o._children||[],d=n.mapper,c=s.backgroundColor||i.global.defaultColor;d&&c&&l.length&&(r.canvas.clipArea(a,t.chartArea),u(a,l,d,s,c,o._loop),r.canvas.unclipArea(a))}}}}},{25:25,40:40,45:45}],50:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{legend:{display:!0,position:\"top\",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return r.isArray(e.datasets)?e.datasets.map(function(e,n){return{text:e.label,fillStyle:r.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(n),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:n}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');for(var n=0;n<t.data.datasets.length;n++)e.push('<li><span style=\"background-color:'+t.data.datasets[n].backgroundColor+'\"></span>'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});o.configure(e,i,n),o.addBox(e,i),e.legend=i}var o=t.layoutService,s=r.noop;return t.Legend=a.extend({initialize:function(t){r.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:s,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:function(){var t=this,e=t.options.labels||{},n=r.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:s,beforeFit:s,fit:function(){var t=this,n=t.options,a=n.labels,o=n.display,s=t.ctx,l=i.global,u=r.valueOrDefault,d=u(a.fontSize,l.defaultFontSize),c=u(a.fontStyle,l.defaultFontStyle),h=u(a.fontFamily,l.defaultFontFamily),f=r.fontString(d,c,h),g=t.legendHitBoxes=[],m=t.minSize,p=t.isHorizontal();if(p?(m.width=t.maxWidth,m.height=o?10:0):(m.width=o?10:0,m.height=t.maxHeight),o)if(s.font=f,p){var v=t.lineWidths=[0],y=t.legendItems.length?d+a.padding:0;s.textAlign=\"left\",s.textBaseline=\"top\",r.each(t.legendItems,function(n,i){var r=e(a,d)+d/2+s.measureText(n.text).width;v[v.length-1]+r+a.padding>=t.width&&(y+=d+a.padding,v[v.length]=t.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+a.padding}),m.height+=y}else{var b=a.padding,x=t.columnWidths=[],_=a.padding,k=0,w=0,M=d+b;r.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+s.measureText(t.text).width;w+M>m.height&&(_+=k+a.padding,x.push(k),k=0,w=0),k=Math.max(k,i),w+=M,g[n]={left:0,top:0,width:i,height:d}}),_+=k,x.push(k),m.width+=_}t.width=m.width,t.height=m.height},afterFit:s,isHorizontal:function(){return\"top\"===this.options.position||\"bottom\"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,o=i.global,s=o.elements.line,l=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=r.valueOrDefault,f=h(a.fontColor,o.defaultFontColor),g=h(a.fontSize,o.defaultFontSize),m=h(a.fontStyle,o.defaultFontStyle),p=h(a.fontFamily,o.defaultFontFamily),v=r.fontString(g,m,p);c.textAlign=\"left\",c.textBaseline=\"middle\",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var y=e(a,g),b=t.legendHitBoxes,x=function(t,e,i){if(!(isNaN(y)||y<=0)){c.save(),c.fillStyle=h(i.fillStyle,o.defaultColor),c.lineCap=h(i.lineCap,s.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,s.borderDashOffset),c.lineJoin=h(i.lineJoin,s.borderJoinStyle),c.lineWidth=h(i.lineWidth,s.borderWidth),c.strokeStyle=h(i.strokeStyle,o.defaultColor);var a=0===h(i.lineWidth,s.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,s.borderDash)),n.labels&&n.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=t+u,f=e+u;r.canvas.drawPoint(c,i.pointStyle,l,d,f)}else a||c.strokeRect(t,e,y,g),c.fillRect(t,e,y,g);c.restore()}},_=function(t,e,n,i){var a=g/2,r=y+a+t,o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(r+i,o),c.stroke())},k=t.isHorizontal();d=k?{x:t.left+(l-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var w=g+a.padding;r.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,r=y+g/2+i,o=d.x,s=d.y;k?o+r>=l&&(s=d.y+=w,d.line++,o=d.x=t.left+(l-u[d.line])/2):s+w>t.bottom&&(o=d.x=o+t.columnWidths[d.line]+a.padding,s=d.y=t.top+a.padding,d.line++),x(o,s,e),b[n].left=o,b[n].top=s,_(o,s,e,i),k?d.x+=r+a.padding:d.y+=w})}},handleEvent:function(t){var e=this,n=e.options,i=\"mouseup\"===t.type?\"click\":t.type,a=!1;if(\"mousemove\"===i){if(!n.onHover)return}else{if(\"click\"!==i)return;if(!n.onClick)return}var r=t.x,o=t.y;if(r>=e.left&&r<=e.right&&o>=e.top&&o<=e.bottom)for(var s=e.legendHitBoxes,l=0;l<s.length;++l){var u=s[l];if(r>=u.left&&r<=u.left+u.width&&o>=u.top&&o<=u.top+u.height){if(\"click\"===i){n.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if(\"mousemove\"===i){n.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}}),{id:\"legend\",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(r.mergeIf(e,i.global.legend),a?(o.configure(t,a,e),a.options=e):n(t,e)):a&&(o.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){\"use strict\";var i=t(25),a=t(26),r=t(45);i._set(\"global\",{title:{display:!1,fontStyle:\"bold\",fullWidth:!0,lineHeight:1.2,padding:10,position:\"top\",text:\"\",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,o=r.noop;return t.Title=a.extend({initialize:function(t){var e=this;r.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:o,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:o,beforeSetDimensions:o,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:o,beforeBuildLabels:o,buildLabels:o,afterBuildLabels:o,beforeFit:o,fit:function(){var t=this,e=r.valueOrDefault,n=t.options,a=n.display,o=e(n.fontSize,i.global.defaultFontSize),s=t.minSize,l=r.isArray(n.text)?n.text.length:1,u=r.options.toLineHeight(n.lineHeight,o),d=a?l*u+2*n.padding:0;t.isHorizontal()?(s.width=t.maxWidth,s.height=d):(s.width=d,s.height=t.maxHeight),t.width=s.width,t.height=s.height},afterFit:o,isHorizontal:function(){var t=this.options.position;return\"top\"===t||\"bottom\"===t},draw:function(){var t=this,e=t.ctx,n=r.valueOrDefault,a=t.options,o=i.global;if(a.display){var s,l,u,d=n(a.fontSize,o.defaultFontSize),c=n(a.fontStyle,o.defaultFontStyle),h=n(a.fontFamily,o.defaultFontFamily),f=r.fontString(d,c,h),g=r.options.toLineHeight(a.lineHeight,d),m=g/2+a.padding,p=0,v=t.top,y=t.left,b=t.bottom,x=t.right;e.fillStyle=n(a.fontColor,o.defaultFontColor),e.font=f,t.isHorizontal()?(l=y+(x-y)/2,u=v+m,s=x-y):(l=\"left\"===a.position?y+m:x-m,u=v+(b-v)/2,s=b-v,p=Math.PI*(\"left\"===a.position?-.5:.5)),e.save(),e.translate(l,u),e.rotate(p),e.textAlign=\"center\",e.textBaseline=\"middle\";var _=a.text;if(r.isArray(_))for(var k=0,w=0;w<_.length;++w)e.fillText(_[w],0,k,s),k+=g;else e.fillText(_,0,0,s);e.restore()}}}),{id:\"title\",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var o=a.options.title,s=a.titleBlock;o?(r.mergeIf(o,i.global.title),s?(n.configure(a,s,o),s.options=o):e(a,o)):s&&(t.layoutService.removeBox(a,s),delete a.titleBlock)}}}},{25:25,26:26,45:45}],52:[function(t,e,n){\"use strict\";e.exports=function(t){var e=t.Scale.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,e=t.getLabels();t.minIndex=0,t.maxIndex=e.length-1;var n;void 0!==t.options.ticks.min&&(n=e.indexOf(t.options.ticks.min),t.minIndex=-1!==n?n:t.minIndex),void 0!==t.options.ticks.max&&(n=e.indexOf(t.options.ticks.max),t.maxIndex=-1!==n?n:t.maxIndex),t.min=e[t.minIndex],t.max=e[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e){var n,i=this,a=i.options.offset,r=Math.max(i.maxIndex+1-i.minIndex-(a?0:1),1);if(void 0!==t&&null!==t&&(n=i.isHorizontal()?t.x:t.y),void 0!==n||void 0!==t&&isNaN(e)){var o=i.getLabels();t=n||t;var s=o.indexOf(t);e=-1!==s?s:e}if(i.isHorizontal()){var l=i.width/r,u=l*(e-i.minIndex);return a&&(u+=l/2),i.left+Math.round(u)}var d=i.height/r,c=d*(e-i.minIndex);return a&&(c+=d/2),i.top+Math.round(c)},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,n=e.options.offset,i=Math.max(e._ticks.length-(n?0:1),1),a=e.isHorizontal(),r=(a?e.width:e.height)/i;return t-=a?e.left:e.top,n&&(t-=r/2),(t<=0?0:Math.round(t/r))+e.minIndex},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType(\"category\",e,{position:\"bottom\"})}},{}],53:[function(t,e,n){\"use strict\";var i=t(25),a=t(45),r=t(34);e.exports=function(t){var e={position:\"left\",ticks:{callback:r.formatters.linear}},n=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return o?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,i=e.chart,r=i.data.datasets,o=e.isHorizontal();e.min=null,e.max=null;var s=n.stacked;if(void 0===s&&a.each(r,function(e,n){if(!s){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&t(a)&&void 0!==a.stack&&(s=!0)}}),n.stacked||s){var l={};a.each(r,function(r,o){var s=i.getDatasetMeta(o),u=[s.type,void 0===n.stacked&&void 0===s.stack?o:\"\",s.stack].join(\".\");void 0===l[u]&&(l[u]={positiveValues:[],negativeValues:[]});var d=l[u].positiveValues,c=l[u].negativeValues;i.isDatasetVisible(o)&&t(s)&&a.each(r.data,function(t,i){var a=+e.getRightValue(t);isNaN(a)||s.data[i].hidden||(d[i]=d[i]||0,c[i]=c[i]||0,n.relativePoints?d[i]=100:a<0?c[i]+=a:d[i]+=a)})}),a.each(l,function(t){var n=t.positiveValues.concat(t.negativeValues),i=a.min(n),r=a.max(n);e.min=null===e.min?i:Math.min(e.min,i),e.max=null===e.max?r:Math.max(e.max,r)})}else a.each(r,function(n,r){var o=i.getDatasetMeta(r);i.isDatasetVisible(r)&&t(o)&&a.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||o.data[n].hidden||(null===e.min?e.min=i:i<e.min&&(e.min=i),null===e.max?e.max=i:i>e.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var r=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*r)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),r=n.end-i;return n.isHorizontal()?(e=n.left+n.width/r*(a-i),Math.round(e)):(e=n.bottom-n.height/r*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType(\"linear\",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){\"use strict\";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return\"string\"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var r=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),r!==o&&t.min>=t.max&&(r?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),r={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},o=t.ticks=a.generators.linear(r,t);t.handleDirectionalChanges(),t.max=i.max(o),t.min=i.min(o),e.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){\"use strict\";var i=t(45),a=t(34);e.exports=function(t){var e={position:\"left\",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,r=e.chart,o=r.data.datasets,s=i.valueOrDefault,l=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(o,function(e,n){if(!u){var i=r.getDatasetMeta(n);r.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(o,function(a,o){var s=r.getDatasetMeta(o),l=[s.type,void 0===n.stacked&&void 0===s.stack?o:\"\",s.stack].join(\".\");r.isDatasetVisible(o)&&t(s)&&(void 0===d[l]&&(d[l]=[]),i.each(a.data,function(t,i){var a=d[l],r=+e.getRightValue(t);isNaN(r)||s.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=r)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(o,function(n,a){var o=r.getDatasetMeta(a);r.isDatasetVisible(a)&&t(o)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||o.data[n].hidden||(null===e.min?e.min=i:i<e.min&&(e.min=i),null===e.max?e.max=i:i>e.max&&(e.max=i),0!==i&&(null===e.minNotZero||i<e.minNotZero)&&(e.minNotZero=i))})});e.min=s(a.min,e.min),e.max=s(a.max,e.max),e.min===e.max&&(0!==e.min&&null!==e.min?(e.min=Math.pow(10,Math.floor(i.log10(e.min))-1),e.max=Math.pow(10,Math.floor(i.log10(e.max))+1)):(e.min=1,e.max=10))},buildTicks:function(){var t=this,e=t.options.ticks,n={min:e.min,max:e.max},r=t.ticks=a.generators.logarithmic(n,t);t.isHorizontal()||r.reverse(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},getPixelForValue:function(t){var e,n,a,r=this,o=r.start,s=+r.getRightValue(t),l=r.options.ticks;return r.isHorizontal()?(a=i.log10(r.end)-i.log10(o),0===s?n=r.left:(e=r.width,n=r.left+e/a*(i.log10(s)-i.log10(o)))):(e=r.height,0!==o||l.reverse?0===r.end&&l.reverse?(a=i.log10(r.start)-i.log10(r.minNotZero),n=s===r.end?r.top:s===r.minNotZero?r.top+.02*e:r.top+.02*e+.98*e/a*(i.log10(s)-i.log10(r.minNotZero))):0===s?n=l.reverse?r.top:r.bottom:(a=i.log10(r.end)-i.log10(o),e=r.height,n=r.bottom-e/a*(i.log10(s)-i.log10(o))):(a=i.log10(r.end)-i.log10(r.minNotZero),n=s===o?r.bottom:s===r.minNotZero?r.bottom-.02*e:r.bottom-.02*e-.98*e/a*(i.log10(s)-i.log10(r.minNotZero)))),n},getValueForPixel:function(t){var e,n,a=this,r=i.log10(a.end)-i.log10(a.start);return a.isHorizontal()?(n=a.width,e=a.start*Math.pow(10,(t-a.left)*r/n)):(n=a.height,e=Math.pow(10,(a.bottom-t)*r/n)/a.start),e}});t.scaleService.registerScaleType(\"logarithmic\",n,e)}},{34:34,45:45}],56:[function(t,e,n){\"use strict\";var i=t(25),a=t(45),r=t(34);e.exports=function(t){function e(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function n(t){var e=t.options.pointLabels,n=a.valueOrDefault(e.fontSize,p.defaultFontSize),i=a.valueOrDefault(e.fontStyle,p.defaultFontStyle),r=a.valueOrDefault(e.fontFamily,p.defaultFontFamily);return{size:n,style:i,family:r,font:a.fontString(n,i,r)}}function o(t,e,n){return a.isArray(n)?{w:a.longestText(t,t.font,n),h:n.length*e+1.5*(n.length-1)*e}:{w:t.measureText(n).width,h:e}}function s(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function l(t){var i,r,l,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;i<f;i++){l=t.getPointPosition(i,d),r=o(t.ctx,u.size,t.pointLabels[i]||\"\"),t._pointLabelSizes[i]=r;var g=t.getIndexAngle(i),m=a.toDegrees(g)%360,p=s(m,l.x,r.w,0,180),v=s(m,l.y,r.h,90,270);p.start<c.l&&(c.l=p.start,h.l=g),p.end>c.r&&(c.r=p.end,h.r=g),v.start<c.t&&(c.t=v.start,h.t=g),v.end>c.b&&(c.b=v.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?\"center\":t<180?\"left\":\"right\"}function c(t,e,n,i){if(a.isArray(e))for(var r=n.y,o=1.5*i,s=0;s<e.length;++s)t.fillText(e[s],n.x,r),r+=o;else t.fillText(e,n.x,n.y)}function h(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,r=a.valueOrDefault,o=t.options,s=o.angleLines,l=o.pointLabels;i.lineWidth=s.lineWidth,i.strokeStyle=s.color;var u=t.getDistanceFromCenterForValue(o.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline=\"top\";for(var g=e(t)-1;g>=0;g--){if(s.display){var m=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}if(l.display){var v=t.getPointPosition(g,u+5),y=r(l.fontColor,p.defaultFontColor);i.font=f.font,i.fillStyle=y;var b=t.getIndexAngle(g),x=a.toDegrees(b);i.textAlign=d(x),h(x,t._pointLabelSizes[g],v),c(i,t.pointLabels[g]||\"\",v,f.size)}}}function g(t,n,i,r){var o=t.ctx;if(o.strokeStyle=a.valueAtIndexOrDefault(n.color,r-1),o.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,r-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var s=e(t);if(0===s)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var u=1;u<s;u++)l=t.getPointPosition(u,i),o.lineTo(l.x,l.y);o.closePath(),o.stroke()}}function m(t){return a.isNumber(t)?t:0}var p=i.global,v={display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,color:\"rgba(0, 0, 0, 0.1)\",lineWidth:1},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:\"rgba(255,255,255,0.75)\",backdropPaddingY:2,backdropPaddingX:2,callback:r.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}},y=t.LinearScaleBase.extend({setDimensions:function(){var t=this,e=t.options,n=e.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var i=a.min([t.height,t.width]),r=a.valueOrDefault(n.fontSize,p.defaultFontSize);t.drawingArea=e.display?i/2-(r/2+n.backdropPaddingY):i/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;a.each(e.data.datasets,function(r,o){if(e.isDatasetVisible(o)){var s=e.getDatasetMeta(o);a.each(r.data,function(e,a){var r=+t.getRightValue(e);isNaN(r)||s.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))})}}),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,e=a.valueOrDefault(t.fontSize,p.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*e)))},convertTicksToLabels:function(){var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){this.options.pointLabels.display?l(this):u(this)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-i.height,0)/Math.cos(n.b);a=m(a),r=m(r),o=m(o),s=m(s),i.drawingArea=Math.min(Math.round(t-(a+r)/2),Math.round(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-i-a.drawingArea;a.xCenter=Math.round((o+r)/2+a.left),a.yCenter=Math.round((s+l)/2+a.top)},getIndexAngle:function(t){return t*(2*Math.PI/e(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this,i=n.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(i)*e)+n.xCenter,y:Math.round(Math.sin(i)*e)+n.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,n=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,r=a.valueOrDefault;if(e.display){var o=t.ctx,s=this.getIndexAngle(0),l=r(i.fontSize,p.defaultFontSize),u=r(i.fontStyle,p.defaultFontStyle),d=r(i.fontFamily,p.defaultFontFamily),c=a.fontString(l,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=r(i.fontColor,p.defaultFontColor);if(o.font=c,o.save(),o.translate(t.xCenter,t.yCenter),o.rotate(s),i.showLabelBackdrop){var h=o.measureText(e).width;o.fillStyle=i.backdropColor,o.fillRect(-h/2-i.backdropPaddingX,-u-l/2-i.backdropPaddingY,h+2*i.backdropPaddingX,l+2*i.backdropPaddingY)}o.textAlign=\"center\",o.textBaseline=\"middle\",o.fillStyle=d,o.fillText(e,0,-u),o.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType(\"radialLinear\",y,v)}},{25:25,34:34,45:45}],57:[function(t,e,n){\"use strict\";function i(t,e){return t-e}function a(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}function r(t,e,n,i){if(\"linear\"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}function o(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(i=o+s>>1,a=t[i-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}function s(t,e,n,i){var a=o(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],s=a.lo?a.hi?a.hi:t[t.length-1]:t[1],l=s[e]-r[e],u=l?(n-r[e])/l:0,d=(s[i]-r[i])*u;return r[i]+d}function l(t,e){var n=e.parser,i=e.parser||e.format;return\"function\"==typeof n?n(t):\"string\"==typeof t&&\"string\"==typeof i?v(t,i):(t instanceof v||(t=v(t)),t.isValid()?t:\"function\"==typeof i?i(t):t)}function u(t,e){if(b.isNullOrUndef(t))return null;var n=e.options.time,i=l(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,r,o,s=e-t,l=k[n],u=l.size,d=l.steps;if(!d)return Math.ceil(s/((i||1)*u));for(a=0,r=d.length;a<r&&(o=d[a],!(Math.ceil(s/(u*o))<=i));++a);return o}function c(t,e,n,i){var a,r,o,s=w.length;for(a=w.indexOf(t);a<s-1;++a)if(r=k[w[a]],o=r.steps?r.steps[r.steps.length-1]:_,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return w[a];return w[s-1]}function h(t,e,n,i){var a,r,o=v.duration(v(i).diff(v(n)));for(a=w.length-1;a>=w.indexOf(e);a--)if(r=w[a],k[r].common&&o.as(r)>=t.length)return r;return w[e?w.indexOf(e):0]}function f(t){for(var e=w.indexOf(t)+1,n=w.length;e<n;++e)if(k[w[e]].common)return w[e]}function g(t,e,n,i){var a,r=i.time,o=r.unit||c(r.minUnit,t,e,n),s=f(o),l=b.valueOrDefault(r.stepSize,r.unitStepSize),u=\"week\"===o&&r.isoWeekday,h=i.ticks.major.enabled,g=k[o],m=v(t),p=v(e),y=[];for(l||(l=d(t,e,o,n)),u&&(m=m.isoWeekday(u),p=p.isoWeekday(u)),m=m.startOf(u?\"day\":o),(p=p.startOf(u?\"day\":o))<e&&p.add(1,o),a=v(m),h&&s&&!u&&!r.round&&(a.startOf(s),a.add(~~((m-a)/(g.size*l))*l,o));a<p;a.add(l,o))y.push(+a);return y.push(+a),y}function m(t,e,n,i,a){var r,o,l=0,u=0;return a.offset&&e.length&&(a.time.min||(r=e.length>1?e[1]:i,o=e[0],l=(s(t,\"time\",r,\"pos\")-s(t,\"time\",o,\"pos\"))/2),a.time.max||(r=e[e.length-1],o=e.length>1?e[e.length-2]:n,u=(s(t,\"time\",r,\"pos\")-s(t,\"time\",o,\"pos\"))/2)),{left:l,right:u}}function p(t,e){var n,i,a,r,o=[];for(n=0,i=t.length;n<i;++n)a=t[n],r=!!e&&a===+v(a).startOf(e),o.push({value:a,major:r});return o}var v=t(6);v=\"function\"==typeof v?v:window.moment;var y=t(25),b=t(45),x=Number.MIN_SAFE_INTEGER||-9007199254740991,_=Number.MAX_SAFE_INTEGER||9007199254740991,k={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},w=Object.keys(k);e.exports=function(t){var e=t.Scale.extend({initialize:function(){if(!v)throw new Error(\"Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com\");this.mergeTicksOptions(),t.Scale.prototype.initialize.call(this)},update:function(){var e=this,n=e.options;return n.time&&n.time.format&&console.warn(\"options.time.format is deprecated and replaced by options.time.parser.\"),t.Scale.prototype.update.apply(e,arguments)},getRightValue:function(e){return e&&void 0!==e.t&&(e=e.t),t.Scale.prototype.getRightValue.call(this,e)},determineDataLimits:function(){var t,e,n,r,o,s,l=this,d=l.chart,c=l.options.time,h=_,f=x,g=[],m=[],p=[];for(t=0,n=d.data.labels.length;t<n;++t)p.push(u(d.data.labels[t],l));for(t=0,n=(d.data.datasets||[]).length;t<n;++t)if(d.isDatasetVisible(t))if(o=d.data.datasets[t].data,b.isObject(o[0]))for(m[t]=[],e=0,r=o.length;e<r;++e)s=u(o[e],l),g.push(s),m[t][e]=s;else g.push.apply(g,p),m[t]=p.slice(0);else m[t]=[];p.length&&(p=a(p).sort(i),h=Math.min(h,p[0]),f=Math.max(f,p[p.length-1])),g.length&&(g=a(g).sort(i),h=Math.min(h,g[0]),f=Math.max(f,g[g.length-1])),h=u(c.min,l)||h,f=u(c.max,l)||f,h=h===_?+v().startOf(\"day\"):h,f=f===x?+v().endOf(\"day\")+1:f,l.min=Math.min(h,f),l.max=Math.max(h+1,f),l._horizontal=l.isHorizontal(),l._table=[],l._timestamps={data:g,datasets:m,labels:p}},buildTicks:function(){var t,e,n,i=this,a=i.min,o=i.max,s=i.options,l=s.time,d=[],c=[];switch(s.ticks.source){case\"data\":d=i._timestamps.data;break;case\"labels\":d=i._timestamps.labels;break;case\"auto\":default:d=g(a,o,i.getLabelCapacity(a),s)}for(\"ticks\"===s.bounds&&d.length&&(a=d[0],o=d[d.length-1]),a=u(l.min,i)||a,o=u(l.max,i)||o,t=0,e=d.length;t<e;++t)(n=d[t])>=a&&n<=o&&c.push(n);return i.min=a,i.max=o,i._unit=l.unit||h(c,l.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=r(i._timestamps.data,a,o,s.distribution),i._offsets=m(i._table,c,a,o,s),p(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,r=i.labels&&t<i.labels.length?i.labels[t]:\"\",o=i.datasets[e].data[t];return b.isObject(o)&&(r=n.getRightValue(o)),a.tooltipFormat&&(r=l(r,a).format(a.tooltipFormat)),r},tickFormatFunction:function(t,e,n,i){var a=this,r=a.options,o=t.valueOf(),s=r.time.displayFormats,l=s[a._unit],u=a._majorUnit,d=s[u],c=t.clone().startOf(u).valueOf(),h=r.ticks.major,f=h.enabled&&u&&d&&o===c,g=t.format(i||(f?d:l)),m=f?h:r.ticks.minor,p=b.valueOrDefault(m.callback,m.userCallback);return p?p(g,e,n):g},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(v(t[e].value),e,t));return i},getPixelForOffset:function(t){var e=this,n=e._horizontal?e.width:e.height,i=e._horizontal?e.left:e.top,a=s(e._table,\"time\",t,\"pos\");return i+n*(e._offsets.left+a)/(e._offsets.left+1+e._offsets.right)},getPixelForValue:function(t,e,n){var i=this,a=null;if(void 0!==e&&void 0!==n&&(a=i._timestamps.datasets[n][e]),null===a&&(a=u(t,i)),null!==a)return i.getPixelForOffset(a)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,n=e._horizontal?e.width:e.height,i=e._horizontal?e.left:e.top,a=(n?(t-i)/n:0)*(e._offsets.left+1+e._offsets.left)-e._offsets.right,r=s(e._table,\"pos\",a,\"time\");return v(r)},getLabelWidth:function(t){var e=this,n=e.options.ticks,i=e.ctx.measureText(t).width,a=b.toRadians(n.maxRotation),r=Math.cos(a),o=Math.sin(a);return i*r+b.valueOrDefault(n.fontSize,y.global.defaultFontSize)*o},getLabelCapacity:function(t){var e=this,n=e.options.time.displayFormats.millisecond,i=e.tickFormatFunction(v(t),0,[],n),a=e.getLabelWidth(i),r=e.isHorizontal()?e.width:e.height;return Math.floor(r/a)}});t.scaleService.registerScaleType(\"time\",e,{position:\"bottom\",distribution:\"linear\",bounds:\"data\",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{millisecond:\"h:mm:ss.SSS a\",second:\"h:mm:ss a\",minute:\"h:mm a\",hour:\"hA\",day:\"MMM D\",week:\"ll\",month:\"MMM YYYY\",quarter:\"[Q]Q - YYYY\",year:\"YYYY\"}},ticks:{autoSkip:!1,source:\"auto\",major:{enabled:!1}}})}},{25:25,45:45,6:6}]},{},[7])(7)});"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/Chart.bundle.js",
    "content": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.1\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/* MIT license */\nvar colorNames = require(5);\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getHwb: getHwb,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   hwbString: hwbString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3})$/i,\n       hex =  /^#([a-fA-F0-9]{6})$/i,\n       rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       keyword = /(\\w+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr);\n   if (match) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n   }\n   else if (match = string.match(hex)) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = colorNames[match[1]];\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb[3] = a;\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getHwb(string) {\n   if (!string) {\n      return;\n   }\n   var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hwb);\n   if (match) {\n    var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n   }\n}\n\nfunction getRgb(string) {\n   var rgba = getRgba(string);\n   return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n  var hsla = getHsla(string);\n  return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n   else if (vals = getHwb(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgb) {\n   return \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1])\n              + hexDouble(rgb[2]);\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n   if (alpha === undefined) {\n      alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n   }\n   return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n           + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n  return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorNames) {\n   reverseNames[colorNames[name]] = name;\n}\n\n},{\"5\":5}],2:[function(require,module,exports){\n/* MIT license */\nvar convert = require(4);\nvar string = require(1);\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.valid = false;\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = string.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\tisValid: function () {\n\t\treturn this.valid;\n\t},\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn string.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tthis.valid = true;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nmodule.exports = Color;\n\n},{\"1\":1,\"4\":4}],3:[function(require,module,exports){\n/* MIT license */\n\nmodule.exports = {\n  rgb2hsl: rgb2hsl,\n  rgb2hsv: rgb2hsv,\n  rgb2hwb: rgb2hwb,\n  rgb2cmyk: rgb2cmyk,\n  rgb2keyword: rgb2keyword,\n  rgb2xyz: rgb2xyz,\n  rgb2lab: rgb2lab,\n  rgb2lch: rgb2lch,\n\n  hsl2rgb: hsl2rgb,\n  hsl2hsv: hsl2hsv,\n  hsl2hwb: hsl2hwb,\n  hsl2cmyk: hsl2cmyk,\n  hsl2keyword: hsl2keyword,\n\n  hsv2rgb: hsv2rgb,\n  hsv2hsl: hsv2hsl,\n  hsv2hwb: hsv2hwb,\n  hsv2cmyk: hsv2cmyk,\n  hsv2keyword: hsv2keyword,\n\n  hwb2rgb: hwb2rgb,\n  hwb2hsl: hwb2hsl,\n  hwb2hsv: hwb2hsv,\n  hwb2cmyk: hwb2cmyk,\n  hwb2keyword: hwb2keyword,\n\n  cmyk2rgb: cmyk2rgb,\n  cmyk2hsl: cmyk2hsl,\n  cmyk2hsv: cmyk2hsv,\n  cmyk2hwb: cmyk2hwb,\n  cmyk2keyword: cmyk2keyword,\n\n  keyword2rgb: keyword2rgb,\n  keyword2hsl: keyword2hsl,\n  keyword2hsv: keyword2hsv,\n  keyword2hwb: keyword2hwb,\n  keyword2cmyk: keyword2cmyk,\n  keyword2lab: keyword2lab,\n  keyword2xyz: keyword2xyz,\n\n  xyz2rgb: xyz2rgb,\n  xyz2lab: xyz2lab,\n  xyz2lch: xyz2lch,\n\n  lab2xyz: lab2xyz,\n  lab2rgb: lab2rgb,\n  lab2lch: lab2lch,\n\n  lch2lab: lch2lab,\n  lch2xyz: lch2xyz,\n  lch2rgb: lch2rgb\n}\n\n\nfunction rgb2hsl(rgb) {\n  var r = rgb[0]/255,\n      g = rgb[1]/255,\n      b = rgb[2]/255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, l;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g)/ delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  l = (min + max) / 2;\n\n  if (max == min)\n    s = 0;\n  else if (l <= 0.5)\n    s = delta / (max + min);\n  else\n    s = delta / (2 - max - min);\n\n  return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, v;\n\n  if (max == 0)\n    s = 0;\n  else\n    s = (delta/max * 1000)/10;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g) / delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  v = ((max / 255) * 1000) / 10;\n\n  return [h, s, v];\n}\n\nfunction rgb2hwb(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      h = rgb2hsl(rgb)[0],\n      w = 1/255 * Math.min(r, Math.min(g, b)),\n      b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n  return [h, w * 100, b * 100];\n}\n\nfunction rgb2cmyk(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255,\n      c, m, y, k;\n\n  k = Math.min(1 - r, 1 - g, 1 - b);\n  c = (1 - r - k) / (1 - k) || 0;\n  m = (1 - g - k) / (1 - k) || 0;\n  y = (1 - b - k) / (1 - k) || 0;\n  return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n  return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255;\n\n  // assume sRGB\n  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n  return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n  var xyz = rgb2xyz(rgb),\n        x = xyz[0],\n        y = xyz[1],\n        z = xyz[2],\n        l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction rgb2lch(args) {\n  return lab2lch(rgb2lab(args));\n}\n\nfunction hsl2rgb(hsl) {\n  var h = hsl[0] / 360,\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      t1, t2, t3, rgb, val;\n\n  if (s == 0) {\n    val = l * 255;\n    return [val, val, val];\n  }\n\n  if (l < 0.5)\n    t2 = l * (1 + s);\n  else\n    t2 = l + s - l * s;\n  t1 = 2 * l - t2;\n\n  rgb = [0, 0, 0];\n  for (var i = 0; i < 3; i++) {\n    t3 = h + 1 / 3 * - (i - 1);\n    t3 < 0 && t3++;\n    t3 > 1 && t3--;\n\n    if (6 * t3 < 1)\n      val = t1 + (t2 - t1) * 6 * t3;\n    else if (2 * t3 < 1)\n      val = t2;\n    else if (3 * t3 < 2)\n      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n    else\n      val = t1;\n\n    rgb[i] = val * 255;\n  }\n\n  return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n  var h = hsl[0],\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      sv, v;\n\n  if(l === 0) {\n      // no need to do calc on black\n      // also avoids divide by 0 error\n      return [0, 0, 0];\n  }\n\n  l *= 2;\n  s *= (l <= 1) ? l : 2 - l;\n  v = (l + s) / 2;\n  sv = (2 * s) / (l + s);\n  return [h, sv * 100, v * 100];\n}\n\nfunction hsl2hwb(args) {\n  return rgb2hwb(hsl2rgb(args));\n}\n\nfunction hsl2cmyk(args) {\n  return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n  return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n  var h = hsv[0] / 60,\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      hi = Math.floor(h) % 6;\n\n  var f = h - Math.floor(h),\n      p = 255 * v * (1 - s),\n      q = 255 * v * (1 - (s * f)),\n      t = 255 * v * (1 - (s * (1 - f))),\n      v = 255 * v;\n\n  switch(hi) {\n    case 0:\n      return [v, t, p];\n    case 1:\n      return [q, v, p];\n    case 2:\n      return [p, v, t];\n    case 3:\n      return [p, q, v];\n    case 4:\n      return [t, p, v];\n    case 5:\n      return [v, p, q];\n  }\n}\n\nfunction hsv2hsl(hsv) {\n  var h = hsv[0],\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      sl, l;\n\n  l = (2 - s) * v;\n  sl = s * v;\n  sl /= (l <= 1) ? l : 2 - l;\n  sl = sl || 0;\n  l /= 2;\n  return [h, sl * 100, l * 100];\n}\n\nfunction hsv2hwb(args) {\n  return rgb2hwb(hsv2rgb(args))\n}\n\nfunction hsv2cmyk(args) {\n  return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n  return rgb2keyword(hsv2rgb(args));\n}\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nfunction hwb2rgb(hwb) {\n  var h = hwb[0] / 360,\n      wh = hwb[1] / 100,\n      bl = hwb[2] / 100,\n      ratio = wh + bl,\n      i, v, f, n;\n\n  // wh + bl cant be > 1\n  if (ratio > 1) {\n    wh /= ratio;\n    bl /= ratio;\n  }\n\n  i = Math.floor(6 * h);\n  v = 1 - bl;\n  f = 6 * h - i;\n  if ((i & 0x01) != 0) {\n    f = 1 - f;\n  }\n  n = wh + f * (v - wh);  // linear interpolation\n\n  switch (i) {\n    default:\n    case 6:\n    case 0: r = v; g = n; b = wh; break;\n    case 1: r = n; g = v; b = wh; break;\n    case 2: r = wh; g = v; b = n; break;\n    case 3: r = wh; g = n; b = v; break;\n    case 4: r = n; g = wh; b = v; break;\n    case 5: r = v; g = wh; b = n; break;\n  }\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction hwb2hsl(args) {\n  return rgb2hsl(hwb2rgb(args));\n}\n\nfunction hwb2hsv(args) {\n  return rgb2hsv(hwb2rgb(args));\n}\n\nfunction hwb2cmyk(args) {\n  return rgb2cmyk(hwb2rgb(args));\n}\n\nfunction hwb2keyword(args) {\n  return rgb2keyword(hwb2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n  var c = cmyk[0] / 100,\n      m = cmyk[1] / 100,\n      y = cmyk[2] / 100,\n      k = cmyk[3] / 100,\n      r, g, b;\n\n  r = 1 - Math.min(1, c * (1 - k) + k);\n  g = 1 - Math.min(1, m * (1 - k) + k);\n  b = 1 - Math.min(1, y * (1 - k) + k);\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n  return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n  return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2hwb(args) {\n  return rgb2hwb(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n  return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n  var x = xyz[0] / 100,\n      y = xyz[1] / 100,\n      z = xyz[2] / 100,\n      r, g, b;\n\n  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n  // assume sRGB\n  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n    : r = (r * 12.92);\n\n  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n    : g = (g * 12.92);\n\n  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n    : b = (b * 12.92);\n\n  r = Math.min(Math.max(0, r), 1);\n  g = Math.min(Math.max(0, g), 1);\n  b = Math.min(Math.max(0, b), 1);\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction xyz2lab(xyz) {\n  var x = xyz[0],\n      y = xyz[1],\n      z = xyz[2],\n      l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction xyz2lch(args) {\n  return lab2lch(xyz2lab(args));\n}\n\nfunction lab2xyz(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      x, y, z, y2;\n\n  if (l <= 8) {\n    y = (l * 100) / 903.3;\n    y2 = (7.787 * (y / 100)) + (16 / 116);\n  } else {\n    y = 100 * Math.pow((l + 16) / 116, 3);\n    y2 = Math.pow(y / 100, 1/3);\n  }\n\n  x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n  z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n  return [x, y, z];\n}\n\nfunction lab2lch(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      hr, h, c;\n\n  hr = Math.atan2(b, a);\n  h = hr * 360 / 2 / Math.PI;\n  if (h < 0) {\n    h += 360;\n  }\n  c = Math.sqrt(a * a + b * b);\n  return [l, c, h];\n}\n\nfunction lab2rgb(args) {\n  return xyz2rgb(lab2xyz(args));\n}\n\nfunction lch2lab(lch) {\n  var l = lch[0],\n      c = lch[1],\n      h = lch[2],\n      a, b, hr;\n\n  hr = h / 360 * 2 * Math.PI;\n  a = c * Math.cos(hr);\n  b = c * Math.sin(hr);\n  return [l, a, b];\n}\n\nfunction lch2xyz(args) {\n  return lab2xyz(lch2lab(args));\n}\n\nfunction lch2rgb(args) {\n  return lab2rgb(lch2lab(args));\n}\n\nfunction keyword2rgb(keyword) {\n  return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n  return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n  return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2hwb(args) {\n  return rgb2hwb(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n  return rgb2cmyk(keyword2rgb(args));\n}\n\nfunction keyword2lab(args) {\n  return rgb2lab(keyword2rgb(args));\n}\n\nfunction keyword2xyz(args) {\n  return rgb2xyz(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n  aliceblue:  [240,248,255],\n  antiquewhite: [250,235,215],\n  aqua: [0,255,255],\n  aquamarine: [127,255,212],\n  azure:  [240,255,255],\n  beige:  [245,245,220],\n  bisque: [255,228,196],\n  black:  [0,0,0],\n  blanchedalmond: [255,235,205],\n  blue: [0,0,255],\n  blueviolet: [138,43,226],\n  brown:  [165,42,42],\n  burlywood:  [222,184,135],\n  cadetblue:  [95,158,160],\n  chartreuse: [127,255,0],\n  chocolate:  [210,105,30],\n  coral:  [255,127,80],\n  cornflowerblue: [100,149,237],\n  cornsilk: [255,248,220],\n  crimson:  [220,20,60],\n  cyan: [0,255,255],\n  darkblue: [0,0,139],\n  darkcyan: [0,139,139],\n  darkgoldenrod:  [184,134,11],\n  darkgray: [169,169,169],\n  darkgreen:  [0,100,0],\n  darkgrey: [169,169,169],\n  darkkhaki:  [189,183,107],\n  darkmagenta:  [139,0,139],\n  darkolivegreen: [85,107,47],\n  darkorange: [255,140,0],\n  darkorchid: [153,50,204],\n  darkred:  [139,0,0],\n  darksalmon: [233,150,122],\n  darkseagreen: [143,188,143],\n  darkslateblue:  [72,61,139],\n  darkslategray:  [47,79,79],\n  darkslategrey:  [47,79,79],\n  darkturquoise:  [0,206,209],\n  darkviolet: [148,0,211],\n  deeppink: [255,20,147],\n  deepskyblue:  [0,191,255],\n  dimgray:  [105,105,105],\n  dimgrey:  [105,105,105],\n  dodgerblue: [30,144,255],\n  firebrick:  [178,34,34],\n  floralwhite:  [255,250,240],\n  forestgreen:  [34,139,34],\n  fuchsia:  [255,0,255],\n  gainsboro:  [220,220,220],\n  ghostwhite: [248,248,255],\n  gold: [255,215,0],\n  goldenrod:  [218,165,32],\n  gray: [128,128,128],\n  green:  [0,128,0],\n  greenyellow:  [173,255,47],\n  grey: [128,128,128],\n  honeydew: [240,255,240],\n  hotpink:  [255,105,180],\n  indianred:  [205,92,92],\n  indigo: [75,0,130],\n  ivory:  [255,255,240],\n  khaki:  [240,230,140],\n  lavender: [230,230,250],\n  lavenderblush:  [255,240,245],\n  lawngreen:  [124,252,0],\n  lemonchiffon: [255,250,205],\n  lightblue:  [173,216,230],\n  lightcoral: [240,128,128],\n  lightcyan:  [224,255,255],\n  lightgoldenrodyellow: [250,250,210],\n  lightgray:  [211,211,211],\n  lightgreen: [144,238,144],\n  lightgrey:  [211,211,211],\n  lightpink:  [255,182,193],\n  lightsalmon:  [255,160,122],\n  lightseagreen:  [32,178,170],\n  lightskyblue: [135,206,250],\n  lightslategray: [119,136,153],\n  lightslategrey: [119,136,153],\n  lightsteelblue: [176,196,222],\n  lightyellow:  [255,255,224],\n  lime: [0,255,0],\n  limegreen:  [50,205,50],\n  linen:  [250,240,230],\n  magenta:  [255,0,255],\n  maroon: [128,0,0],\n  mediumaquamarine: [102,205,170],\n  mediumblue: [0,0,205],\n  mediumorchid: [186,85,211],\n  mediumpurple: [147,112,219],\n  mediumseagreen: [60,179,113],\n  mediumslateblue:  [123,104,238],\n  mediumspringgreen:  [0,250,154],\n  mediumturquoise:  [72,209,204],\n  mediumvioletred:  [199,21,133],\n  midnightblue: [25,25,112],\n  mintcream:  [245,255,250],\n  mistyrose:  [255,228,225],\n  moccasin: [255,228,181],\n  navajowhite:  [255,222,173],\n  navy: [0,0,128],\n  oldlace:  [253,245,230],\n  olive:  [128,128,0],\n  olivedrab:  [107,142,35],\n  orange: [255,165,0],\n  orangered:  [255,69,0],\n  orchid: [218,112,214],\n  palegoldenrod:  [238,232,170],\n  palegreen:  [152,251,152],\n  paleturquoise:  [175,238,238],\n  palevioletred:  [219,112,147],\n  papayawhip: [255,239,213],\n  peachpuff:  [255,218,185],\n  peru: [205,133,63],\n  pink: [255,192,203],\n  plum: [221,160,221],\n  powderblue: [176,224,230],\n  purple: [128,0,128],\n  rebeccapurple: [102, 51, 153],\n  red:  [255,0,0],\n  rosybrown:  [188,143,143],\n  royalblue:  [65,105,225],\n  saddlebrown:  [139,69,19],\n  salmon: [250,128,114],\n  sandybrown: [244,164,96],\n  seagreen: [46,139,87],\n  seashell: [255,245,238],\n  sienna: [160,82,45],\n  silver: [192,192,192],\n  skyblue:  [135,206,235],\n  slateblue:  [106,90,205],\n  slategray:  [112,128,144],\n  slategrey:  [112,128,144],\n  snow: [255,250,250],\n  springgreen:  [0,255,127],\n  steelblue:  [70,130,180],\n  tan:  [210,180,140],\n  teal: [0,128,128],\n  thistle:  [216,191,216],\n  tomato: [255,99,71],\n  turquoise:  [64,224,208],\n  violet: [238,130,238],\n  wheat:  [245,222,179],\n  white:  [255,255,255],\n  whitesmoke: [245,245,245],\n  yellow: [255,255,0],\n  yellowgreen:  [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\n},{}],4:[function(require,module,exports){\nvar conversions = require(3);\n\nvar convert = function() {\n   return new Converter();\n}\n\nfor (var func in conversions) {\n  // export Raw versions\n  convert[func + \"Raw\"] =  (function(func) {\n    // accept array or plain args\n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      return conversions[func](arg);\n    }\n  })(func);\n\n  var pair = /(\\w+)2(\\w+)/.exec(func),\n      from = pair[1],\n      to = pair[2];\n\n  // export rgb2hsl and [\"rgb\"][\"hsl\"]\n  convert[from] = convert[from] || {};\n\n  convert[from][to] = convert[func] = (function(func) { \n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      \n      var val = conversions[func](arg);\n      if (typeof val == \"string\" || val === undefined)\n        return val; // keyword\n\n      for (var i = 0; i < val.length; i++)\n        val[i] = Math.round(val[i]);\n      return val;\n    }\n  })(func);\n}\n\n\n/* Converter does lazy conversion and caching */\nvar Converter = function() {\n   this.convs = {};\n};\n\n/* Either get the values for a space or\n  set the values for a space, depending on args */\nConverter.prototype.routeSpace = function(space, args) {\n   var values = args[0];\n   if (values === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n   }\n   // color.rgb(10, 10, 10)\n   if (typeof values == \"number\") {\n      values = Array.prototype.slice.call(args);        \n   }\n\n   return this.setValues(space, values);\n};\n  \n/* Set the values for a space, invalidating cache */\nConverter.prototype.setValues = function(space, values) {\n   this.space = space;\n   this.convs = {};\n   this.convs[space] = values;\n   return this;\n};\n\n/* Get the values for a space. If there's already\n  a conversion for the space, fetch it, otherwise\n  compute it */\nConverter.prototype.getValues = function(space) {\n   var vals = this.convs[space];\n   if (!vals) {\n      var fspace = this.space,\n          from = this.convs[fspace];\n      vals = convert[fspace][space](from);\n\n      this.convs[space] = vals;\n   }\n  return vals;\n};\n\n[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n   Converter.prototype[space] = function(vals) {\n      return this.routeSpace(space, arguments);\n   }\n});\n\nmodule.exports = convert;\n},{\"3\":3}],5:[function(require,module,exports){\n'use strict'\n\nmodule.exports = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n\n},{}],6:[function(require,module,exports){\n//! moment.js\n//! version : 2.18.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    var k;\n    for (k in obj) {\n        // even if its not own property I'd still call it non-empty\n        return false;\n    }\n    return true;\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null,\n        rfc2822         : false,\n        weekdayMismatch : false\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nvar some$1 = some;\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i = 0; i < momentProperties.length; i++) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    this._dayOfMonthOrdinalParseLenient = new RegExp(\n        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n            '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar keys$1 = keys;\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    ss : '%d seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid()) {\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nvar indexOf$1 = indexOf;\n\nfunction daysInMonth(year, month) {\n    return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return isArray(this._months) ? this._months :\n            this._months['standalone'];\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return isArray(this._monthsShort) ? this._monthsShort :\n            this._monthsShort['standalone'];\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    // the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return isArray(this._weekdays) ? this._weekdays :\n            this._weekdays['standalone'];\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('k',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return null;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            require('./locale/' + name);\n            // because defineLocale currently also sets the global locale, we\n            // want to undo that for lazy loaded locales\n            getSetGlobalLocale(oldLocale);\n        } catch (e) { }\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                if (!localeFamilies[config.parentLocale]) {\n                    localeFamilies[config.parentLocale] = [];\n                }\n                localeFamilies[config.parentLocale].push({\n                    name: name,\n                    config: config\n                });\n                return null;\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, parentConfig = baseConfig;\n        // MERGE\n        if (locales[name] != null) {\n            parentConfig = locales[name]._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys$1(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n    var string, match, dayFormat,\n        dateFormat, timeFormat, tzFormat;\n    var timezones = {\n        ' GMT': ' +0000',\n        ' EDT': ' -0400',\n        ' EST': ' -0500',\n        ' CDT': ' -0500',\n        ' CST': ' -0600',\n        ' MDT': ' -0600',\n        ' MST': ' -0700',\n        ' PDT': ' -0700',\n        ' PST': ' -0800'\n    };\n    var military = 'YXWVUTSRQPONZABCDEFGHIKLM';\n    var timezone, timezoneIndex;\n\n    string = config._i\n        .replace(/\\([^\\)]*\\)|[\\n\\t]/g, ' ') // Remove comments and folding whitespace\n        .replace(/(\\s\\s+)/g, ' ') // Replace multiple-spaces with a single space\n        .replace(/^\\s|\\s$/g, ''); // Remove leading and trailing spaces\n    match = basicRfcRegex.exec(string);\n\n    if (match) {\n        dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';\n        dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');\n        timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');\n\n        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n        if (match[1]) { // day of week given\n            var momentDate = new Date(match[2]);\n            var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];\n\n            if (match[1].substr(0,3) !== momentDay) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return;\n            }\n        }\n\n        switch (match[5].length) {\n            case 2: // military\n                if (timezoneIndex === 0) {\n                    timezone = ' +0000';\n                } else {\n                    timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;\n                    timezone = ((timezoneIndex < 0) ? ' -' : ' +') +\n                        (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';\n                }\n                break;\n            case 4: // Zone\n                timezone = timezones[match[5]];\n                break;\n            default: // UT or +/-9999\n                timezone = timezones[' GMT'];\n        }\n        match[5] = timezone;\n        config._i = match.splice(1).join('');\n        tzFormat = ' ZZ';\n        config._f = dayFormat + dateFormat + timeFormat + tzFormat;\n        configFromStringAndFormat(config);\n        getParsingFlags(config).rfc2822 = true;\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    configFromRFC2822(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    // Final attempt, use Input Fallback\n    hooks.createFromInputFallback(config);\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear != null) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n    if (config._f === hooks.RFC_2822) {\n        configFromRFC2822(config);\n        return;\n    }\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (isUndefined(input)) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (isObject(input)) {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n    for (var key in m) {\n        if (!(ordering.indexOf(key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n            return false;\n        }\n    }\n\n    var unitHasDecimal = false;\n    for (var i = 0; i < ordering.length; ++i) {\n        if (m[ordering[i]]) {\n            if (unitHasDecimal) {\n                return false; // only allow non-integers for smallest unit\n            }\n            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                unitHasDecimal = true;\n            }\n        }\n    }\n\n    return true;\n}\n\nfunction isValid$1() {\n    return this._isValid;\n}\n\nfunction createInvalid$1() {\n    return createDuration(NaN);\n}\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    this._isValid = isDurationValid(normalizedInput);\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16 && !keepMinutes) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        delta, output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    if (units === 'year' || units === 'month' || units === 'quarter') {\n        output = monthDiff(this, that);\n        if (units === 'quarter') {\n            output = output / 3;\n        } else if (units === 'year') {\n            output = output / 12;\n        }\n    } else {\n        delta = this - that;\n        output = units === 'second' ? delta / 1e3 : // 1000\n            units === 'minute' ? delta / 6e4 : // 1000 * 60\n            units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n            units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n            units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n            delta;\n    }\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString() {\n    if (!this.isValid()) {\n        return null;\n    }\n    var m = this.clone().utc();\n    if (m.year() < 0 || m.year() > 9999) {\n        return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n    }\n    if (isFunction(Date.prototype.toISOString)) {\n        // native implementation is ~50x faster, use it when we can\n        return this.toDate().toISOString();\n    }\n    return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ?\n      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n      locale._dayOfMonthOrdinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0], 10);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$2;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\n\n// Year\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\n// Month\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this.isValid() ? this._data[name] : NaN;\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    ss: 44,         // a few seconds to seconds\n    s : 45,         // seconds to minute\n    m : 45,         // minutes to hour\n    h : 22,         // hours to day\n    d : 26,         // days to month\n    M : 11          // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds <= thresholds.ss && ['s', seconds]  ||\n            seconds < thresholds.s   && ['ss', seconds] ||\n            minutes <= 1             && ['m']           ||\n            minutes < thresholds.m   && ['mm', minutes] ||\n            hours   <= 1             && ['h']           ||\n            hours   < thresholds.h   && ['hh', hours]   ||\n            days    <= 1             && ['d']           ||\n            days    < thresholds.d   && ['dd', days]    ||\n            months  <= 1             && ['M']           ||\n            months  < thresholds.M   && ['MM', months]  ||\n            years   <= 1             && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    if (threshold === 's') {\n        thresholds.ss = limit - 1;\n    }\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds;\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    return (total < 0 ? '-' : '') +\n        'P' +\n        (Y ? Y + 'Y' : '') +\n        (M ? M + 'M' : '') +\n        (D ? D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? h + 'H' : '') +\n        (m ? m + 'M' : '') +\n        (s ? s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid        = isValid$1;\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.18.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\nreturn hooks;\n\n})));\n\n},{}],7:[function(require,module,exports){\n/**\n * @namespace Chart\n */\nvar Chart = require(29)();\n\nChart.helpers = require(45);\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\nrequire(27)(Chart);\n\nChart.defaults = require(25);\nChart.Element = require(26);\nChart.elements = require(40);\nChart.Interaction = require(28);\nChart.platform = require(48);\n\nrequire(31)(Chart);\nrequire(22)(Chart);\nrequire(23)(Chart);\nrequire(24)(Chart);\nrequire(30)(Chart);\nrequire(33)(Chart);\nrequire(32)(Chart);\nrequire(35)(Chart);\n\nrequire(54)(Chart);\nrequire(52)(Chart);\nrequire(53)(Chart);\nrequire(55)(Chart);\nrequire(56)(Chart);\nrequire(57)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire(15)(Chart);\nrequire(16)(Chart);\nrequire(17)(Chart);\nrequire(18)(Chart);\nrequire(19)(Chart);\nrequire(20)(Chart);\nrequire(21)(Chart);\n\nrequire(8)(Chart);\nrequire(9)(Chart);\nrequire(10)(Chart);\nrequire(11)(Chart);\nrequire(12)(Chart);\nrequire(13)(Chart);\nrequire(14)(Chart);\n\n// Loading built-it plugins\nvar plugins = [];\n\nplugins.push(\n\trequire(49)(Chart),\n\trequire(50)(Chart),\n\trequire(51)(Chart)\n);\n\nChart.plugins.register(plugins);\n\nChart.platform.initialize();\n\nmodule.exports = Chart;\nif (typeof window !== 'undefined') {\n\twindow.Chart = Chart;\n}\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nChart.canvasHelpers = Chart.helpers.canvas;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"35\":35,\"40\":40,\"45\":45,\"48\":48,\"49\":49,\"50\":50,\"51\":51,\"52\":52,\"53\":53,\"54\":54,\"55\":55,\"56\":56,\"57\":57,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],9:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],10:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],11:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],12:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],14:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n};\n\n},{}],15:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('bar', {\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\ttype: 'linear'\n\t\t}]\n\t}\n});\n\ndefaults._set('horizontalBar', {\n\thover: {\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'bottom'\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\tposition: 'left',\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Horizontal Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}]\n\t},\n\n\telements: {\n\t\trectangle: {\n\t\t\tborderSkipped: 'left'\n\t\t}\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function(item, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\n\t\t\t\tif (item.length > 0) {\n\t\t\t\t\tif (item[0].yLabel) {\n\t\t\t\t\t\ttitle = item[0].yLabel;\n\t\t\t\t\t} else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n\t\t\t\t\t\ttitle = data.labels[item[0].index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\treturn datasetLabel + ': ' + item.xLabel;\n\t\t\t}\n\t\t},\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Rectangle,\n\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta;\n\n\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\tmeta = me.getMeta();\n\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar i, ilen;\n\n\t\t\tme._ruler = me.getRuler();\n\n\t\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(rects[i], i, reset);\n\t\t\t}\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\trectangle._model = {\n\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t};\n\n\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tupdateElementGeometry: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar model = rectangle._model;\n\t\t\tvar vscale = me.getValueScale();\n\t\t\tvar base = vscale.getBasePixel();\n\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\tmodel.horizontal = horizontal;\n\t\t\tmodel.base = reset ? base : vpixels.base;\n\t\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScale: function() {\n\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScale: function() {\n\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t},\n\n\t\t/**\n\t\t * Returns the effective number of stacks based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackCount: function(last) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\t\tvar stacks = [];\n\t\t\tvar i, meta;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) &&\n\t\t\t\t\t(stacked === false ||\n\t\t\t\t\t(stacked === true && stacks.indexOf(meta.stack) === -1) ||\n\t\t\t\t\t(stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\treturn this.getStackCount(datasetIndex) - 1;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stackCount = me.getStackCount();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar pixels = [];\n\t\t\tvar isHorizontal = scale.isHorizontal();\n\t\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tpixels: pixels,\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tstackCount: stackCount,\n\t\t\t\tscale: scale\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Note: pixel values are not clamped to the scale area.\n\t\t * @private\n\t\t */\n\t\tcalculateBarValuePixels: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar value = scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar stack = meta.stack;\n\t\t\tvar start = 0;\n\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\tif (imeta.bar &&\n\t\t\t\t\t\timeta.stack === stack &&\n\t\t\t\t\t\timeta.controller.getValueScaleId() === scale.id &&\n\t\t\t\t\t\tchart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\tivalue = scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\t\tif ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n\t\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbase = scale.getPixelForValue(start);\n\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\tsize = (head - base) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: head,\n\t\t\t\tcenter: head + size / 2\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tcalculateBarIndexPixels: function(datasetIndex, index, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar options = ruler.scale.options;\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar pixels = ruler.pixels;\n\t\t\tvar base = pixels[index];\n\t\t\tvar length = pixels.length;\n\t\t\tvar start = ruler.start;\n\t\t\tvar end = ruler.end;\n\t\t\tvar leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size;\n\n\t\t\tif (length === 1) {\n\t\t\t\tleftSampleSize = base > start ? base - start : end - base;\n\t\t\t\trightSampleSize = base < end ? end - base : base - start;\n\t\t\t} else {\n\t\t\t\tif (index > 0) {\n\t\t\t\t\tleftSampleSize = (base - pixels[index - 1]) / 2;\n\t\t\t\t\tif (index === length - 1) {\n\t\t\t\t\t\trightSampleSize = leftSampleSize;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (index < length - 1) {\n\t\t\t\t\trightSampleSize = (pixels[index + 1] - base) / 2;\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tleftSampleSize = rightSampleSize;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tleftCategorySize = leftSampleSize * options.categoryPercentage;\n\t\t\trightCategorySize = rightSampleSize * options.categoryPercentage;\n\t\t\tfullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount;\n\t\t\tsize = fullBarSize * options.barPercentage;\n\n\t\t\tsize = Math.min(\n\t\t\t\thelpers.valueOrDefault(options.barThickness, size),\n\t\t\t\thelpers.valueOrDefault(options.maxBarThickness, Infinity));\n\n\t\t\tbase -= leftCategorySize;\n\t\t\tbase += fullBarSize * stackIndex;\n\t\t\tbase += (fullBarSize - size) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: base + size,\n\t\t\t\tcenter: base + size / 2\n\t\t\t};\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar ilen = rects.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\t\trects[i].draw();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\t});\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],16:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('bubble', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\tposition: 'bottom',\n\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tdataElementType: elements.Point,\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar options = me._resolveElementOptions(point, index);\n\t\t\tvar data = me.getDataset().data[index];\n\t\t\tvar dsIndex = me.index;\n\n\t\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n\t\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._options = options;\n\t\t\tpoint._datasetIndex = dsIndex;\n\t\t\tpoint._index = index;\n\t\t\tpoint._model = {\n\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\tborderColor: options.borderColor,\n\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\thitRadius: options.hitRadius,\n\t\t\t\tpointStyle: options.pointStyle,\n\t\t\t\tradius: reset ? 0 : options.radius,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t};\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n\t\t\tmodel.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n\t\t\tmodel.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t\t\tmodel.radius = options.radius + options.hoverRadius;\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = options.backgroundColor;\n\t\t\tmodel.borderColor = options.borderColor;\n\t\t\tmodel.borderWidth = options.borderWidth;\n\t\t\tmodel.radius = options.radius;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\t_resolveElementOptions: function(point, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar dataset = datasets[me.index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar options = chart.options.elements.point;\n\t\t\tvar resolve = helpers.options.resolve;\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar values = {};\n\t\t\tvar i, ilen, key;\n\n\t\t\t// Scriptable options\n\t\t\tvar context = {\n\t\t\t\tchart: chart,\n\t\t\t\tdataIndex: index,\n\t\t\t\tdataset: dataset,\n\t\t\t\tdatasetIndex: me.index\n\t\t\t};\n\n\t\t\tvar keys = [\n\t\t\t\t'backgroundColor',\n\t\t\t\t'borderColor',\n\t\t\t\t'borderWidth',\n\t\t\t\t'hoverBackgroundColor',\n\t\t\t\t'hoverBorderColor',\n\t\t\t\t'hoverBorderWidth',\n\t\t\t\t'hoverRadius',\n\t\t\t\t'hitRadius',\n\t\t\t\t'pointStyle'\n\t\t\t];\n\n\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\tkey = keys[i];\n\t\t\t\tvalues[key] = resolve([\n\t\t\t\t\tcustom[key],\n\t\t\t\t\tdataset[key],\n\t\t\t\t\toptions[key]\n\t\t\t\t], context, index);\n\t\t\t}\n\n\t\t\t// Custom radius resolution\n\t\t\tvalues.radius = resolve([\n\t\t\t\tcustom.radius,\n\t\t\t\tdata ? data.r : undefined,\n\t\t\t\tdataset.radius,\n\t\t\t\toptions.radius\n\t\t\t], context, index);\n\n\t\t\treturn values;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],17:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('doughnut', {\n\tanimation: {\n\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\tanimateRotate: true,\n\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\tanimateScale: false\n\t},\n\thover: {\n\t\tmode: 'single'\n\t},\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar labels = data.labels;\n\n\t\tif (datasets.length) {\n\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\tif (labels[i]) {\n\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t}\n\t\t\t\ttext.push('</li>');\n\t\t\t}\n\t\t}\n\n\t\ttext.push('</ul>');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t// toggle visibility of index if exists\n\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// The percentage of the chart that we cut out of the middle.\n\tcutoutPercentage: 50,\n\n\t// The rotation of the chart, where the first data arc begins.\n\trotation: Math.PI * -0.5,\n\n\t// The total circumference of the chart.\n\tcircumference: Math.PI * 2.0,\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t} else {\n\t\t\t\t\tdataLabel += value;\n\t\t\t\t}\n\n\t\t\t\treturn dataLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\ndefaults._set('pie', helpers.clone(defaults.doughnut));\ndefaults._set('pie', {\n\tcutoutPercentage: 0\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n\t\t\tvar availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n\t\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\t\tvar offset = {x: 0, y: 0};\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\t\tvar circumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (value / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(arcs) {\n\t\t\tvar max = 0;\n\t\t\tvar index = this.index;\n\t\t\tvar length = arcs.length;\n\t\t\tvar borderWidth;\n\t\t\tvar hoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],18:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('line', {\n\tshowLines: true,\n\tspanGaps: false,\n\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\tid: 'x-axis-0'\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.valueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar area = chart.chartArea;\n\t\t\tvar ilen = points.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, area);\n\n\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tpoints[i].draw(area);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],19:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('polarArea', {\n\tscale: {\n\t\ttype: 'radialLinear',\n\t\tangleLines: {\n\t\t\tdisplay: false\n\t\t},\n\t\tgridLines: {\n\t\t\tcircular: true\n\t\t},\n\t\tpointLabels: {\n\t\t\tdisplay: false\n\t\t},\n\t\tticks: {\n\t\t\tbeginAtZero: true\n\t\t}\n\t},\n\n\t// Boolean - Whether to animate the rotation of the chart\n\tanimation: {\n\t\tanimateRotate: true,\n\t\tanimateScale: true\n\t},\n\n\tstartAngle: -0.5 * Math.PI,\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar labels = data.labels;\n\n\t\tif (datasets.length) {\n\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\tif (labels[i]) {\n\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t}\n\t\t\t\ttext.push('</li>');\n\t\t\t}\n\t\t}\n\n\t\ttext.push('</ul>');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],20:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('radar', {\n\tscale: {\n\t\ttype: 'radialLinear'\n\t},\n\telements: {\n\t\tline: {\n\t\t\ttension: 0 // no bezier in radar\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_scale: scale,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],21:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\n\ndefaults._set('scatter', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\tid: 'x-axis-1',    // need an ID so datasets can reference the scale\n\t\t\ttype: 'linear',    // scatter should not use a category axis\n\t\t\tposition: 'bottom'\n\t\t}],\n\t\tyAxes: [{\n\t\t\tid: 'y-axis-1',\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left'\n\t\t}]\n\t},\n\n\tshowLines: false,\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';     // doesn't make sense for scatter since data are formatted as a point\n\t\t\t},\n\t\t\tlabel: function(item) {\n\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\n\n};\n\n},{\"25\":25}],22:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tanimation: {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.Animation = Element.extend({\n\t\tchart: null, // the animation associated chart instance\n\t\tcurrentStep: 0, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @param {Chart} chart - The chart to animate.\n\t\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t\t * @param {Number} duration - The animation duration in ms.\n\t\t * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chart, animation, duration, lazy) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar i, ilen;\n\n\t\t\tanimation.chart = chart;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchart.animating = true;\n\t\t\t}\n\n\t\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tanimations.push(animation);\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (animations.length === 1) {\n\t\t\t\tthis.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\tcancelAnimation: function(chart) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animation) {\n\t\t\t\treturn animation.chart === chart;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchart.animating = false;\n\t\t\t}\n\t\t},\n\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\tvar endTime = Date.now();\n\n\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tadvance: function(count) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar animation, chart;\n\t\t\tvar i = 0;\n\n\t\t\twhile (i < animations.length) {\n\t\t\t\tanimation = animations[i];\n\t\t\t\tchart = animation.chart;\n\n\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\tchart.animating = false;\n\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation instead\n\t * @prop Chart.Animation#animationObject\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'animationObject', {\n\t\tget: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation#chart instead\n\t * @prop Chart.Animation#chartInstance\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n\t\tget: function() {\n\t\t\treturn this.chart;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.chart = value;\n\t\t}\n\t});\n\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],23:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\nvar Interaction = require(28);\nvar platform = require(48);\n\nmodule.exports = function(Chart) {\n\tvar plugins = Chart.plugins;\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tdefaults.global,\n\t\t\tdefaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\t// Update Scale(s) with options\n\t\tif (newOptions.scale) {\n\t\t\tchart.scale.options = newOptions.scale;\n\t\t} else if (newOptions.scales) {\n\t\t\tnewOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n\t\t\t\tchart.scales[scaleOptions.id].options = scaleOptions;\n\t\t\t});\n\t\t}\n\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t}\n\n\tfunction positionIsHorizontal(position) {\n\t\treturn position === 'top' || position === 'bottom';\n\t}\n\n\thelpers.extend(Chart.prototype, /** @lends Chart */ {\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tconstruct: function(item, config) {\n\t\t\tvar me = this;\n\n\t\t\tconfig = initConfig(config);\n\n\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\tvar canvas = context && context.canvas;\n\t\t\tvar height = canvas && canvas.height;\n\t\t\tvar width = canvas && canvas.width;\n\n\t\t\tme.id = helpers.uid();\n\t\t\tme.ctx = context;\n\t\t\tme.canvas = canvas;\n\t\t\tme.config = config;\n\t\t\tme.width = width;\n\t\t\tme.height = height;\n\t\t\tme.aspectRatio = height ? width / height : null;\n\t\t\tme.options = config.options;\n\t\t\tme._bufferedRender = false;\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n\t\t\t * the \"instance\" still need to be defined since it might be called from plugins.\n\t\t\t * @prop Chart#chart\n\t\t\t * @deprecated since version 2.6.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tme.chart = me;\n\t\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t\t// Add the chart instance to the global namespace\n\t\t\tChart.instances[me.id] = me;\n\n\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn me.config.data;\n\t\t\t\t},\n\t\t\t\tset: function(value) {\n\t\t\t\t\tme.config.data = value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!context || !canvas) {\n\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tme.initialize();\n\t\t\tme.update();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me, me.options.devicePixelRatio);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.canvas.clear(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n\t\t\tvar newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n\t\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = me.width = newWidth;\n\t\t\tcanvas.height = me.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(me, options.devicePixelRatio);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales = {};\n\t\t\tvar items = [];\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({\n\t\t\t\t\toptions: options.scale,\n\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\tisDefault: true,\n\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\tif (!scaleClass) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t}\n\n\t\t\t\tvar scale = new scaleClass({\n\t\t\t\t\tid: scaleOptions.id,\n\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\tchart: me\n\t\t\t\t});\n\n\t\t\t\tscales[scale.id] = scale;\n\t\t\t\tscale.mergeTicksOptions();\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t}\n\t\t\t\tmeta.type = type;\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t} else {\n\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tupdateConfig(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\tcontroller.reset();\n\t\t\t});\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t\t// after update.\n\t\t\tme.tooltip.initialize();\n\n\t\t\t// Last active contains items that were previously in the tooltip.\n\t\t\t// When we reset the tooltip, we need to clear it\n\t\t\tme.lastActive = [];\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tduration: config.duration,\n\t\t\t\t\teasing: config.easing,\n\t\t\t\t\tlazy: config.lazy\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(config);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tChart.layoutService.update(this, this.width, this.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.updateDataset(i);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\t/**\n\t\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDataset: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.update();\n\n\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t},\n\n\t\trender: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar duration = config.duration;\n\t\t\tvar lazy = config.lazy;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function(animation) {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation({\n\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\t\trender: function(chart, animationObject) {\n\t\t\t\t\t\tvar easingFunction = helpers.easing.effects[animationObject.easing];\n\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t},\n\n\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t});\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\n\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\tonComplete(new Chart.Animation({numSteps: 0, chart: me}));\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (helpers.isNullOrUndef(easingValue)) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tme.transition(easingValue);\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\t\t\tme._drawTooltip(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\ttransition: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.tooltip.transition(easingValue);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDataset: function(index, easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t},\n\n\t\t/**\n\t\t * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n\t\t * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n\t\t * @private\n\t\t */\n\t\t_drawTooltip: function(easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\t\t\tvar args = {\n\t\t\t\ttooltip: tooltip,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttooltip.draw();\n\n\t\t\tplugins.notify(me, 'afterTooltipDraw', [args]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroyDatasetMeta: function(datasetIndex) {\n\t\t\tvar id = this.id;\n\t\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\t\tif (meta) {\n\t\t\t\tmeta.controller.destroy();\n\t\t\t\tdelete dataset._meta[id];\n\t\t\t}\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.destroyDatasetMeta(i);\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.canvas.clear(me);\n\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\tme.canvas = null;\n\t\t\t\tme.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me,\n\t\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\tchanged |= tooltip && tooltip.handleEvent(e);\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// Invoke onHover hook\n\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\thelpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart instead.\n\t * @class Chart.Controller\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.Controller = Chart;\n};\n\n},{\"25\":25,\"28\":28,\"45\":45,\"48\":48}],24:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\ttransition: function(easingValue) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].transition(easingValue);\n\t\t\t}\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar getHoverColor = helpers.getHoverColor;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i = 0; i < count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length - 1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n\n},{\"45\":45}],25:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\nmodule.exports = {\n\t/**\n\t * @private\n\t */\n\t_set: function(scope, values) {\n\t\treturn helpers.merge(this[scope] || (this[scope] = {}), values);\n\t}\n};\n\n},{\"45\":45}],26:[function(require,module,exports){\n'use strict';\n\nvar color = require(2);\nvar helpers = require(45);\n\nfunction interpolate(start, view, model, ease) {\n\tvar keys = Object.keys(model);\n\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\tkey = keys[i];\n\n\t\ttarget = model[key];\n\n\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\tif (!view.hasOwnProperty(key)) {\n\t\t\tview[key] = target;\n\t\t}\n\n\t\tactual = view[key];\n\n\t\tif (actual === target || key[0] === '_') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!start.hasOwnProperty(key)) {\n\t\t\tstart[key] = actual;\n\t\t}\n\n\t\torigin = start[key];\n\n\t\ttype = typeof target;\n\n\t\tif (type === typeof origin) {\n\t\t\tif (type === 'string') {\n\t\t\t\tc0 = color(origin);\n\t\t\t\tif (c0.valid) {\n\t\t\t\t\tc1 = color(target);\n\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tview[key] = target;\n\t}\n}\n\nvar Element = function(configuration) {\n\thelpers.extend(this, configuration);\n\tthis.initialize.apply(this, arguments);\n};\n\nhelpers.extend(Element.prototype, {\n\n\tinitialize: function() {\n\t\tthis.hidden = false;\n\t},\n\n\tpivot: function() {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\tme._view = helpers.clone(me._model);\n\t\t}\n\t\tme._start = {};\n\t\treturn me;\n\t},\n\n\ttransition: function(ease) {\n\t\tvar me = this;\n\t\tvar model = me._model;\n\t\tvar start = me._start;\n\t\tvar view = me._view;\n\n\t\t// No animation -> No Transition\n\t\tif (!model || ease === 1) {\n\t\t\tme._view = model;\n\t\t\tme._start = null;\n\t\t\treturn me;\n\t\t}\n\n\t\tif (!view) {\n\t\t\tview = me._view = {};\n\t\t}\n\n\t\tif (!start) {\n\t\t\tstart = me._start = {};\n\t\t}\n\n\t\tinterpolate(start, view, model, ease);\n\n\t\treturn me;\n\t},\n\n\ttooltipPosition: function() {\n\t\treturn {\n\t\t\tx: this._model.x,\n\t\t\ty: this._model.y\n\t\t};\n\t},\n\n\thasValue: function() {\n\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t}\n});\n\nElement.extend = helpers.inherits;\n\nmodule.exports = Element;\n\n},{\"2\":2,\"45\":45}],27:[function(require,module,exports){\n/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require(2);\nvar defaults = require(25);\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\t// -- Basic js utility methods\n\n\thelpers.configMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tvar tval = target[key] || {};\n\t\t\t\tvar sval = source[key];\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\t\ttarget[key] = helpers.scaleMerge(tval, sval);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\t\ttarget[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.scaleMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t\tvar slen = source[key].length;\n\t\t\t\t\tvar i, type, scale;\n\n\t\t\t\t\tif (!target[key]) {\n\t\t\t\t\t\ttarget[key] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\t\ttype = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n\t\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\n\t\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\t\thelpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\t\thelpers.merge(target[key][i], scale);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex ?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined ? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign ?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10 ?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\treturn Math.log(x) / Math.LN10;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\n\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\n\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\n\t\tvar current = middlePoint;\n\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn function(callback) {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t}\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt;\n\t\tvar canvas = evt.currentTarget || evt.srcElement;\n\t\tvar boundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof styleValue === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientWidth;\n\t\t}\n\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientHeight;\n\t\t}\n\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart, forceRatio) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tcanvas.style.height = height + 'px';\n\t\tcanvas.style.width = width + 'px';\n\t};\n\t// -- Canvas methods\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\n\thelpers.color = !color ?\n\t\tfunction(value) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn value;\n\t\t} :\n\t\tfunction(value) {\n\t\t\t/* global CanvasGradient */\n\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\tvalue = defaults.global.defaultColor;\n\t\t\t}\n\n\t\t\treturn color(value);\n\t\t};\n\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n\n},{\"2\":2,\"25\":25,\"45\":45}],28:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\n/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\nfunction getRelativePosition(e, chart) {\n\tif (e.native) {\n\t\treturn {\n\t\t\tx: e.x,\n\t\t\ty: e.y\n\t\t};\n\t}\n\n\treturn helpers.getRelativePosition(e, chart);\n}\n\n/**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\nfunction parseVisibleItems(chart, handler) {\n\tvar datasets = chart.data.datasets;\n\tvar meta, i, j, ilen, jlen;\n\n\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tmeta = chart.getDatasetMeta(i);\n\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\tvar element = meta.data[j];\n\t\t\tif (!element._view.skip) {\n\t\t\t\thandler(element);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\nfunction getIntersectItems(chart, position) {\n\tvar elements = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (element.inRange(position.x, position.y)) {\n\t\t\telements.push(element);\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\nfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\tvar minDistance = Number.POSITIVE_INFINITY;\n\tvar nearestItems = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar center = element.getCenterPoint();\n\t\tvar distance = distanceMetric(position, center);\n\n\t\tif (distance < minDistance) {\n\t\t\tnearestItems = [element];\n\t\t\tminDistance = distance;\n\t\t} else if (distance === minDistance) {\n\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\tnearestItems.push(element);\n\t\t}\n\t});\n\n\treturn nearestItems;\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {String} axis the axis mode. x|y|xy\n */\nfunction getDistanceMetricForAxis(axis) {\n\tvar useX = axis.indexOf('x') !== -1;\n\tvar useY = axis.indexOf('y') !== -1;\n\n\treturn function(pt1, pt2) {\n\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t};\n}\n\nfunction indexMode(chart, e, options) {\n\tvar position = getRelativePosition(e, chart);\n\t// Default axis for index mode is 'x' to match old behaviour\n\toptions.axis = options.axis || 'x';\n\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\tvar elements = [];\n\n\tif (!items.length) {\n\t\treturn [];\n\t}\n\n\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\tvar element = meta.data[items[0]._index];\n\n\t\t\t// don't count items that are skipped (null data)\n\t\t\tif (element && !element._view.skip) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * @interface IInteractionOptions\n */\n/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nmodule.exports = {\n\t// Helper function for different modes\n\tmodes: {\n\t\tsingle: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar elements = [];\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t\treturn elements;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn elements.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.label\n\t\t * @deprecated since version 2.4.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tlabel: indexMode,\n\n\t\t/**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tindex: indexMode,\n\n\t\t/**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tdataset: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\tif (items.length > 0) {\n\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.x-axis\n\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\t'x-axis': function(chart, e) {\n\t\t\treturn indexMode(chart, e, {intersect: false});\n\t\t},\n\n\t\t/**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tpoint: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\treturn getIntersectItems(chart, position);\n\t\t},\n\n\t\t/**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tnearest: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\tif (nearestItems.length > 1) {\n\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Return only 1 item\n\t\t\treturn nearestItems.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tx: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\ty: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t}\n\t}\n};\n\n},{\"45\":45}],29:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\n\ndefaults._set('global', {\n\tresponsive: true,\n\tresponsiveAnimationDuration: 0,\n\tmaintainAspectRatio: true,\n\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\thover: {\n\t\tonHover: null,\n\t\tmode: 'nearest',\n\t\tintersect: true,\n\t\tanimationDuration: 400\n\t},\n\tonClick: null,\n\tdefaultColor: 'rgba(0,0,0,0.1)',\n\tdefaultFontColor: '#666',\n\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\tdefaultFontSize: 12,\n\tdefaultFontStyle: 'normal',\n\tshowLines: true,\n\n\t// Element defaults defined in element extensions\n\telements: {},\n\n\t// Layout options such as padding\n\tlayout: {\n\t\tpadding: {\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0\n\t\t}\n\t}\n});\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.construct(item, config);\n\t\treturn this;\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n\n},{\"25\":25}],30:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\tfunction filterByPosition(array, position) {\n\t\treturn helpers.where(array, function(v) {\n\t\t\treturn v.position === position;\n\t\t});\n\t}\n\n\tfunction sortByWeight(array, reverse) {\n\t\tarray.forEach(function(v, i) {\n\t\t\tv._tmpIndex_ = i;\n\t\t\treturn v;\n\t\t});\n\t\tarray.sort(function(a, b) {\n\t\t\tvar v0 = reverse ? b : a;\n\t\t\tvar v1 = reverse ? a : b;\n\t\t\treturn v0.weight === v1.weight ?\n\t\t\t\tv0._tmpIndex_ - v1._tmpIndex_ :\n\t\t\t\tv0.weight - v1.weight;\n\t\t});\n\t\tarray.forEach(function(v) {\n\t\t\tdelete v._tmpIndex_;\n\t\t});\n\t}\n\n\t/**\n\t * @interface ILayoutItem\n\t * @prop {String} position - The position of the item in the chart layout. Possible values are\n\t * 'left', 'top', 'right', 'bottom', and 'chartArea'\n\t * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n\t * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n\t * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n\t * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n\t * @prop {Function} getPadding -  Returns an object with padding on the edges\n\t * @prop {Number} width - Width of item. Must be valid after update()\n\t * @prop {Number} height - Height of item. Must be valid after update()\n\t * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n\t */\n\n\t// The layout service is very self explanatory.  It's responsible for the layout within a chart.\n\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t// It is this service's responsibility of carrying out that layout.\n\tChart.layoutService = {\n\t\tdefaults: {},\n\n\t\t/**\n\t\t * Register a box to a chart.\n\t\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t\t * @param {Chart} chart - the chart to use\n\t\t * @param {ILayoutItem} item - the item to add to be layed out\n\t\t */\n\t\taddBox: function(chart, item) {\n\t\t\tif (!chart.boxes) {\n\t\t\t\tchart.boxes = [];\n\t\t\t}\n\n\t\t\t// initialize item with default values\n\t\t\titem.fullWidth = item.fullWidth || false;\n\t\t\titem.position = item.position || 'top';\n\t\t\titem.weight = item.weight || 0;\n\n\t\t\tchart.boxes.push(item);\n\t\t},\n\n\t\t/**\n\t\t * Remove a layoutItem from a chart\n\t\t * @param {Chart} chart - the chart to remove the box from\n\t\t * @param {Object} layoutItem - the item to remove from the layout\n\t\t */\n\t\tremoveBox: function(chart, layoutItem) {\n\t\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\t\tif (index !== -1) {\n\t\t\t\tchart.boxes.splice(index, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sets (or updates) options on the given `item`.\n\t\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t\t * @param {Object} item - the item to configure with the given options\n\t\t * @param {Object} options - the new item options.\n\t\t */\n\t\tconfigure: function(chart, item, options) {\n\t\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\t\tvar ilen = props.length;\n\t\t\tvar i = 0;\n\t\t\tvar prop;\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tprop = props[i];\n\t\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\t\titem[prop] = options[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t\t * then running a fitting algorithm\n\t\t * @param {Chart} chart - the chart\n\t\t * @param {Number} width - the width to fit into\n\t\t * @param {Number} height - the height to fit into\n\t\t */\n\t\tupdate: function(chart, width, height) {\n\t\t\tif (!chart) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar layoutOptions = chart.options.layout || {};\n\t\t\tvar padding = helpers.options.toPadding(layoutOptions.padding);\n\t\t\tvar leftPadding = padding.left;\n\t\t\tvar rightPadding = padding.right;\n\t\t\tvar topPadding = padding.top;\n\t\t\tvar bottomPadding = padding.bottom;\n\n\t\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\t\tsortByWeight(leftBoxes, true);\n\t\t\tsortByWeight(rightBoxes, false);\n\t\t\tsortByWeight(topBoxes, true);\n\t\t\tsortByWeight(bottomBoxes, false);\n\n\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t// Our canvas looks like the following.\n\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t// B1 is the bottom axis\n\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t// an error will be thrown.\n\t\t\t//\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  T1 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |    |    |                 T2                  |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    | C1 |                           | C2 |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// | L1 | L2 |           ChartArea (C0)            | R1 |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    | C3 |                           | C4 |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    |                 B1                  |    |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  B2 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t//\n\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t// 6. Refit each axis\n\t\t\t// 7. Position each axis in the final location\n\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t// Step 1\n\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t// Step 2\n\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t// Step 3\n\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t// Step 4\n\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\tvar minBoxSizes = [];\n\n\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\tvar minSize;\n\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t} else {\n\t\t\t\t\tminSize = box.update(verticalBoxWidth, chartAreaHeight);\n\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t}\n\n\t\t\t\tminBoxSizes.push({\n\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\tminSize: minSize,\n\t\t\t\t\tbox: box,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t// Steps 5 & 6\n\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t// Function to fit a box\n\t\t\tfunction fitBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t});\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t});\n\n\t\t\t\tvar scaleMargin = {\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t};\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Let the left layout know the final margin\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t// without calling `fit` again\n\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t}\n\n\t\t\t// Step 7 - Position the boxes\n\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\tfunction placeBox(box) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\tbox.top = top;\n\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\ttop = box.bottom;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.left = left;\n\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\tleft = box.right;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t// Account for chart width and height\n\t\t\tleft += maxChartAreaWidth;\n\t\t\ttop += maxChartAreaHeight;\n\n\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t// Step 8\n\t\t\tchart.chartArea = {\n\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t};\n\n\t\t\t// Step 9\n\t\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\t\tbox.left = chart.chartArea.left;\n\t\t\t\tbox.top = chart.chartArea.top;\n\t\t\t\tbox.right = chart.chartArea.right;\n\t\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{\"45\":45}],31:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tplugins: {}\n});\n\nmodule.exports = function(Chart) {\n\n\t/**\n\t * The plugin service singleton\n\t * @namespace Chart.plugins\n\t * @since 2.1.0\n\t */\n\tChart.plugins = {\n\t\t/**\n\t\t * Globally registered plugins.\n\t\t * @private\n\t\t */\n\t\t_plugins: [],\n\n\t\t/**\n\t\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t\t * incremented and descriptors are regenerated during following API calls.\n\t\t * @private\n\t\t */\n\t\t_cacheId: 0,\n\n\t\t/**\n\t\t * Registers the given plugin(s) if not already registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\tp.push(plugin);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Unregisters the given plugin(s) only if registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tunregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Remove all registered plugins.\n\t\t * @since 2.1.5\n\t\t */\n\t\tclear: function() {\n\t\t\tthis._plugins = [];\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Returns the number of registered plugins?\n\t\t * @returns {Number}\n\t\t * @since 2.1.5\n\t\t */\n\t\tcount: function() {\n\t\t\treturn this._plugins.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns all registered plugin instances.\n\t\t * @returns {Array} array of plugin objects.\n\t\t * @since 2.1.5\n\t\t */\n\t\tgetAll: function() {\n\t\t\treturn this._plugins;\n\t\t},\n\n\t\t/**\n\t\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t\t * returned value can be used, for instance, to interrupt the current action.\n\t\t * @param {Object} chart - The chart instance for which plugins should be called.\n\t\t * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t\t * @param {Array} [args] - Extra arguments to apply to the hook call.\n\t\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t\t */\n\t\tnotify: function(chart, hook, args) {\n\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\tvar ilen = descriptors.length;\n\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\tmethod = plugin[hook];\n\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\tif (method.apply(plugin, params) === false) {\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\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Returns descriptors of enabled plugins for the given chart.\n\t\t * @returns {Array} [{ plugin, options }]\n\t\t * @private\n\t\t */\n\t\tdescriptors: function(chart) {\n\t\t\tvar cache = chart._plugins || (chart._plugins = {});\n\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\treturn cache.descriptors;\n\t\t\t}\n\n\t\t\tvar plugins = [];\n\t\t\tvar descriptors = [];\n\t\t\tvar config = (chart && chart.config) || {};\n\t\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar id = plugin.id;\n\t\t\t\tvar opts = options[id];\n\t\t\t\tif (opts === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (opts === true) {\n\t\t\t\t\topts = helpers.clone(defaults.global.plugins[id]);\n\t\t\t\t}\n\n\t\t\t\tplugins.push(plugin);\n\t\t\t\tdescriptors.push({\n\t\t\t\t\tplugin: plugin,\n\t\t\t\t\toptions: opts || {}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcache.descriptors = descriptors;\n\t\t\tcache.id = this._cacheId;\n\t\t\treturn descriptors;\n\t\t}\n\t};\n\n\t/**\n\t * Plugin extension hooks.\n\t * @interface IPlugin\n\t * @since 2.1.0\n\t */\n\t/**\n\t * @method IPlugin#beforeInit\n\t * @desc Called before initializing `chart`.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterInit\n\t * @desc Called after `chart` has been initialized and before the first update.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeUpdate\n\t * @desc Called before updating `chart`. If any plugin returns `false`, the update\n\t * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart update.\n\t */\n\t/**\n\t * @method IPlugin#afterUpdate\n\t * @desc Called after `chart` has been updated and before rendering. Note that this\n\t * hook will not be called if the chart update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsUpdate\n \t * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n\t * the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} false to cancel the datasets update.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsUpdate\n\t * @desc Called after the `chart` datasets have been updated. Note that this hook\n\t * will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetUpdate\n \t * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n\t * returns `false`, the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetUpdate\n \t * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n\t * that this hook will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeLayout\n\t * @desc Called before laying out `chart`. If any plugin returns `false`,\n\t * the layout update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart layout.\n\t */\n\t/**\n\t * @method IPlugin#afterLayout\n\t * @desc Called after the `chart` has been layed out. Note that this hook will not\n\t * be called if the layout update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeRender\n\t * @desc Called before rendering `chart`. If any plugin returns `false`,\n\t * the rendering is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart rendering.\n\t */\n\t/**\n\t * @method IPlugin#afterRender\n\t * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n\t * that this hook will not be called if the rendering has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDraw\n\t * @desc Called before drawing `chart` at every animation frame specified by the given\n\t * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n\t * another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDraw\n\t * @desc Called after the `chart` has been drawn for the specific easing value. Note\n\t * that this hook will not be called if the drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsDraw\n \t * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n\t * the datasets drawing is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsDraw\n\t * @desc Called after the `chart` datasets have been drawn. Note that this hook\n\t * will not be called if the datasets drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetDraw\n \t * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n\t * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n\t * is cancelled until another `render` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetDraw\n \t * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n\t * (datasets are drawn in the reverse order). Note that this hook will not be called\n\t * if the datasets drawing has been previously cancelled.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n  \t * @method IPlugin#beforeTooltipDraw\n\t * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\n\t * the tooltip drawing is cancelled until another `render` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Object} args.tooltip - The tooltip.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart tooltip drawing.\n  \t */\n\t/**\n \t * @method IPlugin#afterTooltipDraw\n  \t * @desc Called after drawing the `tooltip`. Note that this hook will not\n \t * be called if the tooltip drawing has been previously cancelled.\n \t * @param {Chart} chart - The chart instance.\n \t * @param {Object} args - The call arguments.\n \t * @param {Object} args.tooltip - The tooltip.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n \t * @param {Object} options - The plugin options.\n \t */\n\t/**\n\t * @method IPlugin#beforeEvent\n \t * @desc Called before processing the specified `event`. If any plugin returns `false`,\n\t * the event will be discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterEvent\n\t * @desc Called after the `event` has been consumed. Note that this hook\n\t * will not be called if the `event` has been previously discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#resize\n\t * @desc Called after the chart as been resized.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#destroy\n\t * @desc Called after the chart as been destroyed.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\n\t/**\n\t * Provided for backward compatibility, use Chart.plugins instead\n\t * @namespace Chart.pluginService\n\t * @deprecated since version 2.1.5\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.pluginService = Chart.plugins;\n\n\t/**\n\t * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n\t * effect, instead simply create/register plugins via plain JavaScript objects.\n\t * @interface Chart.PluginBase\n\t * @deprecated since version 2.5.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.PluginBase = Element.extend({});\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],32:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\nvar Ticks = require(34);\n\ndefaults._set('scale', {\n\tdisplay: true,\n\tposition: 'left',\n\toffset: false,\n\n\t// grid line settings\n\tgridLines: {\n\t\tdisplay: true,\n\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\tlineWidth: 1,\n\t\tdrawBorder: true,\n\t\tdrawOnChartArea: true,\n\t\tdrawTicks: true,\n\t\ttickMarkLength: 10,\n\t\tzeroLineWidth: 1,\n\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\tzeroLineBorderDash: [],\n\t\tzeroLineBorderDashOffset: 0.0,\n\t\toffsetGridLines: false,\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0\n\t},\n\n\t// scale label\n\tscaleLabel: {\n\t\t// display property\n\t\tdisplay: false,\n\n\t\t// actual label\n\t\tlabelString: '',\n\n\t\t// line height\n\t\tlineHeight: 1.2,\n\n\t\t// top/bottom padding\n\t\tpadding: {\n\t\t\ttop: 4,\n\t\t\tbottom: 4\n\t\t}\n\t},\n\n\t// label settings\n\tticks: {\n\t\tbeginAtZero: false,\n\t\tminRotation: 0,\n\t\tmaxRotation: 50,\n\t\tmirror: false,\n\t\tpadding: 0,\n\t\treverse: false,\n\t\tdisplay: true,\n\t\tautoSkip: true,\n\t\tautoSkipPadding: 0,\n\t\tlabelOffset: 0,\n\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\tcallback: Ticks.formatters.values,\n\t\tminor: {},\n\t\tmajor: {}\n\t}\n});\n\nfunction labelsFromTicks(ticks) {\n\tvar labels = [];\n\tvar i, ilen;\n\n\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\tlabels.push(ticks[i].label);\n\t}\n\n\treturn labels;\n}\n\nfunction getLineValue(scale, index, offsetGridLines) {\n\tvar lineValue = scale.getPixelForTick(index);\n\n\tif (offsetGridLines) {\n\t\tif (index === 0) {\n\t\t\tlineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n\t\t} else {\n\t\t\tlineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n\t\t}\n\t}\n\treturn lineValue;\n}\n\nmodule.exports = function(Chart) {\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar globalDefaults = defaults.global;\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tfunction parseLineHeight(options) {\n\t\treturn helpers.options.toLineHeight(\n\t\t\thelpers.valueOrDefault(options.lineHeight, 1.2),\n\t\t\thelpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n\t}\n\n\tChart.Scale = Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Returns the scale tick objects ({label, major})\n\t\t * @since 2.7\n\t\t */\n\t\tgetTicks: function() {\n\t\t\treturn this._ticks;\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tmergeTicksOptions: function() {\n\t\t\tvar ticks = this.options.ticks;\n\t\t\tif (ticks.minor === false) {\n\t\t\t\tticks.minor = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (ticks.major === false) {\n\t\t\t\tticks.major = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tfor (var key in ticks) {\n\t\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\t\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t\t// around for long time and not marked as private, we can't change its structure\n\t\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t\t// use scale.getTicks() instead.\n\n\t\t\tme.beforeBuildTicks();\n\n\t\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\t\tticks = me.buildTicks() || [];\n\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\n\t\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t\t// this method and supposed to contain only string values).\n\t\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\tme.ticks = labels;   // BACKWARD COMPATIBILITY\n\n\t\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\t\tlabel = labels[i];\n\t\t\t\ttick = ticks[i];\n\t\t\t\tif (!tick) {\n\t\t\t\t\tticks.push(tick = {\n\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\tmajor: false\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttick.label = label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme._ticks = ticks;\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tvar scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n\t\t\t\tvar deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += deltaHeight;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += deltaHeight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * (tallestLabelHeightInLines - 1))\n\t\t\t\t\t\t+ lineSpace; // padding\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t\t}\n\n\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (helpers.isNullOrUndef(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof rawValue === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (rawValue) {\n\t\t\t\tif (this.isHorizontal()) {\n\t\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t\t}\n\t\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t/**\n\t\t * Used to get the value to display in the tooltip for the data at the given index\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param value\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t/**\n\t\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param pixel\n\t\t */\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the tick at the given index\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (offset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me._ticks.length - 1)));\n\t\t},\n\n\t\t/**\n\t\t * Utility for getting the pixel location of a percentage of scale\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForDecimal: function(decimal) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\t/**\n\t\t * Returns the pixel for the minimum chart value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.beginAtZero ? 0 :\n\t\t\t\tmin < 0 && max < 0 ? max :\n\t\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t\t0;\n\t\t},\n\n\t\t/**\n\t\t * Returns a subset of ticks to be plotted to avoid overlapping labels.\n\t\t * @private\n\t\t */\n\t\t_autoSkip: function(ticks) {\n\t\t\tvar skipRatio;\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar optionTicks = me.options.ticks.minor;\n\t\t\tvar tickCount = ticks.length;\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\t\t\tvar result = [];\n\t\t\tvar i, tick, shouldSkip;\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && tickCount > maxTicks) {\n\t\t\t\t\tskipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\t\ttick = ticks[i];\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tshouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n\t\t\t\tif (shouldSkip && i !== tickCount - 1) {\n\t\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\t\tdelete tick.label;\n\t\t\t\t}\n\t\t\t\tresult.push(tick);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = defaults.global;\n\t\t\tvar optionTicks = options.ticks.minor;\n\t\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\t\tvar tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\t\t\tvar majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar majorTickFont = parseFontOptions(optionMajorTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\tvar scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n\t\t\thelpers.each(ticks, function(tick, index) {\n\t\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\t\tif (helpers.isNullOrUndef(tick.label)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar label = tick.label;\n\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\tborderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\tborderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\t\t\t\tvar tickPadding = optionTicks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'top' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'bottom' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (xLineValue < me.left) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\txLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (yLineValue < me.top) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tmajor: tick.major,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n\t\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tfor (var i = 0, y = 0; i < label.length; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += (tickFont.size * 1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\t\t\t\tvar halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom'\n\t\t\t\t\t\t? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n\t\t\t\t\t\t: me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft\n\t\t\t\t\t\t? me.left + halfLineHeight + scaleLabelPadding.top\n\t\t\t\t\t\t: me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left;\n\t\t\t\tvar x2 = me.right;\n\t\t\t\tvar y1 = me.top;\n\t\t\t\tvar y2 = me.bottom;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"26\":26,\"34\":34,\"45\":45}],33:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, scaleDefaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(scaleDefaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar me = this;\n\t\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\t\tme.defaults[type] = helpers.extend(me.defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chart) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chart.scales, function(scale) {\n\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\tscale.position = scale.options.position;\n\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\tChart.layoutService.addBox(chart, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"45\":45}],34:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nmodule.exports = {\n\t/**\n\t * Namespace to hold generators for different types of ticks\n\t * @namespace Chart.Ticks.generators\n\t */\n\tgenerators: {\n\t\t/**\n\t\t * Interface for the options provided to the numeric tick generator\n\t\t * @interface INumericTickGenerationOptions\n\t\t */\n\t\t/**\n\t\t * The maximum number of ticks to display\n\t\t * @name INumericTickGenerationOptions#maxTicks\n\t\t * @type Number\n\t\t */\n\t\t/**\n\t\t * The distance between each tick.\n\t\t * @name INumericTickGenerationOptions#stepSize\n\t\t * @type Number\n\t\t * @optional\n\t\t */\n\t\t/**\n\t\t * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n\t\t * @name INumericTickGenerationOptions#min\n\t\t * @type Number\n\t\t * @optional\n\t\t */\n\t\t/**\n\t\t * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n\t\t * @name INumericTickGenerationOptions#max\n\t\t * @type Number\n\t\t * @optional\n\t\t */\n\n\t\t/**\n\t\t * Generate a set of linear ticks\n\t\t * @method Chart.Ticks.generators.linear\n\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t * @param dataRange {IRange} the range of the data\n\t\t * @returns {Array<Number>} array of tick values\n\t\t */\n\t\tlinear: function(generationOptions, dataRange) {\n\t\t\tvar ticks = [];\n\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t// for details.\n\n\t\t\tvar spacing;\n\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t} else {\n\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\t\t\t}\n\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\tif (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t// If very close to our rounded value, use it.\n\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t} else {\n\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t}\n\n\t\t\t// Put the values into the ticks array\n\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\tticks.push(niceMin + (j * spacing));\n\t\t\t}\n\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\treturn ticks;\n\t\t},\n\n\t\t/**\n\t\t * Generate a set of logarithmic ticks\n\t\t * @method Chart.Ticks.generators.logarithmic\n\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t * @param dataRange {IRange} the range of the data\n\t\t * @returns {Array<Number>} array of tick values\n\t\t */\n\t\tlogarithmic: function(generationOptions, dataRange) {\n\t\t\tvar ticks = [];\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph\n\t\t\tvar tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\tvar exp, significand;\n\n\t\t\tif (tickVal === 0) {\n\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\tticks.push(tickVal);\n\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t} else {\n\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t++significand;\n\t\t\t\tif (significand === 10) {\n\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t++exp;\n\t\t\t\t}\n\n\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\t\t\tvar lastTick = valueOrDefault(generationOptions.max, tickVal);\n\t\t\tticks.push(lastTick);\n\n\t\t\treturn ticks;\n\t\t}\n\t},\n\n\t/**\n\t * Namespace to hold formatters for different types of ticks\n\t * @namespace Chart.Ticks.formatters\n\t */\n\tformatters: {\n\t\t/**\n\t\t * Formatter for value labels\n\t\t * @method Chart.Ticks.formatters.values\n\t\t * @param value the value to display\n\t\t * @return {String|Array} the label to display\n\t\t */\n\t\tvalues: function(value) {\n\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t},\n\n\t\t/**\n\t\t * Formatter for linear numeric ticks\n\t\t * @method Chart.Ticks.formatters.linear\n\t\t * @param tickValue {Number} the value to be formatted\n\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t * @param ticks {Array<Number>} the list of ticks being converted\n\t\t * @return {String} string representation of the tickValue parameter\n\t\t */\n\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t// not an integer\n\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\tvar tickString = '';\n\n\t\t\tif (tickValue !== 0) {\n\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t} else {\n\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t}\n\n\t\t\treturn tickString;\n\t\t},\n\n\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\tif (tickValue === 0) {\n\t\t\t\treturn '0';\n\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\treturn tickValue.toExponential();\n\t\t\t}\n\t\t\treturn '';\n\t\t}\n\t}\n};\n\n},{\"45\":45}],35:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\ttooltips: {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretPadding: 2,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tborderColor: 'rgba(0,0,0,0)',\n\t\tborderWidth: 0,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\tif (label) {\n\t\t\t\t\tlabel += ': ';\n\t\t\t\t}\n\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\treturn label;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chart) {\n\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tlabelTextColor: function() {\n\t\t\t\treturn this._options.bodyFontColor;\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index;\n\t\tvar datasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = defaults.global;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize;\n\t\tvar bodyFontSize = model.bodyFontSize;\n\t\tvar footerFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chart.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n\t */\n\tfunction getBackgroundPoint(vm, size, alignment) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize;\n\t\tvar caretPadding = vm.caretPadding;\n\t\tvar cornerRadius = vm.cornerRadius;\n\t\tvar xAlign = alignment.xAlign;\n\t\tvar yAlign = alignment.yAlign;\n\t\tvar paddingAndSize = caretSize + caretPadding;\n\t\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t\tthis._lastActive = [];\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\t\tvar title = callbacks.title.apply(me, arguments);\n\t\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\tvar labelTextColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t\t});\n\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\tmodel.labelColors = labelColors;\n\t\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size) {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t},\n\t\tgetCaretPosition: function(tooltipPoint, size, vm) {\n\t\t\tvar x1, x2, x3, y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x;\n\t\t\tvar ptY = tooltipPoint.y;\n\t\t\tvar width = size.width;\n\t\t\tvar height = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\ty2 = ptY + (height / 2);\n\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = ptX + (width / 2);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t\t// invert drawing order\n\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t\tx1 = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\tctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\tvar textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar x = pt.x;\n\t\t\tvar y = pt.y;\n\t\t\tvar width = tooltipSize.width;\n\t\t\tvar height = tooltipSize.height;\n\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x + radius, y);\n\t\t\tif (yAlign === 'top') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\tif (yAlign === 'bottom') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x, y + radius);\n\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\tctx.closePath();\n\n\t\t\tctx.fill();\n\n\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t// If tooltip didn't change, do not handle the target event\n\t\t\tif (!changed) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tme._lastActive = me._active;\n\n\t\t\tif (options.enabled || options.custom) {\n\t\t\t\tme._eventPosition = {\n\t\t\t\t\tx: e.x,\n\t\t\t\t\ty: e.y\n\t\t\t\t};\n\n\t\t\t\tvar model = me._model;\n\t\t\t\tme.update(true);\n\t\t\t\tme.pivot();\n\n\t\t\t\t// See if our tooltip position changed\n\t\t\t\tchanged |= (model.x !== me._model.x) || (model.y !== me._model.y);\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len, nearestElement;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\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\t};\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],36:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\telements: {\n\t\tarc: {\n\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\tborderColor: '#fff',\n\t\t\tborderWidth: 2\n\t\t}\n\t}\n});\n\nmodule.exports = Element.extend({\n\tinLabelRange: function(mouseX) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t}\n\t\treturn false;\n\t},\n\n\tinRange: function(chartX, chartY) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY});\n\t\t\tvar\tangle = pointRelativePosition.angle;\n\t\t\tvar distance = pointRelativePosition.distance;\n\n\t\t\t// Sanitise angle range\n\t\t\tvar startAngle = vm.startAngle;\n\t\t\tvar endAngle = vm.endAngle;\n\t\t\twhile (endAngle < startAngle) {\n\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t}\n\t\t\twhile (angle > endAngle) {\n\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t}\n\t\t\twhile (angle < startAngle) {\n\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t}\n\n\t\t\t// Check if within the range of the open/close angle\n\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle);\n\t\t\tvar withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\treturn (betweenAngles && withinRadius);\n\t\t}\n\t\treturn false;\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\treturn {\n\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n\t\treturn {\n\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t};\n\t},\n\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar sA = vm.startAngle;\n\t\tvar eA = vm.endAngle;\n\n\t\tctx.beginPath();\n\n\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\tctx.closePath();\n\t\tctx.strokeStyle = vm.borderColor;\n\t\tctx.lineWidth = vm.borderWidth;\n\n\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\tctx.fill();\n\t\tctx.lineJoin = 'bevel';\n\n\t\tif (vm.borderWidth) {\n\t\t\tctx.stroke();\n\t\t}\n\t}\n});\n\n},{\"25\":25,\"26\":26,\"45\":45}],37:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\nvar globalDefaults = defaults.global;\n\ndefaults._set('global', {\n\telements: {\n\t\tline: {\n\t\t\ttension: 0.4,\n\t\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\t\tborderWidth: 3,\n\t\t\tborderColor: globalDefaults.defaultColor,\n\t\t\tborderCapStyle: 'butt',\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0,\n\t\t\tborderJoinStyle: 'miter',\n\t\t\tcapBezierPoints: true,\n\t\t\tfill: true, // do we fill in the area between the line and its base axis\n\t\t}\n\t}\n});\n\nmodule.exports = Element.extend({\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar vm = me._view;\n\t\tvar ctx = me._chart.ctx;\n\t\tvar spanGaps = vm.spanGaps;\n\t\tvar points = me._children.slice(); // clone array\n\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\tvar lastDrawnIndex = -1;\n\t\tvar index, current, previous, currentVM;\n\n\t\t// If we are looping, adding the first point again\n\t\tif (me._loop && points.length) {\n\t\t\tpoints.push(points[0]);\n\t\t}\n\n\t\tctx.save();\n\n\t\t// Stroke Line Options\n\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t// IE 9 and 10 do not support line dash\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t}\n\n\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t// Stroke Line\n\t\tctx.beginPath();\n\t\tlastDrawnIndex = -1;\n\n\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\tcurrent = points[index];\n\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\tcurrentVM = current._view;\n\n\t\t\t// First point moves to it's starting position no matter what\n\t\t\tif (index === 0) {\n\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\thelpers.canvas.lineTo(ctx, previous._view, current._view);\n\t\t\t\t\t}\n\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\t\tctx.restore();\n\t}\n});\n\n},{\"25\":25,\"26\":26,\"45\":45}],38:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\nvar defaultColor = defaults.global.defaultColor;\n\ndefaults._set('global', {\n\telements: {\n\t\tpoint: {\n\t\t\tradius: 3,\n\t\t\tpointStyle: 'circle',\n\t\t\tbackgroundColor: defaultColor,\n\t\t\tborderColor: defaultColor,\n\t\t\tborderWidth: 1,\n\t\t\t// Hover\n\t\t\thitRadius: 1,\n\t\t\thoverRadius: 4,\n\t\t\thoverBorderWidth: 1\n\t\t}\n\t}\n});\n\nfunction xRange(mouseX) {\n\tvar vm = this._view;\n\treturn vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n}\n\nfunction yRange(mouseY) {\n\tvar vm = this._view;\n\treturn vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n}\n\nmodule.exports = Element.extend({\n\tinRange: function(mouseX, mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t},\n\n\tinLabelRange: xRange,\n\tinXRange: xRange,\n\tinYRange: yRange,\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y,\n\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t};\n\t},\n\n\tdraw: function(chartArea) {\n\t\tvar vm = this._view;\n\t\tvar model = this._model;\n\t\tvar ctx = this._chart.ctx;\n\t\tvar pointStyle = vm.pointStyle;\n\t\tvar radius = vm.radius;\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\t\tvar color = helpers.color;\n\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\t\tvar ratio = 0;\n\n\t\tif (vm.skip) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\tctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\n\t\t// Cliping for Points.\n\t\t// going out from inner charArea?\n\t\tif ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) {\n\t\t\t// Point fade out\n\t\t\tif (model.x < chartArea.left) {\n\t\t\t\tratio = (x - model.x) / (chartArea.left - model.x);\n\t\t\t} else if (chartArea.right * errMargin < model.x) {\n\t\t\t\tratio = (model.x - x) / (model.x - chartArea.right);\n\t\t\t} else if (model.y < chartArea.top) {\n\t\t\t\tratio = (y - model.y) / (chartArea.top - model.y);\n\t\t\t} else if (chartArea.bottom * errMargin < model.y) {\n\t\t\t\tratio = (model.y - y) / (model.y - chartArea.bottom);\n\t\t\t}\n\t\t\tratio = Math.round(ratio * 100) / 100;\n\t\t\tctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n\t\t\tctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n\t\t}\n\n\t\thelpers.canvas.drawPoint(ctx, pointStyle, radius, x, y);\n\t}\n});\n\n},{\"25\":25,\"26\":26,\"45\":45}],39:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\n\ndefaults._set('global', {\n\telements: {\n\t\trectangle: {\n\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\tborderColor: defaults.global.defaultColor,\n\t\t\tborderSkipped: 'bottom',\n\t\t\tborderWidth: 0\n\t\t}\n\t}\n});\n\nfunction isVertical(bar) {\n\treturn bar._view.width !== undefined;\n}\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar) {\n\tvar vm = bar._view;\n\tvar x1, x2, y1, y2;\n\n\tif (isVertical(bar)) {\n\t\t// vertical\n\t\tvar halfWidth = vm.width / 2;\n\t\tx1 = vm.x - halfWidth;\n\t\tx2 = vm.x + halfWidth;\n\t\ty1 = Math.min(vm.y, vm.base);\n\t\ty2 = Math.max(vm.y, vm.base);\n\t} else {\n\t\t// horizontal bar\n\t\tvar halfHeight = vm.height / 2;\n\t\tx1 = Math.min(vm.x, vm.base);\n\t\tx2 = Math.max(vm.x, vm.base);\n\t\ty1 = vm.y - halfHeight;\n\t\ty2 = vm.y + halfHeight;\n\t}\n\n\treturn {\n\t\tleft: x1,\n\t\ttop: y1,\n\t\tright: x2,\n\t\tbottom: y2\n\t};\n}\n\nmodule.exports = Element.extend({\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\tvar borderWidth = vm.borderWidth;\n\n\t\tif (!vm.horizontal) {\n\t\t\t// bar\n\t\t\tleft = vm.x - vm.width / 2;\n\t\t\tright = vm.x + vm.width / 2;\n\t\t\ttop = vm.y;\n\t\t\tbottom = vm.base;\n\t\t\tsignX = 1;\n\t\t\tsignY = bottom > top ? 1 : -1;\n\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t} else {\n\t\t\t// horizontal bar\n\t\t\tleft = vm.base;\n\t\t\tright = vm.x;\n\t\t\ttop = vm.y - vm.height / 2;\n\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\tsignX = right > left ? 1 : -1;\n\t\t\tsignY = 1;\n\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t}\n\n\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\tif (borderWidth) {\n\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\tborderWidth = borderWidth > barSize ? barSize : borderWidth;\n\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\tvar borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n\t\t\tvar borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n\t\t\tvar borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n\t\t\t// not become a vertical line?\n\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\ttop = borderTop;\n\t\t\t\tbottom = borderBottom;\n\t\t\t}\n\t\t\t// not become a horizontal line?\n\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\tleft = borderLeft;\n\t\t\t\tright = borderRight;\n\t\t\t}\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.strokeStyle = vm.borderColor;\n\t\tctx.lineWidth = borderWidth;\n\n\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t// | 1 2 |\n\t\t// | 0 3 |\n\t\tvar corners = [\n\t\t\t[left, bottom],\n\t\t\t[left, top],\n\t\t\t[right, top],\n\t\t\t[right, bottom]\n\t\t];\n\n\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\tif (startCorner === -1) {\n\t\t\tstartCorner = 0;\n\t\t}\n\n\t\tfunction cornerAt(index) {\n\t\t\treturn corners[(startCorner + index) % 4];\n\t\t}\n\n\t\t// Draw rectangle from 'startCorner'\n\t\tvar corner = cornerAt(0);\n\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\tfor (var i = 1; i < 4; i++) {\n\t\t\tcorner = cornerAt(i);\n\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t}\n\n\t\tctx.fill();\n\t\tif (borderWidth) {\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\theight: function() {\n\t\tvar vm = this._view;\n\t\treturn vm.base - vm.y;\n\t},\n\n\tinRange: function(mouseX, mouseY) {\n\t\tvar inRange = false;\n\n\t\tif (this._view) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t}\n\n\t\treturn inRange;\n\t},\n\n\tinLabelRange: function(mouseX, mouseY) {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar inRange = false;\n\t\tvar bounds = getBarBounds(me);\n\n\t\tif (isVertical(me)) {\n\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t} else {\n\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t}\n\n\t\treturn inRange;\n\t},\n\n\tinXRange: function(mouseX) {\n\t\tvar bounds = getBarBounds(this);\n\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t},\n\n\tinYRange: function(mouseY) {\n\t\tvar bounds = getBarBounds(this);\n\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar x, y;\n\t\tif (isVertical(this)) {\n\t\t\tx = vm.x;\n\t\t\ty = (vm.y + vm.base) / 2;\n\t\t} else {\n\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\ty = vm.y;\n\t\t}\n\n\t\treturn {x: x, y: y};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t}\n});\n\n},{\"25\":25,\"26\":26}],40:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {};\nmodule.exports.Arc = require(36);\nmodule.exports.Line = require(37);\nmodule.exports.Point = require(38);\nmodule.exports.Rectangle = require(39);\n\n},{\"36\":36,\"37\":37,\"38\":38,\"39\":39}],41:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(42);\n\n/**\n * @namespace Chart.helpers.canvas\n */\nvar exports = module.exports = {\n\t/**\n\t * Clears the entire canvas associated to the given `chart`.\n\t * @param {Chart} chart - The chart for which to clear the canvas.\n\t */\n\tclear: function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t},\n\n\t/**\n\t * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n\t * given size (width, height) and the same `radius` for all corners.\n\t * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n\t * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {Number} width - The rectangle's width.\n\t * @param {Number} height - The rectangle's height.\n\t * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n\t * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n\t */\n\troundedRect: function(ctx, x, y, width, height, radius) {\n\t\tif (radius) {\n\t\t\tvar rx = Math.min(radius, width / 2);\n\t\t\tvar ry = Math.min(radius, height / 2);\n\n\t\t\tctx.moveTo(x + rx, y);\n\t\t\tctx.lineTo(x + width - rx, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry);\n\t\t\tctx.lineTo(x + width, y + height - ry);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);\n\t\t\tctx.lineTo(x + rx, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry);\n\t\t\tctx.lineTo(x, y + ry);\n\t\t\tctx.quadraticCurveTo(x, y, x + rx, y);\n\t\t} else {\n\t\t\tctx.rect(x, y, width, height);\n\t\t}\n\t},\n\n\tdrawPoint: function(ctx, style, radius, x, y) {\n\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\n\t\tif (style && typeof style === 'object') {\n\t\t\ttype = style.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (style) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(x, y, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.beginPath();\n\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\tctx.moveTo(x - edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x + edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x, y - 2 * height / 3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\tvar leftX = x - offset;\n\t\t\tvar topY = y - offset;\n\t\t\tvar sideSize = Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tthis.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rectRot':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - size, y);\n\t\t\tctx.lineTo(x, y + size);\n\t\t\tctx.lineTo(x + size, y);\n\t\t\tctx.lineTo(x, y - size);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'cross':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\tctx.beginPath();\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.stroke();\n\t},\n\n\tclipArea: function(ctx, area) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n\t\tctx.clip();\n\t},\n\n\tunclipArea: function(ctx) {\n\t\tctx.restore();\n\t},\n\n\tlineTo: function(ctx, previous, target, flip) {\n\t\tif (target.steppedLine) {\n\t\t\tif ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) {\n\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t} else {\n\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t}\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target.tension) {\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.bezierCurveTo(\n\t\t\tflip ? previous.controlPointPreviousX : previous.controlPointNextX,\n\t\t\tflip ? previous.controlPointPreviousY : previous.controlPointNextY,\n\t\t\tflip ? target.controlPointNextX : target.controlPointPreviousX,\n\t\t\tflip ? target.controlPointNextY : target.controlPointPreviousY,\n\t\t\ttarget.x,\n\t\t\ttarget.y);\n\t}\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.clear = exports.clear;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.drawRoundedRectangle = function(ctx) {\n\tctx.beginPath();\n\texports.roundedRect.apply(exports, arguments);\n\tctx.closePath();\n};\n\n},{\"42\":42}],42:[function(require,module,exports){\n'use strict';\n\n/**\n * @namespace Chart.helpers\n */\nvar helpers = {\n\t/**\n\t * An empty function that can be used, for example, for optional callback.\n\t */\n\tnoop: function() {},\n\n\t/**\n\t * Returns a unique id, sequentially generated from a global variable.\n\t * @returns {Number}\n\t * @function\n\t */\n\tuid: (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}()),\n\n\t/**\n\t * Returns true if `value` is neither null nor undefined, else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {Boolean}\n\t * @since 2.7.0\n\t */\n\tisNullOrUndef: function(value) {\n\t\treturn value === null || typeof value === 'undefined';\n\t},\n\n\t/**\n\t * Returns true if `value` is an array, else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {Boolean}\n\t * @function\n\t */\n\tisArray: Array.isArray ? Array.isArray : function(value) {\n\t\treturn Object.prototype.toString.call(value) === '[object Array]';\n\t},\n\n\t/**\n\t * Returns true if `value` is an object (excluding null), else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {Boolean}\n\t * @since 2.7.0\n\t */\n\tisObject: function(value) {\n\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\n\t},\n\n\t/**\n\t * Returns `value` if defined, else returns `defaultValue`.\n\t * @param {*} value - The value to return if defined.\n\t * @param {*} defaultValue - The value to return if `value` is undefined.\n\t * @returns {*}\n\t */\n\tvalueOrDefault: function(value, defaultValue) {\n\t\treturn typeof value === 'undefined' ? defaultValue : value;\n\t},\n\n\t/**\n\t * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n\t * @param {Array} value - The array to lookup for value at `index`.\n\t * @param {Number} index - The index in `value` to lookup for value.\n\t * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n\t * @returns {*}\n\t */\n\tvalueAtIndexOrDefault: function(value, index, defaultValue) {\n\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n\t},\n\n\t/**\n\t * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n\t * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n\t * @param {Function} fn - The function to call.\n\t * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n\t * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @returns {*}\n\t */\n\tcallback: function(fn, args, thisArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\treturn fn.apply(thisArg, args);\n\t\t}\n\t},\n\n\t/**\n\t * Note(SB) for performance sake, this method should only be used when loopable type\n\t * is unknown or in none intensive code (not called often and small loopable). Else\n\t * it's preferable to use a regular for() loop and save extra function calls.\n\t * @param {Object|Array} loopable - The object or array to be iterated.\n\t * @param {Function} fn - The function to call for each item.\n\t * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n\t */\n\teach: function(loopable, fn, thisArg, reverse) {\n\t\tvar i, len, keys;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (helpers.isObject(loopable)) {\n\t\t\tkeys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n\t * @see http://stackoverflow.com/a/14853974\n\t * @param {Array} a0 - The array to compare\n\t * @param {Array} a1 - The array to compare\n\t * @returns {Boolean}\n\t */\n\tarrayEquals: function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns a deep copy of `source` without keeping references on objects and arrays.\n\t * @param {*} source - The value to clone.\n\t * @returns {*}\n\t */\n\tclone: function(source) {\n\t\tif (helpers.isArray(source)) {\n\t\t\treturn source.map(helpers.clone);\n\t\t}\n\n\t\tif (helpers.isObject(source)) {\n\t\t\tvar target = {};\n\t\t\tvar keys = Object.keys(source);\n\t\t\tvar klen = keys.length;\n\t\t\tvar k = 0;\n\n\t\t\tfor (; k < klen; ++k) {\n\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\treturn source;\n\t},\n\n\t/**\n\t * The default merger when Chart.helpers.merge is called without merger option.\n\t * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n\t * @private\n\t */\n\t_merger: function(key, target, source, options) {\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.merge(tval, sval, options);\n\t\t} else {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Merges source[key] in target[key] only if target[key] is undefined.\n\t * @private\n\t */\n\t_mergerIf: function(key, target, source) {\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.mergeIf(tval, sval);\n\t\t} else if (!target.hasOwnProperty(key)) {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` with the given `options`.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {Object} target - The target object in which all sources are merged into.\n\t * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n\t * @param {Object} [options] - Merging options:\n\t * @param {Function} [options.merger] - The merge method (key, target, source, options)\n\t * @returns {Object} The `target` object.\n\t */\n\tmerge: function(target, source, options) {\n\t\tvar sources = helpers.isArray(source) ? source : [source];\n\t\tvar ilen = sources.length;\n\t\tvar merge, i, keys, klen, k;\n\n\t\tif (!helpers.isObject(target)) {\n\t\t\treturn target;\n\t\t}\n\n\t\toptions = options || {};\n\t\tmerge = options.merger || helpers._merger;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tsource = sources[i];\n\t\t\tif (!helpers.isObject(source)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tkeys = Object.keys(source);\n\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\n\t\t\t\tmerge(keys[k], target, source, options);\n\t\t\t}\n\t\t}\n\n\t\treturn target;\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {Object} target - The target object in which all sources are merged into.\n\t * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n\t * @returns {Object} The `target` object.\n\t */\n\tmergeIf: function(target, source) {\n\t\treturn helpers.merge(target, source, {merger: helpers._mergerIf});\n\t},\n\n\t/**\n\t * Applies the contents of two or more objects together into the first object.\n\t * @param {Object} target - The target object in which all objects are merged into.\n\t * @param {Object} arg1 - Object containing additional properties to merge in target.\n\t * @param {Object} argN - Additional objects containing properties to merge in target.\n\t * @returns {Object} The `target` object.\n\t */\n\textend: function(target) {\n\t\tvar setFn = function(value, key) {\n\t\t\ttarget[key] = value;\n\t\t};\n\t\tfor (var i = 1, ilen = arguments.length; i < ilen; ++i) {\n\t\t\thelpers.each(arguments[i], setFn);\n\t\t}\n\t\treturn target;\n\t},\n\n\t/**\n\t * Basic javascript inheritance based on the model created in Backbone.js\n\t */\n\tinherits: function(extensions) {\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\t\treturn ChartElement;\n\t}\n};\n\nmodule.exports = helpers;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nhelpers.callCallback = helpers.callback;\n\n/**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.indexOf = function(array, item, fromIndex) {\n\treturn Array.prototype.indexOf.call(array, item, fromIndex);\n};\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueOrDefault = helpers.valueOrDefault;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n},{}],43:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(42);\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\nvar effects = {\n\tlinear: function(t) {\n\t\treturn t;\n\t},\n\n\teaseInQuad: function(t) {\n\t\treturn t * t;\n\t},\n\n\teaseOutQuad: function(t) {\n\t\treturn -t * (t - 2);\n\t},\n\n\teaseInOutQuad: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t;\n\t\t}\n\t\treturn -0.5 * ((--t) * (t - 2) - 1);\n\t},\n\n\teaseInCubic: function(t) {\n\t\treturn t * t * t;\n\t},\n\n\teaseOutCubic: function(t) {\n\t\treturn (t = t - 1) * t * t + 1;\n\t},\n\n\teaseInOutCubic: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t + 2);\n\t},\n\n\teaseInQuart: function(t) {\n\t\treturn t * t * t * t;\n\t},\n\n\teaseOutQuart: function(t) {\n\t\treturn -((t = t - 1) * t * t * t - 1);\n\t},\n\n\teaseInOutQuart: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t;\n\t\t}\n\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\n\t},\n\n\teaseInQuint: function(t) {\n\t\treturn t * t * t * t * t;\n\t},\n\n\teaseOutQuint: function(t) {\n\t\treturn (t = t - 1) * t * t * t * t + 1;\n\t},\n\n\teaseInOutQuint: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\n\t},\n\n\teaseInSine: function(t) {\n\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\n\t},\n\n\teaseOutSine: function(t) {\n\t\treturn Math.sin(t * (Math.PI / 2));\n\t},\n\n\teaseInOutSine: function(t) {\n\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\n\t},\n\n\teaseInExpo: function(t) {\n\t\treturn (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n\t},\n\n\teaseOutExpo: function(t) {\n\t\treturn (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n\t},\n\n\teaseInOutExpo: function(t) {\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\n\t\t}\n\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\n\t},\n\n\teaseInCirc: function(t) {\n\t\tif (t >= 1) {\n\t\t\treturn t;\n\t\t}\n\t\treturn -(Math.sqrt(1 - t * t) - 1);\n\t},\n\n\teaseOutCirc: function(t) {\n\t\treturn Math.sqrt(1 - (t = t - 1) * t);\n\t},\n\n\teaseInOutCirc: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\n\t\t}\n\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t},\n\n\teaseInElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t},\n\n\teaseOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n\t},\n\n\teaseInOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif ((t /= 0.5) === 2) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.45;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\tif (t < 1) {\n\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t}\n\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t},\n\teaseInBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn t * t * ((s + 1) * t - s);\n\t},\n\n\teaseOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\n\t},\n\n\teaseInOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t},\n\n\teaseInBounce: function(t) {\n\t\treturn 1 - effects.easeOutBounce(1 - t);\n\t},\n\n\teaseOutBounce: function(t) {\n\t\tif (t < (1 / 2.75)) {\n\t\t\treturn 7.5625 * t * t;\n\t\t}\n\t\tif (t < (2 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n\t\t}\n\t\tif (t < (2.5 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n\t\t}\n\t\treturn 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n\t},\n\n\teaseInOutBounce: function(t) {\n\t\tif (t < 0.5) {\n\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\n\t\t}\n\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n\t}\n};\n\nmodule.exports = {\n\teffects: effects\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.easingEffects = effects;\n\n},{\"42\":42}],44:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(42);\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\nmodule.exports = {\n\t/**\n\t * Converts the given line height `value` in pixels for a specific font `size`.\n\t * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n\t * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n\t * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n\t * @since 2.7.0\n\t */\n\ttoLineHeight: function(value, size) {\n\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\t\tif (!matches || matches[1] === 'normal') {\n\t\t\treturn size * 1.2;\n\t\t}\n\n\t\tvalue = +matches[2];\n\n\t\tswitch (matches[3]) {\n\t\tcase 'px':\n\t\t\treturn value;\n\t\tcase '%':\n\t\t\tvalue /= 100;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn size * value;\n\t},\n\n\t/**\n\t * Converts the given value into a padding object with pre-computed width/height.\n\t * @param {Number|Object} value - If a number, set the value to all TRBL component,\n\t *  else, if and object, use defined properties and sets undefined ones to 0.\n\t * @returns {Object} The padding values (top, right, bottom, left, width, height)\n\t * @since 2.7.0\n\t */\n\ttoPadding: function(value) {\n\t\tvar t, r, b, l;\n\n\t\tif (helpers.isObject(value)) {\n\t\t\tt = +value.top || 0;\n\t\t\tr = +value.right || 0;\n\t\t\tb = +value.bottom || 0;\n\t\t\tl = +value.left || 0;\n\t\t} else {\n\t\t\tt = r = b = l = +value || 0;\n\t\t}\n\n\t\treturn {\n\t\t\ttop: t,\n\t\t\tright: r,\n\t\t\tbottom: b,\n\t\t\tleft: l,\n\t\t\theight: t + b,\n\t\t\twidth: l + r\n\t\t};\n\t},\n\n\t/**\n\t * Evaluates the given `inputs` sequentially and returns the first defined value.\n\t * @param {Array[]} inputs - An array of values, falling back to the last value.\n\t * @param {Object} [context] - If defined and the current value is a function, the value\n\t * is called with `context` as first argument and the result becomes the new input.\n\t * @param {Number} [index] - If defined and the current value is an array, the value\n\t * at `index` become the new input.\n\t * @since 2.7.0\n\t */\n\tresolve: function(inputs, context, index) {\n\t\tvar i, ilen, value;\n\n\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\n\t\t\tvalue = inputs[i];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (context !== undefined && typeof value === 'function') {\n\t\t\t\tvalue = value(context);\n\t\t\t}\n\t\t\tif (index !== undefined && helpers.isArray(value)) {\n\t\t\t\tvalue = value[index];\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n};\n\n},{\"42\":42}],45:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require(42);\nmodule.exports.easing = require(43);\nmodule.exports.canvas = require(41);\nmodule.exports.options = require(44);\n\n},{\"41\":41,\"42\":42,\"43\":43,\"44\":44}],46:[function(require,module,exports){\n/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nmodule.exports = {\n\tacquireContext: function(item) {\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\treturn item && item.getContext('2d') || null;\n\t}\n};\n\n},{}],47:[function(require,module,exports){\n/**\n * Chart.Platform implementation for targeting a web browser\n */\n\n'use strict';\n\nvar helpers = require(45);\n\nvar EXPANDO_KEY = '$chartjs';\nvar CSS_PREFIX = 'chartjs-';\nvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\nvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\nvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nvar EVENT_TYPES = {\n\ttouchstart: 'mousedown',\n\ttouchmove: 'mousemove',\n\ttouchend: 'mouseup',\n\tpointerenter: 'mouseenter',\n\tpointerdown: 'mousedown',\n\tpointermove: 'mousemove',\n\tpointerup: 'mouseup',\n\tpointerleave: 'mouseout',\n\tpointerout: 'mouseout'\n};\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {Number} Size in pixels or undefined if unknown.\n */\nfunction readUsedSize(element, property) {\n\tvar value = helpers.getStyle(element, property);\n\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\treturn matches ? Number(matches[1]) : undefined;\n}\n\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\nfunction initCanvas(canvas, config) {\n\tvar style = canvas.style;\n\n\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\tvar renderHeight = canvas.getAttribute('height');\n\tvar renderWidth = canvas.getAttribute('width');\n\n\t// Chart.js modifies some canvas values that we want to restore on destroy\n\tcanvas[EXPANDO_KEY] = {\n\t\tinitial: {\n\t\t\theight: renderHeight,\n\t\t\twidth: renderWidth,\n\t\t\tstyle: {\n\t\t\t\tdisplay: style.display,\n\t\t\t\theight: style.height,\n\t\t\t\twidth: style.width\n\t\t\t}\n\t\t}\n\t};\n\n\t// Force canvas to display as block to avoid extra space caused by inline\n\t// elements, which would interfere with the responsive resize process.\n\t// https://github.com/chartjs/Chart.js/issues/2538\n\tstyle.display = style.display || 'block';\n\n\tif (renderWidth === null || renderWidth === '') {\n\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\tif (displayWidth !== undefined) {\n\t\t\tcanvas.width = displayWidth;\n\t\t}\n\t}\n\n\tif (renderHeight === null || renderHeight === '') {\n\t\tif (canvas.style.height === '') {\n\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t} else {\n\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.height = displayHeight;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canvas;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nvar supportsEventListenerOptions = (function() {\n\tvar supports = false;\n\ttry {\n\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\tget: function() {\n\t\t\t\tsupports = true;\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('e', null, options);\n\t} catch (e) {\n\t\t// continue regardless of error\n\t}\n\treturn supports;\n}());\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nvar eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addEventListener(node, type, listener) {\n\tnode.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeEventListener(node, type, listener) {\n\tnode.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction createEvent(type, chart, x, y, nativeEvent) {\n\treturn {\n\t\ttype: type,\n\t\tchart: chart,\n\t\tnative: nativeEvent || null,\n\t\tx: x !== undefined ? x : null,\n\t\ty: y !== undefined ? y : null,\n\t};\n}\n\nfunction fromNativeEvent(event, chart) {\n\tvar type = EVENT_TYPES[event.type] || event.type;\n\tvar pos = helpers.getRelativePosition(event, chart);\n\treturn createEvent(type, chart, pos.x, pos.y, event);\n}\n\nfunction throttled(fn, thisArg) {\n\tvar ticking = false;\n\tvar args = [];\n\n\treturn function() {\n\t\targs = Array.prototype.slice.call(arguments);\n\t\tthisArg = thisArg || this;\n\n\t\tif (!ticking) {\n\t\t\tticking = true;\n\t\t\thelpers.requestAnimFrame.call(window, function() {\n\t\t\t\tticking = false;\n\t\t\t\tfn.apply(thisArg, args);\n\t\t\t});\n\t\t}\n\t};\n}\n\n// Implementation based on https://github.com/marcj/css-element-queries\nfunction createResizer(handler) {\n\tvar resizer = document.createElement('div');\n\tvar cls = CSS_PREFIX + 'size-monitor';\n\tvar maxSize = 1000000;\n\tvar style =\n\t\t'position:absolute;' +\n\t\t'left:0;' +\n\t\t'top:0;' +\n\t\t'right:0;' +\n\t\t'bottom:0;' +\n\t\t'overflow:hidden;' +\n\t\t'pointer-events:none;' +\n\t\t'visibility:hidden;' +\n\t\t'z-index:-1;';\n\n\tresizer.style.cssText = style;\n\tresizer.className = cls;\n\tresizer.innerHTML =\n\t\t'<div class=\"' + cls + '-expand\" style=\"' + style + '\">' +\n\t\t\t'<div style=\"' +\n\t\t\t\t'position:absolute;' +\n\t\t\t\t'width:' + maxSize + 'px;' +\n\t\t\t\t'height:' + maxSize + 'px;' +\n\t\t\t\t'left:0;' +\n\t\t\t\t'top:0\">' +\n\t\t\t'</div>' +\n\t\t'</div>' +\n\t\t'<div class=\"' + cls + '-shrink\" style=\"' + style + '\">' +\n\t\t\t'<div style=\"' +\n\t\t\t\t'position:absolute;' +\n\t\t\t\t'width:200%;' +\n\t\t\t\t'height:200%;' +\n\t\t\t\t'left:0; ' +\n\t\t\t\t'top:0\">' +\n\t\t\t'</div>' +\n\t\t'</div>';\n\n\tvar expand = resizer.childNodes[0];\n\tvar shrink = resizer.childNodes[1];\n\n\tresizer._reset = function() {\n\t\texpand.scrollLeft = maxSize;\n\t\texpand.scrollTop = maxSize;\n\t\tshrink.scrollLeft = maxSize;\n\t\tshrink.scrollTop = maxSize;\n\t};\n\tvar onScroll = function() {\n\t\tresizer._reset();\n\t\thandler();\n\t};\n\n\taddEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\taddEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\treturn resizer;\n}\n\n// https://davidwalsh.name/detect-node-insertion\nfunction watchForRender(node, handler) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\tvar proxy = expando.renderProxy = function(e) {\n\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\thandler();\n\t\t}\n\t};\n\n\thelpers.each(ANIMATION_START_EVENTS, function(type) {\n\t\taddEventListener(node, type, proxy);\n\t});\n\n\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t// is removed then added back immediately (same animation frame?). Accessing the\n\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t// https://github.com/chartjs/Chart.js/issues/4737\n\texpando.reflow = !!node.offsetParent;\n\n\tnode.classList.add(CSS_RENDER_MONITOR);\n}\n\nfunction unwatchForRender(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar proxy = expando.renderProxy;\n\n\tif (proxy) {\n\t\thelpers.each(ANIMATION_START_EVENTS, function(type) {\n\t\t\tremoveEventListener(node, type, proxy);\n\t\t});\n\n\t\tdelete expando.renderProxy;\n\t}\n\n\tnode.classList.remove(CSS_RENDER_MONITOR);\n}\n\nfunction addResizeListener(node, listener, chart) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\tvar resizer = expando.resizer = createResizer(throttled(function() {\n\t\tif (expando.resizer) {\n\t\t\treturn listener(createEvent('resize', chart));\n\t\t}\n\t}));\n\n\t// The resizer needs to be attached to the node parent, so we first need to be\n\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\twatchForRender(node, function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = node.parentNode;\n\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t}\n\n\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\tresizer._reset();\n\t\t}\n\t});\n}\n\nfunction removeResizeListener(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar resizer = expando.resizer;\n\n\tdelete expando.resizer;\n\tunwatchForRender(node);\n\n\tif (resizer && resizer.parentNode) {\n\t\tresizer.parentNode.removeChild(resizer);\n\t}\n}\n\nfunction injectCSS(platform, css) {\n\t// http://stackoverflow.com/q/3922139\n\tvar style = platform._style || document.createElement('style');\n\tif (!platform._style) {\n\t\tplatform._style = style;\n\t\tcss = '/* Chart.js */\\n' + css;\n\t\tstyle.setAttribute('type', 'text/css');\n\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\t}\n\n\tstyle.appendChild(document.createTextNode(css));\n}\n\nmodule.exports = {\n\t/**\n\t * This property holds whether this platform is enabled for the current environment.\n\t * Currently used by platform.js to select the proper implementation.\n\t * @private\n\t */\n\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n\tinitialize: function() {\n\t\tvar keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n\t\tinjectCSS(this,\n\t\t\t// DOM rendering detection\n\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\t'@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n\t\t\t'@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n\t\t\t'.' + CSS_RENDER_MONITOR + '{' +\n\t\t\t\t'-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n\t\t\t\t'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n\t\t\t'}'\n\t\t);\n\t},\n\n\tacquireContext: function(item, config) {\n\t\tif (typeof item === 'string') {\n\t\t\titem = document.getElementById(item);\n\t\t} else if (item.length) {\n\t\t\t// Support for array based queries (such as jQuery)\n\t\t\titem = item[0];\n\t\t}\n\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\tif (context && context.canvas === item) {\n\t\t\tinitCanvas(item, config);\n\t\t\treturn context;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\treleaseContext: function(context) {\n\t\tvar canvas = context.canvas;\n\t\tif (!canvas[EXPANDO_KEY]) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar initial = canvas[EXPANDO_KEY].initial;\n\t\t['height', 'width'].forEach(function(prop) {\n\t\t\tvar value = initial[prop];\n\t\t\tif (helpers.isNullOrUndef(value)) {\n\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t} else {\n\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t}\n\t\t});\n\n\t\thelpers.each(initial.style || {}, function(value, key) {\n\t\t\tcanvas.style[key] = value;\n\t\t});\n\n\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\tcanvas.width = canvas.width;\n\n\t\tdelete canvas[EXPANDO_KEY];\n\t},\n\n\taddEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\taddResizeListener(canvas, listener, chart);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n\t\tvar proxies = expando.proxies || (expando.proxies = {});\n\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t};\n\n\t\taddEventListener(canvas, type, proxy);\n\t},\n\n\tremoveEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\tremoveResizeListener(canvas, listener);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || {};\n\t\tvar proxies = expando.proxies || {};\n\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\tif (!proxy) {\n\t\t\treturn;\n\t\t}\n\n\t\tremoveEventListener(canvas, type, proxy);\n\t}\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.addEvent = addEventListener;\n\n/**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.removeEvent = removeEventListener;\n\n},{\"45\":45}],48:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\nvar basic = require(46);\nvar dom = require(47);\n\n// @TODO Make possible to select another platform at build time.\nvar implementation = dom._enabled ? dom : basic;\n\n/**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\nmodule.exports = helpers.extend({\n\t/**\n\t * @since 2.7.0\n\t */\n\tinitialize: function() {},\n\n\t/**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t * @param {Object} options - The chart options\n\t * @returns {CanvasRenderingContext2D} context2d instance\n\t */\n\tacquireContext: function() {},\n\n\t/**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {Boolean} true if the method succeeded, else false\n\t */\n\treleaseContext: function() {},\n\n\t/**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {String} type - The ({@link IEvent}) type to listen for\n\t * @param {Function} listener - Receives a notification (an object that implements\n\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t */\n\taddEventListener: function() {},\n\n\t/**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart -Chart from which to remove the listener\n\t * @param {String} type - The ({@link IEvent}) type to remove\n\t * @param {Function} listener - The listener function to remove from the event target.\n\t */\n\tremoveEventListener: function() {}\n\n}, implementation);\n\n/**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n/**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\n},{\"45\":45,\"46\":46,\"47\":47}],49:[function(require,module,exports){\n/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tplugins: {\n\t\tfiller: {\n\t\t\tpropagate: true\n\t\t}\n\t}\n});\n\nmodule.exports = function() {\n\n\tvar mappers = {\n\t\tdataset: function(source) {\n\t\t\tvar index = source.fill;\n\t\t\tvar chart = source.chart;\n\t\t\tvar meta = chart.getDatasetMeta(index);\n\t\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\t\tvar points = (visible && meta.dataset._children) || [];\n\t\t\tvar length = points.length || 0;\n\n\t\t\treturn !length ? null : function(point, i) {\n\t\t\t\treturn (i < length && points[i]._view) || null;\n\t\t\t};\n\t\t},\n\n\t\tboundary: function(source) {\n\t\t\tvar boundary = source.boundary;\n\t\t\tvar x = boundary ? boundary.x : null;\n\t\t\tvar y = boundary ? boundary.y : null;\n\n\t\t\treturn function(point) {\n\t\t\t\treturn {\n\t\t\t\t\tx: x === null ? point.x : x,\n\t\t\t\t\ty: y === null ? point.y : y,\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\t};\n\n\t// @todo if (fill[0] === '#')\n\tfunction decodeFill(el, index, count) {\n\t\tvar model = el._model || {};\n\t\tvar fill = model.fill;\n\t\tvar target;\n\n\t\tif (fill === undefined) {\n\t\t\tfill = !!model.backgroundColor;\n\t\t}\n\n\t\tif (fill === false || fill === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (fill === true) {\n\t\t\treturn 'origin';\n\t\t}\n\n\t\ttarget = parseFloat(fill, 10);\n\t\tif (isFinite(target) && Math.floor(target) === target) {\n\t\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\t\ttarget = index + target;\n\t\t\t}\n\n\t\t\tif (target === index || target < 0 || target >= count) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\tswitch (fill) {\n\t\t// compatibility\n\t\tcase 'bottom':\n\t\t\treturn 'start';\n\t\tcase 'top':\n\t\t\treturn 'end';\n\t\tcase 'zero':\n\t\t\treturn 'origin';\n\t\t// supported boundaries\n\t\tcase 'origin':\n\t\tcase 'start':\n\t\tcase 'end':\n\t\t\treturn fill;\n\t\t// invalid fill values\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction computeBoundary(source) {\n\t\tvar model = source.el._model || {};\n\t\tvar scale = source.el._scale || {};\n\t\tvar fill = source.fill;\n\t\tvar target = null;\n\t\tvar horizontal;\n\n\t\tif (isFinite(fill)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t\t// controllers might still use it (e.g. the Smith chart).\n\n\t\tif (fill === 'start') {\n\t\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n\t\t} else if (fill === 'end') {\n\t\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\n\t\t} else if (model.scaleZero !== undefined) {\n\t\t\ttarget = model.scaleZero;\n\t\t} else if (scale.getBasePosition) {\n\t\t\ttarget = scale.getBasePosition();\n\t\t} else if (scale.getBasePixel) {\n\t\t\ttarget = scale.getBasePixel();\n\t\t}\n\n\t\tif (target !== undefined && target !== null) {\n\t\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\t\treturn target;\n\t\t\t}\n\n\t\t\tif (typeof target === 'number' && isFinite(target)) {\n\t\t\t\thorizontal = scale.isHorizontal();\n\t\t\t\treturn {\n\t\t\t\t\tx: horizontal ? target : null,\n\t\t\t\t\ty: horizontal ? null : target\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction resolveTarget(sources, index, propagate) {\n\t\tvar source = sources[index];\n\t\tvar fill = source.fill;\n\t\tvar visited = [index];\n\t\tvar target;\n\n\t\tif (!propagate) {\n\t\t\treturn fill;\n\t\t}\n\n\t\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\t\tif (!isFinite(fill)) {\n\t\t\t\treturn fill;\n\t\t\t}\n\n\t\t\ttarget = sources[fill];\n\t\t\tif (!target) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (target.visible) {\n\t\t\t\treturn fill;\n\t\t\t}\n\n\t\t\tvisited.push(fill);\n\t\t\tfill = target.fill;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction createMapper(source) {\n\t\tvar fill = source.fill;\n\t\tvar type = 'dataset';\n\n\t\tif (fill === false) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!isFinite(fill)) {\n\t\t\ttype = 'boundary';\n\t\t}\n\n\t\treturn mappers[type](source);\n\t}\n\n\tfunction isDrawable(point) {\n\t\treturn point && !point.skip;\n\t}\n\n\tfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\t\tvar i;\n\n\t\tif (!len0 || !len1) {\n\t\t\treturn;\n\t\t}\n\n\t\t// building first area curve (normal)\n\t\tctx.moveTo(curve0[0].x, curve0[0].y);\n\t\tfor (i = 1; i < len0; ++i) {\n\t\t\thelpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n\t\t}\n\n\t\t// joining the two area curves\n\t\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n\t\t// building opposite area curve (reverse)\n\t\tfor (i = len1 - 1; i > 0; --i) {\n\t\t\thelpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n\t\t}\n\t}\n\n\tfunction doFill(ctx, points, mapper, view, color, loop) {\n\t\tvar count = points.length;\n\t\tvar span = view.spanGaps;\n\t\tvar curve0 = [];\n\t\tvar curve1 = [];\n\t\tvar len0 = 0;\n\t\tvar len1 = 0;\n\t\tvar i, ilen, index, p0, p1, d0, d1;\n\n\t\tctx.beginPath();\n\n\t\tfor (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n\t\t\tindex = i % count;\n\t\t\tp0 = points[index]._view;\n\t\t\tp1 = mapper(p0, index, view);\n\t\t\td0 = isDrawable(p0);\n\t\t\td1 = isDrawable(p1);\n\n\t\t\tif (d0 && d1) {\n\t\t\t\tlen0 = curve0.push(p0);\n\t\t\t\tlen1 = curve1.push(p1);\n\t\t\t} else if (len0 && len1) {\n\t\t\t\tif (!span) {\n\t\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\t\tlen0 = len1 = 0;\n\t\t\t\t\tcurve0 = [];\n\t\t\t\t\tcurve1 = [];\n\t\t\t\t} else {\n\t\t\t\t\tif (d0) {\n\t\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t\t}\n\t\t\t\t\tif (d1) {\n\t\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\t\tctx.closePath();\n\t\tctx.fillStyle = color;\n\t\tctx.fill();\n\t}\n\n\treturn {\n\t\tid: 'filler',\n\n\t\tafterDatasetsUpdate: function(chart, options) {\n\t\t\tvar count = (chart.data.datasets || []).length;\n\t\t\tvar propagate = options.propagate;\n\t\t\tvar sources = [];\n\t\t\tvar meta, i, el, source;\n\n\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tel = meta.dataset;\n\t\t\t\tsource = null;\n\n\t\t\t\tif (el && el._model && el instanceof elements.Line) {\n\t\t\t\t\tsource = {\n\t\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\tel: el\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tmeta.$filler = source;\n\t\t\t\tsources.push(source);\n\t\t\t}\n\n\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\tsource = sources[i];\n\t\t\t\tif (!source) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\t\tsource.boundary = computeBoundary(source);\n\t\t\t\tsource.mapper = createMapper(source);\n\t\t\t}\n\t\t},\n\n\t\tbeforeDatasetDraw: function(chart, args) {\n\t\t\tvar meta = args.meta.$filler;\n\t\t\tif (!meta) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar ctx = chart.ctx;\n\t\t\tvar el = meta.el;\n\t\t\tvar view = el._view;\n\t\t\tvar points = el._children || [];\n\t\t\tvar mapper = meta.mapper;\n\t\t\tvar color = view.backgroundColor || defaults.global.defaultColor;\n\n\t\t\tif (mapper && color && points.length) {\n\t\t\t\thelpers.canvas.clipArea(ctx, chart.chartArea);\n\t\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\n\t\t\t\thelpers.canvas.unclipArea(ctx);\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],50:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tlegend: {\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true,\n\t\treverse: false,\n\t\tweight: 1000,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t},\n\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t}\n\t\t\ttext.push('</li>');\n\t\t}\n\t\ttext.push('</ul>');\n\t\treturn text.join('');\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tvar layout = Chart.layoutService;\n\tvar noop = helpers.noop;\n\n\t/**\n\t * Helper function to get the box width based on the usePointStyle option\n\t * @param labelopts {Object} the label options on the legend\n\t * @param fontSize {Number} the label font size\n\t * @return {Number} width of the color box area\n\t */\n\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\treturn labelOpts.usePointStyle ?\n\t\t\tfontSize * Math.SQRT2 :\n\t\t\tlabelOpts.boxWidth;\n\t}\n\n\tChart.Legend = Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\thelpers.extend(this, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\tthis.doughnutMode = false;\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t// Any function defined here is inherited by all legend types.\n\t\t// Any function can be extended by the legend type\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: function() {\n\t\t\tvar me = this;\n\t\t\tvar labelOpts = me.options.labels || {};\n\t\t\tvar legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n\t\t\tif (labelOpts.filter) {\n\t\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (me.options.reverse) {\n\t\t\t\tlegendItems.reverse();\n\t\t\t}\n\n\t\t\tme.legendItems = legendItems;\n\t\t},\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar display = opts.display;\n\n\t\t\tvar ctx = me.ctx;\n\n\t\t\tvar globalDefault = defaults.global;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t// Reset hit boxes\n\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Increase sizes here\n\t\t\tif (display) {\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// Labels\n\n\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\ttotalHeight += fontSize + (labelOpts.padding);\n\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t});\n\n\t\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t\t} else {\n\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\n\t\t// Actually draw the legend on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar globalDefault = defaults.global;\n\t\t\tvar lineDefault = globalDefault.elements.line;\n\t\t\tvar legendWidth = me.width;\n\t\t\tvar lineWidths = me.lineWidths;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\tvar fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n\t\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\tvar cursor;\n\n\t\t\t\t// Canvas setup\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\tvar hitboxes = me.legendHitBoxes;\n\n\t\t\t\t// current position\n\t\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\tctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\tctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\tctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\tctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\tctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\tctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\tvar isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\tctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\thelpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.restore();\n\t\t\t\t};\n\t\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\t\tvar halfFontSize = fontSize / 2;\n\t\t\t\t\tvar xLeft = boxWidth + halfFontSize + x;\n\t\t\t\t\tvar yMiddle = y + halfFontSize;\n\n\t\t\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\n\n\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\tctx.moveTo(xLeft, yMiddle);\n\t\t\t\t\t\tctx.lineTo(xLeft + textWidth, yMiddle);\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Horizontal\n\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2),\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\n\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + textWidth;\n\t\t\t\t\tvar x = cursor.x;\n\t\t\t\t\tvar y = cursor.y;\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t// Fill the actual label\n\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tcursor.x += width + (labelOpts.padding);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @return {Boolean} true if a change occured\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\tvar changed = false;\n\n\t\t\tif (type === 'mousemove') {\n\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (type === 'click') {\n\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Chart event already has relative position in it\n\t\t\tvar x = e.x;\n\t\t\tvar y = e.y;\n\n\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\tfunction createNewLegendAndAttach(chart, legendOpts) {\n\t\tvar legend = new Chart.Legend({\n\t\t\tctx: chart.ctx,\n\t\t\toptions: legendOpts,\n\t\t\tchart: chart\n\t\t});\n\n\t\tlayout.configure(chart, legend, legendOpts);\n\t\tlayout.addBox(chart, legend);\n\t\tchart.legend = legend;\n\t}\n\n\treturn {\n\t\tid: 'legend',\n\n\t\tbeforeInit: function(chart) {\n\t\t\tvar legendOpts = chart.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate: function(chart) {\n\t\t\tvar legendOpts = chart.options.legend;\n\t\t\tvar legend = chart.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\thelpers.mergeIf(legendOpts, defaults.global.legend);\n\n\t\t\t\tif (legend) {\n\t\t\t\t\tlayout.configure(chart, legend, legendOpts);\n\t\t\t\t\tlegend.options = legendOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t}\n\t\t\t} else if (legend) {\n\t\t\t\tlayout.removeBox(chart, legend);\n\t\t\t\tdelete chart.legend;\n\t\t\t}\n\t\t},\n\n\t\tafterEvent: function(chart, e) {\n\t\t\tvar legend = chart.legend;\n\t\t\tif (legend) {\n\t\t\t\tlegend.handleEvent(e);\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],51:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\ttitle: {\n\t\tdisplay: false,\n\t\tfontStyle: 'bold',\n\t\tfullWidth: true,\n\t\tlineHeight: 1.2,\n\t\tpadding: 10,\n\t\tposition: 'top',\n\t\ttext: '',\n\t\tweight: 2000         // by default greater than legend (1000) to be above\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tvar layout = Chart.layoutService;\n\tvar noop = helpers.noop;\n\n\tChart.Title = Element.extend({\n\t\tinitialize: function(config) {\n\t\t\tvar me = this;\n\t\t\thelpers.extend(me, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tme.legendHitBoxes = [];\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: noop,\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar opts = me.options;\n\t\t\tvar display = opts.display;\n\t\t\tvar fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\tvar textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = textSize;\n\t\t\t} else {\n\t\t\t\tminSize.width = textSize;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\tvar pos = this.options.position;\n\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t},\n\n\t\t// Actually draw the title block on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar ctx = me.ctx;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar opts = me.options;\n\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\t\tvar offset = lineHeight / 2 + opts.padding;\n\t\t\t\tvar rotation = 0;\n\t\t\t\tvar top = me.top;\n\t\t\t\tvar left = me.left;\n\t\t\t\tvar bottom = me.bottom;\n\t\t\t\tvar right = me.right;\n\t\t\t\tvar maxWidth, titleX, titleY;\n\n\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t// Horizontal\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\t\ttitleY = top + offset;\n\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t} else {\n\t\t\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t}\n\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\tctx.rotate(rotation);\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tctx.textBaseline = 'middle';\n\n\t\t\t\tvar text = opts.text;\n\t\t\t\tif (helpers.isArray(text)) {\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\n\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tctx.fillText(text, 0, 0, maxWidth);\n\t\t\t\t}\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\t\tvar title = new Chart.Title({\n\t\t\tctx: chart.ctx,\n\t\t\toptions: titleOpts,\n\t\t\tchart: chart\n\t\t});\n\n\t\tlayout.configure(chart, title, titleOpts);\n\t\tlayout.addBox(chart, title);\n\t\tchart.titleBlock = title;\n\t}\n\n\treturn {\n\t\tid: 'title',\n\n\t\tbeforeInit: function(chart) {\n\t\t\tvar titleOpts = chart.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate: function(chart) {\n\t\t\tvar titleOpts = chart.options.title;\n\t\t\tvar titleBlock = chart.titleBlock;\n\n\t\t\tif (titleOpts) {\n\t\t\t\thelpers.mergeIf(titleOpts, defaults.global.title);\n\n\t\t\t\tif (titleBlock) {\n\t\t\t\t\tlayout.configure(chart, titleBlock, titleOpts);\n\t\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t}\n\t\t\t} else if (titleBlock) {\n\t\t\t\tChart.layoutService.removeBox(chart, titleBlock);\n\t\t\t\tdelete chart.titleBlock;\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],52:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\t// Default config for a category scale\n\tvar defaultConfig = {\n\t\tposition: 'bottom'\n\t};\n\n\tvar DatasetScale = Chart.Scale.extend({\n\t\t/**\n\t\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t\t* else fall back to data.labels\n\t\t* @private\n\t\t*/\n\t\tgetLabels: function() {\n\t\t\tvar data = this.chart.data;\n\t\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\tme.minIndex = 0;\n\t\t\tme.maxIndex = labels.length - 1;\n\t\t\tvar findIndex;\n\n\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t// user specified min value\n\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.min);\n\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t}\n\n\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t// user specified max value\n\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.max);\n\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t}\n\n\t\t\tme.min = labels[me.minIndex];\n\t\t\tme.max = labels[me.maxIndex];\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t}\n\t\t\treturn me.ticks[index - me.minIndex];\n\t\t},\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: function(value, index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n\t\t\t// If value is a data object, then index is the index in the data array,\n\t\t\t// not the index of the scale. We need to change that.\n\t\t\tvar valueCategory;\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t\t}\n\t\t\tif (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n\t\t\t\tvar labels = me.getLabels();\n\t\t\t\tvalue = valueCategory || value;\n\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t}\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\t\tif (offset) {\n\t\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t\t}\n\n\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t}\n\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\t\tif (offset) {\n\t\t\t\theightOffset += (valueHeight / 2);\n\t\t\t}\n\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tvar value;\n\t\t\tvar offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\tvar horz = me.isHorizontal();\n\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\tif (offset) {\n\t\t\t\tpixel -= (valueDimension / 2);\n\t\t\t}\n\n\t\t\tif (pixel <= 0) {\n\t\t\t\tvalue = 0;\n\t\t\t} else {\n\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t}\n\n\t\t\treturn value + me.minIndex;\n\t\t},\n\t\tgetBasePixel: function() {\n\t\t\treturn this.bottom;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n};\n\n},{}],53:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\t\tticks: {\n\t\t\tcallback: Ticks.formatters.linear\n\t\t}\n\t};\n\n\tvar LinearScale = Chart.LinearScaleBase.extend({\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar DEFAULT_MIN = 0;\n\t\t\tvar DEFAULT_MAX = 1;\n\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// First Calculate the range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store these per type\n\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n\t\t\tme.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar maxTicks;\n\t\t\tvar me = this;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t} else {\n\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t}\n\n\t\t\treturn maxTicks;\n\t\t},\n\t\t// Called after the ticks are built. We need\n\t\thandleDirectionalChanges: function() {\n\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tthis.ticks.reverse();\n\t\t\t}\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\t// Utils\n\t\tgetPixelForValue: function(value) {\n\t\t\t// This must be called after fit has been run so that\n\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\n\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\tvar pixel;\n\t\t\tvar range = me.end - start;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t\t\treturn Math.round(pixel);\n\t\t\t}\n\n\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t\treturn Math.round(pixel);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\treturn me.start + ((me.end - me.start) * offset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n};\n\n},{\"25\":25,\"34\":34,\"45\":45}],54:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar noop = helpers.noop;\n\n\tChart.LinearScaleBase = Chart.Scale.extend({\n\t\tgetRightValue: function(value) {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\treturn +value;\n\t\t\t}\n\t\t\treturn Chart.Scale.prototype.getRightValue.call(this, value);\n\t\t},\n\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t// axis, they can manually override it\n\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t// move the top up to 0\n\t\t\t\t\tme.max = 0;\n\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\tme.min = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n\t\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\tme.min = tickOpts.min;\n\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\tif (me.min === null) {\n\t\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t\t} else {\n\t\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\tme.max = tickOpts.max;\n\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\tif (me.max === null) {\n\t\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t\t} else {\n\t\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setMin !== setMax) {\n\t\t\t\t// We set the min or the max but not both.\n\t\t\t\t// So ensure that our range is good\n\t\t\t\t// Inverted or 0 length range can happen when\n\t\t\t\t// ticks.min is set, and no datasets are visible\n\t\t\t\tif (me.min >= me.max) {\n\t\t\t\t\tif (setMin) {\n\t\t\t\t\t\tme.max = me.min + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.min = me.max - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tme.max++;\n\n\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\tme.min--;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTickLimit: noop,\n\t\thandleDirectionalChanges: noop,\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\tvar numericGeneratorOptions = {\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max,\n\t\t\t\tstepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me);\n\n\t\t\tme.handleDirectionalChanges();\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(me);\n\t\t}\n\t});\n};\n\n},{\"34\":34,\"45\":45}],55:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tcallback: Ticks.formatters.logarithmic\n\t\t}\n\t};\n\n\tvar LogarithmicScale = Chart.Scale.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// Calculate Range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\t\t\tme.minNotZero = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tvalues[index] = 100;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Don't need to split positive and negative since the log scale can't handle a 0 crossing\n\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = valueOrDefault(tickOpts.min, me.min);\n\t\t\tme.max = valueOrDefault(tickOpts.max, me.max);\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tme.min = 1;\n\t\t\t\t\tme.max = 10;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tvar generationOptions = {\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me);\n\n\t\t\tif (!me.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tticks.reverse();\n\t\t\t}\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(this);\n\t\t},\n\t\t// Get the correct tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t},\n\t\tgetPixelForValue: function(value) {\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\t\t\tvar newVal = +me.getRightValue(value);\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar innerDimension, pixel, range;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n\t\t\t\tif (newVal === 0) {\n\t\t\t\t\tpixel = me.left;\n\t\t\t\t} else {\n\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\tpixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Bottom - top since pixels increase downward on a screen\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tif (start === 0 && !tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === start) {\n\t\t\t\t\t\tpixel = me.bottom;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (me.end === 0 && tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === me.end) {\n\t\t\t\t\t\tpixel = me.top;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (newVal === 0) {\n\t\t\t\t\tpixel = tickOpts.reverse ? me.top : me.bottom;\n\t\t\t\t} else {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start);\n\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\tpixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar range = helpers.log10(me.end) - helpers.log10(me.start);\n\t\t\tvar value, innerDimension;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tvalue = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n\t\t\t} else { // todo: if start === 0\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tvalue = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n};\n\n},{\"34\":34,\"45\":45}],56:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar globalDefaults = defaults.global;\n\n\tvar defaultConfig = {\n\t\tdisplay: true,\n\n\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\tanimate: true,\n\t\tposition: 'chartArea',\n\n\t\tangleLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1\n\t\t},\n\n\t\tgridLines: {\n\t\t\tcircular: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\tshowLabelBackdrop: true,\n\n\t\t\t// String - The colour of the label backdrop\n\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\tbackdropPaddingY: 2,\n\n\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\tbackdropPaddingX: 2,\n\n\t\t\tcallback: Ticks.formatters.linear\n\t\t},\n\n\t\tpointLabels: {\n\t\t\t// Boolean - if true, show point labels\n\t\t\tdisplay: true,\n\n\t\t\t// Number - Point label font size in pixels\n\t\t\tfontSize: 10,\n\n\t\t\t// Function - Used to convert point labels\n\t\t\tcallback: function(label) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction getValueCount(scale) {\n\t\tvar opts = scale.options;\n\t\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n\t}\n\n\tfunction getPointLabelFontOptions(scale) {\n\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\tvar fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\tvar fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\treturn {\n\t\t\tsize: fontSize,\n\t\t\tstyle: fontStyle,\n\t\t\tfamily: fontFamily,\n\t\t\tfont: font\n\t\t};\n\t}\n\n\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\tif (helpers.isArray(label)) {\n\t\t\treturn {\n\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\th: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tw: ctx.measureText(label).width,\n\t\t\th: fontSize\n\t\t};\n\t}\n\n\tfunction determineLimits(angle, pos, size, min, max) {\n\t\tif (angle === min || angle === max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - (size / 2),\n\t\t\t\tend: pos + (size / 2)\n\t\t\t};\n\t\t} else if (angle < min || angle > max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - size - 5,\n\t\t\t\tend: pos\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstart: pos,\n\t\t\tend: pos + size + 5\n\t\t};\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with point labels\n\t */\n\tfunction fitWithPointLabels(scale) {\n\t\t/*\n\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t *\n\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t *\n\t\t * Solution:\n\t\t *\n\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t * at each index we check if the text overlaps.\n\t\t *\n\t\t * Where it does, we store that angle and that index.\n\t\t *\n\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t * from the shape radius to move the point inwards by that x.\n\t\t *\n\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t * along with labels.\n\t\t *\n\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t *\n\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t * and position it in the most space efficient manner\n\t\t *\n\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t */\n\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tvar furthestLimits = {\n\t\t\tr: scale.width,\n\t\t\tl: 0,\n\t\t\tt: scale.height,\n\t\t\tb: 0\n\t\t};\n\t\tvar furthestAngles = {};\n\t\tvar i, textSize, pointPosition;\n\n\t\tscale.ctx.font = plFont.font;\n\t\tscale._pointLabelSizes = [];\n\n\t\tvar valueCount = getValueCount(scale);\n\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t}\n\n\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t}\n\t\t}\n\n\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with no point labels\n\t */\n\tfunction fit(scale) {\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t}\n\n\tfunction getTextAlignForAngle(angle) {\n\t\tif (angle === 0 || angle === 180) {\n\t\t\treturn 'center';\n\t\t} else if (angle < 180) {\n\t\t\treturn 'left';\n\t\t}\n\n\t\treturn 'right';\n\t}\n\n\tfunction fillText(ctx, text, position, fontSize) {\n\t\tif (helpers.isArray(text)) {\n\t\t\tvar y = position.y;\n\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\ty += spacing;\n\t\t\t}\n\t\t} else {\n\t\t\tctx.fillText(text, position.x, position.y);\n\t\t}\n\t}\n\n\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\tif (angle === 90 || angle === 270) {\n\t\t\tposition.y -= (textSize.h / 2);\n\t\t} else if (angle > 270 || angle < 90) {\n\t\t\tposition.y -= textSize.h;\n\t\t}\n\t}\n\n\tfunction drawPointLabels(scale) {\n\t\tvar ctx = scale.ctx;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar opts = scale.options;\n\t\tvar angleLineOpts = opts.angleLines;\n\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n\t\t// Point Label Font\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\tctx.textBaseline = 'top';\n\n\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\tif (angleLineOpts.display) {\n\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\n\t\t\tif (pointLabelOpts.display) {\n\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t\t// Keep this in loop since we may support array properties here\n\t\t\t\tvar pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\tctx.font = plFont.font;\n\t\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\tvar ctx = scale.ctx;\n\t\tctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\tctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\tif (scale.options.gridLines.circular) {\n\t\t\t// Draw circular arcs between the points\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t} else {\n\t\t\t// Draw straight lines connecting each index\n\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\tif (valueCount === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t}\n\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tfunction numberOrZero(param) {\n\t\treturn helpers.isNumber(param) ? param : 0;\n\t}\n\n\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.height = me.maxHeight;\n\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tme.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\thelpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tme.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\n\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t// Point labels\n\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tfit: function() {\n\t\t\tif (this.options.pointLabels.display) {\n\t\t\t\tfitWithPointLabels(this);\n\t\t\t} else {\n\t\t\t\tfit(this);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set radius reductions and determine new radius and center point\n\t\t * @private\n\t\t */\n\t\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\tvar me = this;\n\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\tme.drawingArea = Math.min(\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\tvar me = this;\n\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\n\t\t\tvar maxLeft = leftMovement + me.drawingArea;\n\t\t\tvar maxTop = topMovement + me.drawingArea;\n\t\t\tvar maxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\tme.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n\t\t\tme.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n\t\t},\n\n\t\tgetIndexAngle: function(index) {\n\t\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\t\tthis.chart.options.startAngle :\n\t\t\t\t0;\n\n\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t},\n\t\tgetDistanceFromCenterForValue: function(value) {\n\t\t\tvar me = this;\n\n\t\t\tif (value === null) {\n\t\t\t\treturn 0; // null always in center\n\t\t\t}\n\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\tif (me.options.ticks.reverse) {\n\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t}\n\t\t\treturn (value - me.min) * scalingFactor;\n\t\t},\n\t\tgetPointPosition: function(index, distanceFromCenter) {\n\t\t\tvar me = this;\n\t\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\t\treturn {\n\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t};\n\t\t},\n\t\tgetPointPositionForValue: function(index, value) {\n\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t},\n\n\t\tgetBasePosition: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.getPointPositionForValue(0,\n\t\t\t\tme.beginAtZero ? 0 :\n\t\t\t\tmin < 0 && max < 0 ? max :\n\t\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t\t0);\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\t\t\t\tvar startAngle = this.getIndexAngle(0);\n\n\t\t\t\t// Tick Font\n\t\t\t\tvar tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\tif (index > 0 || tickOpts.reverse) {\n\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\tvar tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(me.xCenter, me.yCenter);\n\t\t\t\t\t\t\tctx.rotate(startAngle);\n\n\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t\t-labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t\t-yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\t\ttickFontSize + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\tctx.fillText(label, 0, -yCenterOffset);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n};\n\n},{\"25\":25,\"34\":34,\"45\":45}],57:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nvar moment = require(6);\nmoment = typeof moment === 'function' ? moment : window.moment;\n\nvar defaults = require(25);\nvar helpers = require(45);\n\n// Integer constants are from the ES6 spec.\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\nvar INTERVALS = {\n\tmillisecond: {\n\t\tcommon: true,\n\t\tsize: 1,\n\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t},\n\tsecond: {\n\t\tcommon: true,\n\t\tsize: 1000,\n\t\tsteps: [1, 2, 5, 10, 30]\n\t},\n\tminute: {\n\t\tcommon: true,\n\t\tsize: 60000,\n\t\tsteps: [1, 2, 5, 10, 30]\n\t},\n\thour: {\n\t\tcommon: true,\n\t\tsize: 3600000,\n\t\tsteps: [1, 2, 3, 6, 12]\n\t},\n\tday: {\n\t\tcommon: true,\n\t\tsize: 86400000,\n\t\tsteps: [1, 2, 5]\n\t},\n\tweek: {\n\t\tcommon: false,\n\t\tsize: 604800000,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tmonth: {\n\t\tcommon: true,\n\t\tsize: 2.628e9,\n\t\tsteps: [1, 2, 3]\n\t},\n\tquarter: {\n\t\tcommon: false,\n\t\tsize: 7.884e9,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tyear: {\n\t\tcommon: true,\n\t\tsize: 3.154e10\n\t}\n};\n\nvar UNITS = Object.keys(INTERVALS);\n\nfunction sorter(a, b) {\n\treturn a - b;\n}\n\nfunction arrayUnique(items) {\n\tvar hash = {};\n\tvar out = [];\n\tvar i, ilen, item;\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\titem = items[i];\n\t\tif (!hash[item]) {\n\t\t\thash[item] = true;\n\t\t\tout.push(item);\n\t\t}\n\t}\n\n\treturn out;\n}\n\n/**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\nfunction buildLookupTable(timestamps, min, max, distribution) {\n\tif (distribution === 'linear' || !timestamps.length) {\n\t\treturn [\n\t\t\t{time: min, pos: 0},\n\t\t\t{time: max, pos: 1}\n\t\t];\n\t}\n\n\tvar table = [];\n\tvar items = [min];\n\tvar i, ilen, prev, curr, next;\n\n\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\tcurr = timestamps[i];\n\t\tif (curr > min && curr < max) {\n\t\t\titems.push(curr);\n\t\t}\n\t}\n\n\titems.push(max);\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\tnext = items[i + 1];\n\t\tprev = items[i - 1];\n\t\tcurr = items[i];\n\n\t\t// only add points that breaks the scale linearity\n\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n\t\t\ttable.push({time: curr, pos: i / (ilen - 1)});\n\t\t}\n\t}\n\n\treturn table;\n}\n\n// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\nfunction lookup(table, key, value) {\n\tvar lo = 0;\n\tvar hi = table.length - 1;\n\tvar mid, i0, i1;\n\n\twhile (lo >= 0 && lo <= hi) {\n\t\tmid = (lo + hi) >> 1;\n\t\ti0 = table[mid - 1] || null;\n\t\ti1 = table[mid];\n\n\t\tif (!i0) {\n\t\t\t// given value is outside table (before first item)\n\t\t\treturn {lo: null, hi: i1};\n\t\t} else if (i1[key] < value) {\n\t\t\tlo = mid + 1;\n\t\t} else if (i0[key] > value) {\n\t\t\thi = mid - 1;\n\t\t} else {\n\t\t\treturn {lo: i0, hi: i1};\n\t\t}\n\t}\n\n\t// given value is outside table (after last item)\n\treturn {lo: i1, hi: null};\n}\n\n/**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\nfunction interpolate(table, skey, sval, tkey) {\n\tvar range = lookup(table, skey, sval);\n\n\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n\tvar span = next[skey] - prev[skey];\n\tvar ratio = span ? (sval - prev[skey]) / span : 0;\n\tvar offset = (next[tkey] - prev[tkey]) * ratio;\n\n\treturn prev[tkey] + offset;\n}\n\n/**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\nfunction momentify(value, options) {\n\tvar parser = options.parser;\n\tvar format = options.parser || options.format;\n\n\tif (typeof parser === 'function') {\n\t\treturn parser(value);\n\t}\n\n\tif (typeof value === 'string' && typeof format === 'string') {\n\t\treturn moment(value, format);\n\t}\n\n\tif (!(value instanceof moment)) {\n\t\tvalue = moment(value);\n\t}\n\n\tif (value.isValid()) {\n\t\treturn value;\n\t}\n\n\t// Labels are in an incompatible moment format and no `parser` has been provided.\n\t// The user might still use the deprecated `format` option to convert his inputs.\n\tif (typeof format === 'function') {\n\t\treturn format(value);\n\t}\n\n\treturn value;\n}\n\nfunction parse(input, scale) {\n\tif (helpers.isNullOrUndef(input)) {\n\t\treturn null;\n\t}\n\n\tvar options = scale.options.time;\n\tvar value = momentify(scale.getRightValue(input), options);\n\tif (!value.isValid()) {\n\t\treturn null;\n\t}\n\n\tif (options.round) {\n\t\tvalue.startOf(options.round);\n\t}\n\n\treturn value.valueOf();\n}\n\n/**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\nfunction determineStepSize(min, max, unit, capacity) {\n\tvar range = max - min;\n\tvar interval = INTERVALS[unit];\n\tvar milliseconds = interval.size;\n\tvar steps = interval.steps;\n\tvar i, ilen, factor;\n\n\tif (!steps) {\n\t\treturn Math.ceil(range / ((capacity || 1) * milliseconds));\n\t}\n\n\tfor (i = 0, ilen = steps.length; i < ilen; ++i) {\n\t\tfactor = steps[i];\n\t\tif (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn factor;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n\tvar ilen = UNITS.length;\n\tvar i, interval, factor;\n\n\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n\t\tinterval = INTERVALS[UNITS[i]];\n\t\tfactor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n\n\treturn UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n */\nfunction determineUnitForFormatting(ticks, minUnit, min, max) {\n\tvar duration = moment.duration(moment(max).diff(moment(min)));\n\tvar ilen = UNITS.length;\n\tvar i, unit;\n\n\tfor (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n\t\tunit = UNITS[i];\n\t\tif (INTERVALS[unit].common && duration.as(unit) >= ticks.length) {\n\t\t\treturn unit;\n\t\t}\n\t}\n\n\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\nfunction determineMajorUnit(unit) {\n\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n\t\tif (INTERVALS[UNITS[i]].common) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n}\n\n/**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\nfunction generate(min, max, capacity, options) {\n\tvar timeOpts = options.time;\n\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n\tvar major = determineMajorUnit(minor);\n\tvar stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n\tvar majorTicksEnabled = options.ticks.major.enabled;\n\tvar interval = INTERVALS[minor];\n\tvar first = moment(min);\n\tvar last = moment(max);\n\tvar ticks = [];\n\tvar time;\n\n\tif (!stepSize) {\n\t\tstepSize = determineStepSize(min, max, minor, capacity);\n\t}\n\n\t// For 'week' unit, handle the first day of week option\n\tif (weekday) {\n\t\tfirst = first.isoWeekday(weekday);\n\t\tlast = last.isoWeekday(weekday);\n\t}\n\n\t// Align first/last ticks on unit\n\tfirst = first.startOf(weekday ? 'day' : minor);\n\tlast = last.startOf(weekday ? 'day' : minor);\n\n\t// Make sure that the last tick include max\n\tif (last < max) {\n\t\tlast.add(1, minor);\n\t}\n\n\ttime = moment(first);\n\n\tif (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n\t\t// Align the first tick on the previous `minor` unit aligned on the `major` unit:\n\t\t// we first aligned time on the previous `major` unit then add the number of full\n\t\t// stepSize there is between first and the previous major time.\n\t\ttime.startOf(major);\n\t\ttime.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n\t}\n\n\tfor (; time < last; time.add(stepSize, minor)) {\n\t\tticks.push(+time);\n\t}\n\n\tticks.push(+time);\n\n\treturn ticks;\n}\n\n/**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\nfunction computeOffsets(table, ticks, min, max, options) {\n\tvar left = 0;\n\tvar right = 0;\n\tvar upper, lower;\n\n\tif (options.offset && ticks.length) {\n\t\tif (!options.time.min) {\n\t\t\tupper = ticks.length > 1 ? ticks[1] : max;\n\t\t\tlower = ticks[0];\n\t\t\tleft = (\n\t\t\t\tinterpolate(table, 'time', upper, 'pos') -\n\t\t\t\tinterpolate(table, 'time', lower, 'pos')\n\t\t\t) / 2;\n\t\t}\n\t\tif (!options.time.max) {\n\t\t\tupper = ticks[ticks.length - 1];\n\t\t\tlower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n\t\t\tright = (\n\t\t\t\tinterpolate(table, 'time', upper, 'pos') -\n\t\t\t\tinterpolate(table, 'time', lower, 'pos')\n\t\t\t) / 2;\n\t\t}\n\t}\n\n\treturn {left: left, right: right};\n}\n\nfunction ticksFromTimestamps(values, majorUnit) {\n\tvar ticks = [];\n\tvar i, ilen, value, major;\n\n\tfor (i = 0, ilen = values.length; i < ilen; ++i) {\n\t\tvalue = values[i];\n\t\tmajor = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n\t\tticks.push({\n\t\t\tvalue: value,\n\t\t\tmajor: major\n\t\t});\n\t}\n\n\treturn ticks;\n}\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'bottom',\n\n\t\t/**\n\t\t * Data distribution along the scale:\n\t\t * - 'linear': data are spread according to their time (distances can vary),\n\t\t * - 'series': data are spread at the same distance from each other.\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t * @since 2.7.0\n\t\t */\n\t\tdistribution: 'linear',\n\n\t\t/**\n\t\t * Scale boundary strategy (bypassed by min/max time options)\n\t\t * - `data`: make sure data are fully visible, ticks outside are removed\n\t\t * - `ticks`: make sure ticks are fully visible, data outside are truncated\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4556\n\t\t * @since 2.7.0\n\t\t */\n\t\tbounds: 'data',\n\n\t\ttime: {\n\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\tminUnit: 'millisecond',\n\n\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\tdisplayFormats: {\n\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\tminute: 'h:mm a', // 11:20 AM\n\t\t\t\thour: 'hA', // 5PM\n\t\t\t\tday: 'MMM D', // Sep 4\n\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t},\n\t\t},\n\t\tticks: {\n\t\t\tautoSkip: false,\n\n\t\t\t/**\n\t\t\t * Ticks generation input values:\n\t\t\t * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n\t\t\t * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n\t\t\t * - 'labels': generates ticks from user given `data.labels` values ONLY.\n\t\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t\t * @since 2.7.0\n\t\t\t */\n\t\t\tsource: 'auto',\n\n\t\t\tmajor: {\n\t\t\t\tenabled: false\n\t\t\t}\n\t\t}\n\t};\n\n\tvar TimeScale = Chart.Scale.extend({\n\t\tinitialize: function() {\n\t\t\tif (!moment) {\n\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t}\n\n\t\t\tthis.mergeTicksOptions();\n\n\t\t\tChart.Scale.prototype.initialize.call(this);\n\t\t},\n\n\t\tupdate: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\n\t\t\t// DEPRECATIONS: output a message only one time per update\n\t\t\tif (options.time && options.time.format) {\n\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t\t}\n\n\t\t\treturn Chart.Scale.prototype.update.apply(me, arguments);\n\t\t},\n\n\t\t/**\n\t\t * Allows data to be referenced via 't' attribute\n\t\t */\n\t\tgetRightValue: function(rawValue) {\n\t\t\tif (rawValue && rawValue.t !== undefined) {\n\t\t\t\trawValue = rawValue.t;\n\t\t\t}\n\t\t\treturn Chart.Scale.prototype.getRightValue.call(this, rawValue);\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar timeOpts = me.options.time;\n\t\t\tvar min = MAX_INTEGER;\n\t\t\tvar max = MIN_INTEGER;\n\t\t\tvar timestamps = [];\n\t\t\tvar datasets = [];\n\t\t\tvar labels = [];\n\t\t\tvar i, j, ilen, jlen, data, timestamp;\n\n\t\t\t// Convert labels to timestamps\n\t\t\tfor (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n\t\t\t\tlabels.push(parse(chart.data.labels[i], me));\n\t\t\t}\n\n\t\t\t// Convert data to timestamps\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\tdata = chart.data.datasets[i].data;\n\n\t\t\t\t\t// Let's consider that all data have the same format.\n\t\t\t\t\tif (helpers.isObject(data[0])) {\n\t\t\t\t\t\tdatasets[i] = [];\n\n\t\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\n\t\t\t\t\t\t\ttimestamp = parse(data[j], me);\n\t\t\t\t\t\t\ttimestamps.push(timestamp);\n\t\t\t\t\t\t\tdatasets[i][j] = timestamp;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimestamps.push.apply(timestamps, labels);\n\t\t\t\t\t\tdatasets[i] = labels.slice(0);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdatasets[i] = [];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (labels.length) {\n\t\t\t\t// Sort labels **after** data have been converted\n\t\t\t\tlabels = arrayUnique(labels).sort(sorter);\n\t\t\t\tmin = Math.min(min, labels[0]);\n\t\t\t\tmax = Math.max(max, labels[labels.length - 1]);\n\t\t\t}\n\n\t\t\tif (timestamps.length) {\n\t\t\t\ttimestamps = arrayUnique(timestamps).sort(sorter);\n\t\t\t\tmin = Math.min(min, timestamps[0]);\n\t\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\n\t\t\t}\n\n\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t// In case there is no valid min/max, let's use today limits\n\t\t\tmin = min === MAX_INTEGER ? +moment().startOf('day') : min;\n\t\t\tmax = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max;\n\n\t\t\t// Make sure that max is strictly higher than min (required by the lookup table)\n\t\t\tme.min = Math.min(min, max);\n\t\t\tme.max = Math.max(min + 1, max);\n\n\t\t\t// PRIVATE\n\t\t\tme._horizontal = me.isHorizontal();\n\t\t\tme._table = [];\n\t\t\tme._timestamps = {\n\t\t\t\tdata: timestamps,\n\t\t\t\tdatasets: datasets,\n\t\t\t\tlabels: labels\n\t\t\t};\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\t\t\tvar options = me.options;\n\t\t\tvar timeOpts = options.time;\n\t\t\tvar timestamps = [];\n\t\t\tvar ticks = [];\n\t\t\tvar i, ilen, timestamp;\n\n\t\t\tswitch (options.ticks.source) {\n\t\t\tcase 'data':\n\t\t\t\ttimestamps = me._timestamps.data;\n\t\t\t\tbreak;\n\t\t\tcase 'labels':\n\t\t\t\ttimestamps = me._timestamps.labels;\n\t\t\t\tbreak;\n\t\t\tcase 'auto':\n\t\t\tdefault:\n\t\t\t\ttimestamps = generate(min, max, me.getLabelCapacity(min), options);\n\t\t\t}\n\n\t\t\tif (options.bounds === 'ticks' && timestamps.length) {\n\t\t\t\tmin = timestamps[0];\n\t\t\t\tmax = timestamps[timestamps.length - 1];\n\t\t\t}\n\n\t\t\t// Enforce limits with user min/max options\n\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t// Remove ticks outside the min/max range\n\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\ttimestamp = timestamps[i];\n\t\t\t\tif (timestamp >= min && timestamp <= max) {\n\t\t\t\t\tticks.push(timestamp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.min = min;\n\t\t\tme.max = max;\n\n\t\t\t// PRIVATE\n\t\t\tme._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max);\n\t\t\tme._majorUnit = determineMajorUnit(me._unit);\n\t\t\tme._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n\t\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n\t\t\treturn ticksFromTimestamps(ticks, me._majorUnit);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar timeOpts = me.options.time;\n\t\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\n\t\t\tvar value = data.datasets[datasetIndex].data[index];\n\n\t\t\tif (helpers.isObject(value)) {\n\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t}\n\t\t\tif (timeOpts.tooltipFormat) {\n\t\t\t\tlabel = momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n\t\t\t}\n\n\t\t\treturn label;\n\t\t},\n\n\t\t/**\n\t\t * Function to format an individual tick mark\n\t\t * @private\n\t\t */\n\t\ttickFormatFunction: function(tick, index, ticks, formatOverride) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar time = tick.valueOf();\n\t\t\tvar formats = options.time.displayFormats;\n\t\t\tvar minorFormat = formats[me._unit];\n\t\t\tvar majorUnit = me._majorUnit;\n\t\t\tvar majorFormat = formats[majorUnit];\n\t\t\tvar majorTime = tick.clone().startOf(majorUnit).valueOf();\n\t\t\tvar majorTickOpts = options.ticks.major;\n\t\t\tvar major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n\t\t\tvar label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat);\n\t\t\tvar tickOpts = major ? majorTickOpts : options.ticks.minor;\n\t\t\tvar formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\treturn formatter ? formatter(label, index, ticks) : label;\n\t\t},\n\n\t\tconvertTicksToLabels: function(ticks) {\n\t\t\tvar labels = [];\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\tlabels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n\t\t\t}\n\n\t\t\treturn labels;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetPixelForOffset: function(time) {\n\t\t\tvar me = this;\n\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\tvar pos = interpolate(me._table, 'time', time, 'pos');\n\n\t\t\treturn start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n\t\t},\n\n\t\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar time = null;\n\n\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\n\t\t\t}\n\n\t\t\tif (time === null) {\n\t\t\t\ttime = parse(value, me);\n\t\t\t}\n\n\t\t\tif (time !== null) {\n\t\t\t\treturn me.getPixelForOffset(time);\n\t\t\t}\n\t\t},\n\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar ticks = this.getTicks();\n\t\t\treturn index >= 0 && index < ticks.length ?\n\t\t\t\tthis.getPixelForOffset(ticks[index].value) :\n\t\t\t\tnull;\n\t\t},\n\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\tvar pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n\t\t\tvar time = interpolate(me._table, 'pos', pos, 'time');\n\n\t\t\treturn moment(time);\n\t\t},\n\n\t\t/**\n\t\t * Crude approximation of what the label width might be\n\t\t * @private\n\t\t */\n\t\tgetLabelWidth: function(label) {\n\t\t\tvar me = this;\n\t\t\tvar ticksOpts = me.options.ticks;\n\t\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\t\tvar angle = helpers.toRadians(ticksOpts.maxRotation);\n\t\t\tvar cosRotation = Math.cos(angle);\n\t\t\tvar sinRotation = Math.sin(angle);\n\t\t\tvar tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n\t\t\treturn (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetLabelCapacity: function(exampleTime) {\n\t\t\tvar me = this;\n\n\t\t\tvar formatOverride = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\n\t\t\tvar exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride);\n\t\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\treturn Math.floor(innerWidth / tickLabelWidth);\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n};\n\n},{\"25\":25,\"45\":45,\"6\":6}]},{},[7])(7)\n});"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/Chart.js",
    "content": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.1\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n\n},{}],2:[function(require,module,exports){\n/* MIT license */\nvar colorNames = require(6);\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getHwb: getHwb,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   hwbString: hwbString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3})$/i,\n       hex =  /^#([a-fA-F0-9]{6})$/i,\n       rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       keyword = /(\\w+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr);\n   if (match) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n   }\n   else if (match = string.match(hex)) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = colorNames[match[1]];\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb[3] = a;\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getHwb(string) {\n   if (!string) {\n      return;\n   }\n   var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hwb);\n   if (match) {\n    var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n   }\n}\n\nfunction getRgb(string) {\n   var rgba = getRgba(string);\n   return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n  var hsla = getHsla(string);\n  return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n   else if (vals = getHwb(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgb) {\n   return \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1])\n              + hexDouble(rgb[2]);\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n   if (alpha === undefined) {\n      alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n   }\n   return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n           + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n  return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorNames) {\n   reverseNames[colorNames[name]] = name;\n}\n\n},{\"6\":6}],3:[function(require,module,exports){\n/* MIT license */\nvar convert = require(5);\nvar string = require(2);\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.valid = false;\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = string.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\tisValid: function () {\n\t\treturn this.valid;\n\t},\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn string.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tthis.valid = true;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nmodule.exports = Color;\n\n},{\"2\":2,\"5\":5}],4:[function(require,module,exports){\n/* MIT license */\n\nmodule.exports = {\n  rgb2hsl: rgb2hsl,\n  rgb2hsv: rgb2hsv,\n  rgb2hwb: rgb2hwb,\n  rgb2cmyk: rgb2cmyk,\n  rgb2keyword: rgb2keyword,\n  rgb2xyz: rgb2xyz,\n  rgb2lab: rgb2lab,\n  rgb2lch: rgb2lch,\n\n  hsl2rgb: hsl2rgb,\n  hsl2hsv: hsl2hsv,\n  hsl2hwb: hsl2hwb,\n  hsl2cmyk: hsl2cmyk,\n  hsl2keyword: hsl2keyword,\n\n  hsv2rgb: hsv2rgb,\n  hsv2hsl: hsv2hsl,\n  hsv2hwb: hsv2hwb,\n  hsv2cmyk: hsv2cmyk,\n  hsv2keyword: hsv2keyword,\n\n  hwb2rgb: hwb2rgb,\n  hwb2hsl: hwb2hsl,\n  hwb2hsv: hwb2hsv,\n  hwb2cmyk: hwb2cmyk,\n  hwb2keyword: hwb2keyword,\n\n  cmyk2rgb: cmyk2rgb,\n  cmyk2hsl: cmyk2hsl,\n  cmyk2hsv: cmyk2hsv,\n  cmyk2hwb: cmyk2hwb,\n  cmyk2keyword: cmyk2keyword,\n\n  keyword2rgb: keyword2rgb,\n  keyword2hsl: keyword2hsl,\n  keyword2hsv: keyword2hsv,\n  keyword2hwb: keyword2hwb,\n  keyword2cmyk: keyword2cmyk,\n  keyword2lab: keyword2lab,\n  keyword2xyz: keyword2xyz,\n\n  xyz2rgb: xyz2rgb,\n  xyz2lab: xyz2lab,\n  xyz2lch: xyz2lch,\n\n  lab2xyz: lab2xyz,\n  lab2rgb: lab2rgb,\n  lab2lch: lab2lch,\n\n  lch2lab: lch2lab,\n  lch2xyz: lch2xyz,\n  lch2rgb: lch2rgb\n}\n\n\nfunction rgb2hsl(rgb) {\n  var r = rgb[0]/255,\n      g = rgb[1]/255,\n      b = rgb[2]/255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, l;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g)/ delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  l = (min + max) / 2;\n\n  if (max == min)\n    s = 0;\n  else if (l <= 0.5)\n    s = delta / (max + min);\n  else\n    s = delta / (2 - max - min);\n\n  return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, v;\n\n  if (max == 0)\n    s = 0;\n  else\n    s = (delta/max * 1000)/10;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g) / delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  v = ((max / 255) * 1000) / 10;\n\n  return [h, s, v];\n}\n\nfunction rgb2hwb(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      h = rgb2hsl(rgb)[0],\n      w = 1/255 * Math.min(r, Math.min(g, b)),\n      b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n  return [h, w * 100, b * 100];\n}\n\nfunction rgb2cmyk(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255,\n      c, m, y, k;\n\n  k = Math.min(1 - r, 1 - g, 1 - b);\n  c = (1 - r - k) / (1 - k) || 0;\n  m = (1 - g - k) / (1 - k) || 0;\n  y = (1 - b - k) / (1 - k) || 0;\n  return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n  return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255;\n\n  // assume sRGB\n  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n  return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n  var xyz = rgb2xyz(rgb),\n        x = xyz[0],\n        y = xyz[1],\n        z = xyz[2],\n        l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction rgb2lch(args) {\n  return lab2lch(rgb2lab(args));\n}\n\nfunction hsl2rgb(hsl) {\n  var h = hsl[0] / 360,\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      t1, t2, t3, rgb, val;\n\n  if (s == 0) {\n    val = l * 255;\n    return [val, val, val];\n  }\n\n  if (l < 0.5)\n    t2 = l * (1 + s);\n  else\n    t2 = l + s - l * s;\n  t1 = 2 * l - t2;\n\n  rgb = [0, 0, 0];\n  for (var i = 0; i < 3; i++) {\n    t3 = h + 1 / 3 * - (i - 1);\n    t3 < 0 && t3++;\n    t3 > 1 && t3--;\n\n    if (6 * t3 < 1)\n      val = t1 + (t2 - t1) * 6 * t3;\n    else if (2 * t3 < 1)\n      val = t2;\n    else if (3 * t3 < 2)\n      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n    else\n      val = t1;\n\n    rgb[i] = val * 255;\n  }\n\n  return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n  var h = hsl[0],\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      sv, v;\n\n  if(l === 0) {\n      // no need to do calc on black\n      // also avoids divide by 0 error\n      return [0, 0, 0];\n  }\n\n  l *= 2;\n  s *= (l <= 1) ? l : 2 - l;\n  v = (l + s) / 2;\n  sv = (2 * s) / (l + s);\n  return [h, sv * 100, v * 100];\n}\n\nfunction hsl2hwb(args) {\n  return rgb2hwb(hsl2rgb(args));\n}\n\nfunction hsl2cmyk(args) {\n  return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n  return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n  var h = hsv[0] / 60,\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      hi = Math.floor(h) % 6;\n\n  var f = h - Math.floor(h),\n      p = 255 * v * (1 - s),\n      q = 255 * v * (1 - (s * f)),\n      t = 255 * v * (1 - (s * (1 - f))),\n      v = 255 * v;\n\n  switch(hi) {\n    case 0:\n      return [v, t, p];\n    case 1:\n      return [q, v, p];\n    case 2:\n      return [p, v, t];\n    case 3:\n      return [p, q, v];\n    case 4:\n      return [t, p, v];\n    case 5:\n      return [v, p, q];\n  }\n}\n\nfunction hsv2hsl(hsv) {\n  var h = hsv[0],\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      sl, l;\n\n  l = (2 - s) * v;\n  sl = s * v;\n  sl /= (l <= 1) ? l : 2 - l;\n  sl = sl || 0;\n  l /= 2;\n  return [h, sl * 100, l * 100];\n}\n\nfunction hsv2hwb(args) {\n  return rgb2hwb(hsv2rgb(args))\n}\n\nfunction hsv2cmyk(args) {\n  return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n  return rgb2keyword(hsv2rgb(args));\n}\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nfunction hwb2rgb(hwb) {\n  var h = hwb[0] / 360,\n      wh = hwb[1] / 100,\n      bl = hwb[2] / 100,\n      ratio = wh + bl,\n      i, v, f, n;\n\n  // wh + bl cant be > 1\n  if (ratio > 1) {\n    wh /= ratio;\n    bl /= ratio;\n  }\n\n  i = Math.floor(6 * h);\n  v = 1 - bl;\n  f = 6 * h - i;\n  if ((i & 0x01) != 0) {\n    f = 1 - f;\n  }\n  n = wh + f * (v - wh);  // linear interpolation\n\n  switch (i) {\n    default:\n    case 6:\n    case 0: r = v; g = n; b = wh; break;\n    case 1: r = n; g = v; b = wh; break;\n    case 2: r = wh; g = v; b = n; break;\n    case 3: r = wh; g = n; b = v; break;\n    case 4: r = n; g = wh; b = v; break;\n    case 5: r = v; g = wh; b = n; break;\n  }\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction hwb2hsl(args) {\n  return rgb2hsl(hwb2rgb(args));\n}\n\nfunction hwb2hsv(args) {\n  return rgb2hsv(hwb2rgb(args));\n}\n\nfunction hwb2cmyk(args) {\n  return rgb2cmyk(hwb2rgb(args));\n}\n\nfunction hwb2keyword(args) {\n  return rgb2keyword(hwb2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n  var c = cmyk[0] / 100,\n      m = cmyk[1] / 100,\n      y = cmyk[2] / 100,\n      k = cmyk[3] / 100,\n      r, g, b;\n\n  r = 1 - Math.min(1, c * (1 - k) + k);\n  g = 1 - Math.min(1, m * (1 - k) + k);\n  b = 1 - Math.min(1, y * (1 - k) + k);\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n  return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n  return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2hwb(args) {\n  return rgb2hwb(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n  return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n  var x = xyz[0] / 100,\n      y = xyz[1] / 100,\n      z = xyz[2] / 100,\n      r, g, b;\n\n  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n  // assume sRGB\n  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n    : r = (r * 12.92);\n\n  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n    : g = (g * 12.92);\n\n  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n    : b = (b * 12.92);\n\n  r = Math.min(Math.max(0, r), 1);\n  g = Math.min(Math.max(0, g), 1);\n  b = Math.min(Math.max(0, b), 1);\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction xyz2lab(xyz) {\n  var x = xyz[0],\n      y = xyz[1],\n      z = xyz[2],\n      l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction xyz2lch(args) {\n  return lab2lch(xyz2lab(args));\n}\n\nfunction lab2xyz(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      x, y, z, y2;\n\n  if (l <= 8) {\n    y = (l * 100) / 903.3;\n    y2 = (7.787 * (y / 100)) + (16 / 116);\n  } else {\n    y = 100 * Math.pow((l + 16) / 116, 3);\n    y2 = Math.pow(y / 100, 1/3);\n  }\n\n  x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n  z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n  return [x, y, z];\n}\n\nfunction lab2lch(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      hr, h, c;\n\n  hr = Math.atan2(b, a);\n  h = hr * 360 / 2 / Math.PI;\n  if (h < 0) {\n    h += 360;\n  }\n  c = Math.sqrt(a * a + b * b);\n  return [l, c, h];\n}\n\nfunction lab2rgb(args) {\n  return xyz2rgb(lab2xyz(args));\n}\n\nfunction lch2lab(lch) {\n  var l = lch[0],\n      c = lch[1],\n      h = lch[2],\n      a, b, hr;\n\n  hr = h / 360 * 2 * Math.PI;\n  a = c * Math.cos(hr);\n  b = c * Math.sin(hr);\n  return [l, a, b];\n}\n\nfunction lch2xyz(args) {\n  return lab2xyz(lch2lab(args));\n}\n\nfunction lch2rgb(args) {\n  return lab2rgb(lch2lab(args));\n}\n\nfunction keyword2rgb(keyword) {\n  return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n  return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n  return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2hwb(args) {\n  return rgb2hwb(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n  return rgb2cmyk(keyword2rgb(args));\n}\n\nfunction keyword2lab(args) {\n  return rgb2lab(keyword2rgb(args));\n}\n\nfunction keyword2xyz(args) {\n  return rgb2xyz(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n  aliceblue:  [240,248,255],\n  antiquewhite: [250,235,215],\n  aqua: [0,255,255],\n  aquamarine: [127,255,212],\n  azure:  [240,255,255],\n  beige:  [245,245,220],\n  bisque: [255,228,196],\n  black:  [0,0,0],\n  blanchedalmond: [255,235,205],\n  blue: [0,0,255],\n  blueviolet: [138,43,226],\n  brown:  [165,42,42],\n  burlywood:  [222,184,135],\n  cadetblue:  [95,158,160],\n  chartreuse: [127,255,0],\n  chocolate:  [210,105,30],\n  coral:  [255,127,80],\n  cornflowerblue: [100,149,237],\n  cornsilk: [255,248,220],\n  crimson:  [220,20,60],\n  cyan: [0,255,255],\n  darkblue: [0,0,139],\n  darkcyan: [0,139,139],\n  darkgoldenrod:  [184,134,11],\n  darkgray: [169,169,169],\n  darkgreen:  [0,100,0],\n  darkgrey: [169,169,169],\n  darkkhaki:  [189,183,107],\n  darkmagenta:  [139,0,139],\n  darkolivegreen: [85,107,47],\n  darkorange: [255,140,0],\n  darkorchid: [153,50,204],\n  darkred:  [139,0,0],\n  darksalmon: [233,150,122],\n  darkseagreen: [143,188,143],\n  darkslateblue:  [72,61,139],\n  darkslategray:  [47,79,79],\n  darkslategrey:  [47,79,79],\n  darkturquoise:  [0,206,209],\n  darkviolet: [148,0,211],\n  deeppink: [255,20,147],\n  deepskyblue:  [0,191,255],\n  dimgray:  [105,105,105],\n  dimgrey:  [105,105,105],\n  dodgerblue: [30,144,255],\n  firebrick:  [178,34,34],\n  floralwhite:  [255,250,240],\n  forestgreen:  [34,139,34],\n  fuchsia:  [255,0,255],\n  gainsboro:  [220,220,220],\n  ghostwhite: [248,248,255],\n  gold: [255,215,0],\n  goldenrod:  [218,165,32],\n  gray: [128,128,128],\n  green:  [0,128,0],\n  greenyellow:  [173,255,47],\n  grey: [128,128,128],\n  honeydew: [240,255,240],\n  hotpink:  [255,105,180],\n  indianred:  [205,92,92],\n  indigo: [75,0,130],\n  ivory:  [255,255,240],\n  khaki:  [240,230,140],\n  lavender: [230,230,250],\n  lavenderblush:  [255,240,245],\n  lawngreen:  [124,252,0],\n  lemonchiffon: [255,250,205],\n  lightblue:  [173,216,230],\n  lightcoral: [240,128,128],\n  lightcyan:  [224,255,255],\n  lightgoldenrodyellow: [250,250,210],\n  lightgray:  [211,211,211],\n  lightgreen: [144,238,144],\n  lightgrey:  [211,211,211],\n  lightpink:  [255,182,193],\n  lightsalmon:  [255,160,122],\n  lightseagreen:  [32,178,170],\n  lightskyblue: [135,206,250],\n  lightslategray: [119,136,153],\n  lightslategrey: [119,136,153],\n  lightsteelblue: [176,196,222],\n  lightyellow:  [255,255,224],\n  lime: [0,255,0],\n  limegreen:  [50,205,50],\n  linen:  [250,240,230],\n  magenta:  [255,0,255],\n  maroon: [128,0,0],\n  mediumaquamarine: [102,205,170],\n  mediumblue: [0,0,205],\n  mediumorchid: [186,85,211],\n  mediumpurple: [147,112,219],\n  mediumseagreen: [60,179,113],\n  mediumslateblue:  [123,104,238],\n  mediumspringgreen:  [0,250,154],\n  mediumturquoise:  [72,209,204],\n  mediumvioletred:  [199,21,133],\n  midnightblue: [25,25,112],\n  mintcream:  [245,255,250],\n  mistyrose:  [255,228,225],\n  moccasin: [255,228,181],\n  navajowhite:  [255,222,173],\n  navy: [0,0,128],\n  oldlace:  [253,245,230],\n  olive:  [128,128,0],\n  olivedrab:  [107,142,35],\n  orange: [255,165,0],\n  orangered:  [255,69,0],\n  orchid: [218,112,214],\n  palegoldenrod:  [238,232,170],\n  palegreen:  [152,251,152],\n  paleturquoise:  [175,238,238],\n  palevioletred:  [219,112,147],\n  papayawhip: [255,239,213],\n  peachpuff:  [255,218,185],\n  peru: [205,133,63],\n  pink: [255,192,203],\n  plum: [221,160,221],\n  powderblue: [176,224,230],\n  purple: [128,0,128],\n  rebeccapurple: [102, 51, 153],\n  red:  [255,0,0],\n  rosybrown:  [188,143,143],\n  royalblue:  [65,105,225],\n  saddlebrown:  [139,69,19],\n  salmon: [250,128,114],\n  sandybrown: [244,164,96],\n  seagreen: [46,139,87],\n  seashell: [255,245,238],\n  sienna: [160,82,45],\n  silver: [192,192,192],\n  skyblue:  [135,206,235],\n  slateblue:  [106,90,205],\n  slategray:  [112,128,144],\n  slategrey:  [112,128,144],\n  snow: [255,250,250],\n  springgreen:  [0,255,127],\n  steelblue:  [70,130,180],\n  tan:  [210,180,140],\n  teal: [0,128,128],\n  thistle:  [216,191,216],\n  tomato: [255,99,71],\n  turquoise:  [64,224,208],\n  violet: [238,130,238],\n  wheat:  [245,222,179],\n  white:  [255,255,255],\n  whitesmoke: [245,245,245],\n  yellow: [255,255,0],\n  yellowgreen:  [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\n},{}],5:[function(require,module,exports){\nvar conversions = require(4);\n\nvar convert = function() {\n   return new Converter();\n}\n\nfor (var func in conversions) {\n  // export Raw versions\n  convert[func + \"Raw\"] =  (function(func) {\n    // accept array or plain args\n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      return conversions[func](arg);\n    }\n  })(func);\n\n  var pair = /(\\w+)2(\\w+)/.exec(func),\n      from = pair[1],\n      to = pair[2];\n\n  // export rgb2hsl and [\"rgb\"][\"hsl\"]\n  convert[from] = convert[from] || {};\n\n  convert[from][to] = convert[func] = (function(func) { \n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      \n      var val = conversions[func](arg);\n      if (typeof val == \"string\" || val === undefined)\n        return val; // keyword\n\n      for (var i = 0; i < val.length; i++)\n        val[i] = Math.round(val[i]);\n      return val;\n    }\n  })(func);\n}\n\n\n/* Converter does lazy conversion and caching */\nvar Converter = function() {\n   this.convs = {};\n};\n\n/* Either get the values for a space or\n  set the values for a space, depending on args */\nConverter.prototype.routeSpace = function(space, args) {\n   var values = args[0];\n   if (values === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n   }\n   // color.rgb(10, 10, 10)\n   if (typeof values == \"number\") {\n      values = Array.prototype.slice.call(args);        \n   }\n\n   return this.setValues(space, values);\n};\n  \n/* Set the values for a space, invalidating cache */\nConverter.prototype.setValues = function(space, values) {\n   this.space = space;\n   this.convs = {};\n   this.convs[space] = values;\n   return this;\n};\n\n/* Get the values for a space. If there's already\n  a conversion for the space, fetch it, otherwise\n  compute it */\nConverter.prototype.getValues = function(space) {\n   var vals = this.convs[space];\n   if (!vals) {\n      var fspace = this.space,\n          from = this.convs[fspace];\n      vals = convert[fspace][space](from);\n\n      this.convs[space] = vals;\n   }\n  return vals;\n};\n\n[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n   Converter.prototype[space] = function(vals) {\n      return this.routeSpace(space, arguments);\n   }\n});\n\nmodule.exports = convert;\n},{\"4\":4}],6:[function(require,module,exports){\n'use strict'\n\nmodule.exports = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n\n},{}],7:[function(require,module,exports){\n/**\n * @namespace Chart\n */\nvar Chart = require(29)();\n\nChart.helpers = require(45);\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\nrequire(27)(Chart);\n\nChart.defaults = require(25);\nChart.Element = require(26);\nChart.elements = require(40);\nChart.Interaction = require(28);\nChart.platform = require(48);\n\nrequire(31)(Chart);\nrequire(22)(Chart);\nrequire(23)(Chart);\nrequire(24)(Chart);\nrequire(30)(Chart);\nrequire(33)(Chart);\nrequire(32)(Chart);\nrequire(35)(Chart);\n\nrequire(54)(Chart);\nrequire(52)(Chart);\nrequire(53)(Chart);\nrequire(55)(Chart);\nrequire(56)(Chart);\nrequire(57)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire(15)(Chart);\nrequire(16)(Chart);\nrequire(17)(Chart);\nrequire(18)(Chart);\nrequire(19)(Chart);\nrequire(20)(Chart);\nrequire(21)(Chart);\n\nrequire(8)(Chart);\nrequire(9)(Chart);\nrequire(10)(Chart);\nrequire(11)(Chart);\nrequire(12)(Chart);\nrequire(13)(Chart);\nrequire(14)(Chart);\n\n// Loading built-it plugins\nvar plugins = [];\n\nplugins.push(\n\trequire(49)(Chart),\n\trequire(50)(Chart),\n\trequire(51)(Chart)\n);\n\nChart.plugins.register(plugins);\n\nChart.platform.initialize();\n\nmodule.exports = Chart;\nif (typeof window !== 'undefined') {\n\twindow.Chart = Chart;\n}\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nChart.canvasHelpers = Chart.helpers.canvas;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"35\":35,\"40\":40,\"45\":45,\"48\":48,\"49\":49,\"50\":50,\"51\":51,\"52\":52,\"53\":53,\"54\":54,\"55\":55,\"56\":56,\"57\":57,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],9:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],10:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],11:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],12:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],14:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n};\n\n},{}],15:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('bar', {\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\ttype: 'linear'\n\t\t}]\n\t}\n});\n\ndefaults._set('horizontalBar', {\n\thover: {\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'bottom'\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\tposition: 'left',\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Horizontal Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}]\n\t},\n\n\telements: {\n\t\trectangle: {\n\t\t\tborderSkipped: 'left'\n\t\t}\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function(item, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\n\t\t\t\tif (item.length > 0) {\n\t\t\t\t\tif (item[0].yLabel) {\n\t\t\t\t\t\ttitle = item[0].yLabel;\n\t\t\t\t\t} else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n\t\t\t\t\t\ttitle = data.labels[item[0].index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\treturn datasetLabel + ': ' + item.xLabel;\n\t\t\t}\n\t\t},\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Rectangle,\n\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta;\n\n\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\tmeta = me.getMeta();\n\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar i, ilen;\n\n\t\t\tme._ruler = me.getRuler();\n\n\t\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(rects[i], i, reset);\n\t\t\t}\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\trectangle._model = {\n\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t};\n\n\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tupdateElementGeometry: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar model = rectangle._model;\n\t\t\tvar vscale = me.getValueScale();\n\t\t\tvar base = vscale.getBasePixel();\n\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\tmodel.horizontal = horizontal;\n\t\t\tmodel.base = reset ? base : vpixels.base;\n\t\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScale: function() {\n\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScale: function() {\n\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t},\n\n\t\t/**\n\t\t * Returns the effective number of stacks based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackCount: function(last) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\t\tvar stacks = [];\n\t\t\tvar i, meta;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) &&\n\t\t\t\t\t(stacked === false ||\n\t\t\t\t\t(stacked === true && stacks.indexOf(meta.stack) === -1) ||\n\t\t\t\t\t(stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\treturn this.getStackCount(datasetIndex) - 1;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stackCount = me.getStackCount();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar pixels = [];\n\t\t\tvar isHorizontal = scale.isHorizontal();\n\t\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tpixels: pixels,\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tstackCount: stackCount,\n\t\t\t\tscale: scale\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Note: pixel values are not clamped to the scale area.\n\t\t * @private\n\t\t */\n\t\tcalculateBarValuePixels: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar value = scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar stack = meta.stack;\n\t\t\tvar start = 0;\n\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\tif (imeta.bar &&\n\t\t\t\t\t\timeta.stack === stack &&\n\t\t\t\t\t\timeta.controller.getValueScaleId() === scale.id &&\n\t\t\t\t\t\tchart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\tivalue = scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\t\tif ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n\t\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbase = scale.getPixelForValue(start);\n\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\tsize = (head - base) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: head,\n\t\t\t\tcenter: head + size / 2\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tcalculateBarIndexPixels: function(datasetIndex, index, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar options = ruler.scale.options;\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar pixels = ruler.pixels;\n\t\t\tvar base = pixels[index];\n\t\t\tvar length = pixels.length;\n\t\t\tvar start = ruler.start;\n\t\t\tvar end = ruler.end;\n\t\t\tvar leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size;\n\n\t\t\tif (length === 1) {\n\t\t\t\tleftSampleSize = base > start ? base - start : end - base;\n\t\t\t\trightSampleSize = base < end ? end - base : base - start;\n\t\t\t} else {\n\t\t\t\tif (index > 0) {\n\t\t\t\t\tleftSampleSize = (base - pixels[index - 1]) / 2;\n\t\t\t\t\tif (index === length - 1) {\n\t\t\t\t\t\trightSampleSize = leftSampleSize;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (index < length - 1) {\n\t\t\t\t\trightSampleSize = (pixels[index + 1] - base) / 2;\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tleftSampleSize = rightSampleSize;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tleftCategorySize = leftSampleSize * options.categoryPercentage;\n\t\t\trightCategorySize = rightSampleSize * options.categoryPercentage;\n\t\t\tfullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount;\n\t\t\tsize = fullBarSize * options.barPercentage;\n\n\t\t\tsize = Math.min(\n\t\t\t\thelpers.valueOrDefault(options.barThickness, size),\n\t\t\t\thelpers.valueOrDefault(options.maxBarThickness, Infinity));\n\n\t\t\tbase -= leftCategorySize;\n\t\t\tbase += fullBarSize * stackIndex;\n\t\t\tbase += (fullBarSize - size) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: base + size,\n\t\t\t\tcenter: base + size / 2\n\t\t\t};\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar ilen = rects.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\t\trects[i].draw();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\t});\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],16:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('bubble', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\tposition: 'bottom',\n\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tdataElementType: elements.Point,\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar options = me._resolveElementOptions(point, index);\n\t\t\tvar data = me.getDataset().data[index];\n\t\t\tvar dsIndex = me.index;\n\n\t\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n\t\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._options = options;\n\t\t\tpoint._datasetIndex = dsIndex;\n\t\t\tpoint._index = index;\n\t\t\tpoint._model = {\n\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\tborderColor: options.borderColor,\n\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\thitRadius: options.hitRadius,\n\t\t\t\tpointStyle: options.pointStyle,\n\t\t\t\tradius: reset ? 0 : options.radius,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t};\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n\t\t\tmodel.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n\t\t\tmodel.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t\t\tmodel.radius = options.radius + options.hoverRadius;\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = options.backgroundColor;\n\t\t\tmodel.borderColor = options.borderColor;\n\t\t\tmodel.borderWidth = options.borderWidth;\n\t\t\tmodel.radius = options.radius;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\t_resolveElementOptions: function(point, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar dataset = datasets[me.index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar options = chart.options.elements.point;\n\t\t\tvar resolve = helpers.options.resolve;\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar values = {};\n\t\t\tvar i, ilen, key;\n\n\t\t\t// Scriptable options\n\t\t\tvar context = {\n\t\t\t\tchart: chart,\n\t\t\t\tdataIndex: index,\n\t\t\t\tdataset: dataset,\n\t\t\t\tdatasetIndex: me.index\n\t\t\t};\n\n\t\t\tvar keys = [\n\t\t\t\t'backgroundColor',\n\t\t\t\t'borderColor',\n\t\t\t\t'borderWidth',\n\t\t\t\t'hoverBackgroundColor',\n\t\t\t\t'hoverBorderColor',\n\t\t\t\t'hoverBorderWidth',\n\t\t\t\t'hoverRadius',\n\t\t\t\t'hitRadius',\n\t\t\t\t'pointStyle'\n\t\t\t];\n\n\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\tkey = keys[i];\n\t\t\t\tvalues[key] = resolve([\n\t\t\t\t\tcustom[key],\n\t\t\t\t\tdataset[key],\n\t\t\t\t\toptions[key]\n\t\t\t\t], context, index);\n\t\t\t}\n\n\t\t\t// Custom radius resolution\n\t\t\tvalues.radius = resolve([\n\t\t\t\tcustom.radius,\n\t\t\t\tdata ? data.r : undefined,\n\t\t\t\tdataset.radius,\n\t\t\t\toptions.radius\n\t\t\t], context, index);\n\n\t\t\treturn values;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],17:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('doughnut', {\n\tanimation: {\n\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\tanimateRotate: true,\n\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\tanimateScale: false\n\t},\n\thover: {\n\t\tmode: 'single'\n\t},\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar labels = data.labels;\n\n\t\tif (datasets.length) {\n\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\tif (labels[i]) {\n\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t}\n\t\t\t\ttext.push('</li>');\n\t\t\t}\n\t\t}\n\n\t\ttext.push('</ul>');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t// toggle visibility of index if exists\n\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// The percentage of the chart that we cut out of the middle.\n\tcutoutPercentage: 50,\n\n\t// The rotation of the chart, where the first data arc begins.\n\trotation: Math.PI * -0.5,\n\n\t// The total circumference of the chart.\n\tcircumference: Math.PI * 2.0,\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t} else {\n\t\t\t\t\tdataLabel += value;\n\t\t\t\t}\n\n\t\t\t\treturn dataLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\ndefaults._set('pie', helpers.clone(defaults.doughnut));\ndefaults._set('pie', {\n\tcutoutPercentage: 0\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n\t\t\tvar availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n\t\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\t\tvar offset = {x: 0, y: 0};\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\t\tvar circumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (value / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(arcs) {\n\t\t\tvar max = 0;\n\t\t\tvar index = this.index;\n\t\t\tvar length = arcs.length;\n\t\t\tvar borderWidth;\n\t\t\tvar hoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],18:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('line', {\n\tshowLines: true,\n\tspanGaps: false,\n\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\tid: 'x-axis-0'\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.valueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar area = chart.chartArea;\n\t\t\tvar ilen = points.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, area);\n\n\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tpoints[i].draw(area);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],19:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('polarArea', {\n\tscale: {\n\t\ttype: 'radialLinear',\n\t\tangleLines: {\n\t\t\tdisplay: false\n\t\t},\n\t\tgridLines: {\n\t\t\tcircular: true\n\t\t},\n\t\tpointLabels: {\n\t\t\tdisplay: false\n\t\t},\n\t\tticks: {\n\t\t\tbeginAtZero: true\n\t\t}\n\t},\n\n\t// Boolean - Whether to animate the rotation of the chart\n\tanimation: {\n\t\tanimateRotate: true,\n\t\tanimateScale: true\n\t},\n\n\tstartAngle: -0.5 * Math.PI,\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar labels = data.labels;\n\n\t\tif (datasets.length) {\n\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\tif (labels[i]) {\n\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t}\n\t\t\t\ttext.push('</li>');\n\t\t\t}\n\t\t}\n\n\t\ttext.push('</ul>');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],20:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('radar', {\n\tscale: {\n\t\ttype: 'radialLinear'\n\t},\n\telements: {\n\t\tline: {\n\t\t\ttension: 0 // no bezier in radar\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_scale: scale,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],21:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\n\ndefaults._set('scatter', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\tid: 'x-axis-1',    // need an ID so datasets can reference the scale\n\t\t\ttype: 'linear',    // scatter should not use a category axis\n\t\t\tposition: 'bottom'\n\t\t}],\n\t\tyAxes: [{\n\t\t\tid: 'y-axis-1',\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left'\n\t\t}]\n\t},\n\n\tshowLines: false,\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';     // doesn't make sense for scatter since data are formatted as a point\n\t\t\t},\n\t\t\tlabel: function(item) {\n\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\n\n};\n\n},{\"25\":25}],22:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tanimation: {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.Animation = Element.extend({\n\t\tchart: null, // the animation associated chart instance\n\t\tcurrentStep: 0, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @param {Chart} chart - The chart to animate.\n\t\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t\t * @param {Number} duration - The animation duration in ms.\n\t\t * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chart, animation, duration, lazy) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar i, ilen;\n\n\t\t\tanimation.chart = chart;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchart.animating = true;\n\t\t\t}\n\n\t\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tanimations.push(animation);\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (animations.length === 1) {\n\t\t\t\tthis.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\tcancelAnimation: function(chart) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animation) {\n\t\t\t\treturn animation.chart === chart;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchart.animating = false;\n\t\t\t}\n\t\t},\n\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\tvar endTime = Date.now();\n\n\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tadvance: function(count) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar animation, chart;\n\t\t\tvar i = 0;\n\n\t\t\twhile (i < animations.length) {\n\t\t\t\tanimation = animations[i];\n\t\t\t\tchart = animation.chart;\n\n\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\tchart.animating = false;\n\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation instead\n\t * @prop Chart.Animation#animationObject\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'animationObject', {\n\t\tget: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation#chart instead\n\t * @prop Chart.Animation#chartInstance\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n\t\tget: function() {\n\t\t\treturn this.chart;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.chart = value;\n\t\t}\n\t});\n\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],23:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\nvar Interaction = require(28);\nvar platform = require(48);\n\nmodule.exports = function(Chart) {\n\tvar plugins = Chart.plugins;\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tdefaults.global,\n\t\t\tdefaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\t// Update Scale(s) with options\n\t\tif (newOptions.scale) {\n\t\t\tchart.scale.options = newOptions.scale;\n\t\t} else if (newOptions.scales) {\n\t\t\tnewOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n\t\t\t\tchart.scales[scaleOptions.id].options = scaleOptions;\n\t\t\t});\n\t\t}\n\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t}\n\n\tfunction positionIsHorizontal(position) {\n\t\treturn position === 'top' || position === 'bottom';\n\t}\n\n\thelpers.extend(Chart.prototype, /** @lends Chart */ {\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tconstruct: function(item, config) {\n\t\t\tvar me = this;\n\n\t\t\tconfig = initConfig(config);\n\n\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\tvar canvas = context && context.canvas;\n\t\t\tvar height = canvas && canvas.height;\n\t\t\tvar width = canvas && canvas.width;\n\n\t\t\tme.id = helpers.uid();\n\t\t\tme.ctx = context;\n\t\t\tme.canvas = canvas;\n\t\t\tme.config = config;\n\t\t\tme.width = width;\n\t\t\tme.height = height;\n\t\t\tme.aspectRatio = height ? width / height : null;\n\t\t\tme.options = config.options;\n\t\t\tme._bufferedRender = false;\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n\t\t\t * the \"instance\" still need to be defined since it might be called from plugins.\n\t\t\t * @prop Chart#chart\n\t\t\t * @deprecated since version 2.6.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tme.chart = me;\n\t\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t\t// Add the chart instance to the global namespace\n\t\t\tChart.instances[me.id] = me;\n\n\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn me.config.data;\n\t\t\t\t},\n\t\t\t\tset: function(value) {\n\t\t\t\t\tme.config.data = value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!context || !canvas) {\n\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tme.initialize();\n\t\t\tme.update();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me, me.options.devicePixelRatio);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.canvas.clear(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n\t\t\tvar newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n\t\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = me.width = newWidth;\n\t\t\tcanvas.height = me.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(me, options.devicePixelRatio);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales = {};\n\t\t\tvar items = [];\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({\n\t\t\t\t\toptions: options.scale,\n\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\tisDefault: true,\n\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\tif (!scaleClass) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t}\n\n\t\t\t\tvar scale = new scaleClass({\n\t\t\t\t\tid: scaleOptions.id,\n\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\tchart: me\n\t\t\t\t});\n\n\t\t\t\tscales[scale.id] = scale;\n\t\t\t\tscale.mergeTicksOptions();\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t}\n\t\t\t\tmeta.type = type;\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t} else {\n\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tupdateConfig(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\tcontroller.reset();\n\t\t\t});\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t\t// after update.\n\t\t\tme.tooltip.initialize();\n\n\t\t\t// Last active contains items that were previously in the tooltip.\n\t\t\t// When we reset the tooltip, we need to clear it\n\t\t\tme.lastActive = [];\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tduration: config.duration,\n\t\t\t\t\teasing: config.easing,\n\t\t\t\t\tlazy: config.lazy\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(config);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tChart.layoutService.update(this, this.width, this.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.updateDataset(i);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\t/**\n\t\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDataset: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.update();\n\n\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t},\n\n\t\trender: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar duration = config.duration;\n\t\t\tvar lazy = config.lazy;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function(animation) {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation({\n\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\t\trender: function(chart, animationObject) {\n\t\t\t\t\t\tvar easingFunction = helpers.easing.effects[animationObject.easing];\n\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t},\n\n\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t});\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\n\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\tonComplete(new Chart.Animation({numSteps: 0, chart: me}));\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (helpers.isNullOrUndef(easingValue)) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tme.transition(easingValue);\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\t\t\tme._drawTooltip(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\ttransition: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.tooltip.transition(easingValue);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDataset: function(index, easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t},\n\n\t\t/**\n\t\t * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n\t\t * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n\t\t * @private\n\t\t */\n\t\t_drawTooltip: function(easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\t\t\tvar args = {\n\t\t\t\ttooltip: tooltip,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttooltip.draw();\n\n\t\t\tplugins.notify(me, 'afterTooltipDraw', [args]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroyDatasetMeta: function(datasetIndex) {\n\t\t\tvar id = this.id;\n\t\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\t\tif (meta) {\n\t\t\t\tmeta.controller.destroy();\n\t\t\t\tdelete dataset._meta[id];\n\t\t\t}\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.destroyDatasetMeta(i);\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.canvas.clear(me);\n\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\tme.canvas = null;\n\t\t\t\tme.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me,\n\t\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\tchanged |= tooltip && tooltip.handleEvent(e);\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// Invoke onHover hook\n\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\thelpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart instead.\n\t * @class Chart.Controller\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.Controller = Chart;\n};\n\n},{\"25\":25,\"28\":28,\"45\":45,\"48\":48}],24:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\ttransition: function(easingValue) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].transition(easingValue);\n\t\t\t}\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar getHoverColor = helpers.getHoverColor;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i = 0; i < count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length - 1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n\n},{\"45\":45}],25:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\nmodule.exports = {\n\t/**\n\t * @private\n\t */\n\t_set: function(scope, values) {\n\t\treturn helpers.merge(this[scope] || (this[scope] = {}), values);\n\t}\n};\n\n},{\"45\":45}],26:[function(require,module,exports){\n'use strict';\n\nvar color = require(3);\nvar helpers = require(45);\n\nfunction interpolate(start, view, model, ease) {\n\tvar keys = Object.keys(model);\n\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\tkey = keys[i];\n\n\t\ttarget = model[key];\n\n\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\tif (!view.hasOwnProperty(key)) {\n\t\t\tview[key] = target;\n\t\t}\n\n\t\tactual = view[key];\n\n\t\tif (actual === target || key[0] === '_') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!start.hasOwnProperty(key)) {\n\t\t\tstart[key] = actual;\n\t\t}\n\n\t\torigin = start[key];\n\n\t\ttype = typeof target;\n\n\t\tif (type === typeof origin) {\n\t\t\tif (type === 'string') {\n\t\t\t\tc0 = color(origin);\n\t\t\t\tif (c0.valid) {\n\t\t\t\t\tc1 = color(target);\n\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tview[key] = target;\n\t}\n}\n\nvar Element = function(configuration) {\n\thelpers.extend(this, configuration);\n\tthis.initialize.apply(this, arguments);\n};\n\nhelpers.extend(Element.prototype, {\n\n\tinitialize: function() {\n\t\tthis.hidden = false;\n\t},\n\n\tpivot: function() {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\tme._view = helpers.clone(me._model);\n\t\t}\n\t\tme._start = {};\n\t\treturn me;\n\t},\n\n\ttransition: function(ease) {\n\t\tvar me = this;\n\t\tvar model = me._model;\n\t\tvar start = me._start;\n\t\tvar view = me._view;\n\n\t\t// No animation -> No Transition\n\t\tif (!model || ease === 1) {\n\t\t\tme._view = model;\n\t\t\tme._start = null;\n\t\t\treturn me;\n\t\t}\n\n\t\tif (!view) {\n\t\t\tview = me._view = {};\n\t\t}\n\n\t\tif (!start) {\n\t\t\tstart = me._start = {};\n\t\t}\n\n\t\tinterpolate(start, view, model, ease);\n\n\t\treturn me;\n\t},\n\n\ttooltipPosition: function() {\n\t\treturn {\n\t\t\tx: this._model.x,\n\t\t\ty: this._model.y\n\t\t};\n\t},\n\n\thasValue: function() {\n\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t}\n});\n\nElement.extend = helpers.inherits;\n\nmodule.exports = Element;\n\n},{\"3\":3,\"45\":45}],27:[function(require,module,exports){\n/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require(3);\nvar defaults = require(25);\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\t// -- Basic js utility methods\n\n\thelpers.configMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tvar tval = target[key] || {};\n\t\t\t\tvar sval = source[key];\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\t\ttarget[key] = helpers.scaleMerge(tval, sval);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\t\ttarget[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.scaleMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t\tvar slen = source[key].length;\n\t\t\t\t\tvar i, type, scale;\n\n\t\t\t\t\tif (!target[key]) {\n\t\t\t\t\t\ttarget[key] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\t\ttype = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n\t\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\n\t\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\t\thelpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\t\thelpers.merge(target[key][i], scale);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex ?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined ? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign ?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10 ?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\treturn Math.log(x) / Math.LN10;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\n\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\n\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\n\t\tvar current = middlePoint;\n\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn function(callback) {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t}\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt;\n\t\tvar canvas = evt.currentTarget || evt.srcElement;\n\t\tvar boundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof styleValue === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientWidth;\n\t\t}\n\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientHeight;\n\t\t}\n\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart, forceRatio) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tcanvas.style.height = height + 'px';\n\t\tcanvas.style.width = width + 'px';\n\t};\n\t// -- Canvas methods\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\n\thelpers.color = !color ?\n\t\tfunction(value) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn value;\n\t\t} :\n\t\tfunction(value) {\n\t\t\t/* global CanvasGradient */\n\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\tvalue = defaults.global.defaultColor;\n\t\t\t}\n\n\t\t\treturn color(value);\n\t\t};\n\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n\n},{\"25\":25,\"3\":3,\"45\":45}],28:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\n/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\nfunction getRelativePosition(e, chart) {\n\tif (e.native) {\n\t\treturn {\n\t\t\tx: e.x,\n\t\t\ty: e.y\n\t\t};\n\t}\n\n\treturn helpers.getRelativePosition(e, chart);\n}\n\n/**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\nfunction parseVisibleItems(chart, handler) {\n\tvar datasets = chart.data.datasets;\n\tvar meta, i, j, ilen, jlen;\n\n\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tmeta = chart.getDatasetMeta(i);\n\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\tvar element = meta.data[j];\n\t\t\tif (!element._view.skip) {\n\t\t\t\thandler(element);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\nfunction getIntersectItems(chart, position) {\n\tvar elements = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (element.inRange(position.x, position.y)) {\n\t\t\telements.push(element);\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\nfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\tvar minDistance = Number.POSITIVE_INFINITY;\n\tvar nearestItems = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar center = element.getCenterPoint();\n\t\tvar distance = distanceMetric(position, center);\n\n\t\tif (distance < minDistance) {\n\t\t\tnearestItems = [element];\n\t\t\tminDistance = distance;\n\t\t} else if (distance === minDistance) {\n\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\tnearestItems.push(element);\n\t\t}\n\t});\n\n\treturn nearestItems;\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {String} axis the axis mode. x|y|xy\n */\nfunction getDistanceMetricForAxis(axis) {\n\tvar useX = axis.indexOf('x') !== -1;\n\tvar useY = axis.indexOf('y') !== -1;\n\n\treturn function(pt1, pt2) {\n\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t};\n}\n\nfunction indexMode(chart, e, options) {\n\tvar position = getRelativePosition(e, chart);\n\t// Default axis for index mode is 'x' to match old behaviour\n\toptions.axis = options.axis || 'x';\n\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\tvar elements = [];\n\n\tif (!items.length) {\n\t\treturn [];\n\t}\n\n\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\tvar element = meta.data[items[0]._index];\n\n\t\t\t// don't count items that are skipped (null data)\n\t\t\tif (element && !element._view.skip) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * @interface IInteractionOptions\n */\n/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nmodule.exports = {\n\t// Helper function for different modes\n\tmodes: {\n\t\tsingle: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar elements = [];\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t\treturn elements;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn elements.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.label\n\t\t * @deprecated since version 2.4.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tlabel: indexMode,\n\n\t\t/**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tindex: indexMode,\n\n\t\t/**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tdataset: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\tif (items.length > 0) {\n\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.x-axis\n\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\t'x-axis': function(chart, e) {\n\t\t\treturn indexMode(chart, e, {intersect: false});\n\t\t},\n\n\t\t/**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tpoint: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\treturn getIntersectItems(chart, position);\n\t\t},\n\n\t\t/**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tnearest: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\tif (nearestItems.length > 1) {\n\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Return only 1 item\n\t\t\treturn nearestItems.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tx: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param chart {chart} the chart we are returning items from\n\t\t * @param e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\ty: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t}\n\t}\n};\n\n},{\"45\":45}],29:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\n\ndefaults._set('global', {\n\tresponsive: true,\n\tresponsiveAnimationDuration: 0,\n\tmaintainAspectRatio: true,\n\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\thover: {\n\t\tonHover: null,\n\t\tmode: 'nearest',\n\t\tintersect: true,\n\t\tanimationDuration: 400\n\t},\n\tonClick: null,\n\tdefaultColor: 'rgba(0,0,0,0.1)',\n\tdefaultFontColor: '#666',\n\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\tdefaultFontSize: 12,\n\tdefaultFontStyle: 'normal',\n\tshowLines: true,\n\n\t// Element defaults defined in element extensions\n\telements: {},\n\n\t// Layout options such as padding\n\tlayout: {\n\t\tpadding: {\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0\n\t\t}\n\t}\n});\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.construct(item, config);\n\t\treturn this;\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n\n},{\"25\":25}],30:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\tfunction filterByPosition(array, position) {\n\t\treturn helpers.where(array, function(v) {\n\t\t\treturn v.position === position;\n\t\t});\n\t}\n\n\tfunction sortByWeight(array, reverse) {\n\t\tarray.forEach(function(v, i) {\n\t\t\tv._tmpIndex_ = i;\n\t\t\treturn v;\n\t\t});\n\t\tarray.sort(function(a, b) {\n\t\t\tvar v0 = reverse ? b : a;\n\t\t\tvar v1 = reverse ? a : b;\n\t\t\treturn v0.weight === v1.weight ?\n\t\t\t\tv0._tmpIndex_ - v1._tmpIndex_ :\n\t\t\t\tv0.weight - v1.weight;\n\t\t});\n\t\tarray.forEach(function(v) {\n\t\t\tdelete v._tmpIndex_;\n\t\t});\n\t}\n\n\t/**\n\t * @interface ILayoutItem\n\t * @prop {String} position - The position of the item in the chart layout. Possible values are\n\t * 'left', 'top', 'right', 'bottom', and 'chartArea'\n\t * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n\t * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n\t * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n\t * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n\t * @prop {Function} getPadding -  Returns an object with padding on the edges\n\t * @prop {Number} width - Width of item. Must be valid after update()\n\t * @prop {Number} height - Height of item. Must be valid after update()\n\t * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n\t */\n\n\t// The layout service is very self explanatory.  It's responsible for the layout within a chart.\n\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t// It is this service's responsibility of carrying out that layout.\n\tChart.layoutService = {\n\t\tdefaults: {},\n\n\t\t/**\n\t\t * Register a box to a chart.\n\t\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t\t * @param {Chart} chart - the chart to use\n\t\t * @param {ILayoutItem} item - the item to add to be layed out\n\t\t */\n\t\taddBox: function(chart, item) {\n\t\t\tif (!chart.boxes) {\n\t\t\t\tchart.boxes = [];\n\t\t\t}\n\n\t\t\t// initialize item with default values\n\t\t\titem.fullWidth = item.fullWidth || false;\n\t\t\titem.position = item.position || 'top';\n\t\t\titem.weight = item.weight || 0;\n\n\t\t\tchart.boxes.push(item);\n\t\t},\n\n\t\t/**\n\t\t * Remove a layoutItem from a chart\n\t\t * @param {Chart} chart - the chart to remove the box from\n\t\t * @param {Object} layoutItem - the item to remove from the layout\n\t\t */\n\t\tremoveBox: function(chart, layoutItem) {\n\t\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\t\tif (index !== -1) {\n\t\t\t\tchart.boxes.splice(index, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sets (or updates) options on the given `item`.\n\t\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t\t * @param {Object} item - the item to configure with the given options\n\t\t * @param {Object} options - the new item options.\n\t\t */\n\t\tconfigure: function(chart, item, options) {\n\t\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\t\tvar ilen = props.length;\n\t\t\tvar i = 0;\n\t\t\tvar prop;\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tprop = props[i];\n\t\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\t\titem[prop] = options[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t\t * then running a fitting algorithm\n\t\t * @param {Chart} chart - the chart\n\t\t * @param {Number} width - the width to fit into\n\t\t * @param {Number} height - the height to fit into\n\t\t */\n\t\tupdate: function(chart, width, height) {\n\t\t\tif (!chart) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar layoutOptions = chart.options.layout || {};\n\t\t\tvar padding = helpers.options.toPadding(layoutOptions.padding);\n\t\t\tvar leftPadding = padding.left;\n\t\t\tvar rightPadding = padding.right;\n\t\t\tvar topPadding = padding.top;\n\t\t\tvar bottomPadding = padding.bottom;\n\n\t\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\t\tsortByWeight(leftBoxes, true);\n\t\t\tsortByWeight(rightBoxes, false);\n\t\t\tsortByWeight(topBoxes, true);\n\t\t\tsortByWeight(bottomBoxes, false);\n\n\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t// Our canvas looks like the following.\n\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t// B1 is the bottom axis\n\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t// an error will be thrown.\n\t\t\t//\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  T1 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |    |    |                 T2                  |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    | C1 |                           | C2 |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// | L1 | L2 |           ChartArea (C0)            | R1 |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    | C3 |                           | C4 |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    |                 B1                  |    |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  B2 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t//\n\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t// 6. Refit each axis\n\t\t\t// 7. Position each axis in the final location\n\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t// Step 1\n\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t// Step 2\n\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t// Step 3\n\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t// Step 4\n\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\tvar minBoxSizes = [];\n\n\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\tvar minSize;\n\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t} else {\n\t\t\t\t\tminSize = box.update(verticalBoxWidth, chartAreaHeight);\n\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t}\n\n\t\t\t\tminBoxSizes.push({\n\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\tminSize: minSize,\n\t\t\t\t\tbox: box,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t// Steps 5 & 6\n\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t// Function to fit a box\n\t\t\tfunction fitBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t});\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t});\n\n\t\t\t\tvar scaleMargin = {\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t};\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Let the left layout know the final margin\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t// without calling `fit` again\n\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t}\n\n\t\t\t// Step 7 - Position the boxes\n\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\tfunction placeBox(box) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\tbox.top = top;\n\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\ttop = box.bottom;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.left = left;\n\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\tleft = box.right;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t// Account for chart width and height\n\t\t\tleft += maxChartAreaWidth;\n\t\t\ttop += maxChartAreaHeight;\n\n\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t// Step 8\n\t\t\tchart.chartArea = {\n\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t};\n\n\t\t\t// Step 9\n\t\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\t\tbox.left = chart.chartArea.left;\n\t\t\t\tbox.top = chart.chartArea.top;\n\t\t\t\tbox.right = chart.chartArea.right;\n\t\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{\"45\":45}],31:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tplugins: {}\n});\n\nmodule.exports = function(Chart) {\n\n\t/**\n\t * The plugin service singleton\n\t * @namespace Chart.plugins\n\t * @since 2.1.0\n\t */\n\tChart.plugins = {\n\t\t/**\n\t\t * Globally registered plugins.\n\t\t * @private\n\t\t */\n\t\t_plugins: [],\n\n\t\t/**\n\t\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t\t * incremented and descriptors are regenerated during following API calls.\n\t\t * @private\n\t\t */\n\t\t_cacheId: 0,\n\n\t\t/**\n\t\t * Registers the given plugin(s) if not already registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\tp.push(plugin);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Unregisters the given plugin(s) only if registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tunregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Remove all registered plugins.\n\t\t * @since 2.1.5\n\t\t */\n\t\tclear: function() {\n\t\t\tthis._plugins = [];\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Returns the number of registered plugins?\n\t\t * @returns {Number}\n\t\t * @since 2.1.5\n\t\t */\n\t\tcount: function() {\n\t\t\treturn this._plugins.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns all registered plugin instances.\n\t\t * @returns {Array} array of plugin objects.\n\t\t * @since 2.1.5\n\t\t */\n\t\tgetAll: function() {\n\t\t\treturn this._plugins;\n\t\t},\n\n\t\t/**\n\t\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t\t * returned value can be used, for instance, to interrupt the current action.\n\t\t * @param {Object} chart - The chart instance for which plugins should be called.\n\t\t * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t\t * @param {Array} [args] - Extra arguments to apply to the hook call.\n\t\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t\t */\n\t\tnotify: function(chart, hook, args) {\n\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\tvar ilen = descriptors.length;\n\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\tmethod = plugin[hook];\n\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\tif (method.apply(plugin, params) === false) {\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\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Returns descriptors of enabled plugins for the given chart.\n\t\t * @returns {Array} [{ plugin, options }]\n\t\t * @private\n\t\t */\n\t\tdescriptors: function(chart) {\n\t\t\tvar cache = chart._plugins || (chart._plugins = {});\n\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\treturn cache.descriptors;\n\t\t\t}\n\n\t\t\tvar plugins = [];\n\t\t\tvar descriptors = [];\n\t\t\tvar config = (chart && chart.config) || {};\n\t\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar id = plugin.id;\n\t\t\t\tvar opts = options[id];\n\t\t\t\tif (opts === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (opts === true) {\n\t\t\t\t\topts = helpers.clone(defaults.global.plugins[id]);\n\t\t\t\t}\n\n\t\t\t\tplugins.push(plugin);\n\t\t\t\tdescriptors.push({\n\t\t\t\t\tplugin: plugin,\n\t\t\t\t\toptions: opts || {}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcache.descriptors = descriptors;\n\t\t\tcache.id = this._cacheId;\n\t\t\treturn descriptors;\n\t\t}\n\t};\n\n\t/**\n\t * Plugin extension hooks.\n\t * @interface IPlugin\n\t * @since 2.1.0\n\t */\n\t/**\n\t * @method IPlugin#beforeInit\n\t * @desc Called before initializing `chart`.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterInit\n\t * @desc Called after `chart` has been initialized and before the first update.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeUpdate\n\t * @desc Called before updating `chart`. If any plugin returns `false`, the update\n\t * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart update.\n\t */\n\t/**\n\t * @method IPlugin#afterUpdate\n\t * @desc Called after `chart` has been updated and before rendering. Note that this\n\t * hook will not be called if the chart update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsUpdate\n \t * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n\t * the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} false to cancel the datasets update.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsUpdate\n\t * @desc Called after the `chart` datasets have been updated. Note that this hook\n\t * will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetUpdate\n \t * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n\t * returns `false`, the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetUpdate\n \t * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n\t * that this hook will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeLayout\n\t * @desc Called before laying out `chart`. If any plugin returns `false`,\n\t * the layout update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart layout.\n\t */\n\t/**\n\t * @method IPlugin#afterLayout\n\t * @desc Called after the `chart` has been layed out. Note that this hook will not\n\t * be called if the layout update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeRender\n\t * @desc Called before rendering `chart`. If any plugin returns `false`,\n\t * the rendering is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart rendering.\n\t */\n\t/**\n\t * @method IPlugin#afterRender\n\t * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n\t * that this hook will not be called if the rendering has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDraw\n\t * @desc Called before drawing `chart` at every animation frame specified by the given\n\t * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n\t * another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDraw\n\t * @desc Called after the `chart` has been drawn for the specific easing value. Note\n\t * that this hook will not be called if the drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsDraw\n \t * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n\t * the datasets drawing is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsDraw\n\t * @desc Called after the `chart` datasets have been drawn. Note that this hook\n\t * will not be called if the datasets drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetDraw\n \t * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n\t * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n\t * is cancelled until another `render` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetDraw\n \t * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n\t * (datasets are drawn in the reverse order). Note that this hook will not be called\n\t * if the datasets drawing has been previously cancelled.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Number} args.index - The dataset index.\n\t * @param {Object} args.meta - The dataset metadata.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n  \t * @method IPlugin#beforeTooltipDraw\n\t * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\n\t * the tooltip drawing is cancelled until another `render` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Object} args.tooltip - The tooltip.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart tooltip drawing.\n  \t */\n\t/**\n \t * @method IPlugin#afterTooltipDraw\n  \t * @desc Called after drawing the `tooltip`. Note that this hook will not\n \t * be called if the tooltip drawing has been previously cancelled.\n \t * @param {Chart} chart - The chart instance.\n \t * @param {Object} args - The call arguments.\n \t * @param {Object} args.tooltip - The tooltip.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n \t * @param {Object} options - The plugin options.\n \t */\n\t/**\n\t * @method IPlugin#beforeEvent\n \t * @desc Called before processing the specified `event`. If any plugin returns `false`,\n\t * the event will be discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterEvent\n\t * @desc Called after the `event` has been consumed. Note that this hook\n\t * will not be called if the `event` has been previously discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#resize\n\t * @desc Called after the chart as been resized.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#destroy\n\t * @desc Called after the chart as been destroyed.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\n\t/**\n\t * Provided for backward compatibility, use Chart.plugins instead\n\t * @namespace Chart.pluginService\n\t * @deprecated since version 2.1.5\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.pluginService = Chart.plugins;\n\n\t/**\n\t * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n\t * effect, instead simply create/register plugins via plain JavaScript objects.\n\t * @interface Chart.PluginBase\n\t * @deprecated since version 2.5.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.PluginBase = Element.extend({});\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],32:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\nvar Ticks = require(34);\n\ndefaults._set('scale', {\n\tdisplay: true,\n\tposition: 'left',\n\toffset: false,\n\n\t// grid line settings\n\tgridLines: {\n\t\tdisplay: true,\n\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\tlineWidth: 1,\n\t\tdrawBorder: true,\n\t\tdrawOnChartArea: true,\n\t\tdrawTicks: true,\n\t\ttickMarkLength: 10,\n\t\tzeroLineWidth: 1,\n\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\tzeroLineBorderDash: [],\n\t\tzeroLineBorderDashOffset: 0.0,\n\t\toffsetGridLines: false,\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0\n\t},\n\n\t// scale label\n\tscaleLabel: {\n\t\t// display property\n\t\tdisplay: false,\n\n\t\t// actual label\n\t\tlabelString: '',\n\n\t\t// line height\n\t\tlineHeight: 1.2,\n\n\t\t// top/bottom padding\n\t\tpadding: {\n\t\t\ttop: 4,\n\t\t\tbottom: 4\n\t\t}\n\t},\n\n\t// label settings\n\tticks: {\n\t\tbeginAtZero: false,\n\t\tminRotation: 0,\n\t\tmaxRotation: 50,\n\t\tmirror: false,\n\t\tpadding: 0,\n\t\treverse: false,\n\t\tdisplay: true,\n\t\tautoSkip: true,\n\t\tautoSkipPadding: 0,\n\t\tlabelOffset: 0,\n\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\tcallback: Ticks.formatters.values,\n\t\tminor: {},\n\t\tmajor: {}\n\t}\n});\n\nfunction labelsFromTicks(ticks) {\n\tvar labels = [];\n\tvar i, ilen;\n\n\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\tlabels.push(ticks[i].label);\n\t}\n\n\treturn labels;\n}\n\nfunction getLineValue(scale, index, offsetGridLines) {\n\tvar lineValue = scale.getPixelForTick(index);\n\n\tif (offsetGridLines) {\n\t\tif (index === 0) {\n\t\t\tlineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n\t\t} else {\n\t\t\tlineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n\t\t}\n\t}\n\treturn lineValue;\n}\n\nmodule.exports = function(Chart) {\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar globalDefaults = defaults.global;\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tfunction parseLineHeight(options) {\n\t\treturn helpers.options.toLineHeight(\n\t\t\thelpers.valueOrDefault(options.lineHeight, 1.2),\n\t\t\thelpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n\t}\n\n\tChart.Scale = Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Returns the scale tick objects ({label, major})\n\t\t * @since 2.7\n\t\t */\n\t\tgetTicks: function() {\n\t\t\treturn this._ticks;\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tmergeTicksOptions: function() {\n\t\t\tvar ticks = this.options.ticks;\n\t\t\tif (ticks.minor === false) {\n\t\t\t\tticks.minor = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (ticks.major === false) {\n\t\t\t\tticks.major = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tfor (var key in ticks) {\n\t\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\t\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t\t// around for long time and not marked as private, we can't change its structure\n\t\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t\t// use scale.getTicks() instead.\n\n\t\t\tme.beforeBuildTicks();\n\n\t\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\t\tticks = me.buildTicks() || [];\n\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\n\t\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t\t// this method and supposed to contain only string values).\n\t\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\tme.ticks = labels;   // BACKWARD COMPATIBILITY\n\n\t\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\t\tlabel = labels[i];\n\t\t\t\ttick = ticks[i];\n\t\t\t\tif (!tick) {\n\t\t\t\t\tticks.push(tick = {\n\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\tmajor: false\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttick.label = label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme._ticks = ticks;\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tvar scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n\t\t\t\tvar deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += deltaHeight;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += deltaHeight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * (tallestLabelHeightInLines - 1))\n\t\t\t\t\t\t+ lineSpace; // padding\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t\t}\n\n\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (helpers.isNullOrUndef(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof rawValue === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (rawValue) {\n\t\t\t\tif (this.isHorizontal()) {\n\t\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t\t}\n\t\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t/**\n\t\t * Used to get the value to display in the tooltip for the data at the given index\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param value\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t/**\n\t\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param pixel\n\t\t */\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the tick at the given index\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (offset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me._ticks.length - 1)));\n\t\t},\n\n\t\t/**\n\t\t * Utility for getting the pixel location of a percentage of scale\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForDecimal: function(decimal) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\t/**\n\t\t * Returns the pixel for the minimum chart value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.beginAtZero ? 0 :\n\t\t\t\tmin < 0 && max < 0 ? max :\n\t\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t\t0;\n\t\t},\n\n\t\t/**\n\t\t * Returns a subset of ticks to be plotted to avoid overlapping labels.\n\t\t * @private\n\t\t */\n\t\t_autoSkip: function(ticks) {\n\t\t\tvar skipRatio;\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar optionTicks = me.options.ticks.minor;\n\t\t\tvar tickCount = ticks.length;\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\t\t\tvar result = [];\n\t\t\tvar i, tick, shouldSkip;\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && tickCount > maxTicks) {\n\t\t\t\t\tskipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\t\ttick = ticks[i];\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tshouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n\t\t\t\tif (shouldSkip && i !== tickCount - 1) {\n\t\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\t\tdelete tick.label;\n\t\t\t\t}\n\t\t\t\tresult.push(tick);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = defaults.global;\n\t\t\tvar optionTicks = options.ticks.minor;\n\t\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\t\tvar tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\t\t\tvar majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar majorTickFont = parseFontOptions(optionMajorTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\tvar scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n\t\t\thelpers.each(ticks, function(tick, index) {\n\t\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\t\tif (helpers.isNullOrUndef(tick.label)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar label = tick.label;\n\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\tborderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\tborderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\t\t\t\tvar tickPadding = optionTicks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'top' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'bottom' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (xLineValue < me.left) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\txLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (yLineValue < me.top) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tmajor: tick.major,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n\t\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tfor (var i = 0, y = 0; i < label.length; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += (tickFont.size * 1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\t\t\t\tvar halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom'\n\t\t\t\t\t\t? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n\t\t\t\t\t\t: me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft\n\t\t\t\t\t\t? me.left + halfLineHeight + scaleLabelPadding.top\n\t\t\t\t\t\t: me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left;\n\t\t\t\tvar x2 = me.right;\n\t\t\t\tvar y1 = me.top;\n\t\t\t\tvar y2 = me.bottom;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{\"25\":25,\"26\":26,\"34\":34,\"45\":45}],33:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\n\nmodule.exports = function(Chart) {\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, scaleDefaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(scaleDefaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar me = this;\n\t\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\t\tme.defaults[type] = helpers.extend(me.defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chart) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chart.scales, function(scale) {\n\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\tscale.position = scale.options.position;\n\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\tChart.layoutService.addBox(chart, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"45\":45}],34:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nmodule.exports = {\n\t/**\n\t * Namespace to hold generators for different types of ticks\n\t * @namespace Chart.Ticks.generators\n\t */\n\tgenerators: {\n\t\t/**\n\t\t * Interface for the options provided to the numeric tick generator\n\t\t * @interface INumericTickGenerationOptions\n\t\t */\n\t\t/**\n\t\t * The maximum number of ticks to display\n\t\t * @name INumericTickGenerationOptions#maxTicks\n\t\t * @type Number\n\t\t */\n\t\t/**\n\t\t * The distance between each tick.\n\t\t * @name INumericTickGenerationOptions#stepSize\n\t\t * @type Number\n\t\t * @optional\n\t\t */\n\t\t/**\n\t\t * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n\t\t * @name INumericTickGenerationOptions#min\n\t\t * @type Number\n\t\t * @optional\n\t\t */\n\t\t/**\n\t\t * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n\t\t * @name INumericTickGenerationOptions#max\n\t\t * @type Number\n\t\t * @optional\n\t\t */\n\n\t\t/**\n\t\t * Generate a set of linear ticks\n\t\t * @method Chart.Ticks.generators.linear\n\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t * @param dataRange {IRange} the range of the data\n\t\t * @returns {Array<Number>} array of tick values\n\t\t */\n\t\tlinear: function(generationOptions, dataRange) {\n\t\t\tvar ticks = [];\n\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t// for details.\n\n\t\t\tvar spacing;\n\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t} else {\n\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\t\t\t}\n\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\tif (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t// If very close to our rounded value, use it.\n\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t} else {\n\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t}\n\n\t\t\t// Put the values into the ticks array\n\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\tticks.push(niceMin + (j * spacing));\n\t\t\t}\n\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\treturn ticks;\n\t\t},\n\n\t\t/**\n\t\t * Generate a set of logarithmic ticks\n\t\t * @method Chart.Ticks.generators.logarithmic\n\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t * @param dataRange {IRange} the range of the data\n\t\t * @returns {Array<Number>} array of tick values\n\t\t */\n\t\tlogarithmic: function(generationOptions, dataRange) {\n\t\t\tvar ticks = [];\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph\n\t\t\tvar tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\tvar exp, significand;\n\n\t\t\tif (tickVal === 0) {\n\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\tticks.push(tickVal);\n\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t} else {\n\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t++significand;\n\t\t\t\tif (significand === 10) {\n\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t++exp;\n\t\t\t\t}\n\n\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\t\t\tvar lastTick = valueOrDefault(generationOptions.max, tickVal);\n\t\t\tticks.push(lastTick);\n\n\t\t\treturn ticks;\n\t\t}\n\t},\n\n\t/**\n\t * Namespace to hold formatters for different types of ticks\n\t * @namespace Chart.Ticks.formatters\n\t */\n\tformatters: {\n\t\t/**\n\t\t * Formatter for value labels\n\t\t * @method Chart.Ticks.formatters.values\n\t\t * @param value the value to display\n\t\t * @return {String|Array} the label to display\n\t\t */\n\t\tvalues: function(value) {\n\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t},\n\n\t\t/**\n\t\t * Formatter for linear numeric ticks\n\t\t * @method Chart.Ticks.formatters.linear\n\t\t * @param tickValue {Number} the value to be formatted\n\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t * @param ticks {Array<Number>} the list of ticks being converted\n\t\t * @return {String} string representation of the tickValue parameter\n\t\t */\n\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t// not an integer\n\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\tvar tickString = '';\n\n\t\t\tif (tickValue !== 0) {\n\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t} else {\n\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t}\n\n\t\t\treturn tickString;\n\t\t},\n\n\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\tif (tickValue === 0) {\n\t\t\t\treturn '0';\n\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\treturn tickValue.toExponential();\n\t\t\t}\n\t\t\treturn '';\n\t\t}\n\t}\n};\n\n},{\"45\":45}],35:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\ttooltips: {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretPadding: 2,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tborderColor: 'rgba(0,0,0,0)',\n\t\tborderWidth: 0,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\tif (label) {\n\t\t\t\t\tlabel += ': ';\n\t\t\t\t}\n\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\treturn label;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chart) {\n\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tlabelTextColor: function() {\n\t\t\t\treturn this._options.bodyFontColor;\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index;\n\t\tvar datasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = defaults.global;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize;\n\t\tvar bodyFontSize = model.bodyFontSize;\n\t\tvar footerFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chart.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n\t */\n\tfunction getBackgroundPoint(vm, size, alignment) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize;\n\t\tvar caretPadding = vm.caretPadding;\n\t\tvar cornerRadius = vm.cornerRadius;\n\t\tvar xAlign = alignment.xAlign;\n\t\tvar yAlign = alignment.yAlign;\n\t\tvar paddingAndSize = caretSize + caretPadding;\n\t\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t\tthis._lastActive = [];\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\t\tvar title = callbacks.title.apply(me, arguments);\n\t\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\tvar labelTextColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t\t});\n\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\tmodel.labelColors = labelColors;\n\t\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size) {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t},\n\t\tgetCaretPosition: function(tooltipPoint, size, vm) {\n\t\t\tvar x1, x2, x3, y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x;\n\t\t\tvar ptY = tooltipPoint.y;\n\t\t\tvar width = size.width;\n\t\t\tvar height = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\ty2 = ptY + (height / 2);\n\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = ptX + (width / 2);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t\t// invert drawing order\n\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t\tx1 = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\tctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\tvar textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar x = pt.x;\n\t\t\tvar y = pt.y;\n\t\t\tvar width = tooltipSize.width;\n\t\t\tvar height = tooltipSize.height;\n\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x + radius, y);\n\t\t\tif (yAlign === 'top') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\tif (yAlign === 'bottom') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x, y + radius);\n\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\tctx.closePath();\n\n\t\t\tctx.fill();\n\n\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t// If tooltip didn't change, do not handle the target event\n\t\t\tif (!changed) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tme._lastActive = me._active;\n\n\t\t\tif (options.enabled || options.custom) {\n\t\t\t\tme._eventPosition = {\n\t\t\t\t\tx: e.x,\n\t\t\t\t\ty: e.y\n\t\t\t\t};\n\n\t\t\t\tvar model = me._model;\n\t\t\t\tme.update(true);\n\t\t\t\tme.pivot();\n\n\t\t\t\t// See if our tooltip position changed\n\t\t\t\tchanged |= (model.x !== me._model.x) || (model.y !== me._model.y);\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len, nearestElement;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\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\t};\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],36:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\telements: {\n\t\tarc: {\n\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\tborderColor: '#fff',\n\t\t\tborderWidth: 2\n\t\t}\n\t}\n});\n\nmodule.exports = Element.extend({\n\tinLabelRange: function(mouseX) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t}\n\t\treturn false;\n\t},\n\n\tinRange: function(chartX, chartY) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY});\n\t\t\tvar\tangle = pointRelativePosition.angle;\n\t\t\tvar distance = pointRelativePosition.distance;\n\n\t\t\t// Sanitise angle range\n\t\t\tvar startAngle = vm.startAngle;\n\t\t\tvar endAngle = vm.endAngle;\n\t\t\twhile (endAngle < startAngle) {\n\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t}\n\t\t\twhile (angle > endAngle) {\n\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t}\n\t\t\twhile (angle < startAngle) {\n\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t}\n\n\t\t\t// Check if within the range of the open/close angle\n\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle);\n\t\t\tvar withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\treturn (betweenAngles && withinRadius);\n\t\t}\n\t\treturn false;\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\treturn {\n\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n\t\treturn {\n\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t};\n\t},\n\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar sA = vm.startAngle;\n\t\tvar eA = vm.endAngle;\n\n\t\tctx.beginPath();\n\n\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\tctx.closePath();\n\t\tctx.strokeStyle = vm.borderColor;\n\t\tctx.lineWidth = vm.borderWidth;\n\n\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\tctx.fill();\n\t\tctx.lineJoin = 'bevel';\n\n\t\tif (vm.borderWidth) {\n\t\t\tctx.stroke();\n\t\t}\n\t}\n});\n\n},{\"25\":25,\"26\":26,\"45\":45}],37:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\nvar globalDefaults = defaults.global;\n\ndefaults._set('global', {\n\telements: {\n\t\tline: {\n\t\t\ttension: 0.4,\n\t\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\t\tborderWidth: 3,\n\t\t\tborderColor: globalDefaults.defaultColor,\n\t\t\tborderCapStyle: 'butt',\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0,\n\t\t\tborderJoinStyle: 'miter',\n\t\t\tcapBezierPoints: true,\n\t\t\tfill: true, // do we fill in the area between the line and its base axis\n\t\t}\n\t}\n});\n\nmodule.exports = Element.extend({\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar vm = me._view;\n\t\tvar ctx = me._chart.ctx;\n\t\tvar spanGaps = vm.spanGaps;\n\t\tvar points = me._children.slice(); // clone array\n\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\tvar lastDrawnIndex = -1;\n\t\tvar index, current, previous, currentVM;\n\n\t\t// If we are looping, adding the first point again\n\t\tif (me._loop && points.length) {\n\t\t\tpoints.push(points[0]);\n\t\t}\n\n\t\tctx.save();\n\n\t\t// Stroke Line Options\n\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t// IE 9 and 10 do not support line dash\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t}\n\n\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t// Stroke Line\n\t\tctx.beginPath();\n\t\tlastDrawnIndex = -1;\n\n\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\tcurrent = points[index];\n\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\tcurrentVM = current._view;\n\n\t\t\t// First point moves to it's starting position no matter what\n\t\t\tif (index === 0) {\n\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\thelpers.canvas.lineTo(ctx, previous._view, current._view);\n\t\t\t\t\t}\n\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\t\tctx.restore();\n\t}\n});\n\n},{\"25\":25,\"26\":26,\"45\":45}],38:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\nvar defaultColor = defaults.global.defaultColor;\n\ndefaults._set('global', {\n\telements: {\n\t\tpoint: {\n\t\t\tradius: 3,\n\t\t\tpointStyle: 'circle',\n\t\t\tbackgroundColor: defaultColor,\n\t\t\tborderColor: defaultColor,\n\t\t\tborderWidth: 1,\n\t\t\t// Hover\n\t\t\thitRadius: 1,\n\t\t\thoverRadius: 4,\n\t\t\thoverBorderWidth: 1\n\t\t}\n\t}\n});\n\nfunction xRange(mouseX) {\n\tvar vm = this._view;\n\treturn vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n}\n\nfunction yRange(mouseY) {\n\tvar vm = this._view;\n\treturn vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n}\n\nmodule.exports = Element.extend({\n\tinRange: function(mouseX, mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t},\n\n\tinLabelRange: xRange,\n\tinXRange: xRange,\n\tinYRange: yRange,\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y,\n\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t};\n\t},\n\n\tdraw: function(chartArea) {\n\t\tvar vm = this._view;\n\t\tvar model = this._model;\n\t\tvar ctx = this._chart.ctx;\n\t\tvar pointStyle = vm.pointStyle;\n\t\tvar radius = vm.radius;\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\t\tvar color = helpers.color;\n\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\t\tvar ratio = 0;\n\n\t\tif (vm.skip) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\tctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\n\t\t// Cliping for Points.\n\t\t// going out from inner charArea?\n\t\tif ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) {\n\t\t\t// Point fade out\n\t\t\tif (model.x < chartArea.left) {\n\t\t\t\tratio = (x - model.x) / (chartArea.left - model.x);\n\t\t\t} else if (chartArea.right * errMargin < model.x) {\n\t\t\t\tratio = (model.x - x) / (model.x - chartArea.right);\n\t\t\t} else if (model.y < chartArea.top) {\n\t\t\t\tratio = (y - model.y) / (chartArea.top - model.y);\n\t\t\t} else if (chartArea.bottom * errMargin < model.y) {\n\t\t\t\tratio = (model.y - y) / (model.y - chartArea.bottom);\n\t\t\t}\n\t\t\tratio = Math.round(ratio * 100) / 100;\n\t\t\tctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n\t\t\tctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n\t\t}\n\n\t\thelpers.canvas.drawPoint(ctx, pointStyle, radius, x, y);\n\t}\n});\n\n},{\"25\":25,\"26\":26,\"45\":45}],39:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\n\ndefaults._set('global', {\n\telements: {\n\t\trectangle: {\n\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\tborderColor: defaults.global.defaultColor,\n\t\t\tborderSkipped: 'bottom',\n\t\t\tborderWidth: 0\n\t\t}\n\t}\n});\n\nfunction isVertical(bar) {\n\treturn bar._view.width !== undefined;\n}\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar) {\n\tvar vm = bar._view;\n\tvar x1, x2, y1, y2;\n\n\tif (isVertical(bar)) {\n\t\t// vertical\n\t\tvar halfWidth = vm.width / 2;\n\t\tx1 = vm.x - halfWidth;\n\t\tx2 = vm.x + halfWidth;\n\t\ty1 = Math.min(vm.y, vm.base);\n\t\ty2 = Math.max(vm.y, vm.base);\n\t} else {\n\t\t// horizontal bar\n\t\tvar halfHeight = vm.height / 2;\n\t\tx1 = Math.min(vm.x, vm.base);\n\t\tx2 = Math.max(vm.x, vm.base);\n\t\ty1 = vm.y - halfHeight;\n\t\ty2 = vm.y + halfHeight;\n\t}\n\n\treturn {\n\t\tleft: x1,\n\t\ttop: y1,\n\t\tright: x2,\n\t\tbottom: y2\n\t};\n}\n\nmodule.exports = Element.extend({\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\tvar borderWidth = vm.borderWidth;\n\n\t\tif (!vm.horizontal) {\n\t\t\t// bar\n\t\t\tleft = vm.x - vm.width / 2;\n\t\t\tright = vm.x + vm.width / 2;\n\t\t\ttop = vm.y;\n\t\t\tbottom = vm.base;\n\t\t\tsignX = 1;\n\t\t\tsignY = bottom > top ? 1 : -1;\n\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t} else {\n\t\t\t// horizontal bar\n\t\t\tleft = vm.base;\n\t\t\tright = vm.x;\n\t\t\ttop = vm.y - vm.height / 2;\n\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\tsignX = right > left ? 1 : -1;\n\t\t\tsignY = 1;\n\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t}\n\n\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\tif (borderWidth) {\n\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\tborderWidth = borderWidth > barSize ? barSize : borderWidth;\n\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\tvar borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n\t\t\tvar borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n\t\t\tvar borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n\t\t\t// not become a vertical line?\n\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\ttop = borderTop;\n\t\t\t\tbottom = borderBottom;\n\t\t\t}\n\t\t\t// not become a horizontal line?\n\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\tleft = borderLeft;\n\t\t\t\tright = borderRight;\n\t\t\t}\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.strokeStyle = vm.borderColor;\n\t\tctx.lineWidth = borderWidth;\n\n\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t// | 1 2 |\n\t\t// | 0 3 |\n\t\tvar corners = [\n\t\t\t[left, bottom],\n\t\t\t[left, top],\n\t\t\t[right, top],\n\t\t\t[right, bottom]\n\t\t];\n\n\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\tif (startCorner === -1) {\n\t\t\tstartCorner = 0;\n\t\t}\n\n\t\tfunction cornerAt(index) {\n\t\t\treturn corners[(startCorner + index) % 4];\n\t\t}\n\n\t\t// Draw rectangle from 'startCorner'\n\t\tvar corner = cornerAt(0);\n\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\tfor (var i = 1; i < 4; i++) {\n\t\t\tcorner = cornerAt(i);\n\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t}\n\n\t\tctx.fill();\n\t\tif (borderWidth) {\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\theight: function() {\n\t\tvar vm = this._view;\n\t\treturn vm.base - vm.y;\n\t},\n\n\tinRange: function(mouseX, mouseY) {\n\t\tvar inRange = false;\n\n\t\tif (this._view) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t}\n\n\t\treturn inRange;\n\t},\n\n\tinLabelRange: function(mouseX, mouseY) {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar inRange = false;\n\t\tvar bounds = getBarBounds(me);\n\n\t\tif (isVertical(me)) {\n\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t} else {\n\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t}\n\n\t\treturn inRange;\n\t},\n\n\tinXRange: function(mouseX) {\n\t\tvar bounds = getBarBounds(this);\n\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t},\n\n\tinYRange: function(mouseY) {\n\t\tvar bounds = getBarBounds(this);\n\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar x, y;\n\t\tif (isVertical(this)) {\n\t\t\tx = vm.x;\n\t\t\ty = (vm.y + vm.base) / 2;\n\t\t} else {\n\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\ty = vm.y;\n\t\t}\n\n\t\treturn {x: x, y: y};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t}\n});\n\n},{\"25\":25,\"26\":26}],40:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {};\nmodule.exports.Arc = require(36);\nmodule.exports.Line = require(37);\nmodule.exports.Point = require(38);\nmodule.exports.Rectangle = require(39);\n\n},{\"36\":36,\"37\":37,\"38\":38,\"39\":39}],41:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(42);\n\n/**\n * @namespace Chart.helpers.canvas\n */\nvar exports = module.exports = {\n\t/**\n\t * Clears the entire canvas associated to the given `chart`.\n\t * @param {Chart} chart - The chart for which to clear the canvas.\n\t */\n\tclear: function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t},\n\n\t/**\n\t * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n\t * given size (width, height) and the same `radius` for all corners.\n\t * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n\t * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {Number} width - The rectangle's width.\n\t * @param {Number} height - The rectangle's height.\n\t * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n\t * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n\t */\n\troundedRect: function(ctx, x, y, width, height, radius) {\n\t\tif (radius) {\n\t\t\tvar rx = Math.min(radius, width / 2);\n\t\t\tvar ry = Math.min(radius, height / 2);\n\n\t\t\tctx.moveTo(x + rx, y);\n\t\t\tctx.lineTo(x + width - rx, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry);\n\t\t\tctx.lineTo(x + width, y + height - ry);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);\n\t\t\tctx.lineTo(x + rx, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry);\n\t\t\tctx.lineTo(x, y + ry);\n\t\t\tctx.quadraticCurveTo(x, y, x + rx, y);\n\t\t} else {\n\t\t\tctx.rect(x, y, width, height);\n\t\t}\n\t},\n\n\tdrawPoint: function(ctx, style, radius, x, y) {\n\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\n\t\tif (style && typeof style === 'object') {\n\t\t\ttype = style.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (style) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(x, y, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.beginPath();\n\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\tctx.moveTo(x - edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x + edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x, y - 2 * height / 3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\tvar leftX = x - offset;\n\t\t\tvar topY = y - offset;\n\t\t\tvar sideSize = Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tthis.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rectRot':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - size, y);\n\t\t\tctx.lineTo(x, y + size);\n\t\t\tctx.lineTo(x + size, y);\n\t\t\tctx.lineTo(x, y - size);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'cross':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\tctx.beginPath();\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.stroke();\n\t},\n\n\tclipArea: function(ctx, area) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n\t\tctx.clip();\n\t},\n\n\tunclipArea: function(ctx) {\n\t\tctx.restore();\n\t},\n\n\tlineTo: function(ctx, previous, target, flip) {\n\t\tif (target.steppedLine) {\n\t\t\tif ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) {\n\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t} else {\n\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t}\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target.tension) {\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.bezierCurveTo(\n\t\t\tflip ? previous.controlPointPreviousX : previous.controlPointNextX,\n\t\t\tflip ? previous.controlPointPreviousY : previous.controlPointNextY,\n\t\t\tflip ? target.controlPointNextX : target.controlPointPreviousX,\n\t\t\tflip ? target.controlPointNextY : target.controlPointPreviousY,\n\t\t\ttarget.x,\n\t\t\ttarget.y);\n\t}\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.clear = exports.clear;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.drawRoundedRectangle = function(ctx) {\n\tctx.beginPath();\n\texports.roundedRect.apply(exports, arguments);\n\tctx.closePath();\n};\n\n},{\"42\":42}],42:[function(require,module,exports){\n'use strict';\n\n/**\n * @namespace Chart.helpers\n */\nvar helpers = {\n\t/**\n\t * An empty function that can be used, for example, for optional callback.\n\t */\n\tnoop: function() {},\n\n\t/**\n\t * Returns a unique id, sequentially generated from a global variable.\n\t * @returns {Number}\n\t * @function\n\t */\n\tuid: (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}()),\n\n\t/**\n\t * Returns true if `value` is neither null nor undefined, else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {Boolean}\n\t * @since 2.7.0\n\t */\n\tisNullOrUndef: function(value) {\n\t\treturn value === null || typeof value === 'undefined';\n\t},\n\n\t/**\n\t * Returns true if `value` is an array, else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {Boolean}\n\t * @function\n\t */\n\tisArray: Array.isArray ? Array.isArray : function(value) {\n\t\treturn Object.prototype.toString.call(value) === '[object Array]';\n\t},\n\n\t/**\n\t * Returns true if `value` is an object (excluding null), else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {Boolean}\n\t * @since 2.7.0\n\t */\n\tisObject: function(value) {\n\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\n\t},\n\n\t/**\n\t * Returns `value` if defined, else returns `defaultValue`.\n\t * @param {*} value - The value to return if defined.\n\t * @param {*} defaultValue - The value to return if `value` is undefined.\n\t * @returns {*}\n\t */\n\tvalueOrDefault: function(value, defaultValue) {\n\t\treturn typeof value === 'undefined' ? defaultValue : value;\n\t},\n\n\t/**\n\t * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n\t * @param {Array} value - The array to lookup for value at `index`.\n\t * @param {Number} index - The index in `value` to lookup for value.\n\t * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n\t * @returns {*}\n\t */\n\tvalueAtIndexOrDefault: function(value, index, defaultValue) {\n\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n\t},\n\n\t/**\n\t * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n\t * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n\t * @param {Function} fn - The function to call.\n\t * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n\t * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @returns {*}\n\t */\n\tcallback: function(fn, args, thisArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\treturn fn.apply(thisArg, args);\n\t\t}\n\t},\n\n\t/**\n\t * Note(SB) for performance sake, this method should only be used when loopable type\n\t * is unknown or in none intensive code (not called often and small loopable). Else\n\t * it's preferable to use a regular for() loop and save extra function calls.\n\t * @param {Object|Array} loopable - The object or array to be iterated.\n\t * @param {Function} fn - The function to call for each item.\n\t * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n\t */\n\teach: function(loopable, fn, thisArg, reverse) {\n\t\tvar i, len, keys;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (helpers.isObject(loopable)) {\n\t\t\tkeys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n\t * @see http://stackoverflow.com/a/14853974\n\t * @param {Array} a0 - The array to compare\n\t * @param {Array} a1 - The array to compare\n\t * @returns {Boolean}\n\t */\n\tarrayEquals: function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns a deep copy of `source` without keeping references on objects and arrays.\n\t * @param {*} source - The value to clone.\n\t * @returns {*}\n\t */\n\tclone: function(source) {\n\t\tif (helpers.isArray(source)) {\n\t\t\treturn source.map(helpers.clone);\n\t\t}\n\n\t\tif (helpers.isObject(source)) {\n\t\t\tvar target = {};\n\t\t\tvar keys = Object.keys(source);\n\t\t\tvar klen = keys.length;\n\t\t\tvar k = 0;\n\n\t\t\tfor (; k < klen; ++k) {\n\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\treturn source;\n\t},\n\n\t/**\n\t * The default merger when Chart.helpers.merge is called without merger option.\n\t * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n\t * @private\n\t */\n\t_merger: function(key, target, source, options) {\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.merge(tval, sval, options);\n\t\t} else {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Merges source[key] in target[key] only if target[key] is undefined.\n\t * @private\n\t */\n\t_mergerIf: function(key, target, source) {\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.mergeIf(tval, sval);\n\t\t} else if (!target.hasOwnProperty(key)) {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` with the given `options`.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {Object} target - The target object in which all sources are merged into.\n\t * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n\t * @param {Object} [options] - Merging options:\n\t * @param {Function} [options.merger] - The merge method (key, target, source, options)\n\t * @returns {Object} The `target` object.\n\t */\n\tmerge: function(target, source, options) {\n\t\tvar sources = helpers.isArray(source) ? source : [source];\n\t\tvar ilen = sources.length;\n\t\tvar merge, i, keys, klen, k;\n\n\t\tif (!helpers.isObject(target)) {\n\t\t\treturn target;\n\t\t}\n\n\t\toptions = options || {};\n\t\tmerge = options.merger || helpers._merger;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tsource = sources[i];\n\t\t\tif (!helpers.isObject(source)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tkeys = Object.keys(source);\n\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\n\t\t\t\tmerge(keys[k], target, source, options);\n\t\t\t}\n\t\t}\n\n\t\treturn target;\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {Object} target - The target object in which all sources are merged into.\n\t * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n\t * @returns {Object} The `target` object.\n\t */\n\tmergeIf: function(target, source) {\n\t\treturn helpers.merge(target, source, {merger: helpers._mergerIf});\n\t},\n\n\t/**\n\t * Applies the contents of two or more objects together into the first object.\n\t * @param {Object} target - The target object in which all objects are merged into.\n\t * @param {Object} arg1 - Object containing additional properties to merge in target.\n\t * @param {Object} argN - Additional objects containing properties to merge in target.\n\t * @returns {Object} The `target` object.\n\t */\n\textend: function(target) {\n\t\tvar setFn = function(value, key) {\n\t\t\ttarget[key] = value;\n\t\t};\n\t\tfor (var i = 1, ilen = arguments.length; i < ilen; ++i) {\n\t\t\thelpers.each(arguments[i], setFn);\n\t\t}\n\t\treturn target;\n\t},\n\n\t/**\n\t * Basic javascript inheritance based on the model created in Backbone.js\n\t */\n\tinherits: function(extensions) {\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\t\treturn ChartElement;\n\t}\n};\n\nmodule.exports = helpers;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nhelpers.callCallback = helpers.callback;\n\n/**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.indexOf = function(array, item, fromIndex) {\n\treturn Array.prototype.indexOf.call(array, item, fromIndex);\n};\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueOrDefault = helpers.valueOrDefault;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n},{}],43:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(42);\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\nvar effects = {\n\tlinear: function(t) {\n\t\treturn t;\n\t},\n\n\teaseInQuad: function(t) {\n\t\treturn t * t;\n\t},\n\n\teaseOutQuad: function(t) {\n\t\treturn -t * (t - 2);\n\t},\n\n\teaseInOutQuad: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t;\n\t\t}\n\t\treturn -0.5 * ((--t) * (t - 2) - 1);\n\t},\n\n\teaseInCubic: function(t) {\n\t\treturn t * t * t;\n\t},\n\n\teaseOutCubic: function(t) {\n\t\treturn (t = t - 1) * t * t + 1;\n\t},\n\n\teaseInOutCubic: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t + 2);\n\t},\n\n\teaseInQuart: function(t) {\n\t\treturn t * t * t * t;\n\t},\n\n\teaseOutQuart: function(t) {\n\t\treturn -((t = t - 1) * t * t * t - 1);\n\t},\n\n\teaseInOutQuart: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t;\n\t\t}\n\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\n\t},\n\n\teaseInQuint: function(t) {\n\t\treturn t * t * t * t * t;\n\t},\n\n\teaseOutQuint: function(t) {\n\t\treturn (t = t - 1) * t * t * t * t + 1;\n\t},\n\n\teaseInOutQuint: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\n\t},\n\n\teaseInSine: function(t) {\n\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\n\t},\n\n\teaseOutSine: function(t) {\n\t\treturn Math.sin(t * (Math.PI / 2));\n\t},\n\n\teaseInOutSine: function(t) {\n\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\n\t},\n\n\teaseInExpo: function(t) {\n\t\treturn (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n\t},\n\n\teaseOutExpo: function(t) {\n\t\treturn (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n\t},\n\n\teaseInOutExpo: function(t) {\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\n\t\t}\n\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\n\t},\n\n\teaseInCirc: function(t) {\n\t\tif (t >= 1) {\n\t\t\treturn t;\n\t\t}\n\t\treturn -(Math.sqrt(1 - t * t) - 1);\n\t},\n\n\teaseOutCirc: function(t) {\n\t\treturn Math.sqrt(1 - (t = t - 1) * t);\n\t},\n\n\teaseInOutCirc: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\n\t\t}\n\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t},\n\n\teaseInElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t},\n\n\teaseOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n\t},\n\n\teaseInOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif ((t /= 0.5) === 2) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.45;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\tif (t < 1) {\n\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t}\n\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t},\n\teaseInBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn t * t * ((s + 1) * t - s);\n\t},\n\n\teaseOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\n\t},\n\n\teaseInOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t},\n\n\teaseInBounce: function(t) {\n\t\treturn 1 - effects.easeOutBounce(1 - t);\n\t},\n\n\teaseOutBounce: function(t) {\n\t\tif (t < (1 / 2.75)) {\n\t\t\treturn 7.5625 * t * t;\n\t\t}\n\t\tif (t < (2 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n\t\t}\n\t\tif (t < (2.5 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n\t\t}\n\t\treturn 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n\t},\n\n\teaseInOutBounce: function(t) {\n\t\tif (t < 0.5) {\n\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\n\t\t}\n\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n\t}\n};\n\nmodule.exports = {\n\teffects: effects\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.easingEffects = effects;\n\n},{\"42\":42}],44:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(42);\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\nmodule.exports = {\n\t/**\n\t * Converts the given line height `value` in pixels for a specific font `size`.\n\t * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n\t * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n\t * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n\t * @since 2.7.0\n\t */\n\ttoLineHeight: function(value, size) {\n\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\t\tif (!matches || matches[1] === 'normal') {\n\t\t\treturn size * 1.2;\n\t\t}\n\n\t\tvalue = +matches[2];\n\n\t\tswitch (matches[3]) {\n\t\tcase 'px':\n\t\t\treturn value;\n\t\tcase '%':\n\t\t\tvalue /= 100;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn size * value;\n\t},\n\n\t/**\n\t * Converts the given value into a padding object with pre-computed width/height.\n\t * @param {Number|Object} value - If a number, set the value to all TRBL component,\n\t *  else, if and object, use defined properties and sets undefined ones to 0.\n\t * @returns {Object} The padding values (top, right, bottom, left, width, height)\n\t * @since 2.7.0\n\t */\n\ttoPadding: function(value) {\n\t\tvar t, r, b, l;\n\n\t\tif (helpers.isObject(value)) {\n\t\t\tt = +value.top || 0;\n\t\t\tr = +value.right || 0;\n\t\t\tb = +value.bottom || 0;\n\t\t\tl = +value.left || 0;\n\t\t} else {\n\t\t\tt = r = b = l = +value || 0;\n\t\t}\n\n\t\treturn {\n\t\t\ttop: t,\n\t\t\tright: r,\n\t\t\tbottom: b,\n\t\t\tleft: l,\n\t\t\theight: t + b,\n\t\t\twidth: l + r\n\t\t};\n\t},\n\n\t/**\n\t * Evaluates the given `inputs` sequentially and returns the first defined value.\n\t * @param {Array[]} inputs - An array of values, falling back to the last value.\n\t * @param {Object} [context] - If defined and the current value is a function, the value\n\t * is called with `context` as first argument and the result becomes the new input.\n\t * @param {Number} [index] - If defined and the current value is an array, the value\n\t * at `index` become the new input.\n\t * @since 2.7.0\n\t */\n\tresolve: function(inputs, context, index) {\n\t\tvar i, ilen, value;\n\n\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\n\t\t\tvalue = inputs[i];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (context !== undefined && typeof value === 'function') {\n\t\t\t\tvalue = value(context);\n\t\t\t}\n\t\t\tif (index !== undefined && helpers.isArray(value)) {\n\t\t\t\tvalue = value[index];\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n};\n\n},{\"42\":42}],45:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require(42);\nmodule.exports.easing = require(43);\nmodule.exports.canvas = require(41);\nmodule.exports.options = require(44);\n\n},{\"41\":41,\"42\":42,\"43\":43,\"44\":44}],46:[function(require,module,exports){\n/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nmodule.exports = {\n\tacquireContext: function(item) {\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\treturn item && item.getContext('2d') || null;\n\t}\n};\n\n},{}],47:[function(require,module,exports){\n/**\n * Chart.Platform implementation for targeting a web browser\n */\n\n'use strict';\n\nvar helpers = require(45);\n\nvar EXPANDO_KEY = '$chartjs';\nvar CSS_PREFIX = 'chartjs-';\nvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\nvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\nvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nvar EVENT_TYPES = {\n\ttouchstart: 'mousedown',\n\ttouchmove: 'mousemove',\n\ttouchend: 'mouseup',\n\tpointerenter: 'mouseenter',\n\tpointerdown: 'mousedown',\n\tpointermove: 'mousemove',\n\tpointerup: 'mouseup',\n\tpointerleave: 'mouseout',\n\tpointerout: 'mouseout'\n};\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {Number} Size in pixels or undefined if unknown.\n */\nfunction readUsedSize(element, property) {\n\tvar value = helpers.getStyle(element, property);\n\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\treturn matches ? Number(matches[1]) : undefined;\n}\n\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\nfunction initCanvas(canvas, config) {\n\tvar style = canvas.style;\n\n\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\tvar renderHeight = canvas.getAttribute('height');\n\tvar renderWidth = canvas.getAttribute('width');\n\n\t// Chart.js modifies some canvas values that we want to restore on destroy\n\tcanvas[EXPANDO_KEY] = {\n\t\tinitial: {\n\t\t\theight: renderHeight,\n\t\t\twidth: renderWidth,\n\t\t\tstyle: {\n\t\t\t\tdisplay: style.display,\n\t\t\t\theight: style.height,\n\t\t\t\twidth: style.width\n\t\t\t}\n\t\t}\n\t};\n\n\t// Force canvas to display as block to avoid extra space caused by inline\n\t// elements, which would interfere with the responsive resize process.\n\t// https://github.com/chartjs/Chart.js/issues/2538\n\tstyle.display = style.display || 'block';\n\n\tif (renderWidth === null || renderWidth === '') {\n\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\tif (displayWidth !== undefined) {\n\t\t\tcanvas.width = displayWidth;\n\t\t}\n\t}\n\n\tif (renderHeight === null || renderHeight === '') {\n\t\tif (canvas.style.height === '') {\n\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t} else {\n\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.height = displayHeight;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canvas;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nvar supportsEventListenerOptions = (function() {\n\tvar supports = false;\n\ttry {\n\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\tget: function() {\n\t\t\t\tsupports = true;\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('e', null, options);\n\t} catch (e) {\n\t\t// continue regardless of error\n\t}\n\treturn supports;\n}());\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nvar eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addEventListener(node, type, listener) {\n\tnode.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeEventListener(node, type, listener) {\n\tnode.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction createEvent(type, chart, x, y, nativeEvent) {\n\treturn {\n\t\ttype: type,\n\t\tchart: chart,\n\t\tnative: nativeEvent || null,\n\t\tx: x !== undefined ? x : null,\n\t\ty: y !== undefined ? y : null,\n\t};\n}\n\nfunction fromNativeEvent(event, chart) {\n\tvar type = EVENT_TYPES[event.type] || event.type;\n\tvar pos = helpers.getRelativePosition(event, chart);\n\treturn createEvent(type, chart, pos.x, pos.y, event);\n}\n\nfunction throttled(fn, thisArg) {\n\tvar ticking = false;\n\tvar args = [];\n\n\treturn function() {\n\t\targs = Array.prototype.slice.call(arguments);\n\t\tthisArg = thisArg || this;\n\n\t\tif (!ticking) {\n\t\t\tticking = true;\n\t\t\thelpers.requestAnimFrame.call(window, function() {\n\t\t\t\tticking = false;\n\t\t\t\tfn.apply(thisArg, args);\n\t\t\t});\n\t\t}\n\t};\n}\n\n// Implementation based on https://github.com/marcj/css-element-queries\nfunction createResizer(handler) {\n\tvar resizer = document.createElement('div');\n\tvar cls = CSS_PREFIX + 'size-monitor';\n\tvar maxSize = 1000000;\n\tvar style =\n\t\t'position:absolute;' +\n\t\t'left:0;' +\n\t\t'top:0;' +\n\t\t'right:0;' +\n\t\t'bottom:0;' +\n\t\t'overflow:hidden;' +\n\t\t'pointer-events:none;' +\n\t\t'visibility:hidden;' +\n\t\t'z-index:-1;';\n\n\tresizer.style.cssText = style;\n\tresizer.className = cls;\n\tresizer.innerHTML =\n\t\t'<div class=\"' + cls + '-expand\" style=\"' + style + '\">' +\n\t\t\t'<div style=\"' +\n\t\t\t\t'position:absolute;' +\n\t\t\t\t'width:' + maxSize + 'px;' +\n\t\t\t\t'height:' + maxSize + 'px;' +\n\t\t\t\t'left:0;' +\n\t\t\t\t'top:0\">' +\n\t\t\t'</div>' +\n\t\t'</div>' +\n\t\t'<div class=\"' + cls + '-shrink\" style=\"' + style + '\">' +\n\t\t\t'<div style=\"' +\n\t\t\t\t'position:absolute;' +\n\t\t\t\t'width:200%;' +\n\t\t\t\t'height:200%;' +\n\t\t\t\t'left:0; ' +\n\t\t\t\t'top:0\">' +\n\t\t\t'</div>' +\n\t\t'</div>';\n\n\tvar expand = resizer.childNodes[0];\n\tvar shrink = resizer.childNodes[1];\n\n\tresizer._reset = function() {\n\t\texpand.scrollLeft = maxSize;\n\t\texpand.scrollTop = maxSize;\n\t\tshrink.scrollLeft = maxSize;\n\t\tshrink.scrollTop = maxSize;\n\t};\n\tvar onScroll = function() {\n\t\tresizer._reset();\n\t\thandler();\n\t};\n\n\taddEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\taddEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\treturn resizer;\n}\n\n// https://davidwalsh.name/detect-node-insertion\nfunction watchForRender(node, handler) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\tvar proxy = expando.renderProxy = function(e) {\n\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\thandler();\n\t\t}\n\t};\n\n\thelpers.each(ANIMATION_START_EVENTS, function(type) {\n\t\taddEventListener(node, type, proxy);\n\t});\n\n\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t// is removed then added back immediately (same animation frame?). Accessing the\n\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t// https://github.com/chartjs/Chart.js/issues/4737\n\texpando.reflow = !!node.offsetParent;\n\n\tnode.classList.add(CSS_RENDER_MONITOR);\n}\n\nfunction unwatchForRender(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar proxy = expando.renderProxy;\n\n\tif (proxy) {\n\t\thelpers.each(ANIMATION_START_EVENTS, function(type) {\n\t\t\tremoveEventListener(node, type, proxy);\n\t\t});\n\n\t\tdelete expando.renderProxy;\n\t}\n\n\tnode.classList.remove(CSS_RENDER_MONITOR);\n}\n\nfunction addResizeListener(node, listener, chart) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\tvar resizer = expando.resizer = createResizer(throttled(function() {\n\t\tif (expando.resizer) {\n\t\t\treturn listener(createEvent('resize', chart));\n\t\t}\n\t}));\n\n\t// The resizer needs to be attached to the node parent, so we first need to be\n\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\twatchForRender(node, function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = node.parentNode;\n\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t}\n\n\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\tresizer._reset();\n\t\t}\n\t});\n}\n\nfunction removeResizeListener(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar resizer = expando.resizer;\n\n\tdelete expando.resizer;\n\tunwatchForRender(node);\n\n\tif (resizer && resizer.parentNode) {\n\t\tresizer.parentNode.removeChild(resizer);\n\t}\n}\n\nfunction injectCSS(platform, css) {\n\t// http://stackoverflow.com/q/3922139\n\tvar style = platform._style || document.createElement('style');\n\tif (!platform._style) {\n\t\tplatform._style = style;\n\t\tcss = '/* Chart.js */\\n' + css;\n\t\tstyle.setAttribute('type', 'text/css');\n\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\t}\n\n\tstyle.appendChild(document.createTextNode(css));\n}\n\nmodule.exports = {\n\t/**\n\t * This property holds whether this platform is enabled for the current environment.\n\t * Currently used by platform.js to select the proper implementation.\n\t * @private\n\t */\n\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n\tinitialize: function() {\n\t\tvar keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n\t\tinjectCSS(this,\n\t\t\t// DOM rendering detection\n\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\t'@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n\t\t\t'@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n\t\t\t'.' + CSS_RENDER_MONITOR + '{' +\n\t\t\t\t'-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n\t\t\t\t'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n\t\t\t'}'\n\t\t);\n\t},\n\n\tacquireContext: function(item, config) {\n\t\tif (typeof item === 'string') {\n\t\t\titem = document.getElementById(item);\n\t\t} else if (item.length) {\n\t\t\t// Support for array based queries (such as jQuery)\n\t\t\titem = item[0];\n\t\t}\n\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\tif (context && context.canvas === item) {\n\t\t\tinitCanvas(item, config);\n\t\t\treturn context;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\treleaseContext: function(context) {\n\t\tvar canvas = context.canvas;\n\t\tif (!canvas[EXPANDO_KEY]) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar initial = canvas[EXPANDO_KEY].initial;\n\t\t['height', 'width'].forEach(function(prop) {\n\t\t\tvar value = initial[prop];\n\t\t\tif (helpers.isNullOrUndef(value)) {\n\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t} else {\n\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t}\n\t\t});\n\n\t\thelpers.each(initial.style || {}, function(value, key) {\n\t\t\tcanvas.style[key] = value;\n\t\t});\n\n\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\tcanvas.width = canvas.width;\n\n\t\tdelete canvas[EXPANDO_KEY];\n\t},\n\n\taddEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\taddResizeListener(canvas, listener, chart);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n\t\tvar proxies = expando.proxies || (expando.proxies = {});\n\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t};\n\n\t\taddEventListener(canvas, type, proxy);\n\t},\n\n\tremoveEventListener: function(chart, type, listener) {\n\t\tvar canvas = chart.canvas;\n\t\tif (type === 'resize') {\n\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\tremoveResizeListener(canvas, listener);\n\t\t\treturn;\n\t\t}\n\n\t\tvar expando = listener[EXPANDO_KEY] || {};\n\t\tvar proxies = expando.proxies || {};\n\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\tif (!proxy) {\n\t\t\treturn;\n\t\t}\n\n\t\tremoveEventListener(canvas, type, proxy);\n\t}\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.addEvent = addEventListener;\n\n/**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.removeEvent = removeEventListener;\n\n},{\"45\":45}],48:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\nvar basic = require(46);\nvar dom = require(47);\n\n// @TODO Make possible to select another platform at build time.\nvar implementation = dom._enabled ? dom : basic;\n\n/**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\nmodule.exports = helpers.extend({\n\t/**\n\t * @since 2.7.0\n\t */\n\tinitialize: function() {},\n\n\t/**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t * @param {Object} options - The chart options\n\t * @returns {CanvasRenderingContext2D} context2d instance\n\t */\n\tacquireContext: function() {},\n\n\t/**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {Boolean} true if the method succeeded, else false\n\t */\n\treleaseContext: function() {},\n\n\t/**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {String} type - The ({@link IEvent}) type to listen for\n\t * @param {Function} listener - Receives a notification (an object that implements\n\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t */\n\taddEventListener: function() {},\n\n\t/**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart -Chart from which to remove the listener\n\t * @param {String} type - The ({@link IEvent}) type to remove\n\t * @param {Function} listener - The listener function to remove from the event target.\n\t */\n\tremoveEventListener: function() {}\n\n}, implementation);\n\n/**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n/**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\n},{\"45\":45,\"46\":46,\"47\":47}],49:[function(require,module,exports){\n/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n'use strict';\n\nvar defaults = require(25);\nvar elements = require(40);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tplugins: {\n\t\tfiller: {\n\t\t\tpropagate: true\n\t\t}\n\t}\n});\n\nmodule.exports = function() {\n\n\tvar mappers = {\n\t\tdataset: function(source) {\n\t\t\tvar index = source.fill;\n\t\t\tvar chart = source.chart;\n\t\t\tvar meta = chart.getDatasetMeta(index);\n\t\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\t\tvar points = (visible && meta.dataset._children) || [];\n\t\t\tvar length = points.length || 0;\n\n\t\t\treturn !length ? null : function(point, i) {\n\t\t\t\treturn (i < length && points[i]._view) || null;\n\t\t\t};\n\t\t},\n\n\t\tboundary: function(source) {\n\t\t\tvar boundary = source.boundary;\n\t\t\tvar x = boundary ? boundary.x : null;\n\t\t\tvar y = boundary ? boundary.y : null;\n\n\t\t\treturn function(point) {\n\t\t\t\treturn {\n\t\t\t\t\tx: x === null ? point.x : x,\n\t\t\t\t\ty: y === null ? point.y : y,\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\t};\n\n\t// @todo if (fill[0] === '#')\n\tfunction decodeFill(el, index, count) {\n\t\tvar model = el._model || {};\n\t\tvar fill = model.fill;\n\t\tvar target;\n\n\t\tif (fill === undefined) {\n\t\t\tfill = !!model.backgroundColor;\n\t\t}\n\n\t\tif (fill === false || fill === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (fill === true) {\n\t\t\treturn 'origin';\n\t\t}\n\n\t\ttarget = parseFloat(fill, 10);\n\t\tif (isFinite(target) && Math.floor(target) === target) {\n\t\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\t\ttarget = index + target;\n\t\t\t}\n\n\t\t\tif (target === index || target < 0 || target >= count) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\tswitch (fill) {\n\t\t// compatibility\n\t\tcase 'bottom':\n\t\t\treturn 'start';\n\t\tcase 'top':\n\t\t\treturn 'end';\n\t\tcase 'zero':\n\t\t\treturn 'origin';\n\t\t// supported boundaries\n\t\tcase 'origin':\n\t\tcase 'start':\n\t\tcase 'end':\n\t\t\treturn fill;\n\t\t// invalid fill values\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction computeBoundary(source) {\n\t\tvar model = source.el._model || {};\n\t\tvar scale = source.el._scale || {};\n\t\tvar fill = source.fill;\n\t\tvar target = null;\n\t\tvar horizontal;\n\n\t\tif (isFinite(fill)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t\t// controllers might still use it (e.g. the Smith chart).\n\n\t\tif (fill === 'start') {\n\t\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n\t\t} else if (fill === 'end') {\n\t\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\n\t\t} else if (model.scaleZero !== undefined) {\n\t\t\ttarget = model.scaleZero;\n\t\t} else if (scale.getBasePosition) {\n\t\t\ttarget = scale.getBasePosition();\n\t\t} else if (scale.getBasePixel) {\n\t\t\ttarget = scale.getBasePixel();\n\t\t}\n\n\t\tif (target !== undefined && target !== null) {\n\t\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\t\treturn target;\n\t\t\t}\n\n\t\t\tif (typeof target === 'number' && isFinite(target)) {\n\t\t\t\thorizontal = scale.isHorizontal();\n\t\t\t\treturn {\n\t\t\t\t\tx: horizontal ? target : null,\n\t\t\t\t\ty: horizontal ? null : target\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction resolveTarget(sources, index, propagate) {\n\t\tvar source = sources[index];\n\t\tvar fill = source.fill;\n\t\tvar visited = [index];\n\t\tvar target;\n\n\t\tif (!propagate) {\n\t\t\treturn fill;\n\t\t}\n\n\t\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\t\tif (!isFinite(fill)) {\n\t\t\t\treturn fill;\n\t\t\t}\n\n\t\t\ttarget = sources[fill];\n\t\t\tif (!target) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (target.visible) {\n\t\t\t\treturn fill;\n\t\t\t}\n\n\t\t\tvisited.push(fill);\n\t\t\tfill = target.fill;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction createMapper(source) {\n\t\tvar fill = source.fill;\n\t\tvar type = 'dataset';\n\n\t\tif (fill === false) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!isFinite(fill)) {\n\t\t\ttype = 'boundary';\n\t\t}\n\n\t\treturn mappers[type](source);\n\t}\n\n\tfunction isDrawable(point) {\n\t\treturn point && !point.skip;\n\t}\n\n\tfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\t\tvar i;\n\n\t\tif (!len0 || !len1) {\n\t\t\treturn;\n\t\t}\n\n\t\t// building first area curve (normal)\n\t\tctx.moveTo(curve0[0].x, curve0[0].y);\n\t\tfor (i = 1; i < len0; ++i) {\n\t\t\thelpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n\t\t}\n\n\t\t// joining the two area curves\n\t\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n\t\t// building opposite area curve (reverse)\n\t\tfor (i = len1 - 1; i > 0; --i) {\n\t\t\thelpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n\t\t}\n\t}\n\n\tfunction doFill(ctx, points, mapper, view, color, loop) {\n\t\tvar count = points.length;\n\t\tvar span = view.spanGaps;\n\t\tvar curve0 = [];\n\t\tvar curve1 = [];\n\t\tvar len0 = 0;\n\t\tvar len1 = 0;\n\t\tvar i, ilen, index, p0, p1, d0, d1;\n\n\t\tctx.beginPath();\n\n\t\tfor (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n\t\t\tindex = i % count;\n\t\t\tp0 = points[index]._view;\n\t\t\tp1 = mapper(p0, index, view);\n\t\t\td0 = isDrawable(p0);\n\t\t\td1 = isDrawable(p1);\n\n\t\t\tif (d0 && d1) {\n\t\t\t\tlen0 = curve0.push(p0);\n\t\t\t\tlen1 = curve1.push(p1);\n\t\t\t} else if (len0 && len1) {\n\t\t\t\tif (!span) {\n\t\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\t\tlen0 = len1 = 0;\n\t\t\t\t\tcurve0 = [];\n\t\t\t\t\tcurve1 = [];\n\t\t\t\t} else {\n\t\t\t\t\tif (d0) {\n\t\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t\t}\n\t\t\t\t\tif (d1) {\n\t\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\t\tctx.closePath();\n\t\tctx.fillStyle = color;\n\t\tctx.fill();\n\t}\n\n\treturn {\n\t\tid: 'filler',\n\n\t\tafterDatasetsUpdate: function(chart, options) {\n\t\t\tvar count = (chart.data.datasets || []).length;\n\t\t\tvar propagate = options.propagate;\n\t\t\tvar sources = [];\n\t\t\tvar meta, i, el, source;\n\n\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tel = meta.dataset;\n\t\t\t\tsource = null;\n\n\t\t\t\tif (el && el._model && el instanceof elements.Line) {\n\t\t\t\t\tsource = {\n\t\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\tel: el\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tmeta.$filler = source;\n\t\t\t\tsources.push(source);\n\t\t\t}\n\n\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\tsource = sources[i];\n\t\t\t\tif (!source) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\t\tsource.boundary = computeBoundary(source);\n\t\t\t\tsource.mapper = createMapper(source);\n\t\t\t}\n\t\t},\n\n\t\tbeforeDatasetDraw: function(chart, args) {\n\t\t\tvar meta = args.meta.$filler;\n\t\t\tif (!meta) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar ctx = chart.ctx;\n\t\t\tvar el = meta.el;\n\t\t\tvar view = el._view;\n\t\t\tvar points = el._children || [];\n\t\t\tvar mapper = meta.mapper;\n\t\t\tvar color = view.backgroundColor || defaults.global.defaultColor;\n\n\t\t\tif (mapper && color && points.length) {\n\t\t\t\thelpers.canvas.clipArea(ctx, chart.chartArea);\n\t\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\n\t\t\t\thelpers.canvas.unclipArea(ctx);\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"40\":40,\"45\":45}],50:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\tlegend: {\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true,\n\t\treverse: false,\n\t\tweight: 1000,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t},\n\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t}\n\t\t\ttext.push('</li>');\n\t\t}\n\t\ttext.push('</ul>');\n\t\treturn text.join('');\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tvar layout = Chart.layoutService;\n\tvar noop = helpers.noop;\n\n\t/**\n\t * Helper function to get the box width based on the usePointStyle option\n\t * @param labelopts {Object} the label options on the legend\n\t * @param fontSize {Number} the label font size\n\t * @return {Number} width of the color box area\n\t */\n\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\treturn labelOpts.usePointStyle ?\n\t\t\tfontSize * Math.SQRT2 :\n\t\t\tlabelOpts.boxWidth;\n\t}\n\n\tChart.Legend = Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\thelpers.extend(this, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\tthis.doughnutMode = false;\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t// Any function defined here is inherited by all legend types.\n\t\t// Any function can be extended by the legend type\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: function() {\n\t\t\tvar me = this;\n\t\t\tvar labelOpts = me.options.labels || {};\n\t\t\tvar legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n\t\t\tif (labelOpts.filter) {\n\t\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (me.options.reverse) {\n\t\t\t\tlegendItems.reverse();\n\t\t\t}\n\n\t\t\tme.legendItems = legendItems;\n\t\t},\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar display = opts.display;\n\n\t\t\tvar ctx = me.ctx;\n\n\t\t\tvar globalDefault = defaults.global;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t// Reset hit boxes\n\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Increase sizes here\n\t\t\tif (display) {\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// Labels\n\n\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\ttotalHeight += fontSize + (labelOpts.padding);\n\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t});\n\n\t\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t\t} else {\n\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\n\t\t// Actually draw the legend on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar globalDefault = defaults.global;\n\t\t\tvar lineDefault = globalDefault.elements.line;\n\t\t\tvar legendWidth = me.width;\n\t\t\tvar lineWidths = me.lineWidths;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\tvar fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n\t\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\tvar cursor;\n\n\t\t\t\t// Canvas setup\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\tvar hitboxes = me.legendHitBoxes;\n\n\t\t\t\t// current position\n\t\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\tctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\tctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\tctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\tctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\tctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\tctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\tvar isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\tctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\thelpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.restore();\n\t\t\t\t};\n\t\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\t\tvar halfFontSize = fontSize / 2;\n\t\t\t\t\tvar xLeft = boxWidth + halfFontSize + x;\n\t\t\t\t\tvar yMiddle = y + halfFontSize;\n\n\t\t\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\n\n\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\tctx.moveTo(xLeft, yMiddle);\n\t\t\t\t\t\tctx.lineTo(xLeft + textWidth, yMiddle);\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Horizontal\n\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2),\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\n\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + textWidth;\n\t\t\t\t\tvar x = cursor.x;\n\t\t\t\t\tvar y = cursor.y;\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t// Fill the actual label\n\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tcursor.x += width + (labelOpts.padding);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @return {Boolean} true if a change occured\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\tvar changed = false;\n\n\t\t\tif (type === 'mousemove') {\n\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (type === 'click') {\n\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Chart event already has relative position in it\n\t\t\tvar x = e.x;\n\t\t\tvar y = e.y;\n\n\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\tfunction createNewLegendAndAttach(chart, legendOpts) {\n\t\tvar legend = new Chart.Legend({\n\t\t\tctx: chart.ctx,\n\t\t\toptions: legendOpts,\n\t\t\tchart: chart\n\t\t});\n\n\t\tlayout.configure(chart, legend, legendOpts);\n\t\tlayout.addBox(chart, legend);\n\t\tchart.legend = legend;\n\t}\n\n\treturn {\n\t\tid: 'legend',\n\n\t\tbeforeInit: function(chart) {\n\t\t\tvar legendOpts = chart.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate: function(chart) {\n\t\t\tvar legendOpts = chart.options.legend;\n\t\t\tvar legend = chart.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\thelpers.mergeIf(legendOpts, defaults.global.legend);\n\n\t\t\t\tif (legend) {\n\t\t\t\t\tlayout.configure(chart, legend, legendOpts);\n\t\t\t\t\tlegend.options = legendOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t}\n\t\t\t} else if (legend) {\n\t\t\t\tlayout.removeBox(chart, legend);\n\t\t\t\tdelete chart.legend;\n\t\t\t}\n\t\t},\n\n\t\tafterEvent: function(chart, e) {\n\t\t\tvar legend = chart.legend;\n\t\t\tif (legend) {\n\t\t\t\tlegend.handleEvent(e);\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],51:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar Element = require(26);\nvar helpers = require(45);\n\ndefaults._set('global', {\n\ttitle: {\n\t\tdisplay: false,\n\t\tfontStyle: 'bold',\n\t\tfullWidth: true,\n\t\tlineHeight: 1.2,\n\t\tpadding: 10,\n\t\tposition: 'top',\n\t\ttext: '',\n\t\tweight: 2000         // by default greater than legend (1000) to be above\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tvar layout = Chart.layoutService;\n\tvar noop = helpers.noop;\n\n\tChart.Title = Element.extend({\n\t\tinitialize: function(config) {\n\t\t\tvar me = this;\n\t\t\thelpers.extend(me, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tme.legendHitBoxes = [];\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: noop,\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar opts = me.options;\n\t\t\tvar display = opts.display;\n\t\t\tvar fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\tvar textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = textSize;\n\t\t\t} else {\n\t\t\t\tminSize.width = textSize;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\tvar pos = this.options.position;\n\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t},\n\n\t\t// Actually draw the title block on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar ctx = me.ctx;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar opts = me.options;\n\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\t\tvar offset = lineHeight / 2 + opts.padding;\n\t\t\t\tvar rotation = 0;\n\t\t\t\tvar top = me.top;\n\t\t\t\tvar left = me.left;\n\t\t\t\tvar bottom = me.bottom;\n\t\t\t\tvar right = me.right;\n\t\t\t\tvar maxWidth, titleX, titleY;\n\n\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t// Horizontal\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\t\ttitleY = top + offset;\n\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t} else {\n\t\t\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t}\n\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\tctx.rotate(rotation);\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tctx.textBaseline = 'middle';\n\n\t\t\t\tvar text = opts.text;\n\t\t\t\tif (helpers.isArray(text)) {\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\n\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tctx.fillText(text, 0, 0, maxWidth);\n\t\t\t\t}\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\t\tvar title = new Chart.Title({\n\t\t\tctx: chart.ctx,\n\t\t\toptions: titleOpts,\n\t\t\tchart: chart\n\t\t});\n\n\t\tlayout.configure(chart, title, titleOpts);\n\t\tlayout.addBox(chart, title);\n\t\tchart.titleBlock = title;\n\t}\n\n\treturn {\n\t\tid: 'title',\n\n\t\tbeforeInit: function(chart) {\n\t\t\tvar titleOpts = chart.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate: function(chart) {\n\t\t\tvar titleOpts = chart.options.title;\n\t\t\tvar titleBlock = chart.titleBlock;\n\n\t\t\tif (titleOpts) {\n\t\t\t\thelpers.mergeIf(titleOpts, defaults.global.title);\n\n\t\t\t\tif (titleBlock) {\n\t\t\t\t\tlayout.configure(chart, titleBlock, titleOpts);\n\t\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t}\n\t\t\t} else if (titleBlock) {\n\t\t\t\tChart.layoutService.removeBox(chart, titleBlock);\n\t\t\t\tdelete chart.titleBlock;\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{\"25\":25,\"26\":26,\"45\":45}],52:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\t// Default config for a category scale\n\tvar defaultConfig = {\n\t\tposition: 'bottom'\n\t};\n\n\tvar DatasetScale = Chart.Scale.extend({\n\t\t/**\n\t\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t\t* else fall back to data.labels\n\t\t* @private\n\t\t*/\n\t\tgetLabels: function() {\n\t\t\tvar data = this.chart.data;\n\t\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\tme.minIndex = 0;\n\t\t\tme.maxIndex = labels.length - 1;\n\t\t\tvar findIndex;\n\n\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t// user specified min value\n\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.min);\n\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t}\n\n\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t// user specified max value\n\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.max);\n\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t}\n\n\t\t\tme.min = labels[me.minIndex];\n\t\t\tme.max = labels[me.maxIndex];\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t}\n\t\t\treturn me.ticks[index - me.minIndex];\n\t\t},\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: function(value, index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n\t\t\t// If value is a data object, then index is the index in the data array,\n\t\t\t// not the index of the scale. We need to change that.\n\t\t\tvar valueCategory;\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t\t}\n\t\t\tif (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n\t\t\t\tvar labels = me.getLabels();\n\t\t\t\tvalue = valueCategory || value;\n\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t}\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\t\tif (offset) {\n\t\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t\t}\n\n\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t}\n\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\t\tif (offset) {\n\t\t\t\theightOffset += (valueHeight / 2);\n\t\t\t}\n\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tvar value;\n\t\t\tvar offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\tvar horz = me.isHorizontal();\n\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\tif (offset) {\n\t\t\t\tpixel -= (valueDimension / 2);\n\t\t\t}\n\n\t\t\tif (pixel <= 0) {\n\t\t\t\tvalue = 0;\n\t\t\t} else {\n\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t}\n\n\t\t\treturn value + me.minIndex;\n\t\t},\n\t\tgetBasePixel: function() {\n\t\t\treturn this.bottom;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n};\n\n},{}],53:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\t\tticks: {\n\t\t\tcallback: Ticks.formatters.linear\n\t\t}\n\t};\n\n\tvar LinearScale = Chart.LinearScaleBase.extend({\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar DEFAULT_MIN = 0;\n\t\t\tvar DEFAULT_MAX = 1;\n\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// First Calculate the range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store these per type\n\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n\t\t\tme.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar maxTicks;\n\t\t\tvar me = this;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t} else {\n\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t}\n\n\t\t\treturn maxTicks;\n\t\t},\n\t\t// Called after the ticks are built. We need\n\t\thandleDirectionalChanges: function() {\n\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tthis.ticks.reverse();\n\t\t\t}\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\t// Utils\n\t\tgetPixelForValue: function(value) {\n\t\t\t// This must be called after fit has been run so that\n\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\n\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\tvar pixel;\n\t\t\tvar range = me.end - start;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t\t\treturn Math.round(pixel);\n\t\t\t}\n\n\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t\treturn Math.round(pixel);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\treturn me.start + ((me.end - me.start) * offset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n};\n\n},{\"25\":25,\"34\":34,\"45\":45}],54:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar noop = helpers.noop;\n\n\tChart.LinearScaleBase = Chart.Scale.extend({\n\t\tgetRightValue: function(value) {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\treturn +value;\n\t\t\t}\n\t\t\treturn Chart.Scale.prototype.getRightValue.call(this, value);\n\t\t},\n\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t// axis, they can manually override it\n\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t// move the top up to 0\n\t\t\t\t\tme.max = 0;\n\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\tme.min = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n\t\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\tme.min = tickOpts.min;\n\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\tif (me.min === null) {\n\t\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t\t} else {\n\t\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\tme.max = tickOpts.max;\n\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\tif (me.max === null) {\n\t\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t\t} else {\n\t\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setMin !== setMax) {\n\t\t\t\t// We set the min or the max but not both.\n\t\t\t\t// So ensure that our range is good\n\t\t\t\t// Inverted or 0 length range can happen when\n\t\t\t\t// ticks.min is set, and no datasets are visible\n\t\t\t\tif (me.min >= me.max) {\n\t\t\t\t\tif (setMin) {\n\t\t\t\t\t\tme.max = me.min + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.min = me.max - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tme.max++;\n\n\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\tme.min--;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTickLimit: noop,\n\t\thandleDirectionalChanges: noop,\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\tvar numericGeneratorOptions = {\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max,\n\t\t\t\tstepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me);\n\n\t\t\tme.handleDirectionalChanges();\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(me);\n\t\t}\n\t});\n};\n\n},{\"34\":34,\"45\":45}],55:[function(require,module,exports){\n'use strict';\n\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tcallback: Ticks.formatters.logarithmic\n\t\t}\n\t};\n\n\tvar LogarithmicScale = Chart.Scale.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// Calculate Range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\t\t\tme.minNotZero = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tvalues[index] = 100;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Don't need to split positive and negative since the log scale can't handle a 0 crossing\n\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = valueOrDefault(tickOpts.min, me.min);\n\t\t\tme.max = valueOrDefault(tickOpts.max, me.max);\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tme.min = 1;\n\t\t\t\t\tme.max = 10;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tvar generationOptions = {\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me);\n\n\t\t\tif (!me.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tticks.reverse();\n\t\t\t}\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(this);\n\t\t},\n\t\t// Get the correct tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t},\n\t\tgetPixelForValue: function(value) {\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\t\t\tvar newVal = +me.getRightValue(value);\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar innerDimension, pixel, range;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n\t\t\t\tif (newVal === 0) {\n\t\t\t\t\tpixel = me.left;\n\t\t\t\t} else {\n\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\tpixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Bottom - top since pixels increase downward on a screen\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tif (start === 0 && !tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === start) {\n\t\t\t\t\t\tpixel = me.bottom;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (me.end === 0 && tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === me.end) {\n\t\t\t\t\t\tpixel = me.top;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (newVal === 0) {\n\t\t\t\t\tpixel = tickOpts.reverse ? me.top : me.bottom;\n\t\t\t\t} else {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start);\n\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\tpixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar range = helpers.log10(me.end) - helpers.log10(me.start);\n\t\t\tvar value, innerDimension;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tvalue = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n\t\t\t} else { // todo: if start === 0\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tvalue = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n};\n\n},{\"34\":34,\"45\":45}],56:[function(require,module,exports){\n'use strict';\n\nvar defaults = require(25);\nvar helpers = require(45);\nvar Ticks = require(34);\n\nmodule.exports = function(Chart) {\n\n\tvar globalDefaults = defaults.global;\n\n\tvar defaultConfig = {\n\t\tdisplay: true,\n\n\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\tanimate: true,\n\t\tposition: 'chartArea',\n\n\t\tangleLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1\n\t\t},\n\n\t\tgridLines: {\n\t\t\tcircular: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\tshowLabelBackdrop: true,\n\n\t\t\t// String - The colour of the label backdrop\n\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\tbackdropPaddingY: 2,\n\n\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\tbackdropPaddingX: 2,\n\n\t\t\tcallback: Ticks.formatters.linear\n\t\t},\n\n\t\tpointLabels: {\n\t\t\t// Boolean - if true, show point labels\n\t\t\tdisplay: true,\n\n\t\t\t// Number - Point label font size in pixels\n\t\t\tfontSize: 10,\n\n\t\t\t// Function - Used to convert point labels\n\t\t\tcallback: function(label) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction getValueCount(scale) {\n\t\tvar opts = scale.options;\n\t\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n\t}\n\n\tfunction getPointLabelFontOptions(scale) {\n\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\tvar fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\tvar fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\treturn {\n\t\t\tsize: fontSize,\n\t\t\tstyle: fontStyle,\n\t\t\tfamily: fontFamily,\n\t\t\tfont: font\n\t\t};\n\t}\n\n\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\tif (helpers.isArray(label)) {\n\t\t\treturn {\n\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\th: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tw: ctx.measureText(label).width,\n\t\t\th: fontSize\n\t\t};\n\t}\n\n\tfunction determineLimits(angle, pos, size, min, max) {\n\t\tif (angle === min || angle === max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - (size / 2),\n\t\t\t\tend: pos + (size / 2)\n\t\t\t};\n\t\t} else if (angle < min || angle > max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - size - 5,\n\t\t\t\tend: pos\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstart: pos,\n\t\t\tend: pos + size + 5\n\t\t};\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with point labels\n\t */\n\tfunction fitWithPointLabels(scale) {\n\t\t/*\n\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t *\n\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t *\n\t\t * Solution:\n\t\t *\n\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t * at each index we check if the text overlaps.\n\t\t *\n\t\t * Where it does, we store that angle and that index.\n\t\t *\n\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t * from the shape radius to move the point inwards by that x.\n\t\t *\n\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t * along with labels.\n\t\t *\n\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t *\n\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t * and position it in the most space efficient manner\n\t\t *\n\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t */\n\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tvar furthestLimits = {\n\t\t\tr: scale.width,\n\t\t\tl: 0,\n\t\t\tt: scale.height,\n\t\t\tb: 0\n\t\t};\n\t\tvar furthestAngles = {};\n\t\tvar i, textSize, pointPosition;\n\n\t\tscale.ctx.font = plFont.font;\n\t\tscale._pointLabelSizes = [];\n\n\t\tvar valueCount = getValueCount(scale);\n\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t}\n\n\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t}\n\t\t}\n\n\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with no point labels\n\t */\n\tfunction fit(scale) {\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t}\n\n\tfunction getTextAlignForAngle(angle) {\n\t\tif (angle === 0 || angle === 180) {\n\t\t\treturn 'center';\n\t\t} else if (angle < 180) {\n\t\t\treturn 'left';\n\t\t}\n\n\t\treturn 'right';\n\t}\n\n\tfunction fillText(ctx, text, position, fontSize) {\n\t\tif (helpers.isArray(text)) {\n\t\t\tvar y = position.y;\n\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\ty += spacing;\n\t\t\t}\n\t\t} else {\n\t\t\tctx.fillText(text, position.x, position.y);\n\t\t}\n\t}\n\n\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\tif (angle === 90 || angle === 270) {\n\t\t\tposition.y -= (textSize.h / 2);\n\t\t} else if (angle > 270 || angle < 90) {\n\t\t\tposition.y -= textSize.h;\n\t\t}\n\t}\n\n\tfunction drawPointLabels(scale) {\n\t\tvar ctx = scale.ctx;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar opts = scale.options;\n\t\tvar angleLineOpts = opts.angleLines;\n\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n\t\t// Point Label Font\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\tctx.textBaseline = 'top';\n\n\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\tif (angleLineOpts.display) {\n\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\n\t\t\tif (pointLabelOpts.display) {\n\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t\t// Keep this in loop since we may support array properties here\n\t\t\t\tvar pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\tctx.font = plFont.font;\n\t\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\tvar ctx = scale.ctx;\n\t\tctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\tctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\tif (scale.options.gridLines.circular) {\n\t\t\t// Draw circular arcs between the points\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t} else {\n\t\t\t// Draw straight lines connecting each index\n\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\tif (valueCount === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t}\n\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tfunction numberOrZero(param) {\n\t\treturn helpers.isNumber(param) ? param : 0;\n\t}\n\n\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.height = me.maxHeight;\n\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tme.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\thelpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tme.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\n\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t// Point labels\n\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tfit: function() {\n\t\t\tif (this.options.pointLabels.display) {\n\t\t\t\tfitWithPointLabels(this);\n\t\t\t} else {\n\t\t\t\tfit(this);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set radius reductions and determine new radius and center point\n\t\t * @private\n\t\t */\n\t\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\tvar me = this;\n\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\tme.drawingArea = Math.min(\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\tvar me = this;\n\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\n\t\t\tvar maxLeft = leftMovement + me.drawingArea;\n\t\t\tvar maxTop = topMovement + me.drawingArea;\n\t\t\tvar maxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\tme.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n\t\t\tme.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n\t\t},\n\n\t\tgetIndexAngle: function(index) {\n\t\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\t\tthis.chart.options.startAngle :\n\t\t\t\t0;\n\n\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t},\n\t\tgetDistanceFromCenterForValue: function(value) {\n\t\t\tvar me = this;\n\n\t\t\tif (value === null) {\n\t\t\t\treturn 0; // null always in center\n\t\t\t}\n\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\tif (me.options.ticks.reverse) {\n\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t}\n\t\t\treturn (value - me.min) * scalingFactor;\n\t\t},\n\t\tgetPointPosition: function(index, distanceFromCenter) {\n\t\t\tvar me = this;\n\t\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\t\treturn {\n\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t};\n\t\t},\n\t\tgetPointPositionForValue: function(index, value) {\n\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t},\n\n\t\tgetBasePosition: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.getPointPositionForValue(0,\n\t\t\t\tme.beginAtZero ? 0 :\n\t\t\t\tmin < 0 && max < 0 ? max :\n\t\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t\t0);\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\t\t\t\tvar startAngle = this.getIndexAngle(0);\n\n\t\t\t\t// Tick Font\n\t\t\t\tvar tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\tif (index > 0 || tickOpts.reverse) {\n\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\tvar tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(me.xCenter, me.yCenter);\n\t\t\t\t\t\t\tctx.rotate(startAngle);\n\n\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t\t-labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t\t-yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\t\ttickFontSize + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\tctx.fillText(label, 0, -yCenterOffset);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n};\n\n},{\"25\":25,\"34\":34,\"45\":45}],57:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nvar moment = require(1);\nmoment = typeof moment === 'function' ? moment : window.moment;\n\nvar defaults = require(25);\nvar helpers = require(45);\n\n// Integer constants are from the ES6 spec.\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\nvar INTERVALS = {\n\tmillisecond: {\n\t\tcommon: true,\n\t\tsize: 1,\n\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t},\n\tsecond: {\n\t\tcommon: true,\n\t\tsize: 1000,\n\t\tsteps: [1, 2, 5, 10, 30]\n\t},\n\tminute: {\n\t\tcommon: true,\n\t\tsize: 60000,\n\t\tsteps: [1, 2, 5, 10, 30]\n\t},\n\thour: {\n\t\tcommon: true,\n\t\tsize: 3600000,\n\t\tsteps: [1, 2, 3, 6, 12]\n\t},\n\tday: {\n\t\tcommon: true,\n\t\tsize: 86400000,\n\t\tsteps: [1, 2, 5]\n\t},\n\tweek: {\n\t\tcommon: false,\n\t\tsize: 604800000,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tmonth: {\n\t\tcommon: true,\n\t\tsize: 2.628e9,\n\t\tsteps: [1, 2, 3]\n\t},\n\tquarter: {\n\t\tcommon: false,\n\t\tsize: 7.884e9,\n\t\tsteps: [1, 2, 3, 4]\n\t},\n\tyear: {\n\t\tcommon: true,\n\t\tsize: 3.154e10\n\t}\n};\n\nvar UNITS = Object.keys(INTERVALS);\n\nfunction sorter(a, b) {\n\treturn a - b;\n}\n\nfunction arrayUnique(items) {\n\tvar hash = {};\n\tvar out = [];\n\tvar i, ilen, item;\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\titem = items[i];\n\t\tif (!hash[item]) {\n\t\t\thash[item] = true;\n\t\t\tout.push(item);\n\t\t}\n\t}\n\n\treturn out;\n}\n\n/**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\nfunction buildLookupTable(timestamps, min, max, distribution) {\n\tif (distribution === 'linear' || !timestamps.length) {\n\t\treturn [\n\t\t\t{time: min, pos: 0},\n\t\t\t{time: max, pos: 1}\n\t\t];\n\t}\n\n\tvar table = [];\n\tvar items = [min];\n\tvar i, ilen, prev, curr, next;\n\n\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\tcurr = timestamps[i];\n\t\tif (curr > min && curr < max) {\n\t\t\titems.push(curr);\n\t\t}\n\t}\n\n\titems.push(max);\n\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\tnext = items[i + 1];\n\t\tprev = items[i - 1];\n\t\tcurr = items[i];\n\n\t\t// only add points that breaks the scale linearity\n\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n\t\t\ttable.push({time: curr, pos: i / (ilen - 1)});\n\t\t}\n\t}\n\n\treturn table;\n}\n\n// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\nfunction lookup(table, key, value) {\n\tvar lo = 0;\n\tvar hi = table.length - 1;\n\tvar mid, i0, i1;\n\n\twhile (lo >= 0 && lo <= hi) {\n\t\tmid = (lo + hi) >> 1;\n\t\ti0 = table[mid - 1] || null;\n\t\ti1 = table[mid];\n\n\t\tif (!i0) {\n\t\t\t// given value is outside table (before first item)\n\t\t\treturn {lo: null, hi: i1};\n\t\t} else if (i1[key] < value) {\n\t\t\tlo = mid + 1;\n\t\t} else if (i0[key] > value) {\n\t\t\thi = mid - 1;\n\t\t} else {\n\t\t\treturn {lo: i0, hi: i1};\n\t\t}\n\t}\n\n\t// given value is outside table (after last item)\n\treturn {lo: i1, hi: null};\n}\n\n/**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\nfunction interpolate(table, skey, sval, tkey) {\n\tvar range = lookup(table, skey, sval);\n\n\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n\tvar span = next[skey] - prev[skey];\n\tvar ratio = span ? (sval - prev[skey]) / span : 0;\n\tvar offset = (next[tkey] - prev[tkey]) * ratio;\n\n\treturn prev[tkey] + offset;\n}\n\n/**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\nfunction momentify(value, options) {\n\tvar parser = options.parser;\n\tvar format = options.parser || options.format;\n\n\tif (typeof parser === 'function') {\n\t\treturn parser(value);\n\t}\n\n\tif (typeof value === 'string' && typeof format === 'string') {\n\t\treturn moment(value, format);\n\t}\n\n\tif (!(value instanceof moment)) {\n\t\tvalue = moment(value);\n\t}\n\n\tif (value.isValid()) {\n\t\treturn value;\n\t}\n\n\t// Labels are in an incompatible moment format and no `parser` has been provided.\n\t// The user might still use the deprecated `format` option to convert his inputs.\n\tif (typeof format === 'function') {\n\t\treturn format(value);\n\t}\n\n\treturn value;\n}\n\nfunction parse(input, scale) {\n\tif (helpers.isNullOrUndef(input)) {\n\t\treturn null;\n\t}\n\n\tvar options = scale.options.time;\n\tvar value = momentify(scale.getRightValue(input), options);\n\tif (!value.isValid()) {\n\t\treturn null;\n\t}\n\n\tif (options.round) {\n\t\tvalue.startOf(options.round);\n\t}\n\n\treturn value.valueOf();\n}\n\n/**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\nfunction determineStepSize(min, max, unit, capacity) {\n\tvar range = max - min;\n\tvar interval = INTERVALS[unit];\n\tvar milliseconds = interval.size;\n\tvar steps = interval.steps;\n\tvar i, ilen, factor;\n\n\tif (!steps) {\n\t\treturn Math.ceil(range / ((capacity || 1) * milliseconds));\n\t}\n\n\tfor (i = 0, ilen = steps.length; i < ilen; ++i) {\n\t\tfactor = steps[i];\n\t\tif (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn factor;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n\tvar ilen = UNITS.length;\n\tvar i, interval, factor;\n\n\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n\t\tinterval = INTERVALS[UNITS[i]];\n\t\tfactor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n\n\treturn UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n */\nfunction determineUnitForFormatting(ticks, minUnit, min, max) {\n\tvar duration = moment.duration(moment(max).diff(moment(min)));\n\tvar ilen = UNITS.length;\n\tvar i, unit;\n\n\tfor (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n\t\tunit = UNITS[i];\n\t\tif (INTERVALS[unit].common && duration.as(unit) >= ticks.length) {\n\t\t\treturn unit;\n\t\t}\n\t}\n\n\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\nfunction determineMajorUnit(unit) {\n\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n\t\tif (INTERVALS[UNITS[i]].common) {\n\t\t\treturn UNITS[i];\n\t\t}\n\t}\n}\n\n/**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\nfunction generate(min, max, capacity, options) {\n\tvar timeOpts = options.time;\n\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n\tvar major = determineMajorUnit(minor);\n\tvar stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n\tvar majorTicksEnabled = options.ticks.major.enabled;\n\tvar interval = INTERVALS[minor];\n\tvar first = moment(min);\n\tvar last = moment(max);\n\tvar ticks = [];\n\tvar time;\n\n\tif (!stepSize) {\n\t\tstepSize = determineStepSize(min, max, minor, capacity);\n\t}\n\n\t// For 'week' unit, handle the first day of week option\n\tif (weekday) {\n\t\tfirst = first.isoWeekday(weekday);\n\t\tlast = last.isoWeekday(weekday);\n\t}\n\n\t// Align first/last ticks on unit\n\tfirst = first.startOf(weekday ? 'day' : minor);\n\tlast = last.startOf(weekday ? 'day' : minor);\n\n\t// Make sure that the last tick include max\n\tif (last < max) {\n\t\tlast.add(1, minor);\n\t}\n\n\ttime = moment(first);\n\n\tif (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n\t\t// Align the first tick on the previous `minor` unit aligned on the `major` unit:\n\t\t// we first aligned time on the previous `major` unit then add the number of full\n\t\t// stepSize there is between first and the previous major time.\n\t\ttime.startOf(major);\n\t\ttime.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n\t}\n\n\tfor (; time < last; time.add(stepSize, minor)) {\n\t\tticks.push(+time);\n\t}\n\n\tticks.push(+time);\n\n\treturn ticks;\n}\n\n/**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\nfunction computeOffsets(table, ticks, min, max, options) {\n\tvar left = 0;\n\tvar right = 0;\n\tvar upper, lower;\n\n\tif (options.offset && ticks.length) {\n\t\tif (!options.time.min) {\n\t\t\tupper = ticks.length > 1 ? ticks[1] : max;\n\t\t\tlower = ticks[0];\n\t\t\tleft = (\n\t\t\t\tinterpolate(table, 'time', upper, 'pos') -\n\t\t\t\tinterpolate(table, 'time', lower, 'pos')\n\t\t\t) / 2;\n\t\t}\n\t\tif (!options.time.max) {\n\t\t\tupper = ticks[ticks.length - 1];\n\t\t\tlower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n\t\t\tright = (\n\t\t\t\tinterpolate(table, 'time', upper, 'pos') -\n\t\t\t\tinterpolate(table, 'time', lower, 'pos')\n\t\t\t) / 2;\n\t\t}\n\t}\n\n\treturn {left: left, right: right};\n}\n\nfunction ticksFromTimestamps(values, majorUnit) {\n\tvar ticks = [];\n\tvar i, ilen, value, major;\n\n\tfor (i = 0, ilen = values.length; i < ilen; ++i) {\n\t\tvalue = values[i];\n\t\tmajor = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n\t\tticks.push({\n\t\t\tvalue: value,\n\t\t\tmajor: major\n\t\t});\n\t}\n\n\treturn ticks;\n}\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\tposition: 'bottom',\n\n\t\t/**\n\t\t * Data distribution along the scale:\n\t\t * - 'linear': data are spread according to their time (distances can vary),\n\t\t * - 'series': data are spread at the same distance from each other.\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t * @since 2.7.0\n\t\t */\n\t\tdistribution: 'linear',\n\n\t\t/**\n\t\t * Scale boundary strategy (bypassed by min/max time options)\n\t\t * - `data`: make sure data are fully visible, ticks outside are removed\n\t\t * - `ticks`: make sure ticks are fully visible, data outside are truncated\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4556\n\t\t * @since 2.7.0\n\t\t */\n\t\tbounds: 'data',\n\n\t\ttime: {\n\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\tminUnit: 'millisecond',\n\n\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\tdisplayFormats: {\n\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\tminute: 'h:mm a', // 11:20 AM\n\t\t\t\thour: 'hA', // 5PM\n\t\t\t\tday: 'MMM D', // Sep 4\n\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t},\n\t\t},\n\t\tticks: {\n\t\t\tautoSkip: false,\n\n\t\t\t/**\n\t\t\t * Ticks generation input values:\n\t\t\t * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n\t\t\t * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n\t\t\t * - 'labels': generates ticks from user given `data.labels` values ONLY.\n\t\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\n\t\t\t * @since 2.7.0\n\t\t\t */\n\t\t\tsource: 'auto',\n\n\t\t\tmajor: {\n\t\t\t\tenabled: false\n\t\t\t}\n\t\t}\n\t};\n\n\tvar TimeScale = Chart.Scale.extend({\n\t\tinitialize: function() {\n\t\t\tif (!moment) {\n\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t}\n\n\t\t\tthis.mergeTicksOptions();\n\n\t\t\tChart.Scale.prototype.initialize.call(this);\n\t\t},\n\n\t\tupdate: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\n\t\t\t// DEPRECATIONS: output a message only one time per update\n\t\t\tif (options.time && options.time.format) {\n\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t\t}\n\n\t\t\treturn Chart.Scale.prototype.update.apply(me, arguments);\n\t\t},\n\n\t\t/**\n\t\t * Allows data to be referenced via 't' attribute\n\t\t */\n\t\tgetRightValue: function(rawValue) {\n\t\t\tif (rawValue && rawValue.t !== undefined) {\n\t\t\t\trawValue = rawValue.t;\n\t\t\t}\n\t\t\treturn Chart.Scale.prototype.getRightValue.call(this, rawValue);\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar timeOpts = me.options.time;\n\t\t\tvar min = MAX_INTEGER;\n\t\t\tvar max = MIN_INTEGER;\n\t\t\tvar timestamps = [];\n\t\t\tvar datasets = [];\n\t\t\tvar labels = [];\n\t\t\tvar i, j, ilen, jlen, data, timestamp;\n\n\t\t\t// Convert labels to timestamps\n\t\t\tfor (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n\t\t\t\tlabels.push(parse(chart.data.labels[i], me));\n\t\t\t}\n\n\t\t\t// Convert data to timestamps\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\tdata = chart.data.datasets[i].data;\n\n\t\t\t\t\t// Let's consider that all data have the same format.\n\t\t\t\t\tif (helpers.isObject(data[0])) {\n\t\t\t\t\t\tdatasets[i] = [];\n\n\t\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\n\t\t\t\t\t\t\ttimestamp = parse(data[j], me);\n\t\t\t\t\t\t\ttimestamps.push(timestamp);\n\t\t\t\t\t\t\tdatasets[i][j] = timestamp;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimestamps.push.apply(timestamps, labels);\n\t\t\t\t\t\tdatasets[i] = labels.slice(0);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdatasets[i] = [];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (labels.length) {\n\t\t\t\t// Sort labels **after** data have been converted\n\t\t\t\tlabels = arrayUnique(labels).sort(sorter);\n\t\t\t\tmin = Math.min(min, labels[0]);\n\t\t\t\tmax = Math.max(max, labels[labels.length - 1]);\n\t\t\t}\n\n\t\t\tif (timestamps.length) {\n\t\t\t\ttimestamps = arrayUnique(timestamps).sort(sorter);\n\t\t\t\tmin = Math.min(min, timestamps[0]);\n\t\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\n\t\t\t}\n\n\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t// In case there is no valid min/max, let's use today limits\n\t\t\tmin = min === MAX_INTEGER ? +moment().startOf('day') : min;\n\t\t\tmax = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max;\n\n\t\t\t// Make sure that max is strictly higher than min (required by the lookup table)\n\t\t\tme.min = Math.min(min, max);\n\t\t\tme.max = Math.max(min + 1, max);\n\n\t\t\t// PRIVATE\n\t\t\tme._horizontal = me.isHorizontal();\n\t\t\tme._table = [];\n\t\t\tme._timestamps = {\n\t\t\t\tdata: timestamps,\n\t\t\t\tdatasets: datasets,\n\t\t\t\tlabels: labels\n\t\t\t};\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\t\t\tvar options = me.options;\n\t\t\tvar timeOpts = options.time;\n\t\t\tvar timestamps = [];\n\t\t\tvar ticks = [];\n\t\t\tvar i, ilen, timestamp;\n\n\t\t\tswitch (options.ticks.source) {\n\t\t\tcase 'data':\n\t\t\t\ttimestamps = me._timestamps.data;\n\t\t\t\tbreak;\n\t\t\tcase 'labels':\n\t\t\t\ttimestamps = me._timestamps.labels;\n\t\t\t\tbreak;\n\t\t\tcase 'auto':\n\t\t\tdefault:\n\t\t\t\ttimestamps = generate(min, max, me.getLabelCapacity(min), options);\n\t\t\t}\n\n\t\t\tif (options.bounds === 'ticks' && timestamps.length) {\n\t\t\t\tmin = timestamps[0];\n\t\t\t\tmax = timestamps[timestamps.length - 1];\n\t\t\t}\n\n\t\t\t// Enforce limits with user min/max options\n\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t// Remove ticks outside the min/max range\n\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\ttimestamp = timestamps[i];\n\t\t\t\tif (timestamp >= min && timestamp <= max) {\n\t\t\t\t\tticks.push(timestamp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.min = min;\n\t\t\tme.max = max;\n\n\t\t\t// PRIVATE\n\t\t\tme._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max);\n\t\t\tme._majorUnit = determineMajorUnit(me._unit);\n\t\t\tme._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n\t\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n\t\t\treturn ticksFromTimestamps(ticks, me._majorUnit);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar timeOpts = me.options.time;\n\t\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\n\t\t\tvar value = data.datasets[datasetIndex].data[index];\n\n\t\t\tif (helpers.isObject(value)) {\n\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t}\n\t\t\tif (timeOpts.tooltipFormat) {\n\t\t\t\tlabel = momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n\t\t\t}\n\n\t\t\treturn label;\n\t\t},\n\n\t\t/**\n\t\t * Function to format an individual tick mark\n\t\t * @private\n\t\t */\n\t\ttickFormatFunction: function(tick, index, ticks, formatOverride) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar time = tick.valueOf();\n\t\t\tvar formats = options.time.displayFormats;\n\t\t\tvar minorFormat = formats[me._unit];\n\t\t\tvar majorUnit = me._majorUnit;\n\t\t\tvar majorFormat = formats[majorUnit];\n\t\t\tvar majorTime = tick.clone().startOf(majorUnit).valueOf();\n\t\t\tvar majorTickOpts = options.ticks.major;\n\t\t\tvar major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n\t\t\tvar label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat);\n\t\t\tvar tickOpts = major ? majorTickOpts : options.ticks.minor;\n\t\t\tvar formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\treturn formatter ? formatter(label, index, ticks) : label;\n\t\t},\n\n\t\tconvertTicksToLabels: function(ticks) {\n\t\t\tvar labels = [];\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\tlabels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n\t\t\t}\n\n\t\t\treturn labels;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetPixelForOffset: function(time) {\n\t\t\tvar me = this;\n\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\tvar pos = interpolate(me._table, 'time', time, 'pos');\n\n\t\t\treturn start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n\t\t},\n\n\t\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar time = null;\n\n\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\n\t\t\t}\n\n\t\t\tif (time === null) {\n\t\t\t\ttime = parse(value, me);\n\t\t\t}\n\n\t\t\tif (time !== null) {\n\t\t\t\treturn me.getPixelForOffset(time);\n\t\t\t}\n\t\t},\n\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar ticks = this.getTicks();\n\t\t\treturn index >= 0 && index < ticks.length ?\n\t\t\t\tthis.getPixelForOffset(ticks[index].value) :\n\t\t\t\tnull;\n\t\t},\n\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\tvar pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n\t\t\tvar time = interpolate(me._table, 'pos', pos, 'time');\n\n\t\t\treturn moment(time);\n\t\t},\n\n\t\t/**\n\t\t * Crude approximation of what the label width might be\n\t\t * @private\n\t\t */\n\t\tgetLabelWidth: function(label) {\n\t\t\tvar me = this;\n\t\t\tvar ticksOpts = me.options.ticks;\n\t\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\t\tvar angle = helpers.toRadians(ticksOpts.maxRotation);\n\t\t\tvar cosRotation = Math.cos(angle);\n\t\t\tvar sinRotation = Math.sin(angle);\n\t\t\tvar tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n\t\t\treturn (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetLabelCapacity: function(exampleTime) {\n\t\t\tvar me = this;\n\n\t\t\tvar formatOverride = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\n\t\t\tvar exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride);\n\t\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\treturn Math.floor(innerWidth / tickLabelWidth);\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n};\n\n},{\"1\":1,\"25\":25,\"45\":45}]},{},[7])(7)\n});"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/cartesian/category.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Category · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"linear.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.6.1.1\" data-path=\"category.html\">\n\n                <a href=\"category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"logarithmic.html\">\n\n                <a href=\"logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"time.html\">\n\n                <a href=\"time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../radial/\">\n\n                <a href=\"../radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../radial/linear.html\">\n\n                <a href=\"../radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Category</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"category-cartesian-axis\">Category Cartesian Axis</h1>\n<p>If global configuration is used, labels are drawn from one of the label arrays included in the chart data. If only <code>data.labels</code> is defined, this will be used. If <code>data.xLabels</code> is defined and the axis is horizontal, this will be used. Similarly, if <code>data.yLabels</code> is defined and the axis is vertical, this property will be used. Using both <code>xLabels</code> and <code>yLabels</code> together can create a chart that uses strings for both the X and Y axes.</p>\n<p>Specifying any of the settings above defines the x axis as <code>type: category</code> if not defined otherwise. For more fine-grained control of category labels it is also possible to add <code>labels</code> as part of the category axis definition. Doing so does not apply the global defaults.</p>\n<h2 id=\"category-axis-definition\">Category Axis Definition</h2>\n<p>Globally:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: ...\n    data: {\n        labels: [<span class=\"hljs-string\">&apos;January&apos;</span>, <span class=\"hljs-string\">&apos;February&apos;</span>, <span class=\"hljs-string\">&apos;March&apos;</span>, <span class=\"hljs-string\">&apos;April&apos;</span>, <span class=\"hljs-string\">&apos;May&apos;</span>, <span class=\"hljs-string\">&apos;June&apos;</span>],\n        datasets: ...\n    },\n});\n</code></pre>\n<p>As part of axis definition:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: ...\n    data: ...\n    options: {\n        scales: {\n            xAxes: [{\n                type: <span class=\"hljs-string\">&apos;category&apos;</span>,\n                labels: [<span class=\"hljs-string\">&apos;January&apos;</span>, <span class=\"hljs-string\">&apos;February&apos;</span>, <span class=\"hljs-string\">&apos;March&apos;</span>, <span class=\"hljs-string\">&apos;April&apos;</span>, <span class=\"hljs-string\">&apos;May&apos;</span>, <span class=\"hljs-string\">&apos;June&apos;</span>],\n            }]\n        }\n    }\n});\n</code></pre>\n<h2 id=\"tick-configuration-options\">Tick Configuration Options</h2>\n<p>The category scale provides the following options for configuring tick marks. They are nested in the <code>ticks</code> sub object. These options extend the <a href=\"./#tick-configuration\">common tick configuration</a>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>labels</code></td>\n<td><code>Array[String]</code></td>\n<td>-</td>\n<td>An array of labels to display.</td>\n</tr>\n<tr>\n<td><code>min</code></td>\n<td><code>String</code></td>\n<td></td>\n<td>The minimum item to display. <a href=\"#min-max-configuration\">more...</a></td>\n</tr>\n<tr>\n<td><code>max</code></td>\n<td><code>String</code></td>\n<td></td>\n<td>The maximum item to display. <a href=\"#min-max-configuration\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"min-max-configuration\">Min Max Configuration</h2>\n<p>For both the <code>min</code> and <code>max</code> properties, the value must be in the <code>labels</code> array. In the example below, the x axis would only display &quot;March&quot; through &quot;June&quot;.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: {\n        datasets: [{\n            data: [<span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">30</span>, <span class=\"hljs-number\">40</span>, <span class=\"hljs-number\">50</span>, <span class=\"hljs-number\">60</span>]\n        }],\n        labels: [<span class=\"hljs-string\">&apos;January&apos;</span>, <span class=\"hljs-string\">&apos;February&apos;</span>, <span class=\"hljs-string\">&apos;March&apos;</span>, <span class=\"hljs-string\">&apos;April&apos;</span>, <span class=\"hljs-string\">&apos;May&apos;</span>, <span class=\"hljs-string\">&apos;June&apos;</span>],\n    },\n    options: {\n        scales: {\n            xAxes: [{\n                ticks: {\n                    min: <span class=\"hljs-string\">&apos;March&apos;</span>\n                }\n            }]\n        }\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Cartesian\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"linear.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Linear\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"next\":{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"path\":\"axes/cartesian/linear.md\",\"ref\":\"axes/cartesian/linear.md\",\"articles\":[]},\"previous\":{\"title\":\"Cartesian\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"axes/cartesian/README.md\",\"ref\":\"axes/cartesian/README.md\",\"articles\":[{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"path\":\"axes/cartesian/category.md\",\"ref\":\"axes/cartesian/category.md\",\"articles\":[]},{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"path\":\"axes/cartesian/linear.md\",\"ref\":\"axes/cartesian/linear.md\",\"articles\":[]},{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"path\":\"axes/cartesian/logarithmic.md\",\"ref\":\"axes/cartesian/logarithmic.md\",\"articles\":[]},{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"path\":\"axes/cartesian/time.md\",\"ref\":\"axes/cartesian/time.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/cartesian/category.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/cartesian/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Cartesian · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"category.html\" />\n\n\n    <link rel=\"prev\" href=\"../\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.6.1\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"category.html\">\n\n                <a href=\"category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"logarithmic.html\">\n\n                <a href=\"logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"time.html\">\n\n                <a href=\"time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../radial/\">\n\n                <a href=\"../radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../radial/linear.html\">\n\n                <a href=\"../radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Cartesian</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"cartesian-axes\">Cartesian Axes</h1>\n<p>Axes that follow a cartesian grid are known as &apos;Cartesian Axes&apos;. Cartesian axes are used for line, bar, and bubble charts. Four cartesian axes are included in Chart.js by default.</p>\n<ul>\n<li><a href=\"linear.html#linear-cartesian-axis\">linear</a></li>\n<li><a href=\"logarithmic.html#logarithmic-cartesian-axis\">logarithmic</a></li>\n<li><a href=\"category.html#category-cartesian-axis\">category</a></li>\n<li><a href=\"time.html#time-cartesian-axis\">time</a></li>\n</ul>\n<h1 id=\"common-configuration\">Common Configuration</h1>\n<p>All of the included cartesian axes support a number of common options.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td><code>String</code></td>\n<td></td>\n<td>Type of scale being employed. Custom scales can be created and registered with a string key. This allows changing the type of an axis for a chart.</td>\n</tr>\n<tr>\n<td><code>position</code></td>\n<td><code>String</code></td>\n<td></td>\n<td>Position of the axis in the chart. Possible values are: <code>&apos;top&apos;</code>, <code>&apos;left&apos;</code>, <code>&apos;bottom&apos;</code>, <code>&apos;right&apos;</code></td>\n</tr>\n<tr>\n<td><code>offset</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>If true, extra space is added to the both edges and the axis is scaled to fit into the chart area. This is set to <code>true</code> in the bar chart by default.</td>\n</tr>\n<tr>\n<td><code>id</code></td>\n<td><code>String</code></td>\n<td></td>\n<td>The ID is used to link datasets and scale axes together. <a href=\"#axis-id\">more...</a></td>\n</tr>\n<tr>\n<td><code>gridLines</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>Grid line configuration. <a href=\"../styling.html#grid-line-configuration\">more...</a></td>\n</tr>\n<tr>\n<td><code>scaleLabel</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>Scale title configuration. <a href=\"../labelling.html#scale-title-configuration\">more...</a></td>\n</tr>\n<tr>\n<td><code>ticks</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>Tick configuration. <a href=\"#tick-configuration\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"tick-configuration\">Tick Configuration</h2>\n<p>The following options are common to all cartesian axes but do not apply to other axes.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>autoSkip</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, automatically calculates how many labels that can be shown and hides labels accordingly. Turn it off to show all labels no matter what</td>\n</tr>\n<tr>\n<td><code>autoSkipPadding</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Padding between the ticks on the horizontal axis when <code>autoSkip</code> is enabled. <em>Note: Only applicable to horizontal scales.</em></td>\n</tr>\n<tr>\n<td><code>labelOffset</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Distance in pixels to offset the label from the centre point of the tick (in the y direction for the x axis, and the x direction for the y axis). <em>Note: this can cause labels at the edges to be cropped by the edge of the canvas</em></td>\n</tr>\n<tr>\n<td><code>maxRotation</code></td>\n<td><code>Number</code></td>\n<td><code>90</code></td>\n<td>Maximum rotation for tick labels when rotating to condense labels. Note: Rotation doesn&apos;t occur until necessary. <em>Note: Only applicable to horizontal scales.</em></td>\n</tr>\n<tr>\n<td><code>minRotation</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Minimum rotation for tick labels. <em>Note: Only applicable to horizontal scales.</em></td>\n</tr>\n<tr>\n<td><code>mirror</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>Flips tick labels around axis, displaying the labels inside the chart instead of outside. <em>Note: Only applicable to vertical scales.</em></td>\n</tr>\n<tr>\n<td><code>padding</code></td>\n<td><code>Number</code></td>\n<td><code>10</code></td>\n<td>Padding between the tick label and the axis. When set on a vertical axis, this applies in the horizontal (X) direction. When set on a horizontal axis, this applies in the vertical (Y) direction.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"axis-id\">Axis ID</h2>\n<p>The properties <code>dataset.xAxisID</code> or <code>dataset.yAxisID</code> have to match the scale properties <code>scales.xAxes.id</code> or <code>scales.yAxes.id</code>. This is especially needed if multi-axes charts are used.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: {\n        datasets: [{\n            <span class=\"hljs-comment\">// This dataset appears on the first axis</span>\n            yAxisID: <span class=\"hljs-string\">&apos;first-y-axis&apos;</span>\n        }, {\n            <span class=\"hljs-comment\">// This dataset appears on the second axis</span>\n            yAxisID: <span class=\"hljs-string\">&apos;second-y-axis&apos;</span>\n        }]\n    },\n    options: {\n        scales: {\n            yAxes: [{\n                id: <span class=\"hljs-string\">&apos;first-y-axis&apos;</span>,\n                type: <span class=\"hljs-string\">&apos;linear&apos;</span>\n            }, {\n                id: <span class=\"hljs-string\">&apos;second-y-axis&apos;</span>,\n                type: <span class=\"hljs-string\">&apos;linear&apos;</span>\n            }]\n        }\n    }\n});\n</code></pre>\n<h1 id=\"creating-multiple-axes\">Creating Multiple Axes</h1>\n<p>With cartesian axes, it is possible to create multiple X and Y axes. To do so, you can add multiple configuration objects to the <code>xAxes</code> and <code>yAxes</code> properties. When adding new axes, it is important to ensure that you specify the type of the new axes as default types are <strong>not</strong> used in this case.</p>\n<p>In the example below, we are creating two Y axes. We then use the <code>yAxisID</code> property to map the datasets to their correct axes.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: {\n        datasets: [{\n            data: [<span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">50</span>, <span class=\"hljs-number\">100</span>, <span class=\"hljs-number\">75</span>, <span class=\"hljs-number\">25</span>, <span class=\"hljs-number\">0</span>],\n            label: <span class=\"hljs-string\">&apos;Left dataset&apos;</span>\n\n            <span class=\"hljs-comment\">// This binds the dataset to the left y axis</span>\n            yAxisID: <span class=\"hljs-string\">&apos;left-y-axis&apos;</span>\n        }, {\n            data: [<span class=\"hljs-number\">0.1</span>, <span class=\"hljs-number\">0.5</span>, <span class=\"hljs-number\">1.0</span>, <span class=\"hljs-number\">2.0</span>, <span class=\"hljs-number\">1.5</span>, <span class=\"hljs-number\">0</span>]\n            label: <span class=\"hljs-string\">&apos;Right dataset&apos;</span>\n\n            <span class=\"hljs-comment\">// This binds the dataset to the right y axis</span>\n            yAxisID: <span class=\"hljs-string\">&apos;right-y-axis&apos;</span>,\n        }],\n        labels: [<span class=\"hljs-string\">&apos;Jan&apos;</span>, <span class=\"hljs-string\">&apos;Feb&apos;</span>, <span class=\"hljs-string\">&apos;Mar&apos;</span>, <span class=\"hljs-string\">&apos;Apr&apos;</span>, <span class=\"hljs-string\">&apos;May&apos;</span>, <span class=\"hljs-string\">&apos;Jun&apos;</span>]\n    },\n    options: {\n        scales: {\n            yAxes: [{\n                id: <span class=\"hljs-string\">&apos;left-y-axis&apos;</span>,\n                type: <span class=\"hljs-string\">&apos;linear&apos;</span>,\n                position: <span class=\"hljs-string\">&apos;left&apos;</span>\n            }, {\n                id: <span class=\"hljs-string\">&apos;right-y-axis&apos;</span>,\n                type: <span class=\"hljs-string\">&apos;linear&apos;</span>,\n                position: <span class=\"hljs-string\">&apos;right&apos;</span>\n            }]\n        }\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Axes\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"category.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Category\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Cartesian\",\"level\":\"1.6.1\",\"depth\":2,\"next\":{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"path\":\"axes/cartesian/category.md\",\"ref\":\"axes/cartesian/category.md\",\"articles\":[]},\"previous\":{\"title\":\"Axes\",\"level\":\"1.6\",\"depth\":1,\"path\":\"axes/README.md\",\"ref\":\"axes/README.md\",\"articles\":[{\"title\":\"Cartesian\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"axes/cartesian/README.md\",\"ref\":\"axes/cartesian/README.md\",\"articles\":[{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"path\":\"axes/cartesian/category.md\",\"ref\":\"axes/cartesian/category.md\",\"articles\":[]},{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"path\":\"axes/cartesian/linear.md\",\"ref\":\"axes/cartesian/linear.md\",\"articles\":[]},{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"path\":\"axes/cartesian/logarithmic.md\",\"ref\":\"axes/cartesian/logarithmic.md\",\"articles\":[]},{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"path\":\"axes/cartesian/time.md\",\"ref\":\"axes/cartesian/time.md\",\"articles\":[]}]},{\"title\":\"Radial\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"axes/radial/README.md\",\"ref\":\"axes/radial/README.md\",\"articles\":[{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"path\":\"axes/radial/linear.md\",\"ref\":\"axes/radial/linear.md\",\"articles\":[]}]},{\"title\":\"Labelling\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"axes/labelling.md\",\"ref\":\"axes/labelling.md\",\"articles\":[]},{\"title\":\"Styling\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"axes/styling.md\",\"ref\":\"axes/styling.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/cartesian/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/cartesian/linear.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Linear · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"logarithmic.html\" />\n\n\n    <link rel=\"prev\" href=\"category.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"category.html\">\n\n                <a href=\"category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6.1.2\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"logarithmic.html\">\n\n                <a href=\"logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"time.html\">\n\n                <a href=\"time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../radial/\">\n\n                <a href=\"../radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../radial/linear.html\">\n\n                <a href=\"../radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Linear</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"linear-cartesian-axis\">Linear Cartesian Axis</h1>\n<p>The linear scale is use to chart numerical data. It can be placed on either the x or y axis. The scatter chart type automatically configures a line chart to use one of these scales for the x axis. As the name suggests, linear interpolation is used to determine where a value lies on the axis.</p>\n<h2 id=\"tick-configuration-options\">Tick Configuration Options</h2>\n<p>The following options are provided by the linear scale. They are all located in the <code>ticks</code> sub options. These options extend the <a href=\"./#tick-configuration\">common tick configuration</a>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>beginAtZero</code></td>\n<td><code>Boolean</code></td>\n<td></td>\n<td>if true, scale will include 0 if it is not already included.</td>\n</tr>\n<tr>\n<td><code>min</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined minimum number for the scale, overrides minimum value from data. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>max</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined maximum number for the scale, overrides maximum value from data. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>maxTicksLimit</code></td>\n<td><code>Number</code></td>\n<td><code>11</code></td>\n<td>Maximum number of ticks and gridlines to show.</td>\n</tr>\n<tr>\n<td><code>stepSize</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined fixed step size for the scale. <a href=\"#step-size\">more...</a></td>\n</tr>\n<tr>\n<td><code>suggestedMax</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>Adjustment used when calculating the maximum data value. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>suggestedMin</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>Adjustment used when calculating the minimum data value. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"axis-range-settings\">Axis Range Settings</h2>\n<p>Given the number of axis range settings, it is important to understand how they all interact with each other.</p>\n<p>The <code>suggestedMax</code> and <code>suggestedMin</code> settings only change the data values that are used to scale the axis. These are useful for extending the range of the axis while maintaing the auto fit behaviour.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> minDataValue = <span class=\"hljs-built_in\">Math</span>.min(mostNegativeValue, options.ticks.suggestedMin);\n<span class=\"hljs-keyword\">let</span> maxDataValue = <span class=\"hljs-built_in\">Math</span>.max(mostPositiveValue, options.ticks.suggestedMax);\n</code></pre>\n<p>In this example, the largest positive value is 50, but the data maximum is expanded out to 100. However, because the lowest data value is below the <code>suggestedMin</code> setting, it is ignored.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: {\n        datasets: [{\n            label: <span class=\"hljs-string\">&apos;First dataset&apos;</span>,\n            data: [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">40</span>, <span class=\"hljs-number\">50</span>]\n        }],\n        labels: [<span class=\"hljs-string\">&apos;January&apos;</span>, <span class=\"hljs-string\">&apos;February&apos;</span>, <span class=\"hljs-string\">&apos;March&apos;</span>, <span class=\"hljs-string\">&apos;April&apos;</span>]\n    },\n    options: {\n        scales: {\n            yAxes: [{\n                ticks: {\n                    suggestedMin: <span class=\"hljs-number\">50</span>\n                    suggestedMax: <span class=\"hljs-number\">100</span>\n                }\n            }]\n        }\n    }\n});\n</code></pre>\n<p>In contrast to the <code>suggested*</code> settings, the <code>min</code> and <code>max</code> settings set explicit ends to the axes. When these are set, some data points may not be visible.</p>\n<h2 id=\"step-size\">Step Size</h2>\n<p> If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm.</p>\n<p>This example sets up a chart with a y axis that creates ticks at <code>0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5</code>.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> options = {\n    scales: {\n        yAxes: [{\n            ticks: {\n                max: <span class=\"hljs-number\">5</span>,\n                min: <span class=\"hljs-number\">0</span>,\n                stepSize: <span class=\"hljs-number\">0.5</span>\n            }\n        }]\n    }\n};\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"category.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Category\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"logarithmic.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Logarithmic\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"next\":{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"path\":\"axes/cartesian/logarithmic.md\",\"ref\":\"axes/cartesian/logarithmic.md\",\"articles\":[]},\"previous\":{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"path\":\"axes/cartesian/category.md\",\"ref\":\"axes/cartesian/category.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/cartesian/linear.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/cartesian/logarithmic.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Logarithmic · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"time.html\" />\n\n\n    <link rel=\"prev\" href=\"linear.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"category.html\">\n\n                <a href=\"category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6.1.3\" data-path=\"logarithmic.html\">\n\n                <a href=\"logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"time.html\">\n\n                <a href=\"time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../radial/\">\n\n                <a href=\"../radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../radial/linear.html\">\n\n                <a href=\"../radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Logarithmic</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"logarithmic-cartesian-axis\">Logarithmic Cartesian Axis</h1>\n<p>The logarithmic scale is use to chart numerical data. It can be placed on either the x or y axis. As the name suggests, logarithmic interpolation is used to determine where a value lies on the axis.</p>\n<h2 id=\"tick-configuration-options\">Tick Configuration Options</h2>\n<p>The following options are provided by the logarithmic scale. They are all located in the <code>ticks</code> sub options. These options extend the <a href=\"./#tick-configuration\">common tick configuration</a>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>min</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined minimum number for the scale, overrides minimum value from data.</td>\n</tr>\n<tr>\n<td><code>max</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined maximum number for the scale, overrides maximum value from data.</td>\n</tr>\n</tbody>\n</table>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"linear.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Linear\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"time.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Time\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"next\":{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"path\":\"axes/cartesian/time.md\",\"ref\":\"axes/cartesian/time.md\",\"articles\":[]},\"previous\":{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"path\":\"axes/cartesian/linear.md\",\"ref\":\"axes/cartesian/linear.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/cartesian/logarithmic.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/cartesian/time.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Time · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../radial/\" />\n\n\n    <link rel=\"prev\" href=\"logarithmic.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"category.html\">\n\n                <a href=\"category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"logarithmic.html\">\n\n                <a href=\"logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6.1.4\" data-path=\"time.html\">\n\n                <a href=\"time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../radial/\">\n\n                <a href=\"../radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../radial/linear.html\">\n\n                <a href=\"../radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Time</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"time-cartesian-axis\">Time Cartesian Axis</h1>\n<p>The time scale is used to display times and dates. When building its ticks, it will automatically calculate the most comfortable unit base on the size of the scale.</p>\n<h2 id=\"data-sets\">Data Sets</h2>\n<h3 id=\"input-data\">Input Data</h3>\n<p>The x-axis data points may additionally be specified via the <code>t</code> attribute when using the time scale.</p>\n<pre><code>data: [{\n    x: new Date(),\n    y: 1\n}, {\n    t: new Date(),\n    y: 10\n}]\n</code></pre><h3 id=\"date-formats\">Date Formats</h3>\n<p>When providing data for the time scale, Chart.js supports all of the formats that Moment.js accepts. See <a href=\"http://momentjs.com/docs/#/parsing/\" target=\"_blank\">Moment.js docs</a> for details.</p>\n<h2 id=\"configuration-options\">Configuration Options</h2>\n<p>The following options are provided by the time scale. You may also set options provided by the <a href=\"./#tick-configuration\">common tick configuration</a>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>distribution</code></td>\n<td><code>String</code></td>\n<td><code>linear</code></td>\n<td>How data is plotted. <a href=\"#scale-distribution\">more...</a></td>\n</tr>\n<tr>\n<td><code>bounds</code></td>\n<td><code>String</code></td>\n<td><code>data</code></td>\n<td>Determines the scale bounds. <a href=\"#scale-bounds\">more...</a></td>\n</tr>\n<tr>\n<td><code>ticks.source</code></td>\n<td><code>String</code></td>\n<td><code>auto</code></td>\n<td>How ticks are generated. <a href=\"#ticks-source\">more...</a></td>\n</tr>\n<tr>\n<td><code>time.displayFormats</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>Sets how different time units are displayed. <a href=\"#display-formats\">more...</a></td>\n</tr>\n<tr>\n<td><code>time.isoWeekday</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>If true and the unit is set to &apos;week&apos;, then the first day of the week will be Monday. Otherwise, it will be Sunday.</td>\n</tr>\n<tr>\n<td><code>time.max</code></td>\n<td><a href=\"#date-formats\">Time</a></td>\n<td></td>\n<td>If defined, this will override the data maximum</td>\n</tr>\n<tr>\n<td><code>time.min</code></td>\n<td><a href=\"#date-formats\">Time</a></td>\n<td></td>\n<td>If defined, this will override the data minimum</td>\n</tr>\n<tr>\n<td><code>time.parser</code></td>\n<td><code>String/Function</code></td>\n<td></td>\n<td>Custom parser for dates. <a href=\"#parser\">more...</a></td>\n</tr>\n<tr>\n<td><code>time.round</code></td>\n<td><code>String</code></td>\n<td><code>false</code></td>\n<td>If defined, dates will be rounded to the start of this unit. See <a href=\"#time-units\">Time Units</a> below for the allowed units.</td>\n</tr>\n<tr>\n<td><code>time.tooltipFormat</code></td>\n<td><code>String</code></td>\n<td></td>\n<td>The moment js format string to use for the tooltip.</td>\n</tr>\n<tr>\n<td><code>time.unit</code></td>\n<td><code>String</code></td>\n<td><code>false</code></td>\n<td>If defined, will force the unit to be a certain type. See <a href=\"#time-units\">Time Units</a> section below for details.</td>\n</tr>\n<tr>\n<td><code>time.stepSize</code></td>\n<td><code>Number</code></td>\n<td><code>1</code></td>\n<td>The number of units between grid lines.</td>\n</tr>\n<tr>\n<td><code>time.minUnit</code></td>\n<td><code>String</code></td>\n<td><code>&apos;millisecond&apos;</code></td>\n<td>The minimum display format to be used for a time unit.</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"time-units\">Time Units</h3>\n<p>The following time measurements are supported. The names can be passed as strings to the <code>time.unit</code> config option to force a certain unit.</p>\n<ul>\n<li>millisecond</li>\n<li>second</li>\n<li>minute</li>\n<li>hour</li>\n<li>day</li>\n<li>week</li>\n<li>month</li>\n<li>quarter</li>\n<li>year</li>\n</ul>\n<p>For example, to create a chart with a time scale that always displayed units per month, the following config could be used.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        scales: {\n            xAxes: [{\n                time: {\n                    unit: <span class=\"hljs-string\">&apos;month&apos;</span>\n                }\n            }]\n        }\n    }\n})\n</code></pre>\n<h3 id=\"display-formats\">Display Formats</h3>\n<p>The following display formats are used to configure how different time units are formed into strings for the axis tick marks. See <a href=\"http://momentjs.com/docs/#/displaying/format/\" target=\"_blank\">moment.js</a> for the allowable format strings.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Default</th>\n<th>Example</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>millisecond</td>\n<td>&apos;h:mm:ss.SSS a&apos;</td>\n<td>11:20:01.123 AM</td>\n</tr>\n<tr>\n<td>second</td>\n<td>&apos;h:mm:ss a&apos;</td>\n<td>11:20:01 AM</td>\n</tr>\n<tr>\n<td>minute</td>\n<td>&apos;h:mm a&apos;</td>\n<td>11:20 AM</td>\n</tr>\n<tr>\n<td>hour</td>\n<td>&apos;hA&apos;</td>\n<td>11AM</td>\n</tr>\n<tr>\n<td>day</td>\n<td>&apos;MMM D&apos;</td>\n<td>Sep 4</td>\n</tr>\n<tr>\n<td>week</td>\n<td>&apos;ll&apos;</td>\n<td>Sep 4 2015</td>\n</tr>\n<tr>\n<td>month</td>\n<td>&apos;MMM YYYY&apos;</td>\n<td>Sep 2015</td>\n</tr>\n<tr>\n<td>quarter</td>\n<td>&apos;[Q]Q - YYYY&apos;</td>\n<td>Q3 - 2015</td>\n</tr>\n<tr>\n<td>year</td>\n<td>&apos;YYYY&apos;</td>\n<td>2015</td>\n</tr>\n</tbody>\n</table>\n<p>For example, to set the display format for the &apos;quarter&apos; unit to show the month and year, the following config would be passed to the chart constructor.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        scales: {\n            xAxes: [{\n                type: <span class=\"hljs-string\">&apos;time&apos;</span>,\n                time: {\n                    displayFormats: {\n                        quarter: <span class=\"hljs-string\">&apos;MMM YYYY&apos;</span>\n                    }\n                }\n            }]\n        }\n    }\n})\n</code></pre>\n<h3 id=\"scale-distribution\">Scale Distribution</h3>\n<p>The <code>distribution</code> property controls the data distribution along the scale:</p>\n<ul>\n<li><code>&apos;linear&apos;</code>: data are spread according to their time (distances can vary)</li>\n<li><code>&apos;series&apos;</code>: data are spread at the same distance from each other</li>\n</ul>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        scales: {\n            xAxes: [{\n                type: <span class=\"hljs-string\">&apos;time&apos;</span>,\n                distribution: <span class=\"hljs-string\">&apos;series&apos;</span>\n            }]\n        }\n    }\n})\n</code></pre>\n<h3 id=\"scale-bounds\">Scale Bounds</h3>\n<p>The <code>bounds</code> property controls the scale boundary strategy (bypassed by min/max time options)</p>\n<ul>\n<li><code>&apos;data&apos;</code>: make sure data are fully visible, labels outside are removed</li>\n<li><code>&apos;ticks&apos;</code>: make sure ticks are fully visible, data outside are truncated</li>\n</ul>\n<h3 id=\"ticks-source\">Ticks Source</h3>\n<p>The <code>ticks.source</code> property controls the ticks generation</p>\n<ul>\n<li><code>&apos;auto&apos;</code>: generates &quot;optimal&quot; ticks based on scale size and time options.</li>\n<li><code>&apos;data&apos;</code>: generates ticks from data (including labels from data <code>{t|x|y}</code> objects)</li>\n<li><code>&apos;labels&apos;</code>: generates ticks from user given <code>data.labels</code> values ONLY</li>\n</ul>\n<h3 id=\"parser\">Parser</h3>\n<p>If this property is defined as a string, it is interpreted as a custom format to be used by moment to parse the date. </p>\n<p>If this is a function, it must return a moment.js object given the appropriate data value.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"logarithmic.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Logarithmic\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../radial/\" class=\"navigation navigation-next \" aria-label=\"Next page: Radial\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"next\":{\"title\":\"Radial\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"axes/radial/README.md\",\"ref\":\"axes/radial/README.md\",\"articles\":[{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"path\":\"axes/radial/linear.md\",\"ref\":\"axes/radial/linear.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"path\":\"axes/cartesian/logarithmic.md\",\"ref\":\"axes/cartesian/logarithmic.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/cartesian/time.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Axes · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"cartesian/\" />\n\n\n    <link rel=\"prev\" href=\"../charts/mixed.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"cartesian/\">\n\n                <a href=\"cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"cartesian/category.html\">\n\n                <a href=\"cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"cartesian/linear.html\">\n\n                <a href=\"cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"cartesian/logarithmic.html\">\n\n                <a href=\"cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"cartesian/time.html\">\n\n                <a href=\"cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"radial/\">\n\n                <a href=\"radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"radial/linear.html\">\n\n                <a href=\"radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"labelling.html\">\n\n                <a href=\"labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"styling.html\">\n\n                <a href=\"styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Axes</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"axes\">Axes</h1>\n<p>Axes are an integral part of a chart. They are used to determine how data maps to a pixel value on the chart. In a cartesian chart, there is 1 or more X axis and 1 or more Y axis to map points onto the 2 dimensional canvas. These axes are know as <a href=\"cartesian/#cartesian-axes\">&apos;cartesian axes&apos;</a>.</p>\n<p>In a radial chart, such as a radar chart or a polar area chart, there is a single axis that maps points in the angular and radial directions. These are known as <a href=\"radial/#radial-axes\">&apos;radial axes&apos;</a>.</p>\n<p>Scales in Chart.js &gt;V2.0 are significantly more powerful, but also different than those of v1.0.</p>\n<ul>\n<li>Multiple X &amp; Y axes are supported.</li>\n<li>A built-in label auto-skip feature detects would-be overlapping ticks and labels and removes every nth label to keep things displaying normally.</li>\n<li>Scale titles are supported</li>\n<li>New scale types can be extended without writing an entirely new chart type</li>\n</ul>\n<h1 id=\"common-configuration\">Common Configuration</h1>\n<p>The following properties are common to all axes provided by Chart.js</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If set to <code>false</code> the axis is hidden from view. Overrides <em>gridLines.display</em>, <em>scaleLabel.display</em>, and <em>ticks.display</em>.</td>\n</tr>\n<tr>\n<td><code>callbacks</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>Callback functions to hook into the axis lifecycle. <a href=\"#callbacks\">more...</a></td>\n</tr>\n<tr>\n<td><code>weight</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>The weight used to sort the axis. Higher weights are further away from the chart area.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"callbacks\">Callbacks</h2>\n<p>There are a number of config callbacks that can be used to change parameters in the scale at different points in the update process.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Arguments</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>beforeUpdate</code></td>\n<td><code>axis</code></td>\n<td>Callback called before the update process starts.</td>\n</tr>\n<tr>\n<td><code>beforeSetDimensions</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs before dimensions are set. </td>\n</tr>\n<tr>\n<td><code>afterSetDimensions</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs after dimensions are set.</td>\n</tr>\n<tr>\n<td><code>beforeDataLimits</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs before data limits are determined.</td>\n</tr>\n<tr>\n<td><code>afterDataLimits</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs after data limits are determined.</td>\n</tr>\n<tr>\n<td><code>beforeBuildTicks</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs before ticks are created.</td>\n</tr>\n<tr>\n<td><code>afterBuildTicks</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs after ticks are created. Useful for filtering ticks.</td>\n</tr>\n<tr>\n<td><code>beforeTickToLabelConversion</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs before ticks are converted into strings.</td>\n</tr>\n<tr>\n<td><code>afterTickToLabelConversion</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs after ticks are converted into strings. </td>\n</tr>\n<tr>\n<td><code>beforeCalculateTickRotation</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs before tick rotation is determined.</td>\n</tr>\n<tr>\n<td><code>afterCalculateTickRotation</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs after tick rotation is determined.</td>\n</tr>\n<tr>\n<td><code>beforeFit</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs before the scale fits to the canvas. </td>\n</tr>\n<tr>\n<td><code>afterFit</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs after the scale fits to the canvas. </td>\n</tr>\n<tr>\n<td><code>afterUpdate</code></td>\n<td><code>axis</code></td>\n<td>Callback that runs at the end of the update process.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"updating-axis-defaults\">Updating Axis Defaults</h2>\n<p>The default configuration for a scale can be easily changed using the scale service. All you need to do is to pass in a partial configuration that will be merged with the current scale default configuration to form the new default.</p>\n<p>For example, to set the minimum value of 0 for all linear scales, you would do the following. Any linear scales created after this time would now have a minimum of 0.</p>\n<pre><code class=\"lang-javascript\">Chart.scaleService.updateScaleDefaults(<span class=\"hljs-string\">&apos;linear&apos;</span>, {\n    ticks: {\n        min: <span class=\"hljs-number\">0</span>\n    }\n});\n</code></pre>\n<h2 id=\"creating-new-axes\">Creating New Axes</h2>\n<p>To create a new axis, see the <a href=\"../developers/axes.html\">developer docs</a>.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../charts/mixed.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Mixed\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"cartesian/\" class=\"navigation navigation-next \" aria-label=\"Next page: Cartesian\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Axes\",\"level\":\"1.6\",\"depth\":1,\"next\":{\"title\":\"Cartesian\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"axes/cartesian/README.md\",\"ref\":\"axes/cartesian/README.md\",\"articles\":[{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"path\":\"axes/cartesian/category.md\",\"ref\":\"axes/cartesian/category.md\",\"articles\":[]},{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"path\":\"axes/cartesian/linear.md\",\"ref\":\"axes/cartesian/linear.md\",\"articles\":[]},{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"path\":\"axes/cartesian/logarithmic.md\",\"ref\":\"axes/cartesian/logarithmic.md\",\"articles\":[]},{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"path\":\"axes/cartesian/time.md\",\"ref\":\"axes/cartesian/time.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Mixed\",\"level\":\"1.5.9\",\"depth\":2,\"path\":\"charts/mixed.md\",\"ref\":\"charts/mixed.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/labelling.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Labelling · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"styling.html\" />\n\n\n    <link rel=\"prev\" href=\"radial/linear.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"cartesian/\">\n\n                <a href=\"cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"cartesian/category.html\">\n\n                <a href=\"cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"cartesian/linear.html\">\n\n                <a href=\"cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"cartesian/logarithmic.html\">\n\n                <a href=\"cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"cartesian/time.html\">\n\n                <a href=\"cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"radial/\">\n\n                <a href=\"radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"radial/linear.html\">\n\n                <a href=\"radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6.3\" data-path=\"labelling.html\">\n\n                <a href=\"labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"styling.html\">\n\n                <a href=\"styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Labelling</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"labeling-axes\">Labeling Axes</h1>\n<p>When creating a chart, you want to tell the viewer what data they are viewing. To do this, you need to label the axis.</p>\n<h2 id=\"scale-title-configuration\">Scale Title Configuration</h2>\n<p>The scale label configuration is nested under the scale configuration in the <code>scaleLabel</code> key. It defines options for the scale title. Note that this only applies to cartesian axes.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>If true, display the axis title.</td>\n</tr>\n<tr>\n<td><code>labelString</code></td>\n<td><code>String</code></td>\n<td><code>&apos;&apos;</code></td>\n<td>The text for the title. (i.e. &quot;# of People&quot; or &quot;Response Choices&quot;).</td>\n</tr>\n<tr>\n<td><code>lineHeight</code></td>\n<td><code>Number/String</code></td>\n<td><code>1.2</code></td>\n<td>Height of an individual line of text (see <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\" target=\"_blank\">MDN</a>)</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Font color for scale title.</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family for the scale title, follows CSS font-family options.</td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Font size for scale title.</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Font style for the scale title, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).</td>\n</tr>\n<tr>\n<td><code>padding</code></td>\n<td><code>Number/Object</code></td>\n<td><code>4</code></td>\n<td>Padding to apply around scale labels. Only <code>top</code> and <code>bottom</code> are implemented.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"creating-custom-tick-formats\">Creating Custom Tick Formats</h2>\n<p>It is also common to want to change the tick marks to include information about the data type. For example, adding a dollar sign (&apos;$&apos;). To do this, you need to override the <code>ticks.callback</code> method in the axis configuration.\nIn the following example, every label of the Y axis would be displayed with a dollar sign at the front..</p>\n<p>If the callback returns <code>null</code> or <code>undefined</code> the associated grid line will be hidden.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        scales: {\n            yAxes: [{\n                ticks: {\n                    <span class=\"hljs-comment\">// Include a dollar sign in the ticks</span>\n                    callback: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, index, values</span>) </span>{\n                        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">&apos;$&apos;</span> + value;\n                    }\n                }\n            }]\n        }\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"radial/linear.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Linear\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"styling.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Styling\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Labelling\",\"level\":\"1.6.3\",\"depth\":2,\"next\":{\"title\":\"Styling\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"axes/styling.md\",\"ref\":\"axes/styling.md\",\"articles\":[]},\"previous\":{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"path\":\"axes/radial/linear.md\",\"ref\":\"axes/radial/linear.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/labelling.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/radial/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Radial · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"linear.html\" />\n\n\n    <link rel=\"prev\" href=\"../cartesian/time.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../cartesian/\">\n\n                <a href=\"../cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../cartesian/category.html\">\n\n                <a href=\"../cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../cartesian/linear.html\">\n\n                <a href=\"../cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../cartesian/logarithmic.html\">\n\n                <a href=\"../cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../cartesian/time.html\">\n\n                <a href=\"../cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Radial</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"radial-axes\">Radial Axes</h1>\n<p>Radial axes are used specifically for the radar and polar area chart types. These axes overlay the chart area, rather than being positioned on one of the edges. One radial axis is included by default in Chart.js.</p>\n<ul>\n<li><a href=\"linear.html#linear-radial-axis\">linear</a></li>\n</ul>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../cartesian/time.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Time\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"linear.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Linear\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Radial\",\"level\":\"1.6.2\",\"depth\":2,\"next\":{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"path\":\"axes/radial/linear.md\",\"ref\":\"axes/radial/linear.md\",\"articles\":[]},\"previous\":{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"path\":\"axes/cartesian/time.md\",\"ref\":\"axes/cartesian/time.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/radial/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/radial/linear.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Linear · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../labelling.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../../general/\">\n\n                <a href=\"../../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../../general/responsive.html\">\n\n                <a href=\"../../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../../general/interactions/\">\n\n                <a href=\"../../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../../general/interactions/events.html\">\n\n                <a href=\"../../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../../general/interactions/modes.html\">\n\n                <a href=\"../../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../../general/options.html\">\n\n                <a href=\"../../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../../general/colors.html\">\n\n                <a href=\"../../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../../general/fonts.html\">\n\n                <a href=\"../../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../cartesian/\">\n\n                <a href=\"../cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../cartesian/category.html\">\n\n                <a href=\"../cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../cartesian/linear.html\">\n\n                <a href=\"../cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../cartesian/logarithmic.html\">\n\n                <a href=\"../cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../cartesian/time.html\">\n\n                <a href=\"../cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.6.2.1\" data-path=\"linear.html\">\n\n                <a href=\"linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../labelling.html\">\n\n                <a href=\"../labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../styling.html\">\n\n                <a href=\"../styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Linear</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"linear-radial-axis\">Linear Radial Axis</h1>\n<p>The linear scale is use to chart numerical data. As the name suggests, linear interpolation is used to determine where a value lies in relation the center of the axis.</p>\n<p>The following additional configuration options are provided by the radial linear scale.</p>\n<h2 id=\"configuration-options\">Configuration Options</h2>\n<p>The axis has configuration properties for ticks, angle lines (line that appear in a radar chart outward from the center), pointLabels (labels around the edge in a radar chart). The following sections define each of the properties in those sections.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>angleLines</code></td>\n<td><code>Object</code></td>\n<td>Angle line configuration. <a href=\"#angle-line-options\">more...</a></td>\n</tr>\n<tr>\n<td><code>gridLines</code></td>\n<td><code>Object</code></td>\n<td>Grid line configuration. <a href=\"../styling.html#grid-line-configuration\">more...</a></td>\n</tr>\n<tr>\n<td><code>pointLabels</code></td>\n<td><code>Object</code></td>\n<td>Point label configuration. <a href=\"#point-label-options\">more...</a></td>\n</tr>\n<tr>\n<td><code>ticks</code></td>\n<td><code>Object</code></td>\n<td>Tick configuration. <a href=\"#tick-options\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"tick-options\">Tick Options</h2>\n<p>The following options are provided by the linear scale. They are all located in the <code>ticks</code> sub options. The <a href=\"../styling.html#tick-configuration\">common tick configuration</a> options are supported by this axis.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>backdropColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(255, 255, 255, 0.75)&apos;</code></td>\n<td>Color of label backdrops</td>\n</tr>\n<tr>\n<td><code>backdropPaddingX</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Horizontal padding of label backdrop.</td>\n</tr>\n<tr>\n<td><code>backdropPaddingY</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Vertical padding of label backdrop.</td>\n</tr>\n<tr>\n<td><code>beginAtZero</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>if true, scale will include 0 if it is not already included.</td>\n</tr>\n<tr>\n<td><code>min</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined minimum number for the scale, overrides minimum value from data. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>max</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined maximum number for the scale, overrides maximum value from data. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>maxTicksLimit</code></td>\n<td><code>Number</code></td>\n<td><code>11</code></td>\n<td>Maximum number of ticks and gridlines to show.</td>\n</tr>\n<tr>\n<td><code>stepSize</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>User defined fixed step size for the scale. <a href=\"#step-size\">more...</a></td>\n</tr>\n<tr>\n<td><code>suggestedMax</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>Adjustment used when calculating the maximum data value. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>suggestedMin</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>Adjustment used when calculating the minimum data value. <a href=\"#axis-range-settings\">more...</a></td>\n</tr>\n<tr>\n<td><code>showLabelBackdrop</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, draw a background behind the tick labels</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"axis-range-settings\">Axis Range Settings</h2>\n<p>Given the number of axis range settings, it is important to understand how they all interact with each other.</p>\n<p>The <code>suggestedMax</code> and <code>suggestedMin</code> settings only change the data values that are used to scale the axis. These are useful for extending the range of the axis while maintaing the auto fit behaviour.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> minDataValue = <span class=\"hljs-built_in\">Math</span>.min(mostNegativeValue, options.ticks.suggestedMin);\n<span class=\"hljs-keyword\">let</span> maxDataValue = <span class=\"hljs-built_in\">Math</span>.max(mostPositiveValue, options.ticks.suggestedMax);\n</code></pre>\n<p>In this example, the largest positive value is 50, but the data maximum is expanded out to 100. However, because the lowest data value is below the <code>suggestedMin</code> setting, it is ignored.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;radar&apos;</span>,\n    data: {\n        datasets: [{\n            label: <span class=\"hljs-string\">&apos;First dataset&apos;</span>,\n            data: [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">40</span>, <span class=\"hljs-number\">50</span>]\n        }],\n        labels: [<span class=\"hljs-string\">&apos;January&apos;</span>, <span class=\"hljs-string\">&apos;February&apos;</span>, <span class=\"hljs-string\">&apos;March&apos;</span>, <span class=\"hljs-string\">&apos;April&apos;</span>]\n    },\n    options: {\n        scale: {\n            ticks: {\n                suggestedMin: <span class=\"hljs-number\">50</span>\n                suggestedMax: <span class=\"hljs-number\">100</span>\n            }\n        }\n    }\n});\n</code></pre>\n<p>In contrast to the <code>suggested*</code> settings, the <code>min</code> and <code>max</code> settings set explicit ends to the axes. When these are set, some data points may not be visible.</p>\n<h2 id=\"step-size\">Step Size</h2>\n<p> If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm.</p>\n<p>This example sets up a chart with a y axis that creates ticks at <code>0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5</code>.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> options = {\n    scales: {\n        yAxes: [{\n            ticks: {\n                max: <span class=\"hljs-number\">5</span>,\n                min: <span class=\"hljs-number\">0</span>,\n                stepSize: <span class=\"hljs-number\">0.5</span>\n            }\n        }]\n    }\n};\n</code></pre>\n<h2 id=\"angle-line-options\">Angle Line Options</h2>\n<p>The following options are used to configure angled lines that radiate from the center of the chart to the point labels. They can be found in the <code>angleLines</code> sub options. Note that these options only apply if <code>angleLines.display</code> is true.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>if true, angle lines are shown</td>\n</tr>\n<tr>\n<td><code>color</code></td>\n<td><code>Color</code></td>\n<td><code>rgba(0, 0, 0, 0.1)</code></td>\n<td>Color of angled lines</td>\n</tr>\n<tr>\n<td><code>lineWidth</code></td>\n<td><code>Number</code></td>\n<td><code>1</code></td>\n<td>Width of angled lines</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"point-label-options\">Point Label Options</h2>\n<p>The following options are used to configure the point labels that are shown on the perimeter of the scale. They can be found in the <code>pointLabels</code> sub options. Note that these options only apply if <code>pointLabels.display</code> is true.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>callback</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Callback function to transform data labels to point labels. The default implementation simply returns the current string.</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Font color for point labels.</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family to use when rendering labels.</td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td>10</td>\n<td>font size in pixels</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Font style to use when rendering point labels.</td>\n</tr>\n</tbody>\n</table>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Radial\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../labelling.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Labelling\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"next\":{\"title\":\"Labelling\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"axes/labelling.md\",\"ref\":\"axes/labelling.md\",\"articles\":[]},\"previous\":{\"title\":\"Radial\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"axes/radial/README.md\",\"ref\":\"axes/radial/README.md\",\"articles\":[{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"path\":\"axes/radial/linear.md\",\"ref\":\"axes/radial/linear.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/radial/linear.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/axes/styling.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Styling · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../developers/\" />\n\n\n    <link rel=\"prev\" href=\"labelling.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"cartesian/\">\n\n                <a href=\"cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"cartesian/category.html\">\n\n                <a href=\"cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"cartesian/linear.html\">\n\n                <a href=\"cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"cartesian/logarithmic.html\">\n\n                <a href=\"cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"cartesian/time.html\">\n\n                <a href=\"cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"radial/\">\n\n                <a href=\"radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"radial/linear.html\">\n\n                <a href=\"radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"labelling.html\">\n\n                <a href=\"labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.6.4\" data-path=\"styling.html\">\n\n                <a href=\"styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Styling</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"styling\">Styling</h1>\n<p>There are a number of options to allow styling an axis. There are settings to control <a href=\"#grid-line-configuration\">grid lines</a> and <a href=\"#tick-configuration\">ticks</a>.</p>\n<h2 id=\"grid-line-configuration\">Grid Line Configuration</h2>\n<p>The grid line configuration is nested under the scale configuration in the <code>gridLines</code> key. It defines options for the grid lines that run perpendicular to the axis.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If false, do not display grid lines for this axis.</td>\n</tr>\n<tr>\n<td><code>color</code></td>\n<td><code>Color/Color[]</code></td>\n<td><code>&apos;rgba(0, 0, 0, 0.1)&apos;</code></td>\n<td>The color of the grid lines. If specified as an array, the first color applies to the first grid line, the second to the second grid line and so on.</td>\n</tr>\n<tr>\n<td><code>borderDash</code></td>\n<td><code>Number[]</code></td>\n<td><code>[]</code></td>\n<td>Length and spacing of dashes on grid lines. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderDashOffset</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Offset for line dashes. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>lineWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td><code>1</code></td>\n<td>Stroke width of grid lines.</td>\n</tr>\n<tr>\n<td><code>drawBorder</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, draw border at the edge between the axis and the chart area.</td>\n</tr>\n<tr>\n<td><code>drawOnChartArea</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, draw lines on the chart area inside the axis lines. This is useful when there are multiple axes and you need to control which grid lines are drawn.</td>\n</tr>\n<tr>\n<td><code>drawTicks</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, draw lines beside the ticks in the axis area beside the chart.</td>\n</tr>\n<tr>\n<td><code>tickMarkLength</code></td>\n<td><code>Number</code></td>\n<td><code>10</code></td>\n<td>Length in pixels that the grid lines will draw into the axis area.</td>\n</tr>\n<tr>\n<td><code>zeroLineWidth</code></td>\n<td><code>Number</code></td>\n<td><code>1</code></td>\n<td>Stroke width of the grid line for the first index (index 0).</td>\n</tr>\n<tr>\n<td><code>zeroLineColor</code></td>\n<td>Color</td>\n<td><code>&apos;rgba(0, 0, 0, 0.25)&apos;</code></td>\n<td>Stroke color of the grid line for the first index (index 0).</td>\n</tr>\n<tr>\n<td><code>zeroLineBorderDash</code></td>\n<td><code>Number[]</code></td>\n<td><code>[]</code></td>\n<td>Length and spacing of dashes of the grid line for the first index (index 0). See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>zeroLineBorderDashOffset</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Offset for line dashes of the grid line for the first index (index 0). See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>offsetGridLines</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>If true, grid lines will be shifted to be between labels. This is set to <code>true</code> in the bar chart by default.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"tick-configuration\">Tick Configuration</h2>\n<p>The tick configuration is nested under the scale configuration in the <code>ticks</code> key. It defines options for the tick marks that are generated by the axis.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>callback</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Returns the string representation of the tick value as it should be displayed on the chart. See <a href=\"labelling.html#creating-custom-tick-formats\">callback</a>.</td>\n</tr>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, show tick marks</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Font color for tick labels.</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family for the tick labels, follows CSS font-family options.</td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Font size for the tick labels.</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).</td>\n</tr>\n<tr>\n<td><code>reverse</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>Reverses order of tick labels.</td>\n</tr>\n<tr>\n<td><code>minor</code></td>\n<td><code>object</code></td>\n<td><code>{}</code></td>\n<td>Minor ticks configuration. Ommited options are inherited from options above.</td>\n</tr>\n<tr>\n<td><code>major</code></td>\n<td><code>object</code></td>\n<td><code>{}</code></td>\n<td>Major ticks configuration. Ommited options are inherited from options above.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"minor-tick-configuration\">Minor Tick Configuration</h2>\n<p>The minorTick configuration is nested under the ticks configuration in the <code>minor</code> key. It defines options for the minor tick marks that are generated by the axis. Omitted options are inherited from <code>ticks</code> configuration.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>callback</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Returns the string representation of the tick value as it should be displayed on the chart. See <a href=\"labelling.html#creating-custom-tick-formats\">callback</a>.</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Font color for tick labels.</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family for the tick labels, follows CSS font-family options.</td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Font size for the tick labels.</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"major-tick-configuration\">Major Tick Configuration</h2>\n<p>The majorTick configuration is nested under the ticks configuration in the <code>major</code> key. It defines options for the major tick marks that are generated by the axis. Omitted options are inherited from <code>ticks</code> configuration.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>callback</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Returns the string representation of the tick value as it should be displayed on the chart. See <a href=\"labelling.html#creating-custom-tick-formats\">callback</a>.</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Font color for tick labels.</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family for the tick labels, follows CSS font-family options.</td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Font size for the tick labels.</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).</td>\n</tr>\n</tbody>\n</table>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"labelling.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Labelling\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../developers/\" class=\"navigation navigation-next \" aria-label=\"Next page: Developers\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Styling\",\"level\":\"1.6.4\",\"depth\":2,\"next\":{\"title\":\"Developers\",\"level\":\"1.7\",\"depth\":1,\"path\":\"developers/README.md\",\"ref\":\"developers/README.md\",\"articles\":[{\"title\":\"Chart.js API\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"developers/api.md\",\"ref\":\"developers/api.md\",\"articles\":[]},{\"title\":\"Updating Charts\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"developers/updates.md\",\"ref\":\"developers/updates.md\",\"articles\":[]},{\"title\":\"Plugins\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"developers/plugins.md\",\"ref\":\"developers/plugins.md\",\"articles\":[]},{\"title\":\"New Charts\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"developers/charts.md\",\"ref\":\"developers/charts.md\",\"articles\":[]},{\"title\":\"New Axes\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"developers/axes.md\",\"ref\":\"developers/axes.md\",\"articles\":[]},{\"title\":\"Contributing\",\"level\":\"1.7.6\",\"depth\":2,\"path\":\"developers/contributing.md\",\"ref\":\"developers/contributing.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Labelling\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"axes/labelling.md\",\"ref\":\"axes/labelling.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"axes/styling.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/area.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Area · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"mixed.html\" />\n\n\n    <link rel=\"prev\" href=\"scatter.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Area</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"area-charts\">Area Charts</h1>\n<p>Both <a href=\"line.html\">line</a> and <a href=\"radar.html\">radar</a> charts support a <code>fill</code> option on the dataset object which can be used to create area between two datasets or a dataset and a boundary, i.e. the scale <code>origin</code>, <code>start</code> or <code>end</code> (see <a href=\"#filling-modes\">filling modes</a>).</p>\n<blockquote>\n<p><strong>Note:</strong> this feature is implemented by the <a href=\"https://github.com/chartjs/Chart.js/blob/master/src/plugins/plugin.filler.js\" target=\"_blank\"><code>filler</code> plugin</a>.</p>\n</blockquote>\n<h2 id=\"filling-modes\">Filling modes</h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Mode</th>\n<th style=\"text-align:left\">Type</th>\n<th style=\"text-align:left\">Values</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">Absolute dataset index <sup>1</sup></td>\n<td style=\"text-align:left\"><code>Number</code></td>\n<td style=\"text-align:left\"><code>1</code>, <code>2</code>, <code>3</code>, ...</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Relative dataset index <sup>1</sup></td>\n<td style=\"text-align:left\"><code>String</code></td>\n<td style=\"text-align:left\"><code>&apos;-1&apos;</code>, <code>&apos;-2&apos;</code>, <code>&apos;+1&apos;</code>, ...</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Boundary <sup>2</sup></td>\n<td style=\"text-align:left\"><code>String</code></td>\n<td style=\"text-align:left\"><code>&apos;start&apos;</code>, <code>&apos;end&apos;</code>, <code>&apos;origin&apos;</code></td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Disabled <sup>3</sup></td>\n<td style=\"text-align:left\"><code>Boolean</code></td>\n<td style=\"text-align:left\"><code>false</code></td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p><sup>1</sup> dataset filling modes have been introduced in version 2.6.0<br>\n<sup>2</sup> prior version 2.6.0, boundary values was <code>&apos;zero&apos;</code>, <code>&apos;top&apos;</code>, <code>&apos;bottom&apos;</code> (deprecated)<br>\n<sup>3</sup> for backward compatibility, <code>fill: true</code> (default) is equivalent to <code>fill: &apos;origin&apos;</code><br></p>\n</blockquote>\n<p><strong>Example</strong></p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    data: {\n        datasets: [\n            {fill: <span class=\"hljs-string\">&apos;origin&apos;</span>},      <span class=\"hljs-comment\">// 0: fill to &apos;origin&apos;</span>\n            {fill: <span class=\"hljs-string\">&apos;+2&apos;</span>},          <span class=\"hljs-comment\">// 1: fill to dataset 3</span>\n            {fill: <span class=\"hljs-number\">1</span>},             <span class=\"hljs-comment\">// 2: fill to dataset 1</span>\n            {fill: <span class=\"hljs-literal\">false</span>},         <span class=\"hljs-comment\">// 3: no fill</span>\n            {fill: <span class=\"hljs-string\">&apos;-2&apos;</span>}           <span class=\"hljs-comment\">// 4: fill to dataset 2</span>\n        ]\n    }\n})\n</code></pre>\n<h2 id=\"configuration\">Configuration</h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Option</th>\n<th style=\"text-align:left\">Type</th>\n<th style=\"text-align:left\">Default</th>\n<th style=\"text-align:left\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\"><a href=\"#propagate\"><code>plugins.filler.propagate</code></a></td>\n<td style=\"text-align:left\"><code>Boolean</code></td>\n<td style=\"text-align:left\"><code>true</code></td>\n<td style=\"text-align:left\">Fill propagation when target is hidden</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"propagate\">propagate</h3>\n<p>Boolean (default: <code>true</code>)</p>\n<p>If <code>true</code>, the fill area will be recursively extended to the visible target defined by the <code>fill</code> value of hidden dataset targets:</p>\n<p><strong>Example</strong></p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    data: {\n        datasets: [\n            {fill: <span class=\"hljs-string\">&apos;origin&apos;</span>},   <span class=\"hljs-comment\">// 0: fill to &apos;origin&apos;</span>\n            {fill: <span class=\"hljs-string\">&apos;-1&apos;</span>},       <span class=\"hljs-comment\">// 1: fill to dataset 0</span>\n            {fill: <span class=\"hljs-number\">1</span>},          <span class=\"hljs-comment\">// 2: fill to dataset 1</span>\n            {fill: <span class=\"hljs-literal\">false</span>},      <span class=\"hljs-comment\">// 3: no fill</span>\n            {fill: <span class=\"hljs-string\">&apos;-2&apos;</span>}        <span class=\"hljs-comment\">// 4: fill to dataset 2</span>\n        ]\n    },\n    options: {\n        plugins: {\n            filler: {\n                propagate: <span class=\"hljs-literal\">true</span>\n            }\n        }\n    }\n})\n</code></pre>\n<p><code>propagate: true</code>:</p>\n<ul>\n<li>if dataset 2 is hidden, dataset 4 will fill to dataset 1</li>\n<li>if dataset 2 and 1 are hidden, dataset 4 will fill to <code>&apos;origin&apos;</code></li>\n</ul>\n<p><code>propagate: false</code>:</p>\n<ul>\n<li>if dataset 2 and/or 4 are hidden, dataset 4 will not be filled</li>\n</ul>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"scatter.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Scatter\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"mixed.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Mixed\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Area\",\"level\":\"1.5.8\",\"depth\":2,\"next\":{\"title\":\"Mixed\",\"level\":\"1.5.9\",\"depth\":2,\"path\":\"charts/mixed.md\",\"ref\":\"charts/mixed.md\",\"articles\":[]},\"previous\":{\"title\":\"Scatter\",\"level\":\"1.5.7\",\"depth\":2,\"path\":\"charts/scatter.md\",\"ref\":\"charts/scatter.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/area.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/bar.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Bar · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"radar.html\" />\n\n\n    <link rel=\"prev\" href=\"line.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Bar</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"bar\">Bar</h1>\n<p>A bar chart provides a way of showing data values represented as vertical bars. It is sometimes used to show trend data, and the comparison of multiple data sets side by side.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-1\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-1\"),{\"type\":\"bar\",\"data\":{\"labels\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\"],\"datasets\":[{\"label\":\"My First Dataset\",\"data\":[65,59,80,81,56,55,40],\"fill\":false,\"backgroundColor\":[\"rgba(255, 99, 132, 0.2)\",\"rgba(255, 159, 64, 0.2)\",\"rgba(255, 205, 86, 0.2)\",\"rgba(75, 192, 192, 0.2)\",\"rgba(54, 162, 235, 0.2)\",\"rgba(153, 102, 255, 0.2)\",\"rgba(201, 203, 207, 0.2)\"],\"borderColor\":[\"rgb(255, 99, 132)\",\"rgb(255, 159, 64)\",\"rgb(255, 205, 86)\",\"rgb(75, 192, 192)\",\"rgb(54, 162, 235)\",\"rgb(153, 102, 255)\",\"rgb(201, 203, 207)\"],\"borderWidth\":1}]},\"options\":{\"scales\":{\"yAxes\":[{\"ticks\":{\"beginAtZero\":true}}]}}});</script></div></p>\n<h2 id=\"example-usage\">Example Usage</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myBarChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The bar chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of the bars is generally set this way.</p>\n<p>Some properties can be specified as an array. If these are set to an array value, the first value applies to the first bar, the second value to the second bar, and so on.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>label</code></td>\n<td><code>String</code></td>\n<td>The label for the dataset which appears in the legend and tooltips.</td>\n</tr>\n<tr>\n<td><code>xAxisID</code></td>\n<td><code>String</code></td>\n<td>The ID of the x axis to plot this dataset on. If not specified, this defaults to the ID of the first found x axis</td>\n</tr>\n<tr>\n<td><code>yAxisID</code></td>\n<td><code>String</code></td>\n<td>The ID of the y axis to plot this dataset on. If not specified, this defaults to the ID of the first found y axis.</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The fill color of the bar. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The color of the bar border. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The stroke width of the bar in pixels.</td>\n</tr>\n<tr>\n<td><code>borderSkipped</code></td>\n<td><code>String</code></td>\n<td>Which edge to skip drawing the border for. <a href=\"#borderskipped\">more...</a></td>\n</tr>\n<tr>\n<td><code>hoverBackgroundColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The fill colour of the bars when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The stroke colour of the bars when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The stroke width of the bars when hovered.</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"borderskipped\">borderSkipped</h3>\n<p>This setting is used to avoid drawing the bar stroke at the base of the fill. In general, this does not need to be changed except when creating chart types that derive from a bar chart.</p>\n<p>Options are:</p>\n<ul>\n<li>&apos;bottom&apos;</li>\n<li>&apos;left&apos;</li>\n<li>&apos;top&apos;</li>\n<li>&apos;right&apos;</li>\n</ul>\n<h2 id=\"configuration-options\">Configuration Options</h2>\n<p>The bar chart defines the following configuration options. These options are merged with the global chart configuration options, <code>Chart.defaults.global</code>, to form the options passed to the chart.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>barPercentage</code></td>\n<td><code>Number</code></td>\n<td><code>0.9</code></td>\n<td>Percent (0-1) of the available width each bar should be within the category width. 1.0 will take the whole category width and put the bars right next to each other. <a href=\"#barpercentage-vs-categorypercentage\">more...</a></td>\n</tr>\n<tr>\n<td><code>categoryPercentage</code></td>\n<td><code>Number</code></td>\n<td><code>0.8</code></td>\n<td>Percent (0-1) of the available width each category should be within the sample width. <a href=\"#barpercentage-vs-categorypercentage\">more...</a></td>\n</tr>\n<tr>\n<td><code>barThickness</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>Manually set width of each bar in pixels. If not set, the base sample widths are calculated automatically so that they take the full available widths without overlap. Then, the bars are sized using <code>barPercentage</code> and <code>categoryPercentage</code>.</td>\n</tr>\n<tr>\n<td><code>maxBarThickness</code></td>\n<td><code>Number</code></td>\n<td></td>\n<td>Set this to ensure that bars are not sized thicker than this.</td>\n</tr>\n<tr>\n<td><code>gridLines.offsetGridLines</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, the bars for a particular data point fall between the grid lines. The grid line will move to the left by one half of the tick interval. If false, the grid line will go right down the middle of the bars. <a href=\"#offsetgridlines\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"offsetgridlines\">offsetGridLines</h3>\n<p>If true, the bars for a particular data point fall between the grid lines. The grid line will move to the left by one half of the tick interval, which is the space between the grid lines. If false, the grid line will go right down the middle of the bars. This is set to true for a bar chart while false for other charts by default.</p>\n<p>This setting applies to the axis configuration. If axes are added to the chart, this setting will need to be set for each new axis.</p>\n<pre><code class=\"lang-javascript\">options = {\n    scales: {\n        xAxes: [{\n            gridLines: {\n                offsetGridLines: <span class=\"hljs-literal\">true</span>\n            }\n        }]\n    }\n}\n</code></pre>\n<h2 id=\"default-options\">Default Options</h2>\n<p>It is common to want to apply a configuration setting to all created bar charts. The global bar chart settings are stored in <code>Chart.defaults.bar</code>. Changing the global options only affects charts created after the change. Existing charts are not changed.</p>\n<h2 id=\"barpercentage-vs-categorypercentage\">barPercentage vs categoryPercentage</h2>\n<p>The following shows the relationship between the bar percentage option and the category percentage option.</p>\n<pre><code class=\"lang-text\">// categoryPercentage: 1.0\n// barPercentage: 1.0\nBar:        | 1.0 | 1.0 |\nCategory:   |    1.0    |\nSample:     |===========|\n\n// categoryPercentage: 1.0\n// barPercentage: 0.5\nBar:          |.5|  |.5|\nCategory:  |      1.0     |\nSample:    |==============|\n\n// categoryPercentage: 0.5\n// barPercentage: 1.0\nBar:            |1.||1.|\nCategory:       |  .5  |\nSample:     |==============|\n</code></pre>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>The <code>data</code> property of a dataset for a bar chart is specified as a an array of numbers. Each point in the data array corresponds to the label at the same index on the x axis.</p>\n<pre><code class=\"lang-javascript\">data: [<span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">10</span>]\n</code></pre>\n<p>You can also specify the dataset as x/y coordinates when using the <a href=\"time.md\">time scale</a>.</p>\n<pre><code class=\"lang-javascript\">data: [{x:<span class=\"hljs-string\">&apos;2016-12-25&apos;</span>, y:<span class=\"hljs-number\">20</span>}, {x:<span class=\"hljs-string\">&apos;2016-12-26&apos;</span>, y:<span class=\"hljs-number\">10</span>}]\n</code></pre>\n<h1 id=\"stacked-bar-chart\">Stacked Bar Chart</h1>\n<p>Bar charts can be configured into stacked bar charts by changing the settings on the X and Y axes to enable stacking. Stacked bar charts can be used to show how one data series is made up of a number of smaller pieces.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> stackedBar = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n    data: data,\n    options: {\n        scales: {\n            xAxes: [{\n                stacked: <span class=\"hljs-literal\">true</span>\n            }],\n            yAxes: [{\n                stacked: <span class=\"hljs-literal\">true</span>\n            }]\n        }\n    }\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The following dataset properties are specific to stacked bar charts.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>stack</code></td>\n<td><code>String</code></td>\n<td>The ID of the group to which this dataset belongs to (when stacked, each group will be a separate stack)</td>\n</tr>\n</tbody>\n</table>\n<h1 id=\"horizontal-bar-chart\">Horizontal Bar Chart</h1>\n<p>A horizontal bar chart is a variation on a vertical bar chart. It is sometimes used to show trend data, and the comparison of multiple data sets side by side.\n<div class=\"chartjs-wrapper\"><canvas id=\"chartjs-2\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-2\"),{\"type\":\"horizontalBar\",\"data\":{\"labels\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\"],\"datasets\":[{\"label\":\"My First Dataset\",\"data\":[65,59,80,81,56,55,40],\"fill\":false,\"backgroundColor\":[\"rgba(255, 99, 132, 0.2)\",\"rgba(255, 159, 64, 0.2)\",\"rgba(255, 205, 86, 0.2)\",\"rgba(75, 192, 192, 0.2)\",\"rgba(54, 162, 235, 0.2)\",\"rgba(153, 102, 255, 0.2)\",\"rgba(201, 203, 207, 0.2)\"],\"borderColor\":[\"rgb(255, 99, 132)\",\"rgb(255, 159, 64)\",\"rgb(255, 205, 86)\",\"rgb(75, 192, 192)\",\"rgb(54, 162, 235)\",\"rgb(153, 102, 255)\",\"rgb(201, 203, 207)\"],\"borderWidth\":1}]},\"options\":{\"scales\":{\"xAxes\":[{\"ticks\":{\"beginAtZero\":true}}]}}});</script></div></p>\n<h2 id=\"example\">Example</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myBarChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;horizontalBar&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"config-options\">Config Options</h2>\n<p>The configuration options for the horizontal bar chart are the same as for the <a href=\"#configuration-options\">bar chart</a>. However, any options specified on the x axis in a bar chart, are applied to the y axis in a horizontal bar chart.</p>\n<p>The default horizontal bar configuration is specified in <code>Chart.defaults.horizontalBar</code>.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"line.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Line\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"radar.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Radar\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Bar\",\"level\":\"1.5.2\",\"depth\":2,\"next\":{\"title\":\"Radar\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"charts/radar.md\",\"ref\":\"charts/radar.md\",\"articles\":[]},\"previous\":{\"title\":\"Line\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"charts/line.md\",\"ref\":\"charts/line.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/bar.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/bubble.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Bubble · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"scatter.html\" />\n\n\n    <link rel=\"prev\" href=\"polar.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Bubble</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"bubble-chart\">Bubble Chart</h1>\n<p>A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-6\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-6\"),{\"type\":\"bubble\",\"data\":{\"datasets\":[{\"label\":\"First Dataset\",\"data\":[{\"x\":20,\"y\":30,\"r\":15},{\"x\":40,\"y\":10,\"r\":10}],\"backgroundColor\":\"rgb(255, 99, 132)\"}]}});</script></div></p>\n<h2 id=\"example-usage\">Example Usage</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// For a bubble chart</span>\n<span class=\"hljs-keyword\">var</span> myBubbleChart = <span class=\"hljs-keyword\">new</span> Chart(ctx,{\n    type: <span class=\"hljs-string\">&apos;bubble&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The bubble chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of the bubbles is generally set this way.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th style=\"text-align:center\"><a href=\"../general/options.html#scriptable-options\">Scriptable</a></th>\n<th style=\"text-align:center\"><a href=\"../general/options.html#indexable-options\">Indexable</a></th>\n<th>Default</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><a href=\"#styling\"><code>backgroundColor</code></a></td>\n<td><a href=\"../general/colors.html\"><code>Color</code></a></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n</tr>\n<tr>\n<td><a href=\"#styling\"><code>borderColor</code></a></td>\n<td><a href=\"../general/colors.html\"><code>Color</code></a></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n</tr>\n<tr>\n<td><a href=\"#styling\"><code>borderWidth</code></a></td>\n<td><code>Number</code></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>3</code></td>\n</tr>\n<tr>\n<td><a href=\"#data-structure\"><code>data</code></a></td>\n<td><code>Object[]</code></td>\n<td style=\"text-align:center\">-</td>\n<td style=\"text-align:center\">-</td>\n<td><strong>required</strong></td>\n</tr>\n<tr>\n<td><a href=\"#interactions\"><code>hoverBackgroundColor</code></a></td>\n<td><a href=\"../general/colors.html\"><code>Color</code></a></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>undefined</code></td>\n</tr>\n<tr>\n<td><a href=\"#interactions\"><code>hoverBorderColor</code></a></td>\n<td><a href=\"../general/colors.html\"><code>Color</code></a></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>undefined</code></td>\n</tr>\n<tr>\n<td><a href=\"#interactions\"><code>hoverBorderWidth</code></a></td>\n<td><code>Number</code></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>1</code></td>\n</tr>\n<tr>\n<td><a href=\"#interactions\"><code>hoverRadius</code></a></td>\n<td><code>Number</code></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>4</code></td>\n</tr>\n<tr>\n<td><a href=\"#interactions\"><code>hitRadius</code></a></td>\n<td><code>Number</code></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>1</code></td>\n</tr>\n<tr>\n<td><a href=\"#labeling\"><code>label</code></a></td>\n<td><code>String</code></td>\n<td style=\"text-align:center\">-</td>\n<td style=\"text-align:center\">-</td>\n<td><code>undefined</code></td>\n</tr>\n<tr>\n<td><a href=\"#styling\"><code>pointStyle</code></a></td>\n<td><code>String</code></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>circle</code></td>\n</tr>\n<tr>\n<td><a href=\"#styling\"><code>radius</code></a></td>\n<td><code>Number</code></td>\n<td style=\"text-align:center\">Yes</td>\n<td style=\"text-align:center\">Yes</td>\n<td><code>3</code></td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"labeling\">Labeling</h3>\n<p><code>label</code> defines the text associated to the dataset and which appears in the legend and tooltips.</p>\n<h3 id=\"styling\">Styling</h3>\n<p>The style of each bubble can be controlled with the following properties:</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>backgroundColor</code></td>\n<td>bubble background color</td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td>bubble border color</td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td>bubble border width (in pixels)</td>\n</tr>\n<tr>\n<td><code>pointStyle</code></td>\n<td>bubble <a href=\"../configuration/elements#point-styles\">shape style</a></td>\n</tr>\n<tr>\n<td><code>radius</code></td>\n<td>bubble radius (in pixels)</td>\n</tr>\n</tbody>\n</table>\n<p>All these values, if <code>undefined</code>, fallback to the associated <a href=\"../configuration/elements.html#point-configuration\"><code>elements.point.*</code></a> options.</p>\n<h3 id=\"interactions\">Interactions</h3>\n<p>The interaction with each bubble can be controlled with the following properties:</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hoverBackgroundColor</code></td>\n<td>bubble background color when hovered</td>\n</tr>\n<tr>\n<td><code>hoverBorderColor</code></td>\n<td>bubble border color hovered</td>\n</tr>\n<tr>\n<td><code>hoverBorderWidth</code></td>\n<td>bubble border width when hovered (in pixels)</td>\n</tr>\n<tr>\n<td><code>hoverRadius</code></td>\n<td>bubble <strong>additional</strong> radius when hovered (in pixels)</td>\n</tr>\n<tr>\n<td><code>hitRadius</code></td>\n<td>bubble <strong>additional</strong> radius for hit detection (in pixels)</td>\n</tr>\n</tbody>\n</table>\n<p>All these values, if <code>undefined</code>, fallback to the associated <a href=\"../configuration/elements.html#point-configuration\"><code>elements.point.*</code></a> options.</p>\n<h2 id=\"default-options\">Default Options</h2>\n<p>We can also change the default values for the Bubble chart type. Doing so will give all bubble charts created after this point the new defaults. The default configuration for the bubble chart can be accessed at <code>Chart.defaults.bubble</code>.</p>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>Bubble chart datasets need to contain a <code>data</code> array of points, each points represented by an object containing the following properties:</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// X Value</span>\n    x: &lt;Number&gt;,\n\n    // Y Value\n    y: &lt;Number&gt;,\n\n    // Bubble radius in pixels (not scaled).\n    r: &lt;Number&gt;\n}\n</code></pre>\n<p><strong>Important:</strong> the radius property, <code>r</code> is <strong>not</strong> scaled by the chart, it is the raw radius in pixels of the bubble that is drawn on the canvas.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"polar.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Polar Area\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"scatter.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Scatter\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Bubble\",\"level\":\"1.5.6\",\"depth\":2,\"next\":{\"title\":\"Scatter\",\"level\":\"1.5.7\",\"depth\":2,\"path\":\"charts/scatter.md\",\"ref\":\"charts/scatter.md\",\"articles\":[]},\"previous\":{\"title\":\"Polar Area\",\"level\":\"1.5.5\",\"depth\":2,\"path\":\"charts/polar.md\",\"ref\":\"charts/polar.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/bubble.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/doughnut.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Doughnut & Pie · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"polar.html\" />\n\n\n    <link rel=\"prev\" href=\"radar.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Doughnut & Pie</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"doughnut-and-pie\">Doughnut and Pie</h1>\n<p>Pie and doughnut charts are probably the most commonly used charts. They are divided into segments, the arc of each segment shows the proportional value of each piece of data.</p>\n<p>They are excellent at showing the relational proportions between data.</p>\n<p>Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their <code>cutoutPercentage</code>. This equates what percentage of the inner should be cut out. This defaults to <code>0</code> for pie charts, and <code>50</code> for doughnuts.</p>\n<p>They are also registered under two aliases in the <code>Chart</code> core. Other than their different default value, and different alias, they are exactly the same.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-4\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-4\"),{\"type\":\"doughnut\",\"data\":{\"labels\":[\"Red\",\"Blue\",\"Yellow\"],\"datasets\":[{\"label\":\"My First Dataset\",\"data\":[300,50,100],\"backgroundColor\":[\"rgb(255, 99, 132)\",\"rgb(54, 162, 235)\",\"rgb(255, 205, 86)\"]}]}});</script></div></p>\n<h2 id=\"example-usage\">Example Usage</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// For a pie chart</span>\n<span class=\"hljs-keyword\">var</span> myPieChart = <span class=\"hljs-keyword\">new</span> Chart(ctx,{\n    type: <span class=\"hljs-string\">&apos;pie&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// And for a doughnut chart</span>\n<span class=\"hljs-keyword\">var</span> myDoughnutChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;doughnut&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The doughnut/pie chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of a the dataset&apos;s arc are generally set this way.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>label</code></td>\n<td><code>String</code></td>\n<td>The label for the dataset which appears in the legend and tooltips.</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color[]</code></td>\n<td>The fill color of the arcs in the dataset. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color[]</code></td>\n<td>The border color of the arcs in the dataset. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number[]</code></td>\n<td>The border width of the arcs in the dataset.</td>\n</tr>\n<tr>\n<td><code>hoverBackgroundColor</code></td>\n<td><code>Color[]</code></td>\n<td>The fill colour of the arcs when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderColor</code></td>\n<td><code>Color[]</code></td>\n<td>The stroke colour of the arcs when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderWidth</code></td>\n<td><code>Number[]</code></td>\n<td>The stroke width of the arcs when hovered.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"config-options\">Config Options</h2>\n<p>These are the customisation options specific to Pie &amp; Doughnut charts. These options are merged with the global chart configuration options, and form the options of the chart.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cutoutPercentage</code></td>\n<td><code>Number</code></td>\n<td><code>50</code> - for doughnut, <code>0</code> - for pie</td>\n<td>The percentage of the chart that is cut out of the middle.</td>\n</tr>\n<tr>\n<td><code>rotation</code></td>\n<td><code>Number</code></td>\n<td><code>-0.5 * Math.PI</code></td>\n<td>Starting angle to draw arcs from.</td>\n</tr>\n<tr>\n<td><code>circumference</code></td>\n<td><code>Number</code></td>\n<td><code>2 * Math.PI</code></td>\n<td>Sweep to allow arcs to cover</td>\n</tr>\n<tr>\n<td><code>animation.animateRotate</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, the chart will animate in with a rotation animation. This property is in the <code>options.animation</code> object.</td>\n</tr>\n<tr>\n<td><code>animation.animateScale</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>If true, will animate scaling the chart from the center outwards.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"default-options\">Default Options</h2>\n<p>We can also change these default values for each Doughnut type that is created, this object is available at <code>Chart.defaults.doughnut</code>. Pie charts also have a clone of these defaults available to change at <code>Chart.defaults.pie</code>, with the only difference being <code>cutoutPercentage</code> being set to 0.</p>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>For a pie chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each.</p>\n<p>You also need to specify an array of labels so that tooltips appear correctly</p>\n<pre><code class=\"lang-javascript\">data = {\n    datasets: [{\n        data: [<span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">30</span>]\n    }],\n\n    <span class=\"hljs-comment\">// These labels appear in the legend and in the tooltips when hovering different arcs</span>\n    labels: [\n        <span class=\"hljs-string\">&apos;Red&apos;</span>,\n        <span class=\"hljs-string\">&apos;Yellow&apos;</span>,\n        <span class=\"hljs-string\">&apos;Blue&apos;</span>\n    ]\n};\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"radar.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Radar\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"polar.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Polar Area\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Doughnut & Pie\",\"level\":\"1.5.4\",\"depth\":2,\"next\":{\"title\":\"Polar Area\",\"level\":\"1.5.5\",\"depth\":2,\"path\":\"charts/polar.md\",\"ref\":\"charts/polar.md\",\"articles\":[]},\"previous\":{\"title\":\"Radar\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"charts/radar.md\",\"ref\":\"charts/radar.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/doughnut.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Charts · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"line.html\" />\n\n\n    <link rel=\"prev\" href=\"../configuration/elements.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Charts</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"charts\">Charts</h1>\n<p>Chart.js comes with built-in chart types:</p>\n<ul>\n<li><a href=\"line.html\">line</a></li>\n<li><a href=\"bar.html\">bar</a></li>\n<li><a href=\"radar.html\">radar</a></li>\n<li><a href=\"polar.html\">polar area</a></li>\n<li><a href=\"doughnut.html\">doughnut and pie</a></li>\n<li><a href=\"bubble.html\">bubble</a></li>\n</ul>\n<p><a href=\"area.html\">Area charts</a> can be built from a line or radar chart using the dataset <code>fill</code> option.</p>\n<p>To create a new chart type, see the <a href=\"../developers/charts.html#new-charts\">developer notes</a></p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../configuration/elements.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Elements\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"line.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Line\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Charts\",\"level\":\"1.5\",\"depth\":1,\"next\":{\"title\":\"Line\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"charts/line.md\",\"ref\":\"charts/line.md\",\"articles\":[]},\"previous\":{\"title\":\"Elements\",\"level\":\"1.4.6\",\"depth\":2,\"path\":\"configuration/elements.md\",\"ref\":\"configuration/elements.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/line.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Line · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"bar.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Line</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"line\">Line</h1>\n<p>A line chart is a way of plotting data points on a line. Often, it is used to show trend data, or the comparison of two data sets.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-0\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-0\"),{\"type\":\"line\",\"data\":{\"labels\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\"],\"datasets\":[{\"label\":\"My First Dataset\",\"data\":[65,59,80,81,56,55,40],\"fill\":false,\"borderColor\":\"rgb(75, 192, 192)\",\"lineTension\":0.1}]},\"options\":{}});</script></div></p>\n<h2 id=\"example-usage\">Example Usage</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myLineChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The line chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of a line is generally set this way.</p>\n<p>All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>label</code></td>\n<td><code>String</code></td>\n<td>The label for the dataset which appears in the legend and tooltips.</td>\n</tr>\n<tr>\n<td><code>xAxisID</code></td>\n<td><code>String</code></td>\n<td>The ID of the x axis to plot this dataset on. If not specified, this defaults to the ID of the first found x axis</td>\n</tr>\n<tr>\n<td><code>yAxisID</code></td>\n<td><code>String</code></td>\n<td>The ID of the y axis to plot this dataset on. If not specified, this defaults to the ID of the first found y axis.</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td>The fill color under the line. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td>The color of the line. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td>The width of the line in pixels.</td>\n</tr>\n<tr>\n<td><code>borderDash</code></td>\n<td><code>Number[]</code></td>\n<td>Length and spacing of dashes. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderDashOffset</code></td>\n<td><code>Number</code></td>\n<td>Offset for line dashes. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderCapStyle</code></td>\n<td><code>String</code></td>\n<td>Cap style of the line. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderJoinStyle</code></td>\n<td><code>String</code></td>\n<td>Line joint style. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>cubicInterpolationMode</code></td>\n<td><code>String</code></td>\n<td>Algorithm used to interpolate a smooth curve from the discrete data points. <a href=\"#cubicinterpolationmode\">more...</a></td>\n</tr>\n<tr>\n<td><code>fill</code></td>\n<td><code>Boolean/String</code></td>\n<td>How to fill the area under the line. See <a href=\"area.html\">area charts</a></td>\n</tr>\n<tr>\n<td><code>lineTension</code></td>\n<td><code>Number</code></td>\n<td>Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used.</td>\n</tr>\n<tr>\n<td><code>pointBackgroundColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The fill color for points.</td>\n</tr>\n<tr>\n<td><code>pointBorderColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The border color for points.</td>\n</tr>\n<tr>\n<td><code>pointBorderWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The width of the point border in pixels.</td>\n</tr>\n<tr>\n<td><code>pointRadius</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The radius of the point shape. If set to 0, the point is not rendered.</td>\n</tr>\n<tr>\n<td><code>pointStyle</code></td>\n<td><code>String/String[]/Image/Image[]</code></td>\n<td>Style of the point. <a href=\"../configuration/elements#point-styles\">more...</a></td>\n</tr>\n<tr>\n<td><code>pointHitRadius</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The pixel size of the non-displayed point that reacts to mouse events.</td>\n</tr>\n<tr>\n<td><code>pointHoverBackgroundColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>Point background color when hovered.</td>\n</tr>\n<tr>\n<td><code>pointHoverBorderColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>Point border color when hovered.</td>\n</tr>\n<tr>\n<td><code>pointHoverBorderWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td>Border width of point when hovered.</td>\n</tr>\n<tr>\n<td><code>pointHoverRadius</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The radius of the point when hovered.</td>\n</tr>\n<tr>\n<td><code>showLine</code></td>\n<td><code>Boolean</code></td>\n<td>If false, the line is not drawn for this dataset.</td>\n</tr>\n<tr>\n<td><code>spanGaps</code></td>\n<td><code>Boolean</code></td>\n<td>If true, lines will be drawn between points with no or null data. If false, points with <code>NaN</code> data will create a break in the line</td>\n</tr>\n<tr>\n<td><code>steppedLine</code></td>\n<td><code>Boolean/String</code></td>\n<td>If the line is shown as a stepped line. <a href=\"#stepped-line\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"cubicinterpolationmode\">cubicInterpolationMode</h3>\n<p>The following interpolation modes are supported:</p>\n<ul>\n<li>&apos;default&apos;</li>\n<li>&apos;monotone&apos;.</li>\n</ul>\n<p>The &apos;default&apos; algorithm uses a custom weighted cubic interpolation, which produces pleasant curves for all types of datasets.</p>\n<p>The &apos;monotone&apos; algorithm is more suited to <code>y = f(x)</code> datasets : it preserves monotonicity (or piecewise monotonicity) of the dataset being interpolated, and ensures local extremums (if any) stay at input data points.</p>\n<p>If left untouched (<code>undefined</code>), the global <code>options.elements.line.cubicInterpolationMode</code> property is used.</p>\n<h3 id=\"stepped-line\">Stepped Line</h3>\n<p>The following values are supported for <code>steppedLine</code>:</p>\n<ul>\n<li><code>false</code>:  No Step Interpolation (default)</li>\n<li><code>true</code>: Step-before Interpolation (eq. &apos;before&apos;)</li>\n<li><code>&apos;before&apos;</code>: Step-before Interpolation</li>\n<li><code>&apos;after&apos;</code>: Step-after Interpolation</li>\n</ul>\n<p>If the <code>steppedLine</code> value is set to anything other than false, <code>lineTension</code> will be ignored.</p>\n<h2 id=\"configuration-options\">Configuration Options</h2>\n<p>The line chart defines the following configuration options. These options are merged with the global chart configuration options, <code>Chart.defaults.global</code>, to form the options passed to the chart.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>showLines</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If false, the lines between points are not drawn.</td>\n</tr>\n<tr>\n<td><code>spanGaps</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>If false, NaN data causes a break in the line.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"default-options\">Default Options</h2>\n<p>It is common to want to apply a configuration setting to all created line charts. The global line chart settings are stored in <code>Chart.defaults.line</code>. Changing the global options only affects charts created after the change. Existing charts are not changed.</p>\n<p>For example, to configure all line charts with <code>spanGaps = true</code> you would do:</p>\n<pre><code class=\"lang-javascript\">Chart.defaults.line.spanGaps = <span class=\"hljs-literal\">true</span>;\n</code></pre>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>The <code>data</code> property of a dataset for a line chart can be passed in two formats.</p>\n<h3 id=\"number\">Number[]</h3>\n<pre><code class=\"lang-javascript\">data: [<span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">10</span>]\n</code></pre>\n<p>When the <code>data</code> array is an array of numbers, the x axis is generally a <a href=\"../axes/cartesian/category.html#Category%20Axis\">category</a>. The points are placed onto the axis using their position in the array. When a line chart is created with a category axis, the <code>labels</code> property of the data object must be specified.</p>\n<h3 id=\"point\">Point[]</h3>\n<pre><code class=\"lang-javascript\">data: [{\n        x: <span class=\"hljs-number\">10</span>,\n        y: <span class=\"hljs-number\">20</span>\n    }, {\n        x: <span class=\"hljs-number\">15</span>,\n        y: <span class=\"hljs-number\">10</span>\n    }]\n</code></pre>\n<p>This alternate is used for sparse datasets, such as those in <a href=\"scatter.html#scatter-chart\">scatter charts</a>. Each data point is specified using an object containing <code>x</code> and <code>y</code> properties.</p>\n<h1 id=\"stacked-area-chart\">Stacked Area Chart</h1>\n<p>Line charts can be configured into stacked area charts by changing the settings on the y axis to enable stacking. Stacked area charts can be used to show how one data trend is made up of a number of smaller pieces.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> stackedLine = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        scales: {\n            yAxes: [{\n                stacked: <span class=\"hljs-literal\">true</span>\n            }]\n        }\n    }\n});\n</code></pre>\n<h1 id=\"high-performance-line-charts\">High Performance Line Charts</h1>\n<p>When charting a lot of data, the chart render time may start to get quite large. In that case, the following strategies can be used to improve performance.</p>\n<h2 id=\"data-decimation\">Data Decimation</h2>\n<p>Decimating your data will achieve the best results. When there is a lot of data to display on the graph, it doesn&apos;t make sense to show tens of thousands of data points on a graph that is only a few hundred pixels wide.</p>\n<p>There are many approaches to data decimation and selection of an algorithm will depend on your data and the results you want to achieve. For instance, <a href=\"http://digital.ni.com/public.nsf/allkb/F694FFEEA0ACF282862576020075F784\" target=\"_blank\">min/max</a> decimation will preserve peaks in your data but could require up to 4 points for each pixel. This type of decimation would work well for a very noisy signal where you need to see data peaks.</p>\n<h2 id=\"disable-bezier-curves\">Disable Bezier Curves</h2>\n<p>If you are drawing lines on your chart, disabling bezier curves will improve render times since drawing a straight line is more performant than a bezier curve.</p>\n<p>To disable bezier curves for an entire chart:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        elements: {\n            line: {\n                tension: <span class=\"hljs-number\">0</span>, <span class=\"hljs-comment\">// disables bezier curves</span>\n            }\n        }\n    }\n});\n</code></pre>\n<h2 id=\"disable-line-drawing\">Disable Line Drawing</h2>\n<p>If you have a lot of data points, it can be more performant to disable rendering of the line for a dataset and only draw points. Doing this means that there is less to draw on the canvas which will improve render performance.</p>\n<p>To disable lines:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: {\n        datasets: [{\n            showLine: <span class=\"hljs-literal\">false</span>, <span class=\"hljs-comment\">// disable for a single dataset</span>\n        }]\n    },\n    options: {\n        showLines: <span class=\"hljs-literal\">false</span>, <span class=\"hljs-comment\">// disable for all datasets</span>\n    }\n});\n</code></pre>\n<h2 id=\"disable-animations\">Disable Animations</h2>\n<p>If your charts have long render times, it is a good idea to disable animations. Doing so will mean that the chart needs to only be rendered once during an update instead of multiple times. This will have the effect of reducing CPU usage and improving general page performance.</p>\n<p>To disable animations</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        animation: {\n            duration: <span class=\"hljs-number\">0</span>, <span class=\"hljs-comment\">// general animation time</span>\n        },\n        hover: {\n            animationDuration: <span class=\"hljs-number\">0</span>, <span class=\"hljs-comment\">// duration of animations when hovering an item</span>\n        },\n        responsiveAnimationDuration: <span class=\"hljs-number\">0</span>, <span class=\"hljs-comment\">// animation duration after a resize</span>\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Charts\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"bar.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Bar\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Line\",\"level\":\"1.5.1\",\"depth\":2,\"next\":{\"title\":\"Bar\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"charts/bar.md\",\"ref\":\"charts/bar.md\",\"articles\":[]},\"previous\":{\"title\":\"Charts\",\"level\":\"1.5\",\"depth\":1,\"path\":\"charts/README.md\",\"ref\":\"charts/README.md\",\"articles\":[{\"title\":\"Line\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"charts/line.md\",\"ref\":\"charts/line.md\",\"articles\":[]},{\"title\":\"Bar\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"charts/bar.md\",\"ref\":\"charts/bar.md\",\"articles\":[]},{\"title\":\"Radar\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"charts/radar.md\",\"ref\":\"charts/radar.md\",\"articles\":[]},{\"title\":\"Doughnut & Pie\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"charts/doughnut.md\",\"ref\":\"charts/doughnut.md\",\"articles\":[]},{\"title\":\"Polar Area\",\"level\":\"1.5.5\",\"depth\":2,\"path\":\"charts/polar.md\",\"ref\":\"charts/polar.md\",\"articles\":[]},{\"title\":\"Bubble\",\"level\":\"1.5.6\",\"depth\":2,\"path\":\"charts/bubble.md\",\"ref\":\"charts/bubble.md\",\"articles\":[]},{\"title\":\"Scatter\",\"level\":\"1.5.7\",\"depth\":2,\"path\":\"charts/scatter.md\",\"ref\":\"charts/scatter.md\",\"articles\":[]},{\"title\":\"Area\",\"level\":\"1.5.8\",\"depth\":2,\"path\":\"charts/area.md\",\"ref\":\"charts/area.md\",\"articles\":[]},{\"title\":\"Mixed\",\"level\":\"1.5.9\",\"depth\":2,\"path\":\"charts/mixed.md\",\"ref\":\"charts/mixed.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/line.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/mixed.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Mixed · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../axes/\" />\n\n\n    <link rel=\"prev\" href=\"area.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Mixed</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"mixed-chart-types\">Mixed Chart Types</h1>\n<p>With Chart.js, it is possible to create mixed charts that are a combination of two or more different chart types. A common example is a bar chart that also includes a line dataset.</p>\n<p>Creating a mixed chart starts with the initialization of a basic chart.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n  type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n  data: data,\n  options: options\n});\n</code></pre>\n<p>At this point we have a standard bar chart. Now we need to convert one of the datasets to a line dataset.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> mixedChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n  type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n  data: {\n    datasets: [{\n          label: <span class=\"hljs-string\">&apos;Bar Dataset&apos;</span>,\n          data: [<span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">30</span>, <span class=\"hljs-number\">40</span>]\n        }, {\n          label: <span class=\"hljs-string\">&apos;Line Dataset&apos;</span>,\n          data: [<span class=\"hljs-number\">50</span>, <span class=\"hljs-number\">50</span>, <span class=\"hljs-number\">50</span>, <span class=\"hljs-number\">50</span>],\n\n          <span class=\"hljs-comment\">// Changes this dataset to become a line</span>\n          type: <span class=\"hljs-string\">&apos;line&apos;</span>\n        }],\n    labels: [<span class=\"hljs-string\">&apos;January&apos;</span>, <span class=\"hljs-string\">&apos;February&apos;</span>, <span class=\"hljs-string\">&apos;March&apos;</span>, <span class=\"hljs-string\">&apos;April&apos;</span>]\n  },\n  options: options\n});\n</code></pre>\n<p>At this point we have a chart rendering how we&apos;d like. It&apos;s important to note that the default options for a line chart are not merged in this case. Only the options for the default type are merged in. In this case, that means that the default options for a bar chart are merged because that is the type specified by the <code>type</code> field.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-7\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-7\"),{\"type\":\"bar\",\"data\":{\"labels\":[\"January\",\"February\",\"March\",\"April\"],\"datasets\":[{\"label\":\"Bar Dataset\",\"data\":[10,20,30,40],\"borderColor\":\"rgb(255, 99, 132)\",\"backgroundColor\":\"rgba(255, 99, 132, 0.2)\"},{\"label\":\"Line Dataset\",\"data\":[50,50,50,50],\"type\":\"line\",\"fill\":false,\"borderColor\":\"rgb(54, 162, 235)\"}]},\"options\":{\"scales\":{\"yAxes\":[{\"ticks\":{\"beginAtZero\":true}}]}}});</script></div></p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"area.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Area\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../axes/\" class=\"navigation navigation-next \" aria-label=\"Next page: Axes\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Mixed\",\"level\":\"1.5.9\",\"depth\":2,\"next\":{\"title\":\"Axes\",\"level\":\"1.6\",\"depth\":1,\"path\":\"axes/README.md\",\"ref\":\"axes/README.md\",\"articles\":[{\"title\":\"Cartesian\",\"level\":\"1.6.1\",\"depth\":2,\"path\":\"axes/cartesian/README.md\",\"ref\":\"axes/cartesian/README.md\",\"articles\":[{\"title\":\"Category\",\"level\":\"1.6.1.1\",\"depth\":3,\"path\":\"axes/cartesian/category.md\",\"ref\":\"axes/cartesian/category.md\",\"articles\":[]},{\"title\":\"Linear\",\"level\":\"1.6.1.2\",\"depth\":3,\"path\":\"axes/cartesian/linear.md\",\"ref\":\"axes/cartesian/linear.md\",\"articles\":[]},{\"title\":\"Logarithmic\",\"level\":\"1.6.1.3\",\"depth\":3,\"path\":\"axes/cartesian/logarithmic.md\",\"ref\":\"axes/cartesian/logarithmic.md\",\"articles\":[]},{\"title\":\"Time\",\"level\":\"1.6.1.4\",\"depth\":3,\"path\":\"axes/cartesian/time.md\",\"ref\":\"axes/cartesian/time.md\",\"articles\":[]}]},{\"title\":\"Radial\",\"level\":\"1.6.2\",\"depth\":2,\"path\":\"axes/radial/README.md\",\"ref\":\"axes/radial/README.md\",\"articles\":[{\"title\":\"Linear\",\"level\":\"1.6.2.1\",\"depth\":3,\"path\":\"axes/radial/linear.md\",\"ref\":\"axes/radial/linear.md\",\"articles\":[]}]},{\"title\":\"Labelling\",\"level\":\"1.6.3\",\"depth\":2,\"path\":\"axes/labelling.md\",\"ref\":\"axes/labelling.md\",\"articles\":[]},{\"title\":\"Styling\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"axes/styling.md\",\"ref\":\"axes/styling.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Area\",\"level\":\"1.5.8\",\"depth\":2,\"path\":\"charts/area.md\",\"ref\":\"charts/area.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/mixed.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/polar.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Polar Area · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"bubble.html\" />\n\n\n    <link rel=\"prev\" href=\"doughnut.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Polar Area</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"polar-area\">Polar Area</h1>\n<p>Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value.</p>\n<p>This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-5\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-5\"),{\"type\":\"polarArea\",\"data\":{\"labels\":[\"Red\",\"Green\",\"Yellow\",\"Grey\",\"Blue\"],\"datasets\":[{\"label\":\"My First Dataset\",\"data\":[11,16,7,3,14],\"backgroundColor\":[\"rgb(255, 99, 132)\",\"rgb(75, 192, 192)\",\"rgb(255, 205, 86)\",\"rgb(201, 203, 207)\",\"rgb(54, 162, 235)\"]}]}});</script></div></p>\n<h2 id=\"example-usage\">Example Usage</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    data: data,\n    type: <span class=\"hljs-string\">&apos;polarArea&apos;</span>,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The following options can be included in a polar area chart dataset to configure options for that specific dataset.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>label</code></td>\n<td><code>String</code></td>\n<td>The label for the dataset which appears in the legend and tooltips.</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color[]</code></td>\n<td>The fill color of the arcs in the dataset. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color[]</code></td>\n<td>The border color of the arcs in the dataset. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number[]</code></td>\n<td>The border width of the arcs in the dataset.</td>\n</tr>\n<tr>\n<td><code>hoverBackgroundColor</code></td>\n<td><code>Color[]</code></td>\n<td>The fill colour of the arcs when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderColor</code></td>\n<td><code>Color[]</code></td>\n<td>The stroke colour of the arcs when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderWidth</code></td>\n<td><code>Number[]</code></td>\n<td>The stroke width of the arcs when hovered.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"config-options\">Config Options</h2>\n<p>These are the customisation options specific to Polar Area charts. These options are merged with the <a href=\"#default-options\">global chart default options</a>, and form the options of the chart.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>startAngle</code></td>\n<td><code>Number</code></td>\n<td><code>-0.5 * Math.PI</code></td>\n<td>Starting angle to draw arcs for the first item in a dataset.</td>\n</tr>\n<tr>\n<td><code>animation.animateRotate</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, the chart will animate in with a rotation animation. This property is in the <code>options.animation</code> object.</td>\n</tr>\n<tr>\n<td><code>animation.animateScale</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>If true, will animate scaling the chart from the center outwards.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"default-options\">Default Options</h2>\n<p>We can also change these defaults values for each PolarArea type that is created, this object is available at <code>Chart.defaults.polarArea</code>. Changing the global options only affects charts created after the change. Existing charts are not changed.</p>\n<p>For example, to configure all new polar area charts with <code>animateScale = false</code> you would do:</p>\n<pre><code class=\"lang-javascript\">Chart.defaults.polarArea.animation.animateScale = <span class=\"hljs-literal\">false</span>;\n</code></pre>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>For a polar area chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each.</p>\n<p>You also need to specify an array of labels so that tooltips appear correctly for each slice.</p>\n<pre><code class=\"lang-javascript\">data = {\n    datasets: [{\n        data: [<span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">30</span>]\n    }],\n\n    <span class=\"hljs-comment\">// These labels appear in the legend and in the tooltips when hovering different arcs</span>\n    labels: [\n        <span class=\"hljs-string\">&apos;Red&apos;</span>,\n        <span class=\"hljs-string\">&apos;Yellow&apos;</span>,\n        <span class=\"hljs-string\">&apos;Blue&apos;</span>\n    ]\n};\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"doughnut.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Doughnut & Pie\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"bubble.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Bubble\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Polar Area\",\"level\":\"1.5.5\",\"depth\":2,\"next\":{\"title\":\"Bubble\",\"level\":\"1.5.6\",\"depth\":2,\"path\":\"charts/bubble.md\",\"ref\":\"charts/bubble.md\",\"articles\":[]},\"previous\":{\"title\":\"Doughnut & Pie\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"charts/doughnut.md\",\"ref\":\"charts/doughnut.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/polar.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/radar.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Radar · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"doughnut.html\" />\n\n\n    <link rel=\"prev\" href=\"bar.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Radar</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"radar\">Radar</h1>\n<p>A radar chart is a way of showing multiple data points and the variation between them.</p>\n<p>They are often useful for comparing the points of two or more different data sets.</p>\n<p><div class=\"chartjs-wrapper\"><canvas id=\"chartjs-3\" class=\"chartjs\" width=\"undefined\" height=\"undefined\"></canvas><script>new Chart(document.getElementById(\"chartjs-3\"),{\"type\":\"radar\",\"data\":{\"labels\":[\"Eating\",\"Drinking\",\"Sleeping\",\"Designing\",\"Coding\",\"Cycling\",\"Running\"],\"datasets\":[{\"label\":\"My First Dataset\",\"data\":[65,59,90,81,56,55,40],\"fill\":true,\"backgroundColor\":\"rgba(255, 99, 132, 0.2)\",\"borderColor\":\"rgb(255, 99, 132)\",\"pointBackgroundColor\":\"rgb(255, 99, 132)\",\"pointBorderColor\":\"#fff\",\"pointHoverBackgroundColor\":\"#fff\",\"pointHoverBorderColor\":\"rgb(255, 99, 132)\"},{\"label\":\"My Second Dataset\",\"data\":[28,48,40,19,96,27,100],\"fill\":true,\"backgroundColor\":\"rgba(54, 162, 235, 0.2)\",\"borderColor\":\"rgb(54, 162, 235)\",\"pointBackgroundColor\":\"rgb(54, 162, 235)\",\"pointBorderColor\":\"#fff\",\"pointHoverBackgroundColor\":\"#fff\",\"pointHoverBorderColor\":\"rgb(54, 162, 235)\"}]},\"options\":{\"elements\":{\"line\":{\"tension\":0,\"borderWidth\":3}}}});</script></div></p>\n<h2 id=\"example-usage\">Example Usage</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myRadarChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;radar&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The radar chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of a line is generally set this way.</p>\n<p>All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>label</code></td>\n<td><code>String</code></td>\n<td>The label for the dataset which appears in the legend and tooltips.</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td>The fill color under the line. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td>The color of the line. See <a href=\"../general/colors.html#colors\">Colors</a></td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td>The width of the line in pixels.</td>\n</tr>\n<tr>\n<td><code>borderDash</code></td>\n<td><code>Number[]</code></td>\n<td>Length and spacing of dashes. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderDashOffset</code></td>\n<td><code>Number</code></td>\n<td>Offset for line dashes. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderCapStyle</code></td>\n<td><code>String</code></td>\n<td>Cap style of the line. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>borderJoinStyle</code></td>\n<td><code>String</code></td>\n<td>Line joint style. See <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\" target=\"_blank\">MDN</a></td>\n</tr>\n<tr>\n<td><code>fill</code></td>\n<td><code>Boolean/String</code></td>\n<td>How to fill the area under the line. See <a href=\"area.html\">area charts</a></td>\n</tr>\n<tr>\n<td><code>lineTension</code></td>\n<td><code>Number</code></td>\n<td>Bezier curve tension of the line. Set to 0 to draw straightlines.</td>\n</tr>\n<tr>\n<td><code>pointBackgroundColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The fill color for points.</td>\n</tr>\n<tr>\n<td><code>pointBorderColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>The border color for points.</td>\n</tr>\n<tr>\n<td><code>pointBorderWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The width of the point border in pixels.</td>\n</tr>\n<tr>\n<td><code>pointRadius</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The radius of the point shape. If set to 0, the point is not rendered.</td>\n</tr>\n<tr>\n<td><code>pointStyle</code></td>\n<td><code>String/String[]/Image/Image[]</code></td>\n<td>Style of the point. <a href=\"#pointstyle\">more...</a></td>\n</tr>\n<tr>\n<td><code>pointHitRadius</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The pixel size of the non-displayed point that reacts to mouse events.</td>\n</tr>\n<tr>\n<td><code>pointHoverBackgroundColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>Point background color when hovered.</td>\n</tr>\n<tr>\n<td><code>pointHoverBorderColor</code></td>\n<td><code>Color/Color[]</code></td>\n<td>Point border color when hovered.</td>\n</tr>\n<tr>\n<td><code>pointHoverBorderWidth</code></td>\n<td><code>Number/Number[]</code></td>\n<td>Border width of point when hovered.</td>\n</tr>\n<tr>\n<td><code>pointHoverRadius</code></td>\n<td><code>Number/Number[]</code></td>\n<td>The radius of the point when hovered.</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"pointstyle\">pointStyle</h3>\n<p>The style of point. Options are:</p>\n<ul>\n<li>&apos;circle&apos;</li>\n<li>&apos;cross&apos;</li>\n<li>&apos;crossRot&apos;</li>\n<li>&apos;dash&apos;. </li>\n<li>&apos;line&apos;</li>\n<li>&apos;rect&apos;</li>\n<li>&apos;rectRounded&apos;</li>\n<li>&apos;rectRot&apos;</li>\n<li>&apos;star&apos;</li>\n<li>&apos;triangle&apos;</li>\n</ul>\n<p>If the option is an image, that image is drawn on the canvas using <a href=\"https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/drawImage\" target=\"_blank\">drawImage</a>.</p>\n<h2 id=\"configuration-options\">Configuration Options</h2>\n<p>Unlike other charts, the radar chart has no chart specific options.</p>\n<h2 id=\"scale-options\">Scale Options</h2>\n<p>The radar chart supports only a single scale. The options for this scale are defined in the <code>scale</code> property.</p>\n<pre><code class=\"lang-javascript\">options = {\n    scale: {\n        <span class=\"hljs-comment\">// Hides the scale</span>\n        display: <span class=\"hljs-literal\">false</span>\n    }\n};\n</code></pre>\n<h2 id=\"default-options\">Default Options</h2>\n<p>It is common to want to apply a configuration setting to all created radar charts. The global radar chart settings are stored in <code>Chart.defaults.radar</code>. Changing the global options only affects charts created after the change. Existing charts are not changed.</p>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>The <code>data</code> property of a dataset for a radar chart is specified as a an array of numbers. Each point in the data array corresponds to the label at the same index on the x axis. </p>\n<pre><code class=\"lang-javascript\">data: [<span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">10</span>]\n</code></pre>\n<p>For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart.</p>\n<pre><code class=\"lang-javascript\">data: {\n    labels: [<span class=\"hljs-string\">&apos;Running&apos;</span>, <span class=\"hljs-string\">&apos;Swimming&apos;</span>, <span class=\"hljs-string\">&apos;Eating&apos;</span>, <span class=\"hljs-string\">&apos;Cycling&apos;</span>],\n    datasets: [{\n        data: [<span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">2</span>]\n    }]\n}\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"bar.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Bar\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"doughnut.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Doughnut & Pie\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Radar\",\"level\":\"1.5.3\",\"depth\":2,\"next\":{\"title\":\"Doughnut & Pie\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"charts/doughnut.md\",\"ref\":\"charts/doughnut.md\",\"articles\":[]},\"previous\":{\"title\":\"Bar\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"charts/bar.md\",\"ref\":\"charts/bar.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/radar.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/charts/scatter.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Scatter · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"area.html\" />\n\n\n    <link rel=\"prev\" href=\"bubble.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"line.html\">\n\n                <a href=\"line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"bar.html\">\n\n                <a href=\"bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"radar.html\">\n\n                <a href=\"radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"doughnut.html\">\n\n                <a href=\"doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"polar.html\">\n\n                <a href=\"polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"bubble.html\">\n\n                <a href=\"bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.5.7\" data-path=\"scatter.html\">\n\n                <a href=\"scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"area.html\">\n\n                <a href=\"area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"mixed.html\">\n\n                <a href=\"mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Scatter</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"scatter-chart\">Scatter Chart</h1>\n<p>Scatter charts are based on basic line charts with the x axis changed to a linear axis. To use a scatter chart, data must be passed as objects containing X and Y properties. The example below creates a scatter chart with 3 points.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> scatterChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;scatter&apos;</span>,\n    data: {\n        datasets: [{\n            label: <span class=\"hljs-string\">&apos;Scatter Dataset&apos;</span>,\n            data: [{\n                x: <span class=\"hljs-number\">-10</span>,\n                y: <span class=\"hljs-number\">0</span>\n            }, {\n                x: <span class=\"hljs-number\">0</span>,\n                y: <span class=\"hljs-number\">10</span>\n            }, {\n                x: <span class=\"hljs-number\">10</span>,\n                y: <span class=\"hljs-number\">5</span>\n            }]\n        }]\n    },\n    options: {\n        scales: {\n            xAxes: [{\n                type: <span class=\"hljs-string\">&apos;linear&apos;</span>,\n                position: <span class=\"hljs-string\">&apos;bottom&apos;</span>\n            }]\n        }\n    }\n});\n</code></pre>\n<h2 id=\"dataset-properties\">Dataset Properties</h2>\n<p>The scatter chart supports all of the same properties as the <a href=\"line.html#dataset-properties\">line chart</a>.</p>\n<h2 id=\"data-structure\">Data Structure</h2>\n<p>Unlike the line chart where data can be supplied in two different formats, the scatter chart only accepts data in a point format.</p>\n<pre><code class=\"lang-javascript\">data: [{\n        x: <span class=\"hljs-number\">10</span>,\n        y: <span class=\"hljs-number\">20</span>\n    }, {\n        x: <span class=\"hljs-number\">15</span>,\n        y: <span class=\"hljs-number\">10</span>\n    }]\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"bubble.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Bubble\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"area.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Area\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Scatter\",\"level\":\"1.5.7\",\"depth\":2,\"next\":{\"title\":\"Area\",\"level\":\"1.5.8\",\"depth\":2,\"path\":\"charts/area.md\",\"ref\":\"charts/area.md\",\"articles\":[]},\"previous\":{\"title\":\"Bubble\",\"level\":\"1.5.6\",\"depth\":2,\"path\":\"charts/bubble.md\",\"ref\":\"charts/bubble.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"charts/scatter.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/animations.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Animations · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"layout.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Animations</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"animations\">Animations</h1>\n<p>Chart.js animates charts out of the box. A number of options are provided to configure how the animation looks and how long it takes</p>\n<h2 id=\"animation-configuration\">Animation Configuration</h2>\n<p>The following animation options are available. The global options for are defined in <code>Chart.defaults.global.animation</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>duration</code></td>\n<td><code>Number</code></td>\n<td><code>1000</code></td>\n<td>The number of milliseconds an animation takes.</td>\n</tr>\n<tr>\n<td><code>easing</code></td>\n<td><code>String</code></td>\n<td><code>&apos;easeOutQuart&apos;</code></td>\n<td>Easing function to use. <a href=\"#easing\">more...</a></td>\n</tr>\n<tr>\n<td><code>onProgress</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>Callback called on each step of an animation. <a href=\"#animation-callbacks\">more...</a></td>\n</tr>\n<tr>\n<td><code>onComplete</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>Callback called at the end of an animation. <a href=\"#animation-callbacks\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"easing\">Easing</h2>\n<p> Available options are:</p>\n<ul>\n<li><code>&apos;linear&apos;</code></li>\n<li><code>&apos;easeInQuad&apos;</code></li>\n<li><code>&apos;easeOutQuad&apos;</code></li>\n<li><code>&apos;easeInOutQuad&apos;</code></li>\n<li><code>&apos;easeInCubic&apos;</code></li>\n<li><code>&apos;easeOutCubic&apos;</code></li>\n<li><code>&apos;easeInOutCubic&apos;</code></li>\n<li><code>&apos;easeInQuart&apos;</code></li>\n<li><code>&apos;easeOutQuart&apos;</code></li>\n<li><code>&apos;easeInOutQuart&apos;</code></li>\n<li><code>&apos;easeInQuint&apos;</code></li>\n<li><code>&apos;easeOutQuint&apos;</code></li>\n<li><code>&apos;easeInOutQuint&apos;</code></li>\n<li><code>&apos;easeInSine&apos;</code></li>\n<li><code>&apos;easeOutSine&apos;</code></li>\n<li><code>&apos;easeInOutSine&apos;</code></li>\n<li><code>&apos;easeInExpo&apos;</code></li>\n<li><code>&apos;easeOutExpo&apos;</code></li>\n<li><code>&apos;easeInOutExpo&apos;</code></li>\n<li><code>&apos;easeInCirc&apos;</code></li>\n<li><code>&apos;easeOutCirc&apos;</code></li>\n<li><code>&apos;easeInOutCirc&apos;</code></li>\n<li><code>&apos;easeInElastic&apos;</code></li>\n<li><code>&apos;easeOutElastic&apos;</code></li>\n<li><code>&apos;easeInOutElastic&apos;</code></li>\n<li><code>&apos;easeInBack&apos;</code></li>\n<li><code>&apos;easeOutBack&apos;</code></li>\n<li><code>&apos;easeInOutBack&apos;</code></li>\n<li><code>&apos;easeInBounce&apos;</code></li>\n<li><code>&apos;easeOutBounce&apos;</code></li>\n<li><code>&apos;easeInOutBounce&apos;</code></li>\n</ul>\n<p>See <a href=\"http://robertpenner.com/easing/\" target=\"_blank\">Robert Penner&apos;s easing equations</a>.</p>\n<h2 id=\"animation-callbacks\">Animation Callbacks</h2>\n<p>The <code>onProgress</code> and <code>onComplete</code> callbacks are useful for synchronizing an external draw to the chart animation. The callback is passed a <code>Chart.Animation</code> instance:</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// Chart object</span>\n    chart: Chart,\n\n    <span class=\"hljs-comment\">// Current Animation frame number</span>\n    currentStep: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Number of animation frames</span>\n    numSteps: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Animation easing to use</span>\n    easing: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// Function that renders the chart</span>\n    render: <span class=\"hljs-built_in\">Function</span>,\n\n    <span class=\"hljs-comment\">// User callback</span>\n    onAnimationProgress: <span class=\"hljs-built_in\">Function</span>,\n\n    <span class=\"hljs-comment\">// User callback</span>\n    onAnimationComplete: <span class=\"hljs-built_in\">Function</span>\n}\n</code></pre>\n<p>The following example fills a progress bar during the chart animation.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        animation: {\n            onProgress: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">animation</span>) </span>{\n                progress.value = animation.animationObject.currentStep / animation.animationObject.numSteps;\n            }\n        }\n    }\n});\n</code></pre>\n<p>Another example usage of these callbacks can be found on <a href=\"https://github.com/chartjs/Chart.js/blob/master/samples/advanced/progress-bar.html\" target=\"_blank\">Github</a>: this sample displays a progress bar showing how far along the animation is.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Configuration\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"layout.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Layout\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Animations\",\"level\":\"1.4.1\",\"depth\":2,\"next\":{\"title\":\"Layout\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"configuration/layout.md\",\"ref\":\"configuration/layout.md\",\"articles\":[]},\"previous\":{\"title\":\"Configuration\",\"level\":\"1.4\",\"depth\":1,\"path\":\"configuration/README.md\",\"ref\":\"configuration/README.md\",\"articles\":[{\"title\":\"Animations\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"configuration/animations.md\",\"ref\":\"configuration/animations.md\",\"articles\":[]},{\"title\":\"Layout\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"configuration/layout.md\",\"ref\":\"configuration/layout.md\",\"articles\":[]},{\"title\":\"Legend\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"configuration/legend.md\",\"ref\":\"configuration/legend.md\",\"articles\":[]},{\"title\":\"Title\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"configuration/title.md\",\"ref\":\"configuration/title.md\",\"articles\":[]},{\"title\":\"Tooltip\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"configuration/tooltip.md\",\"ref\":\"configuration/tooltip.md\",\"articles\":[]},{\"title\":\"Elements\",\"level\":\"1.4.6\",\"depth\":2,\"path\":\"configuration/elements.md\",\"ref\":\"configuration/elements.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/animations.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/elements.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Elements · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../charts/\" />\n\n\n    <link rel=\"prev\" href=\"tooltip.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Elements</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"elements\">Elements</h1>\n<p>While chart types provide settings to configure the styling of each dataset, you sometimes want to style <strong>all datasets the same way</strong>. A common example would be to stroke all of the bars in a bar chart with the same colour but change the fill per dataset. Options can be configured for four different types of elements: <strong><a href=\"#arc-configuration\">arc</a></strong>, <strong><a href=\"#line-configuration\">lines</a></strong>, <strong><a href=\"#point-configuration\">points</a></strong>, and <strong><a href=\"#rectangle-configuration\">rectangles</a></strong>. When set, these options apply to all objects of that type unless specifically overridden by the configuration attached to a dataset.</p>\n<h2 id=\"global-configuration\">Global Configuration</h2>\n<p>The element options can be specified per chart or globally. The global options for elements are defined in <code>Chart.defaults.global.elements</code>. For example, to set the border width of all bar charts globally you would do:</p>\n<pre><code class=\"lang-javascript\">Chart.defaults.global.elements.rectangle.borderWidth = <span class=\"hljs-number\">2</span>;\n</code></pre>\n<h2 id=\"point-configuration\">Point Configuration</h2>\n<p>Point elements are used to represent the points in a line chart or a bubble chart.</p>\n<p>Global point options: <code>Chart.defaults.global.elements.point</code></p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>radius</code></td>\n<td><code>Number</code></td>\n<td><code>3</code></td>\n<td>Point radius.</td>\n</tr>\n<tr>\n<td><a href=\"#point-styles\"><code>pointStyle</code></a></td>\n<td><code>String</code></td>\n<td><code>circle</code></td>\n<td>Point style.</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Point fill color.</td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td><code>1</code></td>\n<td>Point stroke width.</td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Point stroke color.</td>\n</tr>\n<tr>\n<td><code>hitRadius</code></td>\n<td><code>Number</code></td>\n<td><code>1</code></td>\n<td>Extra radius added to point radius for hit detection.</td>\n</tr>\n<tr>\n<td><code>hoverRadius</code></td>\n<td><code>Number</code></td>\n<td><code>4</code></td>\n<td>Point radius when hovered.</td>\n</tr>\n<tr>\n<td><code>hoverBorderWidth</code></td>\n<td><code>Number</code></td>\n<td><code>1</code></td>\n<td>Stroke width when hovered.</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"point-styles\">Point Styles</h3>\n<p>The following values are supported:</p>\n<ul>\n<li><code>&apos;circle&apos;</code></li>\n<li><code>&apos;cross&apos;</code></li>\n<li><code>&apos;crossRot&apos;</code></li>\n<li><code>&apos;dash&apos;</code></li>\n<li><code>&apos;line&apos;</code></li>\n<li><code>&apos;rect&apos;</code></li>\n<li><code>&apos;rectRounded&apos;</code></li>\n<li><code>&apos;rectRot&apos;</code></li>\n<li><code>&apos;star&apos;</code></li>\n<li><code>&apos;triangle&apos;</code></li>\n</ul>\n<p>If the value is an image, that image is drawn on the canvas using <a href=\"https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/drawImage\" target=\"_blank\">drawImage</a>.</p>\n<h2 id=\"line-configuration\">Line Configuration</h2>\n<p>Line elements are used to represent the line in a line chart.</p>\n<p>Global line options: <code>Chart.defaults.global.elements.line</code></p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>tension</code></td>\n<td><code>Number</code></td>\n<td><code>0.4</code></td>\n<td>B&#xE9;zier curve tension (<code>0</code> for no B&#xE9;zier curves).</td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Line fill color.</td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td><code>3</code></td>\n<td>Line stroke width.</td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Line stroke color.</td>\n</tr>\n<tr>\n<td><code>borderCapStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;butt&apos;</code></td>\n<td>Line cap style (see <a href=\"https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap\" target=\"_blank\">MDN</a>).</td>\n</tr>\n<tr>\n<td><code>borderDash</code></td>\n<td><code>Array</code></td>\n<td><code>[]</code></td>\n<td>Line dash (see <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\" target=\"_blank\">MDN</a>).</td>\n</tr>\n<tr>\n<td><code>borderDashOffset</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Line dash offset (see <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\" target=\"_blank\">MDN</a>).</td>\n</tr>\n<tr>\n<td><code>borderJoinStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;miter</code></td>\n<td>Line join style (see <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\" target=\"_blank\">MDN</a>).</td>\n</tr>\n<tr>\n<td><code>capBezierPoints</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td><code>true</code> to keep B&#xE9;zier control inside the chart, <code>false</code> for no restriction.</td>\n</tr>\n<tr>\n<td><code>fill</code></td>\n<td><code>Boolean/String</code></td>\n<td><code>true</code></td>\n<td>Fill location: <code>&apos;zero&apos;</code>, <code>&apos;top&apos;</code>, <code>&apos;bottom&apos;</code>, <code>true</code> (eq. <code>&apos;zero&apos;</code>) or <code>false</code> (no fill).</td>\n</tr>\n<tr>\n<td><code>stepped</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td><code>true</code> to show the line as a stepped line (<code>tension</code> will be ignored).</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"rectangle-configuration\">Rectangle Configuration</h2>\n<p>Rectangle elements are used to represent the bars in a bar chart.</p>\n<p>Global rectangle options: <code>Chart.defaults.global.elements.rectangle</code></p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Bar fill color.</td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Bar stroke width.</td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Bar stroke color.</td>\n</tr>\n<tr>\n<td><code>borderSkipped</code></td>\n<td><code>String</code></td>\n<td><code>&apos;bottom&apos;</code></td>\n<td>Skipped (excluded) border: <code>&apos;bottom&apos;</code>, <code>&apos;left&apos;</code>, <code>&apos;top&apos;</code> or <code>&apos;right&apos;</code>.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"arc-configuration\">Arc Configuration</h2>\n<p>Arcs are used in the polar area, doughnut and pie charts.</p>\n<p>Global arc options: <code>Chart.defaults.global.elements.arc</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.1)&apos;</code></td>\n<td>Arc fill color.</td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#fff&apos;</code></td>\n<td>Arc stroke color.</td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Arc stroke width.</td>\n</tr>\n</tbody>\n</table>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"tooltip.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Tooltip\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../charts/\" class=\"navigation navigation-next \" aria-label=\"Next page: Charts\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Elements\",\"level\":\"1.4.6\",\"depth\":2,\"next\":{\"title\":\"Charts\",\"level\":\"1.5\",\"depth\":1,\"path\":\"charts/README.md\",\"ref\":\"charts/README.md\",\"articles\":[{\"title\":\"Line\",\"level\":\"1.5.1\",\"depth\":2,\"path\":\"charts/line.md\",\"ref\":\"charts/line.md\",\"articles\":[]},{\"title\":\"Bar\",\"level\":\"1.5.2\",\"depth\":2,\"path\":\"charts/bar.md\",\"ref\":\"charts/bar.md\",\"articles\":[]},{\"title\":\"Radar\",\"level\":\"1.5.3\",\"depth\":2,\"path\":\"charts/radar.md\",\"ref\":\"charts/radar.md\",\"articles\":[]},{\"title\":\"Doughnut & Pie\",\"level\":\"1.5.4\",\"depth\":2,\"path\":\"charts/doughnut.md\",\"ref\":\"charts/doughnut.md\",\"articles\":[]},{\"title\":\"Polar Area\",\"level\":\"1.5.5\",\"depth\":2,\"path\":\"charts/polar.md\",\"ref\":\"charts/polar.md\",\"articles\":[]},{\"title\":\"Bubble\",\"level\":\"1.5.6\",\"depth\":2,\"path\":\"charts/bubble.md\",\"ref\":\"charts/bubble.md\",\"articles\":[]},{\"title\":\"Scatter\",\"level\":\"1.5.7\",\"depth\":2,\"path\":\"charts/scatter.md\",\"ref\":\"charts/scatter.md\",\"articles\":[]},{\"title\":\"Area\",\"level\":\"1.5.8\",\"depth\":2,\"path\":\"charts/area.md\",\"ref\":\"charts/area.md\",\"articles\":[]},{\"title\":\"Mixed\",\"level\":\"1.5.9\",\"depth\":2,\"path\":\"charts/mixed.md\",\"ref\":\"charts/mixed.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Tooltip\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"configuration/tooltip.md\",\"ref\":\"configuration/tooltip.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/elements.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Configuration · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"animations.html\" />\n\n\n    <link rel=\"prev\" href=\"../general/fonts.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Configuration</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"configuration\">Configuration</h1>\n<p>The configuration is used to change how the chart behaves. There are properties to control styling, fonts, the legend, etc.</p>\n<h2 id=\"global-configuration\">Global Configuration</h2>\n<p>This concept was introduced in Chart.js 1.0 to keep configuration <a href=\"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself\" target=\"_blank\">DRY</a>, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type.</p>\n<p>Chart.js merges the options object passed to the chart with the global configuration using chart type defaults and scales defaults appropriately. This way you can be as specific as you would like in your individual chart configuration, while still changing the defaults for all chart types where applicable. The global general options are defined in <code>Chart.defaults.global</code>. The defaults for each chart type are discussed in the documentation for that chart type.</p>\n<p>The following example would set the hover mode to &apos;nearest&apos; for all charts where this was not overridden by the chart type defaults or the options passed to the constructor on creation.</p>\n<pre><code class=\"lang-javascript\">Chart.defaults.global.hover.mode = <span class=\"hljs-string\">&apos;nearest&apos;</span>;\n\n<span class=\"hljs-comment\">// Hover mode is set to nearest because it was not overridden here</span>\n<span class=\"hljs-keyword\">var</span> chartHoverModeNearest  = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n});\n\n<span class=\"hljs-comment\">// This chart would have the hover mode that was passed in</span>\n<span class=\"hljs-keyword\">var</span> chartDifferentHoverMode = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        hover: {\n            <span class=\"hljs-comment\">// Overrides the global setting</span>\n            mode: <span class=\"hljs-string\">&apos;index&apos;</span>\n        }\n    }\n})\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../general/fonts.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Fonts\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"animations.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Animations\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Configuration\",\"level\":\"1.4\",\"depth\":1,\"next\":{\"title\":\"Animations\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"configuration/animations.md\",\"ref\":\"configuration/animations.md\",\"articles\":[]},\"previous\":{\"title\":\"Fonts\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"general/fonts.md\",\"ref\":\"general/fonts.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/layout.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Layout · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"legend.html\" />\n\n\n    <link rel=\"prev\" href=\"animations.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Layout</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"layout-configuration\">Layout Configuration</h1>\n<p>The layout configuration is passed into the <code>options.layout</code> namespace. The global options for the chart layout is defined in <code>Chart.defaults.global.layout</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>padding</code></td>\n<td><code>Number</code> or <code>Object</code></td>\n<td><code>0</code></td>\n<td>The padding to add inside the chart. <a href=\"#padding\">more...</a></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"padding\">Padding</h2>\n<p>If this value is a number, it is applied to all sides of the chart (left, top, right, bottom). If this value is an object, the <code>left</code> property defines the left padding. Similarly the <code>right</code>, <code>top</code>, and <code>bottom</code> properties can also be specified.</p>\n<p>Lets say you wanted to add 50px of padding to the left side of the chart canvas, you would do:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        layout: {\n            padding: {\n                left: <span class=\"hljs-number\">50</span>,\n                right: <span class=\"hljs-number\">0</span>,\n                top: <span class=\"hljs-number\">0</span>,\n                bottom: <span class=\"hljs-number\">0</span>\n            }\n        }\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"animations.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Animations\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"legend.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Legend\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Layout\",\"level\":\"1.4.2\",\"depth\":2,\"next\":{\"title\":\"Legend\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"configuration/legend.md\",\"ref\":\"configuration/legend.md\",\"articles\":[]},\"previous\":{\"title\":\"Animations\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"configuration/animations.md\",\"ref\":\"configuration/animations.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/layout.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/legend.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Legend · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"title.html\" />\n\n\n    <link rel=\"prev\" href=\"layout.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Legend</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"legend-configuration\">Legend Configuration</h1>\n<p>The chart legend displays data about the datasets that area appearing on the chart.</p>\n<h2 id=\"configuration-options\">Configuration options</h2>\n<p>The legend configuration is passed into the <code>options.legend</code> namespace. The global options for the chart legend is defined in <code>Chart.defaults.global.legend</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>is the legend shown</td>\n</tr>\n<tr>\n<td><code>position</code></td>\n<td><code>String</code></td>\n<td><code>&apos;top&apos;</code></td>\n<td>Position of the legend. <a href=\"#position\">more...</a></td>\n</tr>\n<tr>\n<td><code>fullWidth</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>Marks that this box should take the full width of the canvas (pushing down other boxes). This is unlikely to need to be changed in day-to-day use.</td>\n</tr>\n<tr>\n<td><code>onClick</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>A callback that is called when a click event is registered on a label item </td>\n</tr>\n<tr>\n<td><code>onHover</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>A callback that is called when a &apos;mousemove&apos; event is registered on top of a label item</td>\n</tr>\n<tr>\n<td><code>reverse</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>Legend will show datasets in reverse order.</td>\n</tr>\n<tr>\n<td><code>labels</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>See the <a href=\"#legend-label-configuration\">Legend Label Configuration</a> section below.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"position\">Position</h2>\n<p>Position of the legend. Options are:</p>\n<ul>\n<li><code>&apos;top&apos;</code></li>\n<li><code>&apos;left&apos;</code></li>\n<li><code>&apos;bottom&apos;</code></li>\n<li><code>&apos;right&apos;</code></li>\n</ul>\n<h2 id=\"legend-label-configuration\">Legend Label Configuration</h2>\n<p>The legend label configuration is nested below the legend configuration using the <code>labels</code> key.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>boxWidth</code></td>\n<td><code>Number</code></td>\n<td><code>40</code></td>\n<td>width of coloured box</td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>font size of text</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>font style of text</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Color of text</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family of legend text.</td>\n</tr>\n<tr>\n<td><code>padding</code></td>\n<td><code>Number</code></td>\n<td><code>10</code></td>\n<td>Padding between rows of colored boxes.</td>\n</tr>\n<tr>\n<td><code>generateLabels</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Generates legend items for each thing in the legend. Default implementation returns the text + styling for the color box. See <a href=\"#legend-item-interface\">Legend Item</a> for details.</td>\n</tr>\n<tr>\n<td><code>filter</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>Filters legend items out of the legend. Receives 2 parameters, a <a href=\"#legend-item-interface\">Legend Item</a> and the chart data.</td>\n</tr>\n<tr>\n<td><code>usePointStyle</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>Label style will match corresponding point style (size is based on fontSize, boxWidth is not used in this case).</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"legend-item-interface\">Legend Item Interface</h2>\n<p>Items passed to the legend <code>onClick</code> function are the ones returned from <code>labels.generateLabels</code>. These items must implement the following interface.</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// Label that will be displayed</span>\n    text: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// Fill style of the legend box</span>\n    fillStyle: Color,\n\n    <span class=\"hljs-comment\">// If true, this item represents a hidden dataset. Label will be rendered with a strike-through effect</span>\n    hidden: <span class=\"hljs-built_in\">Boolean</span>,\n\n    <span class=\"hljs-comment\">// For box border. See https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap</span>\n    lineCap: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash</span>\n    lineDash: <span class=\"hljs-built_in\">Array</span>[<span class=\"hljs-built_in\">Number</span>],\n\n    <span class=\"hljs-comment\">// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset</span>\n    lineDashOffset: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin</span>\n    lineJoin: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// Width of box border</span>\n    lineWidth: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Stroke style of the legend box</span>\n    strokeStyle: Color\n\n    <span class=\"hljs-comment\">// Point style of the legend box (only used if usePointStyle is true)</span>\n    pointStyle: <span class=\"hljs-built_in\">String</span>\n}\n</code></pre>\n<h2 id=\"example\">Example</h2>\n<p>The following example will create a chart with the legend enabled and turn all of the text red in color.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n    data: data,\n    options: {\n        legend: {\n            display: <span class=\"hljs-literal\">true</span>,\n            labels: {\n                fontColor: <span class=\"hljs-string\">&apos;rgb(255, 99, 132)&apos;</span>\n            }\n        }\n}\n});\n</code></pre>\n<h2 id=\"custom-on-click-actions\">Custom On Click Actions</h2>\n<p>It can be common to want to trigger different behaviour when clicking an item in the legend. This can be easily achieved using a callback in the config object.</p>\n<p>The default legend click handler is:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">e, legendItem</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> index = legendItem.datasetIndex;\n    <span class=\"hljs-keyword\">var</span> ci = <span class=\"hljs-keyword\">this</span>.chart;\n    <span class=\"hljs-keyword\">var</span> meta = ci.getDatasetMeta(index);\n\n    <span class=\"hljs-comment\">// See controller.isDatasetVisible comment</span>\n    meta.hidden = meta.hidden === <span class=\"hljs-literal\">null</span>? !ci.data.datasets[index].hidden : <span class=\"hljs-literal\">null</span>;\n\n    <span class=\"hljs-comment\">// We hid a dataset ... rerender the chart</span>\n    ci.update();\n}\n</code></pre>\n<p>Lets say we wanted instead to link the display of the first two datasets. We could change the click handler accordingly.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> defaultLegendClickHandler = Chart.defaults.global.legend.onClick;\n<span class=\"hljs-keyword\">var</span> newLegendClickHandler = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">e, legendItem</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> index = legendItem.datasetIndex;\n\n    <span class=\"hljs-keyword\">if</span> (index &gt; <span class=\"hljs-number\">1</span>) {\n        <span class=\"hljs-comment\">// Do the original logic</span>\n        defaultLegendClickHandler(e, legendItem);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-keyword\">let</span> ci = <span class=\"hljs-keyword\">this</span>.chart;\n        [ci.getDatasetMeta(<span class=\"hljs-number\">0</span>),\n         ci.getDatasetMeta(<span class=\"hljs-number\">1</span>)].forEach(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">meta</span>) </span>{\n            meta.hidden = meta.hidden === <span class=\"hljs-literal\">null</span>? !ci.data.datasets[index].hidden : <span class=\"hljs-literal\">null</span>;\n        });\n        ci.update();\n    }\n};\n\n<span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        legend: {\n\n        }\n    }\n});\n</code></pre>\n<p>Now when you click the legend in this chart, the visibility of the first two datasets will be linked together.</p>\n<h2 id=\"html-legends\">HTML Legends</h2>\n<p>Sometimes you need a very complex legend. In these cases, it makes sense to generate an HTML legend. Charts provide a <code>generateLegend()</code> method on their prototype that returns an HTML string for the legend.</p>\n<p>To configure how this legend is generated, you can change the <code>legendCallback</code> config property.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        legendCallback: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">chart</span>) </span>{\n            <span class=\"hljs-comment\">// Return the HTML string here.</span>\n        }\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"layout.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Layout\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"title.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Title\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Legend\",\"level\":\"1.4.3\",\"depth\":2,\"next\":{\"title\":\"Title\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"configuration/title.md\",\"ref\":\"configuration/title.md\",\"articles\":[]},\"previous\":{\"title\":\"Layout\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"configuration/layout.md\",\"ref\":\"configuration/layout.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/legend.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/title.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Title · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"tooltip.html\" />\n\n\n    <link rel=\"prev\" href=\"legend.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Title</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"title\">Title</h1>\n<p>The chart title defines text to draw at the top of the chart.</p>\n<h2 id=\"title-configuration\">Title Configuration</h2>\n<p>The title configuration is passed into the <code>options.title</code> namespace. The global options for the chart title is defined in <code>Chart.defaults.global.title</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>display</code></td>\n<td><code>Boolean</code></td>\n<td><code>false</code></td>\n<td>is the title shown</td>\n</tr>\n<tr>\n<td><code>position</code></td>\n<td><code>String</code></td>\n<td><code>&apos;top&apos;</code></td>\n<td>Position of title. <a href=\"#position\">more...</a></td>\n</tr>\n<tr>\n<td><code>fontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Font size</td>\n</tr>\n<tr>\n<td><code>fontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Font family for the title text.</td>\n</tr>\n<tr>\n<td><code>fontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Font color</td>\n</tr>\n<tr>\n<td><code>fontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;bold&apos;</code></td>\n<td>Font style</td>\n</tr>\n<tr>\n<td><code>padding</code></td>\n<td><code>Number</code></td>\n<td><code>10</code></td>\n<td>Number of pixels to add above and below the title text.</td>\n</tr>\n<tr>\n<td><code>lineHeight</code></td>\n<td><code>Number/String</code></td>\n<td><code>1.2</code></td>\n<td>Height of an individual line of text (see <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\" target=\"_blank\">MDN</a>)</td>\n</tr>\n<tr>\n<td><code>text</code></td>\n<td><code>String/String[]</code></td>\n<td><code>&apos;&apos;</code></td>\n<td>Title text to display. If specified as an array, text is rendered on multiple lines.</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"position\">Position</h3>\n<p>Possible title position values are:</p>\n<ul>\n<li><code>&apos;top&apos;</code></li>\n<li><code>&apos;left&apos;</code></li>\n<li><code>&apos;bottom&apos;</code></li>\n<li><code>&apos;right&apos;</code></li>\n</ul>\n<h2 id=\"example-usage\">Example Usage</h2>\n<p>The example below would enable a title of &apos;Custom Chart Title&apos; on the chart that is created.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        title: {\n            display: <span class=\"hljs-literal\">true</span>,\n            text: <span class=\"hljs-string\">&apos;Custom Chart Title&apos;</span>\n        }\n    }\n})\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"legend.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Legend\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"tooltip.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Tooltip\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Title\",\"level\":\"1.4.4\",\"depth\":2,\"next\":{\"title\":\"Tooltip\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"configuration/tooltip.md\",\"ref\":\"configuration/tooltip.md\",\"articles\":[]},\"previous\":{\"title\":\"Legend\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"configuration/legend.md\",\"ref\":\"configuration/legend.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/title.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/configuration/tooltip.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Tooltip · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"elements.html\" />\n\n\n    <link rel=\"prev\" href=\"title.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"animations.html\">\n\n                <a href=\"animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"layout.html\">\n\n                <a href=\"layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"legend.html\">\n\n                <a href=\"legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"title.html\">\n\n                <a href=\"title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.4.5\" data-path=\"tooltip.html\">\n\n                <a href=\"tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"elements.html\">\n\n                <a href=\"elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Tooltip</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"tooltips\">Tooltips</h1>\n<h2 id=\"tooltip-configuration\">Tooltip Configuration</h2>\n<p>The tooltip configuration is passed into the <code>options.tooltips</code> namespace. The global options for the chart tooltips is defined in <code>Chart.defaults.global.tooltips</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>enabled</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>Are tooltips enabled</td>\n</tr>\n<tr>\n<td><code>custom</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>See <a href=\"#external-custom-tooltips\">custom tooltip</a> section.</td>\n</tr>\n<tr>\n<td><code>mode</code></td>\n<td><code>String</code></td>\n<td><code>&apos;nearest&apos;</code></td>\n<td>Sets which elements appear in the tooltip. <a href=\"../general/interactions/modes.html#interaction-modes\">more...</a>.</td>\n</tr>\n<tr>\n<td><code>intersect</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>if true, the tooltip mode applies only when the mouse position intersects with an element. If false, the mode will be applied at all times.</td>\n</tr>\n<tr>\n<td><code>position</code></td>\n<td><code>String</code></td>\n<td><code>&apos;average&apos;</code></td>\n<td>The mode for positioning the tooltip. <a href=\"#position-modes\">more...</a></td>\n</tr>\n<tr>\n<td><code>callbacks</code></td>\n<td><code>Object</code></td>\n<td></td>\n<td>See the <a href=\"#tooltip-callbacks\">callbacks section</a></td>\n</tr>\n<tr>\n<td><code>itemSort</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Sort tooltip items. <a href=\"#sort-callback\">more...</a></td>\n</tr>\n<tr>\n<td><code>filter</code></td>\n<td><code>Function</code></td>\n<td></td>\n<td>Filter tooltip items. <a href=\"#filter-callback\">more...</a></td>\n</tr>\n<tr>\n<td><code>backgroundColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0.8)&apos;</code></td>\n<td>Background color of the tooltip.</td>\n</tr>\n<tr>\n<td><code>titleFontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>title font</td>\n</tr>\n<tr>\n<td><code>titleFontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Title font size</td>\n</tr>\n<tr>\n<td><code>titleFontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;bold&apos;</code></td>\n<td>Title font style</td>\n</tr>\n<tr>\n<td><code>titleFontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#fff&apos;</code></td>\n<td>Title font color</td>\n</tr>\n<tr>\n<td><code>titleSpacing</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Spacing to add to top and bottom of each title line.</td>\n</tr>\n<tr>\n<td><code>titleMarginBottom</code></td>\n<td><code>Number</code></td>\n<td><code>6</code></td>\n<td>Margin to add on bottom of title section.</td>\n</tr>\n<tr>\n<td><code>bodyFontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>body line font</td>\n</tr>\n<tr>\n<td><code>bodyFontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Body font size</td>\n</tr>\n<tr>\n<td><code>bodyFontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Body font style</td>\n</tr>\n<tr>\n<td><code>bodyFontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#fff&apos;</code></td>\n<td>Body font color</td>\n</tr>\n<tr>\n<td><code>bodySpacing</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Spacing to add to top and bottom of each tooltip item.</td>\n</tr>\n<tr>\n<td><code>footerFontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>footer font</td>\n</tr>\n<tr>\n<td><code>footerFontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Footer font size</td>\n</tr>\n<tr>\n<td><code>footerFontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;bold&apos;</code></td>\n<td>Footer font style</td>\n</tr>\n<tr>\n<td><code>footerFontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#fff&apos;</code></td>\n<td>Footer font color</td>\n</tr>\n<tr>\n<td><code>footerSpacing</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Spacing to add to top and bottom of each fotter line.</td>\n</tr>\n<tr>\n<td><code>footerMarginTop</code></td>\n<td><code>Number</code></td>\n<td><code>6</code></td>\n<td>Margin to add before drawing the footer.</td>\n</tr>\n<tr>\n<td><code>xPadding</code></td>\n<td><code>Number</code></td>\n<td><code>6</code></td>\n<td>Padding to add on left and right of tooltip.</td>\n</tr>\n<tr>\n<td><code>yPadding</code></td>\n<td><code>Number</code></td>\n<td><code>6</code></td>\n<td>Padding to add on top and bottom of tooltip.</td>\n</tr>\n<tr>\n<td><code>caretPadding</code></td>\n<td><code>Number</code></td>\n<td><code>2</code></td>\n<td>Extra distance to move the end of the tooltip arrow away from the tooltip point.</td>\n</tr>\n<tr>\n<td><code>caretSize</code></td>\n<td><code>Number</code></td>\n<td><code>5</code></td>\n<td>Size, in px, of the tooltip arrow.</td>\n</tr>\n<tr>\n<td><code>cornerRadius</code></td>\n<td><code>Number</code></td>\n<td><code>6</code></td>\n<td>Radius of tooltip corner curves.</td>\n</tr>\n<tr>\n<td><code>multiKeyBackground</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#fff&apos;</code></td>\n<td>Color to draw behind the colored boxes when multiple items are in the tooltip</td>\n</tr>\n<tr>\n<td><code>displayColors</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>if true, color boxes are shown in the tooltip</td>\n</tr>\n<tr>\n<td><code>borderColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;rgba(0,0,0,0)&apos;</code></td>\n<td>Color of the border</td>\n</tr>\n<tr>\n<td><code>borderWidth</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Size of the border</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"position-modes\">Position Modes</h3>\n<p> Possible modes are:</p>\n<ul>\n<li>&apos;average&apos;</li>\n<li>&apos;nearest&apos;</li>\n</ul>\n<p>&apos;average&apos; mode will place the tooltip at the average position of the items displayed in the tooltip. &apos;nearest&apos; will place the tooltip at the position of the element closest to the event position.</p>\n<p>New modes can be defined by adding functions to the Chart.Tooltip.positioners map.</p>\n<p>Example:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">/**\n * Custom positioner\n * @function Chart.Tooltip.positioners.custom\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {Point} the position of the event in canvas coordinates\n * @returns {Point} the tooltip position\n */</span>\nChart.Tooltip.positioners.custom = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">elements, eventPosition</span>) </span>{\n    <span class=\"hljs-comment\">/** @type {Chart.Tooltip} */</span>\n    <span class=\"hljs-keyword\">var</span> tooltip = <span class=\"hljs-keyword\">this</span>;\n\n    <span class=\"hljs-comment\">/* ... */</span>\n\n    <span class=\"hljs-keyword\">return</span> {\n        x: <span class=\"hljs-number\">0</span>,\n        y: <span class=\"hljs-number\">0</span>\n    };\n}\n</code></pre>\n<h3 id=\"sort-callback\">Sort Callback</h3>\n<p>Allows sorting of <a href=\"#tooltip-item-interface\">tooltip items</a>. Must implement at minimum a function that can be passed to <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\" target=\"_blank\">Array.prototype.sort</a>.  This function can also accept a third parameter that is the data object passed to the chart.</p>\n<h3 id=\"filter-callback\">Filter Callback</h3>\n<p>Allows filtering of <a href=\"#tooltip-item-interface\">tooltip items</a>. Must implement at minimum a function that can be passed to <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\" target=\"_blank\">Array.prototype.filter</a>. This function can also accept a second parameter that is the data object passed to the chart.</p>\n<h2 id=\"tooltip-callbacks\">Tooltip Callbacks</h2>\n<p>The tooltip label configuration is nested below the tooltip configuration using the <code>callbacks</code> key. The tooltip has the following callbacks for providing text. For all functions, &apos;this&apos; will be the tooltip object created from the Chart.Tooltip constructor.</p>\n<p>All functions are called with the same arguments: a <a href=\"#tooltip-item-interface\">tooltip item</a> and the data object passed to the chart. All functions must return either a string or an array of strings. Arrays of strings are treated as multiple lines of text.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Arguments</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>beforeTitle</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns the text to render before the title.</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns text to render as the title of the tooltip.</td>\n</tr>\n<tr>\n<td><code>afterTitle</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns text to render after the title.</td>\n</tr>\n<tr>\n<td><code>beforeBody</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns text to render before the body section.</td>\n</tr>\n<tr>\n<td><code>beforeLabel</code></td>\n<td><code>tooltipItem, data</code></td>\n<td>Returns text to render before an individual label. This will be called for each item in the tooltip.</td>\n</tr>\n<tr>\n<td><code>label</code></td>\n<td><code>tooltipItem, data</code></td>\n<td>Returns text to render for an individual item in the tooltip.</td>\n</tr>\n<tr>\n<td><code>labelColor</code></td>\n<td><code>tooltipItem, chart</code></td>\n<td>Returns the colors to render for the tooltip item. <a href=\"#label-color-callback\">more...</a></td>\n</tr>\n<tr>\n<td><code>labelTextColor</code></td>\n<td><code>tooltipItem, chart</code></td>\n<td>Returns the colors for the text of the label for the tooltip item.</td>\n</tr>\n<tr>\n<td><code>afterLabel</code></td>\n<td><code>tooltipItem, data</code></td>\n<td>Returns text to render after an individual label.</td>\n</tr>\n<tr>\n<td><code>afterBody</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns text to render after the body section</td>\n</tr>\n<tr>\n<td><code>beforeFooter</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns text to render before the footer section.</td>\n</tr>\n<tr>\n<td><code>footer</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Returns text to render as the footer of the tooltip.</td>\n</tr>\n<tr>\n<td><code>afterFooter</code></td>\n<td><code>Array[tooltipItem], data</code></td>\n<td>Text to render after the footer section</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"label-color-callback\">Label Color Callback</h3>\n<p>For example, to return a red box for each item in the tooltip you could do:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            callbacks: {\n                labelColor: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">tooltipItem, chart</span>) </span>{\n                    <span class=\"hljs-keyword\">return</span> {\n                        borderColor: <span class=\"hljs-string\">&apos;rgb(255, 0, 0)&apos;</span>,\n                        backgroundColor: <span class=\"hljs-string\">&apos;rgb(255, 0, 0)&apos;</span>\n                    }\n                },\n                labelTextColor:<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">tooltipItem, chart</span>)</span>{\n                    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">&apos;#543453&apos;</span>;\n                }\n            }\n        }\n    }\n});\n</code></pre>\n<h3 id=\"tooltip-item-interface\">Tooltip Item Interface</h3>\n<p>The tooltip items passed to the tooltip callbacks implement the following interface.</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// X Value of the tooltip as a string</span>\n    xLabel: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// Y value of the tooltip as a string</span>\n    yLabel: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// Index of the dataset the item comes from</span>\n    datasetIndex: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Index of this data item in the dataset</span>\n    index: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// X position of matching point</span>\n    x: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Y position of matching point</span>\n    y: <span class=\"hljs-built_in\">Number</span>,\n}\n</code></pre>\n<h2 id=\"external-custom-tooltips\">External (Custom) Tooltips</h2>\n<p>Custom tooltips allow you to hook into the tooltip rendering process so that you can render the tooltip in your own custom way. Generally this is used to create an HTML tooltip instead of an oncanvas one. You can enable custom tooltips in the global or chart configuration like so:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> myPieChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;pie&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            custom: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">tooltipModel</span>) </span>{\n                <span class=\"hljs-comment\">// Tooltip Element</span>\n                <span class=\"hljs-keyword\">var</span> tooltipEl = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&apos;chartjs-tooltip&apos;</span>);\n\n                <span class=\"hljs-comment\">// Create element on first render</span>\n                <span class=\"hljs-keyword\">if</span> (!tooltipEl) {\n                    tooltipEl = <span class=\"hljs-built_in\">document</span>.createElement(<span class=\"hljs-string\">&apos;div&apos;</span>);\n                    tooltipEl.id = <span class=\"hljs-string\">&apos;chartjs-tooltip&apos;</span>;\n                    tooltipEl.innerHTML = <span class=\"hljs-string\">&quot;&lt;table&gt;&lt;/table&gt;&quot;</span>\n                    <span class=\"hljs-built_in\">document</span>.body.appendChild(tooltipEl);\n                }\n\n                <span class=\"hljs-comment\">// Hide if no tooltip</span>\n                <span class=\"hljs-keyword\">if</span> (tooltipModel.opacity === <span class=\"hljs-number\">0</span>) {\n                    tooltipEl.style.opacity = <span class=\"hljs-number\">0</span>;\n                    <span class=\"hljs-keyword\">return</span>;\n                }\n\n                <span class=\"hljs-comment\">// Set caret Position</span>\n                tooltipEl.classList.remove(<span class=\"hljs-string\">&apos;above&apos;</span>, <span class=\"hljs-string\">&apos;below&apos;</span>, <span class=\"hljs-string\">&apos;no-transform&apos;</span>);\n                <span class=\"hljs-keyword\">if</span> (tooltipModel.yAlign) {\n                    tooltipEl.classList.add(tooltipModel.yAlign);\n                } <span class=\"hljs-keyword\">else</span> {\n                    tooltipEl.classList.add(<span class=\"hljs-string\">&apos;no-transform&apos;</span>);\n                }\n\n                <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">getBody</span>(<span class=\"hljs-params\">bodyItem</span>) </span>{\n                    <span class=\"hljs-keyword\">return</span> bodyItem.lines;\n                }\n\n                <span class=\"hljs-comment\">// Set Text</span>\n                <span class=\"hljs-keyword\">if</span> (tooltipModel.body) {\n                    <span class=\"hljs-keyword\">var</span> titleLines = tooltipModel.title || [];\n                    <span class=\"hljs-keyword\">var</span> bodyLines = tooltipModel.body.map(getBody);\n\n                    <span class=\"hljs-keyword\">var</span> innerHtml = <span class=\"hljs-string\">&apos;&lt;thead&gt;&apos;</span>;\n\n                    titleLines.forEach(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">title</span>) </span>{\n                        innerHtml += <span class=\"hljs-string\">&apos;&lt;tr&gt;&lt;th&gt;&apos;</span> + title + <span class=\"hljs-string\">&apos;&lt;/th&gt;&lt;/tr&gt;&apos;</span>;\n                    });\n                    innerHtml += <span class=\"hljs-string\">&apos;&lt;/thead&gt;&lt;tbody&gt;&apos;</span>;\n\n                    bodyLines.forEach(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">body, i</span>) </span>{\n                        <span class=\"hljs-keyword\">var</span> colors = tooltipModel.labelColors[i];\n                        <span class=\"hljs-keyword\">var</span> style = <span class=\"hljs-string\">&apos;background:&apos;</span> + colors.backgroundColor;\n                        style += <span class=\"hljs-string\">&apos;; border-color:&apos;</span> + colors.borderColor;\n                        style += <span class=\"hljs-string\">&apos;; border-width: 2px&apos;</span>;\n                        <span class=\"hljs-keyword\">var</span> span = <span class=\"hljs-string\">&apos;&lt;span class=&quot;chartjs-tooltip-key&quot; style=&quot;&apos;</span> + style + <span class=\"hljs-string\">&apos;&quot;&gt;&lt;/span&gt;&apos;</span>;\n                        innerHtml += <span class=\"hljs-string\">&apos;&lt;tr&gt;&lt;td&gt;&apos;</span> + span + body + <span class=\"hljs-string\">&apos;&lt;/td&gt;&lt;/tr&gt;&apos;</span>;\n                    });\n                    innerHtml += <span class=\"hljs-string\">&apos;&lt;/tbody&gt;&apos;</span>;\n\n                    <span class=\"hljs-keyword\">var</span> tableRoot = tooltipEl.querySelector(<span class=\"hljs-string\">&apos;table&apos;</span>);\n                    tableRoot.innerHTML = innerHtml;\n                }\n\n                <span class=\"hljs-comment\">// `this` will be the overall tooltip</span>\n                <span class=\"hljs-keyword\">var</span> position = <span class=\"hljs-keyword\">this</span>._chart.canvas.getBoundingClientRect();\n\n                <span class=\"hljs-comment\">// Display, position, and set styles for font</span>\n                tooltipEl.style.opacity = <span class=\"hljs-number\">1</span>;\n                tooltipEl.style.left = position.left + tooltipModel.caretX + <span class=\"hljs-string\">&apos;px&apos;</span>;\n                tooltipEl.style.top = position.top + tooltipModel.caretY + <span class=\"hljs-string\">&apos;px&apos;</span>;\n                tooltipEl.style.fontFamily = tooltipModel._fontFamily;\n                tooltipEl.style.fontSize = tooltipModel.fontSize;\n                tooltipEl.style.fontStyle = tooltipModel._fontStyle;\n                tooltipEl.style.padding = tooltipModel.yPadding + <span class=\"hljs-string\">&apos;px &apos;</span> + tooltipModel.xPadding + <span class=\"hljs-string\">&apos;px&apos;</span>;\n            }\n        }\n    }\n});\n</code></pre>\n<p>See <code>samples/tooltips/line-customTooltips.html</code> for examples on how to get started.</p>\n<h2 id=\"tooltip-model\">Tooltip Model</h2>\n<p>The tooltip model contains parameters that can be used to render the tooltip.</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// The items that we are rendering in the tooltip. See Tooltip Item Interface section</span>\n    dataPoints: TooltipItem[],\n\n    <span class=\"hljs-comment\">// Positioning</span>\n    xPadding: <span class=\"hljs-built_in\">Number</span>,\n    yPadding: <span class=\"hljs-built_in\">Number</span>,\n    xAlign: <span class=\"hljs-built_in\">String</span>,\n    yAlign: <span class=\"hljs-built_in\">String</span>,\n\n    <span class=\"hljs-comment\">// X and Y properties are the top left of the tooltip</span>\n    x: <span class=\"hljs-built_in\">Number</span>,\n    y: <span class=\"hljs-built_in\">Number</span>,\n    width: <span class=\"hljs-built_in\">Number</span>,\n    height: <span class=\"hljs-built_in\">Number</span>,\n    <span class=\"hljs-comment\">// Where the tooltip points to</span>\n    caretX: <span class=\"hljs-built_in\">Number</span>,\n    caretY: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Body</span>\n    <span class=\"hljs-comment\">// The body lines that need to be rendered</span>\n    <span class=\"hljs-comment\">// Each object contains 3 parameters</span>\n    <span class=\"hljs-comment\">// before: String[] // lines of text before the line with the color square</span>\n    <span class=\"hljs-comment\">// lines: String[], // lines of text to render as the main item with color square</span>\n    <span class=\"hljs-comment\">// after: String[], // lines of text to render after the main lines</span>\n    body: <span class=\"hljs-built_in\">Object</span>[],\n    <span class=\"hljs-comment\">// lines of text that appear after the title but before the body</span>\n    beforeBody: <span class=\"hljs-built_in\">String</span>[],\n    <span class=\"hljs-comment\">// line of text that appear after the body and before the footer</span>\n    afterBody: <span class=\"hljs-built_in\">String</span>[],\n    bodyFontColor: Color,\n    _bodyFontFamily: <span class=\"hljs-built_in\">String</span>,\n    _bodyFontStyle: <span class=\"hljs-built_in\">String</span>,\n    _bodyAlign: <span class=\"hljs-built_in\">String</span>,\n    bodyFontSize: <span class=\"hljs-built_in\">Number</span>,\n    bodySpacing: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Title</span>\n    <span class=\"hljs-comment\">// lines of text that form the title</span>\n    title: <span class=\"hljs-built_in\">String</span>[],\n    titleFontColor: Color,\n    _titleFontFamily: <span class=\"hljs-built_in\">String</span>,\n    _titleFontStyle: <span class=\"hljs-built_in\">String</span>,\n    titleFontSize: <span class=\"hljs-built_in\">Number</span>,\n    _titleAlign: <span class=\"hljs-built_in\">String</span>,\n    titleSpacing: <span class=\"hljs-built_in\">Number</span>,\n    titleMarginBottom: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Footer</span>\n    <span class=\"hljs-comment\">// lines of text that form the footer</span>\n    footer: <span class=\"hljs-built_in\">String</span>[],\n    footerFontColor: Color,\n    _footerFontFamily: <span class=\"hljs-built_in\">String</span>,\n    _footerFontStyle: <span class=\"hljs-built_in\">String</span>,\n    footerFontSize: <span class=\"hljs-built_in\">Number</span>,\n    _footerAlign: <span class=\"hljs-built_in\">String</span>,\n    footerSpacing: <span class=\"hljs-built_in\">Number</span>,\n    footerMarginTop: <span class=\"hljs-built_in\">Number</span>,\n\n    <span class=\"hljs-comment\">// Appearance</span>\n    caretSize: <span class=\"hljs-built_in\">Number</span>,\n    cornerRadius: <span class=\"hljs-built_in\">Number</span>,\n    backgroundColor: Color,\n\n    <span class=\"hljs-comment\">// colors to render for each item in body[]. This is the color of the squares in the tooltip</span>\n    labelColors: Color[],\n\n    <span class=\"hljs-comment\">// 0 opacity is a hidden tooltip</span>\n    opacity: <span class=\"hljs-built_in\">Number</span>,\n    legendColorBackground: Color,\n    displayColors: <span class=\"hljs-built_in\">Boolean</span>,\n}\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"title.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Title\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"elements.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Elements\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Tooltip\",\"level\":\"1.4.5\",\"depth\":2,\"next\":{\"title\":\"Elements\",\"level\":\"1.4.6\",\"depth\":2,\"path\":\"configuration/elements.md\",\"ref\":\"configuration/elements.md\",\"articles\":[]},\"previous\":{\"title\":\"Title\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"configuration/title.md\",\"ref\":\"configuration/title.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"configuration/tooltip.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/api.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Chart.js API · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"updates.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Chart.js API</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"chart-prototype-methods\">Chart Prototype Methods</h1>\n<p>For each chart, there are a set of global prototype methods on the shared <code>ChartType</code> which you may find useful. These are available on all charts created with Chart.js, but for the examples, let&apos;s use a line chart we&apos;ve made.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// For example:</span>\n<span class=\"hljs-keyword\">var</span> myLineChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, config);\n</code></pre>\n<h2 id=\"destroy\">.destroy()</h2>\n<p>Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js.\nThis must be called before the canvas is reused for a new chart.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// Destroys a specific chart instance</span>\nmyLineChart.destroy();\n</code></pre>\n<h2 id=\"updateconfig\">.update(config)</h2>\n<p>Triggers an update of the chart. This can be safely called after updating the data object. This will update all scales, legends, and then re-render the chart.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// duration is the time for the animation of the redraw in milliseconds</span>\n<span class=\"hljs-comment\">// lazy is a boolean. if true, the animation can be interrupted by other animations</span>\nmyLineChart.data.datasets[<span class=\"hljs-number\">0</span>].data[<span class=\"hljs-number\">2</span>] = <span class=\"hljs-number\">50</span>; <span class=\"hljs-comment\">// Would update the first dataset&apos;s value of &apos;March&apos; to be 50</span>\nmyLineChart.update(); <span class=\"hljs-comment\">// Calling update now animates the position of March from 90 to 50.</span>\n</code></pre>\n<blockquote>\n<p><strong>Note:</strong> replacing the data reference (e.g. <code>myLineChart.data = {datasets: [...]}</code> only works starting <strong>version 2.6</strong>. Prior that, replacing the entire data object could be achieved with the following workaround: <code>myLineChart.config.data = {datasets: [...]}</code>.</p>\n</blockquote>\n<p>A <code>config</code> object can be provided with additional configuration for the update process. This is useful when <code>update</code> is manually called inside an event handler and some different animation is desired.</p>\n<p>The following properties are supported:</p>\n<ul>\n<li><strong>duration</strong> (number): Time for the animation of the redraw in milliseconds</li>\n<li><strong>lazy</strong> (boolean): If true, the animation can be interrupted by other animations</li>\n<li><strong>easing</strong> (string): The animation easing function. See <a href=\"../configuration/animations.html\">Animation Easing</a> for possible values.</li>\n</ul>\n<p>Example:</p>\n<pre><code class=\"lang-javascript\">myChart.update({\n    duration: <span class=\"hljs-number\">800</span>,\n    easing: <span class=\"hljs-string\">&apos;easeOutBounce&apos;</span>\n})\n</code></pre>\n<p>See <a href=\"updates.html\">Updating Charts</a> for more details.</p>\n<h2 id=\"reset\">.reset()</h2>\n<p>Reset the chart to it&apos;s state before the initial animation. A new animation can then be triggered using <code>update</code>.</p>\n<pre><code class=\"lang-javascript\">myLineChart.reset();\n</code></pre>\n<h2 id=\"renderconfig\">.render(config)</h2>\n<p>Triggers a redraw of all chart elements. Note, this does not update elements for new data. Use <code>.update()</code> in that case.</p>\n<p>See <code>.update(config)</code> for more details on the config object.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// duration is the time for the animation of the redraw in milliseconds</span>\n<span class=\"hljs-comment\">// lazy is a boolean. if true, the animation can be interrupted by other animations</span>\nmyLineChart.render({\n    duration: <span class=\"hljs-number\">800</span>,\n    lazy: <span class=\"hljs-literal\">false</span>,\n    easing: <span class=\"hljs-string\">&apos;easeOutBounce&apos;</span>\n});\n</code></pre>\n<h2 id=\"stop\">.stop()</h2>\n<p>Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call <code>.render()</code> to re-animate.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// Stops the charts animation loop at its current frame</span>\nmyLineChart.stop();\n<span class=\"hljs-comment\">// =&gt; returns &apos;this&apos; for chainability</span>\n</code></pre>\n<h2 id=\"resize\">.resize()</h2>\n<p>Use this to manually resize the canvas element. This is run each time the canvas container is resized, but you can call this method manually if you change the size of the canvas nodes container element.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// Resizes &amp; redraws to fill its container element</span>\nmyLineChart.resize();\n<span class=\"hljs-comment\">// =&gt; returns &apos;this&apos; for chainability</span>\n</code></pre>\n<h2 id=\"clear\">.clear()</h2>\n<p>Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// Will clear the canvas that myLineChart is drawn on</span>\nmyLineChart.clear();\n<span class=\"hljs-comment\">// =&gt; returns &apos;this&apos; for chainability</span>\n</code></pre>\n<h2 id=\"tobase64image\">.toBase64Image()</h2>\n<p>This returns a base 64 encoded string of the chart in it&apos;s current state.</p>\n<pre><code class=\"lang-javascript\">myLineChart.toBase64Image();\n<span class=\"hljs-comment\">// =&gt; returns png data url of the image on the canvas</span>\n</code></pre>\n<h2 id=\"generatelegend\">.generateLegend()</h2>\n<p>Returns an HTML string of a legend for that chart. The legend is generated from the <code>legendCallback</code> in the options.</p>\n<pre><code class=\"lang-javascript\">myLineChart.generateLegend();\n<span class=\"hljs-comment\">// =&gt; returns HTML string of a legend for this chart</span>\n</code></pre>\n<h2 id=\"getelementatevente\">.getElementAtEvent(e)</h2>\n<p>Calling <code>getElementAtEvent(event)</code> on your Chart instance passing an argument of an event, or jQuery event, will return the single element at the event position. If there are multiple items within range, only the first is returned. The value returned from this method is an array with a single parameter. An array is used to keep a consistent API between the <code>get*AtEvent</code> methods.</p>\n<pre><code class=\"lang-javascript\">myLineChart.getElementAtEvent(e);\n<span class=\"hljs-comment\">// =&gt; returns the first element at the event point.</span>\n</code></pre>\n<p>To get an item that was clicked on, <code>getElementAtEvent</code> can be used.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">clickHandler</span>(<span class=\"hljs-params\">evt</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> item = myChart.getElementAtEvent(evt)[<span class=\"hljs-number\">0</span>];\n\n    <span class=\"hljs-keyword\">if</span> (item) {\n        <span class=\"hljs-keyword\">var</span> label = myChart.data.labels[firstPoint._index];\n        <span class=\"hljs-keyword\">var</span> value = myChart.data.datasets[firstPoint._datasetIndex].data[firstPoint._index];\n    }\n}\n</code></pre>\n<h2 id=\"getelementsatevente\">.getElementsAtEvent(e)</h2>\n<p>Looks for the element under the event point, then returns all elements at the same data index. This is used internally for &apos;label&apos; mode highlighting.</p>\n<p>Calling <code>getElementsAtEvent(event)</code> on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event.</p>\n<pre><code class=\"lang-javascript\">canvas.onclick = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">evt</span>)</span>{\n    <span class=\"hljs-keyword\">var</span> activePoints = myLineChart.getElementsAtEvent(evt);\n    <span class=\"hljs-comment\">// =&gt; activePoints is an array of points on the canvas that are at the same position as the click event.</span>\n};\n</code></pre>\n<p>This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.</p>\n<h2 id=\"getdatasetatevente\">.getDatasetAtEvent(e)</h2>\n<p>Looks for the element under the event point, then returns all elements from that dataset. This is used internally for &apos;dataset&apos; mode highlighting</p>\n<pre><code class=\"lang-javascript\">myLineChart.getDatasetAtEvent(e);\n<span class=\"hljs-comment\">// =&gt; returns an array of elements</span>\n</code></pre>\n<h2 id=\"getdatasetmetaindex\">.getDatasetMeta(index)</h2>\n<p>Looks for the dataset that matches the current index and returns that metadata. This returned data has all of the metadata that is used to construct the chart.</p>\n<p>The <code>data</code> property of the metadata will contain information about each point, rectangle, etc. depending on the chart type.</p>\n<p>Extensive examples of usage are available in the <a href=\"https://github.com/chartjs/Chart.js/tree/master/test\" target=\"_blank\">Chart.js tests</a>.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> meta = myChart.getDatasetMeta(<span class=\"hljs-number\">0</span>);\n<span class=\"hljs-keyword\">var</span> x = meta.data[<span class=\"hljs-number\">0</span>]._model.x\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Developers\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"updates.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Updating Charts\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Chart.js API\",\"level\":\"1.7.1\",\"depth\":2,\"next\":{\"title\":\"Updating Charts\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"developers/updates.md\",\"ref\":\"developers/updates.md\",\"articles\":[]},\"previous\":{\"title\":\"Developers\",\"level\":\"1.7\",\"depth\":1,\"path\":\"developers/README.md\",\"ref\":\"developers/README.md\",\"articles\":[{\"title\":\"Chart.js API\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"developers/api.md\",\"ref\":\"developers/api.md\",\"articles\":[]},{\"title\":\"Updating Charts\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"developers/updates.md\",\"ref\":\"developers/updates.md\",\"articles\":[]},{\"title\":\"Plugins\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"developers/plugins.md\",\"ref\":\"developers/plugins.md\",\"articles\":[]},{\"title\":\"New Charts\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"developers/charts.md\",\"ref\":\"developers/charts.md\",\"articles\":[]},{\"title\":\"New Axes\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"developers/axes.md\",\"ref\":\"developers/axes.md\",\"articles\":[]},{\"title\":\"Contributing\",\"level\":\"1.7.6\",\"depth\":2,\"path\":\"developers/contributing.md\",\"ref\":\"developers/contributing.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/api.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/axes.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>New Axes · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"contributing.html\" />\n\n\n    <link rel=\"prev\" href=\"charts.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >New Axes</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"new-axes\">New Axes</h1>\n<p>Axes in Chart.js can be individually extended. Axes should always derive from Chart.Scale but this is not a mandatory requirement.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">let</span> MyScale = Chart.Scale.extend({\n    <span class=\"hljs-comment\">/* extensions ... */</span>\n});\n\n<span class=\"hljs-comment\">// MyScale is now derived from Chart.Scale</span>\n</code></pre>\n<p>Once you have created your scale class, you need to register it with the global chart object so that it can be used. A default config for the scale may be provided when registering the constructor. The first parameter to the register function is a string key that is used later to identify which scale type to use for a chart.</p>\n<pre><code class=\"lang-javascript\">Chart.scaleService.registerScaleType(<span class=\"hljs-string\">&apos;myScale&apos;</span>, MyScale, defaultConfigObject);\n</code></pre>\n<p>To use the new scale, simply pass in the string key to the config when creating a chart.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> lineChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    data: data,\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    options: {\n        scales: {\n            yAxes: [{\n                type: <span class=\"hljs-string\">&apos;myScale&apos;</span> <span class=\"hljs-comment\">// this is the same key that was passed to the registerScaleType function</span>\n            }]\n        }\n    }\n})\n</code></pre>\n<h2 id=\"scale-properties\">Scale Properties</h2>\n<p>Scale instances are given the following properties during the fitting process.</p>\n<pre><code class=\"lang-javascript\">{\n    left: <span class=\"hljs-built_in\">Number</span>, <span class=\"hljs-comment\">// left edge of the scale bounding box</span>\n    right: <span class=\"hljs-built_in\">Number</span>, <span class=\"hljs-comment\">// right edge of the bounding box&apos;</span>\n    top: <span class=\"hljs-built_in\">Number</span>,\n    bottom: <span class=\"hljs-built_in\">Number</span>,\n    width: <span class=\"hljs-built_in\">Number</span>, <span class=\"hljs-comment\">// the same as right - left</span>\n    height: <span class=\"hljs-built_in\">Number</span>, <span class=\"hljs-comment\">// the same as bottom - top</span>\n\n    <span class=\"hljs-comment\">// Margin on each side. Like css, this is outside the bounding box.</span>\n    margins: {\n        left: <span class=\"hljs-built_in\">Number</span>,\n        right: <span class=\"hljs-built_in\">Number</span>,\n        top: <span class=\"hljs-built_in\">Number</span>,\n        bottom: <span class=\"hljs-built_in\">Number</span>,\n    },\n\n    <span class=\"hljs-comment\">// Amount of padding on the inside of the bounding box (like CSS)</span>\n    paddingLeft: <span class=\"hljs-built_in\">Number</span>,\n    paddingRight: <span class=\"hljs-built_in\">Number</span>,\n    paddingTop: <span class=\"hljs-built_in\">Number</span>,\n    paddingBottom: <span class=\"hljs-built_in\">Number</span>,\n}\n</code></pre>\n<h2 id=\"scale-interface\">Scale Interface</h2>\n<p>To work with Chart.js, custom scale types must implement the following interface.</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// Determines the data limits. Should set this.min and this.max to be the data max/min</span>\n    determineDataLimits: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Generate tick marks. this.chart is the chart instance. The data object can be accessed as this.chart.data</span>\n    <span class=\"hljs-comment\">// buildTicks() should create a ticks array on the axis instance, if you intend to use any of the implementations from the base class</span>\n    buildTicks: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Get the value to show for the data at the given index of the the given dataset, ie this.chart.data.datasets[datasetIndex].data[index]</span>\n    getLabelForIndex: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">index, datasetIndex</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value</span>\n    <span class=\"hljs-comment\">// @param index: index into the ticks array</span>\n    <span class=\"hljs-comment\">// @param includeOffset: if true, get the pixel halway between the given tick and the next</span>\n    getPixelForTick: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">index, includeOffset</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value</span>\n    <span class=\"hljs-comment\">// @param value : the value to get the pixel for</span>\n    <span class=\"hljs-comment\">// @param index : index into the data array of the value</span>\n    <span class=\"hljs-comment\">// @param datasetIndex : index of the dataset the value comes from</span>\n    <span class=\"hljs-comment\">// @param includeOffset : if true, get the pixel halway between the given tick and the next</span>\n    getPixelForValue: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, index, datasetIndex, includeOffset</span>) </span>{}\n\n    <span class=\"hljs-comment\">// Get the value for a given pixel (x coordinate for horizontal axis, y coordinate for vertical axis)</span>\n    <span class=\"hljs-comment\">// @param pixel : pixel value</span>\n    getValueForPixel: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">pixel</span>) </span>{}\n}\n</code></pre>\n<p>Optionally, the following methods may also be overwritten, but an implementation is already provided by the <code>Chart.Scale</code> base class.</p>\n<pre><code class=\"lang-javascript\">    <span class=\"hljs-comment\">// Transform the ticks array of the scale instance into strings. The default implementation simply calls this.options.ticks.callback(numericalTick, index, ticks);</span>\n    convertTicksToLabels: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Determine how much the labels will rotate by. The default implementation will only rotate labels if the scale is horizontal.</span>\n    calculateTickRotation: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Fits the scale into the canvas.</span>\n    <span class=\"hljs-comment\">// this.maxWidth and this.maxHeight will tell you the maximum dimensions the scale instance can be. Scales should endeavour to be as efficient as possible with canvas space.</span>\n    <span class=\"hljs-comment\">// this.margins is the amount of space you have on either side of your scale that you may expand in to. This is used already for calculating the best label rotation</span>\n    <span class=\"hljs-comment\">// You must set this.minSize to be the size of your scale. It must be an object containing 2 properties: width and height.</span>\n    <span class=\"hljs-comment\">// You must set this.width to be the width and this.height to be the height of the scale</span>\n    fit: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Draws the scale onto the canvas. this.(left|right|top|bottom) will have been populated to tell you the area on the canvas to draw in</span>\n    <span class=\"hljs-comment\">// @param chartArea : an object containing four properties: left, right, top, bottom. This is the rectangle that lines, bars, etc will be drawn in. It may be used, for example, to draw grid lines.</span>\n    draw: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">chartArea</span>) </span>{},\n</code></pre>\n<p>The Core.Scale base class also has some utility functions that you may find useful.</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// Returns true if the scale instance is horizontal</span>\n    isHorizontal: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Get the correct value from the value from this.chart.data.datasets[x].data[]</span>\n    <span class=\"hljs-comment\">// If dataValue is an object, returns .x or .y depending on the return of isHorizontal()</span>\n    <span class=\"hljs-comment\">// If the value is undefined, returns NaN</span>\n    <span class=\"hljs-comment\">// Otherwise returns the value.</span>\n    <span class=\"hljs-comment\">// Note that in all cases, the returned value is not guaranteed to be a Number</span>\n    getRightValue: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">dataValue</span>) </span>{},\n}\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"charts.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: New Charts\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"contributing.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Contributing\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"New Axes\",\"level\":\"1.7.5\",\"depth\":2,\"next\":{\"title\":\"Contributing\",\"level\":\"1.7.6\",\"depth\":2,\"path\":\"developers/contributing.md\",\"ref\":\"developers/contributing.md\",\"articles\":[]},\"previous\":{\"title\":\"New Charts\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"developers/charts.md\",\"ref\":\"developers/charts.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/axes.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/charts.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>New Charts · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"axes.html\" />\n\n\n    <link rel=\"prev\" href=\"plugins.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >New Charts</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"new-charts\">New Charts</h1>\n<p>Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed.</p>\n<pre><code class=\"lang-javascript\">Chart.controllers.MyType = Chart.DatasetController.extend({\n\n});\n\n\n<span class=\"hljs-comment\">// Now we can create a new instance of our chart, using the Chart.js API</span>\n<span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    <span class=\"hljs-comment\">// this is the string the constructor was registered at, ie Chart.controllers.MyType</span>\n    type: <span class=\"hljs-string\">&apos;MyType&apos;</span>,\n    data: data,\n    options: options\n});\n</code></pre>\n<h2 id=\"dataset-controller-interface\">Dataset Controller Interface</h2>\n<p>Dataset controllers must implement the following interface.</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// Create elements for each piece of data in the dataset. Store elements in an array on the dataset as dataset.metaData</span>\n    addElements: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Create a single element for the data at the given index and reset its state</span>\n    addElementAndReset: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">index</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Draw the representation of the dataset</span>\n    <span class=\"hljs-comment\">// @param ease : if specified, this number represents how far to transition elements. See the implementation of draw() in any of the provided controllers to see how this should be used</span>\n    draw: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">ease</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Remove hover styling from the given element</span>\n    removeHoverStyle: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">element</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Add hover styling to the given element</span>\n    setHoverStyle: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">element</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Update the elements in response to new data</span>\n    <span class=\"hljs-comment\">// @param reset : if true, put the elements into a reset state so they can animate to their final values</span>\n    update: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">reset</span>) </span>{},\n}\n</code></pre>\n<p>The following methods may optionally be overridden by derived dataset controllers</p>\n<pre><code class=\"lang-javascript\">{\n    <span class=\"hljs-comment\">// Initializes the controller</span>\n    initialize: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">chart, datasetIndex</span>) </span>{},\n\n    <span class=\"hljs-comment\">// Ensures that the dataset represented by this controller is linked to a scale. Overridden to helpers.noop in the polar area and doughnut controllers as these</span>\n    <span class=\"hljs-comment\">// chart types using a single scale</span>\n    linkScales: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{},\n\n    <span class=\"hljs-comment\">// Called by the main chart controller when an update is triggered. The default implementation handles the number of data points changing and creating elements appropriately.</span>\n    buildOrUpdateElements: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{}\n}\n</code></pre>\n<h2 id=\"extending-existing-chart-types\">Extending Existing Chart Types</h2>\n<p>Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own.</p>\n<p>The built in controller types are:</p>\n<ul>\n<li><code>Chart.controllers.line</code></li>\n<li><code>Chart.controllers.bar</code></li>\n<li><code>Chart.controllers.radar</code></li>\n<li><code>Chart.controllers.doughnut</code></li>\n<li><code>Chart.controllers.polarArea</code></li>\n<li><code>Chart.controllers.bubble</code></li>\n</ul>\n<p>For example, to derive a new chart type that extends from a bubble chart, you would do the following.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// Sets the default config for &apos;derivedBubble&apos; to be the same as the bubble defaults. </span>\n<span class=\"hljs-comment\">// We look for the defaults by doing Chart.defaults[chartType]</span>\n<span class=\"hljs-comment\">// It looks like a bug exists when the defaults don&apos;t exist</span>\nChart.defaults.derivedBubble = Chart.defaults.bubble;\n\n<span class=\"hljs-comment\">// I think the recommend using Chart.controllers.bubble.extend({ extensions here });</span>\n<span class=\"hljs-keyword\">var</span> custom = Chart.controllers.bubble.extend({\n    draw: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">ease</span>) </span>{\n        <span class=\"hljs-comment\">// Call super method first</span>\n        Chart.controllers.bubble.prototype.draw.call(<span class=\"hljs-keyword\">this</span>, ease);\n\n        <span class=\"hljs-comment\">// Now we can do some custom drawing for this dataset. Here we&apos;ll draw a red box around the first point in each dataset</span>\n        <span class=\"hljs-keyword\">var</span> meta = <span class=\"hljs-keyword\">this</span>.getMeta();\n        <span class=\"hljs-keyword\">var</span> pt0 = meta.data[<span class=\"hljs-number\">0</span>];\n        <span class=\"hljs-keyword\">var</span> radius = pt0._view.radius;\n\n        <span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-keyword\">this</span>.chart.chart.ctx;\n        ctx.save();\n        ctx.strokeStyle = <span class=\"hljs-string\">&apos;red&apos;</span>;\n        ctx.lineWidth = <span class=\"hljs-number\">1</span>;\n        ctx.strokeRect(pt0._view.x - radius, pt0._view.y - radius, <span class=\"hljs-number\">2</span> * radius, <span class=\"hljs-number\">2</span> * radius);\n        ctx.restore();\n    }\n});\n\n<span class=\"hljs-comment\">// Stores the controller so that the chart initialization routine can look it up with</span>\n<span class=\"hljs-comment\">// Chart.controllers[type]</span>\nChart.controllers.derivedBubble = custom;\n\n<span class=\"hljs-comment\">// Now we can create and use our new chart type</span>\n<span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;derivedBubble&apos;</span>,\n    data: data,\n    options: options,\n});\n</code></pre>\n<h3 id=\"bar-controller\">Bar Controller</h3>\n<p>The bar controller has a special property that you should be aware of. To correctly calculate the width of a bar, the controller must determine the number of datasets that map to bars. To do this, the bar controller attaches a property <code>bar</code> to the dataset during initialization. If you are creating a replacement or updated bar controller, you should do the same. This will ensure that charts with regular bars and your new derived bars will work seamlessly.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"plugins.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Plugins\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"axes.html\" class=\"navigation navigation-next \" aria-label=\"Next page: New Axes\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"New Charts\",\"level\":\"1.7.4\",\"depth\":2,\"next\":{\"title\":\"New Axes\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"developers/axes.md\",\"ref\":\"developers/axes.md\",\"articles\":[]},\"previous\":{\"title\":\"Plugins\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"developers/plugins.md\",\"ref\":\"developers/plugins.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/charts.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/contributing.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Contributing · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../notes/\" />\n\n\n    <link rel=\"prev\" href=\"axes.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Contributing</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"contributing\">Contributing</h1>\n<p>New contributions to the library are welcome, but we ask that you please follow these guidelines:</p>\n<ul>\n<li>Use tabs for indentation, not spaces.</li>\n<li>Only change the individual files in <code>/src</code>.</li>\n<li>Check that your code will pass <code>eslint</code> code standards, <code>gulp lint</code> will run this for you.</li>\n<li>Check that your code will pass tests, <code>gulp test</code> will run tests for you.</li>\n<li>Keep pull requests concise, and document new functionality in the relevant <code>.md</code> file.</li>\n<li>Consider whether your changes are useful for all users, or if creating a Chart.js <a href=\"plugins.html\">plugin</a> would be more appropriate.</li>\n<li>Avoid breaking changes unless there is an upcoming major release, which are infrequent. We encourage people to write plugins for most new advanced features, so care a lot about backwards compatibility.</li>\n</ul>\n<h1 id=\"joining-the-project\">Joining the project</h1>\n<p> Active committers and contributors are invited to introduce yourself and request commit access to this project. We have a very active Slack community that you can join <a href=\"https://chart-js-automation.herokuapp.com/\" target=\"_blank\">here</a>. If you think you can help, we&apos;d love to have you!</p>\n<h1 id=\"building-and-testing\">Building and Testing</h1>\n<p>Chart.js uses <a href=\"http://gulpjs.com/\" target=\"_blank\">gulp</a> to build the library into a single JavaScript file.</p>\n<p>Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following:</p>\n<pre><code class=\"lang-bash\">&gt; npm install\n&gt; npm install -g gulp\n</code></pre>\n<p>This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner <a href=\"http://gulpjs.com/\" target=\"_blank\">gulp</a>.</p>\n<p>The following commands are now available from the repository root:</p>\n<pre><code class=\"lang-bash\">&gt; gulp build                // build Chart.js <span class=\"hljs-keyword\">in</span> ./dist\n&gt; gulp unittest             // run tests from ./<span class=\"hljs-built_in\">test</span>/specs\n&gt; gulp unittest --watch     // run tests and watch <span class=\"hljs-keyword\">for</span> <span class=\"hljs-built_in\">source</span> changes\n&gt; gulp unittest --coverage  // run tests and generate coverage reports <span class=\"hljs-keyword\">in</span> ./coverage\n&gt; gulp lint                 // perform code linting (ESLint)\n&gt; gulp <span class=\"hljs-built_in\">test</span>                 // perform code linting and run unit tests\n&gt; gulp docs                 // build the documentation <span class=\"hljs-keyword\">in</span> ./dist/docs\n</code></pre>\n<p>More information can be found in <a href=\"https://github.com/chartjs/Chart.js/blob/master/gulpfile.js\" target=\"_blank\">gulpfile.js</a>.</p>\n<h1 id=\"bugs-and-issues\">Bugs and Issues</h1>\n<p>Please report these on the GitHub page - at <a href=\"https://github.com/chartjs/Chart.js\" target=\"_blank\">github.com/chartjs/Chart.js</a>. Please do not use issues for support requests. For help using Chart.js, please take a look at the <a href=\"http://stackoverflow.com/questions/tagged/chartjs\" target=\"_blank\"><code>chartjs</code></a> tag on Stack Overflow.</p>\n<p>Well structured, detailed bug reports are hugely valuable for the project.</p>\n<p>Guidelines for reporting bugs:</p>\n<ul>\n<li>Check the issue search to see if it has already been reported</li>\n<li>Isolate the problem to a simple test case</li>\n<li>Please include a demonstration of the bug on a website such as <a href=\"http://jsbin.com/\" target=\"_blank\">JS Bin</a>, <a href=\"http://jsfiddle.net/\" target=\"_blank\">JS Fiddle</a>, or <a href=\"http://codepen.io/pen/\" target=\"_blank\">Codepen</a>. (<a href=\"http://codepen.io/pen?template=JXVYzq\" target=\"_blank\">Template</a>)</li>\n</ul>\n<p>Please provide any additional details associated with the bug, if it&apos;s browser or screen density specific, or only happens with a certain configuration or data.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"axes.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: New Axes\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../notes/\" class=\"navigation navigation-next \" aria-label=\"Next page: Additional Notes\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Contributing\",\"level\":\"1.7.6\",\"depth\":2,\"next\":{\"title\":\"Additional Notes\",\"level\":\"1.8\",\"depth\":1,\"path\":\"notes/README.md\",\"ref\":\"notes/README.md\",\"articles\":[{\"title\":\"Comparison Table\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"notes/comparison.md\",\"ref\":\"notes/comparison.md\",\"articles\":[]},{\"title\":\"Popular Extensions\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"notes/extensions.md\",\"ref\":\"notes/extensions.md\",\"articles\":[]},{\"title\":\"License\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"notes/license.md\",\"ref\":\"notes/license.md\",\"articles\":[]}]},\"previous\":{\"title\":\"New Axes\",\"level\":\"1.7.5\",\"depth\":2,\"path\":\"developers/axes.md\",\"ref\":\"developers/axes.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/contributing.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Developers · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"api.html\" />\n\n\n    <link rel=\"prev\" href=\"../axes/styling.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Developers</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"developers\">Developers</h1>\n<p>Developer features allow extending and enhancing Chart.js in many different ways.</p>\n<h1 id=\"latest-resources\">Latest resources</h1>\n<p>Latest documentation and samples, including unreleased features, are available at:</p>\n<ul>\n<li><a href=\"http://www.chartjs.org/docs/master/\" target=\"_blank\">http://www.chartjs.org/docs/master/</a></li>\n<li><a href=\"http://www.chartjs.org/samples/master/\" target=\"_blank\">http://www.chartjs.org/samples/master/</a></li>\n</ul>\n<h1 id=\"development-releases\">Development releases</h1>\n<p>Latest builds are available for testing at:</p>\n<ul>\n<li><a href=\"http://www.chartjs.org/dist/master/Chart.min.js\" target=\"_blank\">http://www.chartjs.org/dist/master/Chart.min.js</a></li>\n<li><a href=\"http://www.chartjs.org/dist/master/Chart.bundle.min.js\" target=\"_blank\">http://www.chartjs.org/dist/master/Chart.bundle.min.js</a></li>\n</ul>\n<blockquote>\n<p>Note: Development builds are currently only available via HTTP, so in order to include them in <a href=\"http://jsfiddle.net\" target=\"_blank\">JSFiddle</a> or <a href=\"http://codepen.io\" target=\"_blank\">CodePen</a>, you need to access these tools via HTTP as well.</p>\n</blockquote>\n<p><strong>WARNING: Development builds MUST not be used for production purposes or as replacement for CDN.</strong></p>\n<h1 id=\"browser-support\">Browser support</h1>\n<p>Chart.js offers support for the following browsers:</p>\n<ul>\n<li>Chrome 50+</li>\n<li>Firefox 45+</li>\n<li>Internet Explorer 11</li>\n<li>Edge 14+</li>\n<li>Safari 9+</li>\n</ul>\n<p>Browser support for the canvas element is available in all modern &amp; major mobile browsers. <a href=\"http://caniuse.com/#feat=canvas\" target=\"_blank\">CanIUse</a></p>\n<p>Thanks to <a href=\"https://browserstack.com\" target=\"_blank\">BrowserStack</a> for allowing our team to test on thousands of browsers.</p>\n<h1 id=\"previous-versions\">Previous versions</h1>\n<p>Version 2 has a completely different API than earlier versions.</p>\n<p>Most earlier version options have current equivalents or are the same.</p>\n<p>Please use the documentation that is available on <a href=\"http://www.chartjs.org/docs/\" target=\"_blank\">chartjs.org</a> for the current version of Chart.js.</p>\n<p>Please note - documentation for previous versions are available on the GitHub repo.</p>\n<ul>\n<li><a href=\"https://github.com/chartjs/Chart.js/tree/v1.1.1/docs\" target=\"_blank\">1.x Documentation</a></li>\n</ul>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../axes/styling.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Styling\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"api.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Chart.js API\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Developers\",\"level\":\"1.7\",\"depth\":1,\"next\":{\"title\":\"Chart.js API\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"developers/api.md\",\"ref\":\"developers/api.md\",\"articles\":[]},\"previous\":{\"title\":\"Styling\",\"level\":\"1.6.4\",\"depth\":2,\"path\":\"axes/styling.md\",\"ref\":\"axes/styling.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/plugins.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Plugins · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"charts.html\" />\n\n\n    <link rel=\"prev\" href=\"updates.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Plugins</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"plugins\">Plugins</h1>\n<p>Plugins are the most efficient way to customize or change the default behavior of a chart. They have been introduced at <a href=\"https://github.com/chartjs/Chart.js/releases/tag/2.1.0\" target=\"_blank\">version 2.1.0</a> (global plugins only) and extended at <a href=\"https://github.com/chartjs/Chart.js/releases/tag/v2.5.0\" target=\"_blank\">version 2.5.0</a> (per chart plugins and options).</p>\n<h2 id=\"using-plugins\">Using plugins</h2>\n<p>Plugins can be shared between chart instances:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> plugin = { <span class=\"hljs-comment\">/* plugin implementation */</span> };\n\n<span class=\"hljs-comment\">// chart1 and chart2 use &quot;plugin&quot;</span>\n<span class=\"hljs-keyword\">var</span> chart1 = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    plugins: [plugin]\n});\n\n<span class=\"hljs-keyword\">var</span> chart2 = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    plugins: [plugin]\n});\n\n<span class=\"hljs-comment\">// chart3 doesn&apos;t use &quot;plugin&quot;</span>\n<span class=\"hljs-keyword\">var</span> chart3 = <span class=\"hljs-keyword\">new</span> Chart(ctx, {});\n</code></pre>\n<p>Plugins can also be defined directly in the chart <code>plugins</code> config (a.k.a. <em>inline plugins</em>):</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    plugins: [{\n        beforeInit: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">chart, options</span>) </span>{\n            <span class=\"hljs-comment\">//..</span>\n        }\n    }]\n});\n</code></pre>\n<p>However, this approach is not ideal when the customization needs to apply to many charts.</p>\n<h2 id=\"global-plugins\">Global plugins</h2>\n<p>Plugins can be registered globally to be applied on all charts (a.k.a. <em>global plugins</em>):</p>\n<pre><code class=\"lang-javascript\">Chart.plugins.register({\n    <span class=\"hljs-comment\">// plugin implementation</span>\n});\n</code></pre>\n<blockquote>\n<p>Note: <em>inline</em> plugins can&apos;t be registered globally.</p>\n</blockquote>\n<h2 id=\"configuration\">Configuration</h2>\n<h3 id=\"plugin-id\">Plugin ID</h3>\n<p>Plugins must define a unique id in order to be configurable.</p>\n<p>This id should follow the <a href=\"https://docs.npmjs.com/files/package.json#name\" target=\"_blank\">npm package name convention</a>:</p>\n<ul>\n<li>can&apos;t start with a dot or an underscore</li>\n<li>can&apos;t contain any non-URL-safe characters</li>\n<li>can&apos;t contain uppercase letters</li>\n<li>should be something short, but also reasonably descriptive</li>\n</ul>\n<p>If a plugin is intended to be released publicly, you may want to check the <a href=\"https://www.npmjs.com/search?q=chartjs-plugin-\" target=\"_blank\">registry</a> to see if there&apos;s something by that name already. Note that in this case, the package name should be prefixed by <code>chartjs-plugin-</code> to appear in Chart.js plugin registry.</p>\n<h3 id=\"plugin-options\">Plugin options</h3>\n<p>Plugin options are located under the <code>options.plugins</code> config and are scoped by the plugin ID: <code>options.plugins.{plugin-id}</code>.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    config: {\n        foo: { ... },           <span class=\"hljs-comment\">// chart &apos;foo&apos; option</span>\n        plugins: {\n            p1: {\n                foo: { ... },   <span class=\"hljs-comment\">// p1 plugin &apos;foo&apos; option</span>\n                bar: { ... }\n            },\n            p2: {\n                foo: { ... },   <span class=\"hljs-comment\">// p2 plugin &apos;foo&apos; option</span>\n                bla: { ... }\n            }\n        }\n    }\n});\n</code></pre>\n<h4 id=\"disable-plugins\">Disable plugins</h4>\n<p>To disable a global plugin for a specific chart instance, the plugin options must be set to <code>false</code>:</p>\n<pre><code class=\"lang-javascript\">Chart.plugins.register({\n    id: <span class=\"hljs-string\">&apos;p1&apos;</span>,\n    <span class=\"hljs-comment\">// ...</span>\n});\n\n<span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    config: {\n        plugins: {\n            p1: <span class=\"hljs-literal\">false</span>   <span class=\"hljs-comment\">// disable plugin &apos;p1&apos; for this instance</span>\n        }\n    }\n});\n</code></pre>\n<h2 id=\"plugin-core-api\">Plugin Core API</h2>\n<p>Available hooks (as of version 2.6):</p>\n<ul>\n<li>beforeInit</li>\n<li>afterInit</li>\n<li>beforeUpdate <em>(cancellable)</em></li>\n<li>afterUpdate</li>\n<li>beforeLayout <em>(cancellable)</em></li>\n<li>afterLayout</li>\n<li>beforeDatasetsUpdate <em>(cancellable)</em></li>\n<li>afterDatasetsUpdate</li>\n<li>beforeDatasetUpdate <em>(cancellable)</em></li>\n<li>afterDatasetUpdate</li>\n<li>beforeRender <em>(cancellable)</em></li>\n<li>afterRender</li>\n<li>beforeDraw <em>(cancellable)</em></li>\n<li>afterDraw</li>\n<li>beforeDatasetsDraw <em>(cancellable)</em></li>\n<li>afterDatasetsDraw</li>\n<li>beforeDatasetDraw <em>(cancellable)</em></li>\n<li>afterDatasetDraw</li>\n<li>beforeEvent <em>(cancellable)</em></li>\n<li>afterEvent</li>\n<li>resize</li>\n<li>destroy</li>\n</ul>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"updates.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Updating Charts\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"charts.html\" class=\"navigation navigation-next \" aria-label=\"Next page: New Charts\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Plugins\",\"level\":\"1.7.3\",\"depth\":2,\"next\":{\"title\":\"New Charts\",\"level\":\"1.7.4\",\"depth\":2,\"path\":\"developers/charts.md\",\"ref\":\"developers/charts.md\",\"articles\":[]},\"previous\":{\"title\":\"Updating Charts\",\"level\":\"1.7.2\",\"depth\":2,\"path\":\"developers/updates.md\",\"ref\":\"developers/updates.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/plugins.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/developers/updates.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Updating Charts · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"plugins.html\" />\n\n\n    <link rel=\"prev\" href=\"api.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"api.html\">\n\n                <a href=\"api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.7.2\" data-path=\"updates.html\">\n\n                <a href=\"updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"plugins.html\">\n\n                <a href=\"plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"charts.html\">\n\n                <a href=\"charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"axes.html\">\n\n                <a href=\"axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"contributing.html\">\n\n                <a href=\"contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Updating Charts</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"updating-charts\">Updating Charts</h1>\n<p>It&apos;s pretty common to want to update charts after they&apos;ve been created. When the chart data is changed, Chart.js will animate to the new data values. </p>\n<h2 id=\"adding-or-removing-data\">Adding or Removing Data</h2>\n<p>Adding and removing data is supported by changing the data array. To add data, just add data into the data array as seen in this example.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">addData</span>(<span class=\"hljs-params\">chart, label, data</span>) </span>{\n    chart.data.labels.push(label);\n    chart.data.datasets.forEach((dataset) =&gt; {\n        dataset.data.push(data);\n    });\n    chart.update();\n}\n</code></pre>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">removeData</span>(<span class=\"hljs-params\">chart</span>) </span>{\n    chart.data.labels.pop();\n    chart.data.datasets.forEach((dataset) =&gt; {\n        dataset.data.pop();\n    });\n    chart.update();\n}\n</code></pre>\n<h2 id=\"preventing-animations\">Preventing Animations</h2>\n<p>Sometimes when a chart updates, you may not want an animation. To achieve this you can call <code>update</code> with a duration of <code>0</code>. This will render the chart synchronously and without an animation.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"api.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Chart.js API\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"plugins.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Plugins\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Updating Charts\",\"level\":\"1.7.2\",\"depth\":2,\"next\":{\"title\":\"Plugins\",\"level\":\"1.7.3\",\"depth\":2,\"path\":\"developers/plugins.md\",\"ref\":\"developers/plugins.md\",\"articles\":[]},\"previous\":{\"title\":\"Chart.js API\",\"level\":\"1.7.1\",\"depth\":2,\"path\":\"developers/api.md\",\"ref\":\"developers/api.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"developers/updates.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/colors.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Colors · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"fonts.html\" />\n\n\n    <link rel=\"prev\" href=\"options.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"responsive.html\">\n\n                <a href=\"responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"interactions/\">\n\n                <a href=\"interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"interactions/events.html\">\n\n                <a href=\"interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"interactions/modes.html\">\n\n                <a href=\"interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"options.html\">\n\n                <a href=\"options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.3.4\" data-path=\"colors.html\">\n\n                <a href=\"colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"fonts.html\">\n\n                <a href=\"fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Colors</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"colors\">Colors</h1>\n<p>When supplying colors to Chart options, you can use a number of formats. You can specify the color as a string in hexadecimal, RGB, or HSL notations. If a color is needed, but not specified, Chart.js will use the global default color. This color is stored at <code>Chart.defaults.global.defaultColor</code>. It is initially set to <code>&apos;rgba(0, 0, 0, 0.1)&apos;</code></p>\n<p>You can also pass a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasGradient\" target=\"_blank\">CanvasGradient</a> object. You will need to create this before passing to the chart, but using it you can achieve some interesting effects.</p>\n<h2 id=\"patterns-and-gradients\">Patterns and Gradients</h2>\n<p>An alternative option is to pass a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern\" target=\"_blank\">CanvasPattern</a> or <a href=\"https://developer.mozilla.org/en/docs/Web/API/CanvasGradient\" target=\"_blank\">CanvasGradient</a> object instead of a string colour. </p>\n<p>For example, if you wanted to fill a dataset with a pattern from an image you could do the following.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> img = <span class=\"hljs-keyword\">new</span> Image();\nimg.src = <span class=\"hljs-string\">&apos;https://example.com/my_image.png&apos;</span>;\nimg.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&apos;canvas&apos;</span>).getContext(<span class=\"hljs-string\">&apos;2d&apos;</span>);\n    <span class=\"hljs-keyword\">var</span> fillPattern = ctx.createPattern(img, <span class=\"hljs-string\">&apos;repeat&apos;</span>);\n\n    <span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n        data: {\n            labels: [<span class=\"hljs-string\">&apos;Item 1&apos;</span>, <span class=\"hljs-string\">&apos;Item 2&apos;</span>, <span class=\"hljs-string\">&apos;Item 3&apos;</span>],\n            datasets: [{\n                data: [<span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">30</span>],\n                backgroundColor: fillPattern\n            }]\n        }\n    })\n}\n</code></pre>\n<p>Using pattern fills for data graphics can help viewers with vision deficiencies (e.g. color-blindness or partial sight) to <a href=\"http://betweentwobrackets.com/data-graphics-and-colour-vision/\" target=\"_blank\">more easily understand your data</a>.</p>\n<p>Using the <a href=\"https://github.com/ashiguruma/patternomaly\" target=\"_blank\">Patternomaly</a> library you can generate patterns to fill datasets.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chartData = {\n    datasets: [{\n        data: [<span class=\"hljs-number\">45</span>, <span class=\"hljs-number\">25</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">10</span>],\n        backgroundColor: [\n            pattern.draw(<span class=\"hljs-string\">&apos;square&apos;</span>, <span class=\"hljs-string\">&apos;#ff6384&apos;</span>),\n            pattern.draw(<span class=\"hljs-string\">&apos;circle&apos;</span>, <span class=\"hljs-string\">&apos;#36a2eb&apos;</span>),\n            pattern.draw(<span class=\"hljs-string\">&apos;diamond&apos;</span>, <span class=\"hljs-string\">&apos;#cc65fe&apos;</span>),\n            pattern.draw(<span class=\"hljs-string\">&apos;triangle&apos;</span>, <span class=\"hljs-string\">&apos;#ffce56&apos;</span>),\n        ]\n    }],\n    labels: [<span class=\"hljs-string\">&apos;Red&apos;</span>, <span class=\"hljs-string\">&apos;Blue&apos;</span>, <span class=\"hljs-string\">&apos;Purple&apos;</span>, <span class=\"hljs-string\">&apos;Yellow&apos;</span>]\n};\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"options.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Options\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"fonts.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Fonts\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Colors\",\"level\":\"1.3.4\",\"depth\":2,\"next\":{\"title\":\"Fonts\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"general/fonts.md\",\"ref\":\"general/fonts.md\",\"articles\":[]},\"previous\":{\"title\":\"Options\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"general/options.md\",\"ref\":\"general/options.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/colors.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/device-pixel-ratio.md",
    "content": "# Device Pixel Ratio\n\nBy default the chart's canvas will use a 1:1 pixel ratio, unless the physical display has a higher pixel ratio (e.g. Retina displays).\n\nFor applications where a chart will be converted to a bitmap, or printed to a higher DPI medium it can be desirable to render the chart at a higher resolution than the default.\n\nSetting `devicePixelRatio` to a value other than 1 will force the canvas size to be scaled by that amount, relative to the container size. There should be no visible difference on screen; the difference will only be visible when the image is zoomed or printed.\n\n## Configuration Options\n\n| Name | Type | Default | Description\n| ---- | ---- | ------- | -----------\n| `devicePixelRatio` | `Number` | window.devicePixelRatio | Override the window's default devicePixelRatio.\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/fonts.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Fonts · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../configuration/\" />\n\n\n    <link rel=\"prev\" href=\"colors.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"responsive.html\">\n\n                <a href=\"responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"interactions/\">\n\n                <a href=\"interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"interactions/events.html\">\n\n                <a href=\"interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"interactions/modes.html\">\n\n                <a href=\"interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"options.html\">\n\n                <a href=\"options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"colors.html\">\n\n                <a href=\"colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.3.5\" data-path=\"fonts.html\">\n\n                <a href=\"fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Fonts</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"fonts\">Fonts</h1>\n<p>There are 4 special global settings that can change all of the fonts on the chart. These options are in <code>Chart.defaults.global</code>. The global font settings only apply when more specific options are not included in the config.</p>\n<p>For example, in this chart the text will all be red except for the labels in the legend.</p>\n<pre><code class=\"lang-javascript\">Chart.defaults.global.defaultFontColor = <span class=\"hljs-string\">&apos;red&apos;</span>;\n<span class=\"hljs-keyword\">let</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        legend: {\n            labels: {\n                <span class=\"hljs-comment\">// This more specific font property overrides the global property</span>\n                fontColor: <span class=\"hljs-string\">&apos;black&apos;</span>\n            }\n        }\n    }\n});\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>defaultFontColor</code></td>\n<td><code>Color</code></td>\n<td><code>&apos;#666&apos;</code></td>\n<td>Default font color for all text.</td>\n</tr>\n<tr>\n<td><code>defaultFontFamily</code></td>\n<td><code>String</code></td>\n<td><code>&quot;&apos;Helvetica Neue&apos;, &apos;Helvetica&apos;, &apos;Arial&apos;, sans-serif&quot;</code></td>\n<td>Default font family for all text.</td>\n</tr>\n<tr>\n<td><code>defaultFontSize</code></td>\n<td><code>Number</code></td>\n<td><code>12</code></td>\n<td>Default font size (in px) for text. Does not apply to radialLinear scale point labels.</td>\n</tr>\n<tr>\n<td><code>defaultFontStyle</code></td>\n<td><code>String</code></td>\n<td><code>&apos;normal&apos;</code></td>\n<td>Default font style. Does not apply to tooltip title or footer. Does not apply to chart title.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"non-existant-fonts\">Non-Existant Fonts</h2>\n<p>If a font is specified for a chart that does exist on the system, the browser will not apply the font when it is set. If you notice odd fonts appearing in your charts, check that the font you are applying exists on your system. See <a href=\"https://github.com/chartjs/Chart.js/issues/3318\" target=\"_blank\">issue 3318</a> for more details.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"colors.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Colors\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../configuration/\" class=\"navigation navigation-next \" aria-label=\"Next page: Configuration\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Fonts\",\"level\":\"1.3.5\",\"depth\":2,\"next\":{\"title\":\"Configuration\",\"level\":\"1.4\",\"depth\":1,\"path\":\"configuration/README.md\",\"ref\":\"configuration/README.md\",\"articles\":[{\"title\":\"Animations\",\"level\":\"1.4.1\",\"depth\":2,\"path\":\"configuration/animations.md\",\"ref\":\"configuration/animations.md\",\"articles\":[]},{\"title\":\"Layout\",\"level\":\"1.4.2\",\"depth\":2,\"path\":\"configuration/layout.md\",\"ref\":\"configuration/layout.md\",\"articles\":[]},{\"title\":\"Legend\",\"level\":\"1.4.3\",\"depth\":2,\"path\":\"configuration/legend.md\",\"ref\":\"configuration/legend.md\",\"articles\":[]},{\"title\":\"Title\",\"level\":\"1.4.4\",\"depth\":2,\"path\":\"configuration/title.md\",\"ref\":\"configuration/title.md\",\"articles\":[]},{\"title\":\"Tooltip\",\"level\":\"1.4.5\",\"depth\":2,\"path\":\"configuration/tooltip.md\",\"ref\":\"configuration/tooltip.md\",\"articles\":[]},{\"title\":\"Elements\",\"level\":\"1.4.6\",\"depth\":2,\"path\":\"configuration/elements.md\",\"ref\":\"configuration/elements.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Colors\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"general/colors.md\",\"ref\":\"general/colors.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/fonts.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>General · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"responsive.html\" />\n\n\n    <link rel=\"prev\" href=\"../getting-started/usage.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.3\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"responsive.html\">\n\n                <a href=\"responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"interactions/\">\n\n                <a href=\"interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"interactions/events.html\">\n\n                <a href=\"interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"interactions/modes.html\">\n\n                <a href=\"interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"options.html\">\n\n                <a href=\"options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"colors.html\">\n\n                <a href=\"colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"fonts.html\">\n\n                <a href=\"fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >General</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"general-configuration\">General Configuration</h1>\n<p>These sections describe general configuration options that can apply elsewhere in the documentation.</p>\n<ul>\n<li><a href=\"responsive.html\">Responsive</a> defines responsive chart options that apply to all charts.</li>\n<li><a href=\"device-pixel-ratio.md\">Device Pixel Ratio</a> defines the ratio between display pixels and rendered pixels.</li>\n<li><a href=\"interactions/\">Interactions</a> defines options that reflect how hovering chart elements works.</li>\n<li><a href=\"options.html\">Options</a> scriptable and indexable options syntax.</li>\n<li><a href=\"colors.html\">Colors</a> defines acceptable color values.</li>\n<li><a href=\"fonts.html\">Font</a> defines various font options.</li>\n</ul>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../getting-started/usage.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Usage\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"responsive.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Responsive\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"General\",\"level\":\"1.3\",\"depth\":1,\"next\":{\"title\":\"Responsive\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"general/responsive.md\",\"ref\":\"general/responsive.md\",\"articles\":[]},\"previous\":{\"title\":\"Usage\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"getting-started/usage.md\",\"ref\":\"getting-started/usage.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/interactions/events.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Events · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"modes.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../responsive.html\">\n\n                <a href=\"../responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.3.2.1\" data-path=\"events.html\">\n\n                <a href=\"events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"modes.html\">\n\n                <a href=\"modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../options.html\">\n\n                <a href=\"../options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../colors.html\">\n\n                <a href=\"../colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../fonts.html\">\n\n                <a href=\"../fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../../axes/\">\n\n                <a href=\"../../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../../axes/cartesian/\">\n\n                <a href=\"../../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../../axes/cartesian/category.html\">\n\n                <a href=\"../../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../../axes/cartesian/linear.html\">\n\n                <a href=\"../../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../../axes/cartesian/time.html\">\n\n                <a href=\"../../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../../axes/radial/\">\n\n                <a href=\"../../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../../axes/radial/linear.html\">\n\n                <a href=\"../../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../../axes/labelling.html\">\n\n                <a href=\"../../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../../axes/styling.html\">\n\n                <a href=\"../../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Events</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"events\">Events</h1>\n<p>The following properties define how the chart interacts with events.</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>events</code></td>\n<td><code>String[]</code></td>\n<td><code>[&quot;mousemove&quot;, &quot;mouseout&quot;, &quot;click&quot;, &quot;touchstart&quot;, &quot;touchmove&quot;, &quot;touchend&quot;]</code></td>\n<td>The <code>events</code> option defines the browser events that the chart should listen to for tooltips and hovering. <a href=\"#event-option\">more...</a></td>\n</tr>\n<tr>\n<td><code>onHover</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>Called when any of the events fire. Called in the context of the chart and passed the event and an array of active elements (bars, points, etc).</td>\n</tr>\n<tr>\n<td><code>onClick</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>Called if the event is of type &apos;mouseup&apos; or &apos;click&apos;. Called in the context of the chart and passed the event and an array of active elements</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"event-option\">Event Option</h2>\n<p>For example, to have the chart only respond to click events, you could do</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        <span class=\"hljs-comment\">// This chart will not respond to mousemove, etc</span>\n        events: [<span class=\"hljs-string\">&apos;click&apos;</span>]\n    }\n});\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Interactions\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"modes.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Modes\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"next\":{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"path\":\"general/interactions/modes.md\",\"ref\":\"general/interactions/modes.md\",\"articles\":[]},\"previous\":{\"title\":\"Interactions\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"general/interactions/README.md\",\"ref\":\"general/interactions/README.md\",\"articles\":[{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"path\":\"general/interactions/events.md\",\"ref\":\"general/interactions/events.md\",\"articles\":[]},{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"path\":\"general/interactions/modes.md\",\"ref\":\"general/interactions/modes.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/interactions/events.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/interactions/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Interactions · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"events.html\" />\n\n\n    <link rel=\"prev\" href=\"../responsive.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../responsive.html\">\n\n                <a href=\"../responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.3.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"events.html\">\n\n                <a href=\"events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"modes.html\">\n\n                <a href=\"modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../options.html\">\n\n                <a href=\"../options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../colors.html\">\n\n                <a href=\"../colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../fonts.html\">\n\n                <a href=\"../fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../../axes/\">\n\n                <a href=\"../../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../../axes/cartesian/\">\n\n                <a href=\"../../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../../axes/cartesian/category.html\">\n\n                <a href=\"../../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../../axes/cartesian/linear.html\">\n\n                <a href=\"../../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../../axes/cartesian/time.html\">\n\n                <a href=\"../../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../../axes/radial/\">\n\n                <a href=\"../../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../../axes/radial/linear.html\">\n\n                <a href=\"../../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../../axes/labelling.html\">\n\n                <a href=\"../../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../../axes/styling.html\">\n\n                <a href=\"../../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Interactions</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"interactions\">Interactions</h1>\n<p>The hover configuration is passed into the <code>options.hover</code> namespace. The global hover configuration is at <code>Chart.defaults.global.hover</code>. To configure which events trigger chart interactions, see <a href=\"events.html#events\">events</a>. </p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>mode</code></td>\n<td><code>String</code></td>\n<td><code>&apos;nearest&apos;</code></td>\n<td>Sets which elements appear in the tooltip. See <a href=\"modes.html#interaction-modes\">Interaction Modes</a> for details.</td>\n</tr>\n<tr>\n<td><code>intersect</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>if true, the hover mode only applies when the mouse position intersects an item on the chart.</td>\n</tr>\n<tr>\n<td><code>axis</code></td>\n<td><code>String</code></td>\n<td><code>&apos;x&apos;</code></td>\n<td>Can be set to <code>&apos;x&apos;</code>, <code>&apos;y&apos;</code>, or <code>&apos;xy&apos;</code> to define which directions are used in calculating distances. Defaults to <code>&apos;x&apos;</code> for <code>index</code> mode and <code>&apos;xy&apos;</code> in <code>dataset</code> and <code>nearest</code> modes.</td>\n</tr>\n<tr>\n<td><code>animationDuration</code></td>\n<td><code>Number</code></td>\n<td><code>400</code></td>\n<td>Duration in milliseconds it takes to animate hover style changes.</td>\n</tr>\n</tbody>\n</table>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../responsive.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Responsive\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"events.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Events\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Interactions\",\"level\":\"1.3.2\",\"depth\":2,\"next\":{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"path\":\"general/interactions/events.md\",\"ref\":\"general/interactions/events.md\",\"articles\":[]},\"previous\":{\"title\":\"Responsive\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"general/responsive.md\",\"ref\":\"general/responsive.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/interactions/README.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/interactions/modes.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Modes · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../options.html\" />\n\n\n    <link rel=\"prev\" href=\"events.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../../\">\n\n                <a href=\"../../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../../getting-started/\">\n\n                <a href=\"../../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../../getting-started/installation.html\">\n\n                <a href=\"../../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../../getting-started/integration.html\">\n\n                <a href=\"../../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../../getting-started/usage.html\">\n\n                <a href=\"../../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../responsive.html\">\n\n                <a href=\"../responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"events.html\">\n\n                <a href=\"events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.3.2.2\" data-path=\"modes.html\">\n\n                <a href=\"modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../options.html\">\n\n                <a href=\"../options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../colors.html\">\n\n                <a href=\"../colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../fonts.html\">\n\n                <a href=\"../fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../../configuration/\">\n\n                <a href=\"../../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../../configuration/animations.html\">\n\n                <a href=\"../../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../../configuration/layout.html\">\n\n                <a href=\"../../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../../configuration/legend.html\">\n\n                <a href=\"../../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../../configuration/title.html\">\n\n                <a href=\"../../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../../configuration/tooltip.html\">\n\n                <a href=\"../../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../../configuration/elements.html\">\n\n                <a href=\"../../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../../charts/\">\n\n                <a href=\"../../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../../charts/line.html\">\n\n                <a href=\"../../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../../charts/bar.html\">\n\n                <a href=\"../../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../../charts/radar.html\">\n\n                <a href=\"../../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../../charts/doughnut.html\">\n\n                <a href=\"../../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../../charts/polar.html\">\n\n                <a href=\"../../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../../charts/bubble.html\">\n\n                <a href=\"../../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../../charts/scatter.html\">\n\n                <a href=\"../../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../../charts/area.html\">\n\n                <a href=\"../../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../../charts/mixed.html\">\n\n                <a href=\"../../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../../axes/\">\n\n                <a href=\"../../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../../axes/cartesian/\">\n\n                <a href=\"../../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../../axes/cartesian/category.html\">\n\n                <a href=\"../../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../../axes/cartesian/linear.html\">\n\n                <a href=\"../../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../../axes/cartesian/time.html\">\n\n                <a href=\"../../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../../axes/radial/\">\n\n                <a href=\"../../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../../axes/radial/linear.html\">\n\n                <a href=\"../../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../../axes/labelling.html\">\n\n                <a href=\"../../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../../axes/styling.html\">\n\n                <a href=\"../../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../../developers/\">\n\n                <a href=\"../../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../../developers/api.html\">\n\n                <a href=\"../../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../../developers/updates.html\">\n\n                <a href=\"../../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../../developers/plugins.html\">\n\n                <a href=\"../../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../../developers/charts.html\">\n\n                <a href=\"../../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../../developers/axes.html\">\n\n                <a href=\"../../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../../developers/contributing.html\">\n\n                <a href=\"../../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../../notes/\">\n\n                <a href=\"../../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../../notes/comparison.html\">\n\n                <a href=\"../../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../../notes/extensions.html\">\n\n                <a href=\"../../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../../notes/license.html\">\n\n                <a href=\"../../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"../..\" >Modes</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"interaction-modes\">Interaction Modes</h1>\n<p>When configuring interaction with the graph via hover or tooltips, a number of different modes are available.</p>\n<p>The modes are detailed below and how they behave in conjunction with the <code>intersect</code> setting.</p>\n<h2 id=\"point\">point</h2>\n<p>Finds all of the items that intersect the point.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;point&apos;</span>\n        }\n    }\n})\n</code></pre>\n<h2 id=\"nearest\">nearest</h2>\n<p>Gets the item that is nearest to the point. The nearest item is determined based on the distance to the center of the chart item (point, bar). If 2 or more items are at the same distance, the one with the smallest area is used. If <code>intersect</code> is true, this is only triggered when the mouse position intersects an item in the graph. This is very useful for combo charts where points are hidden behind bars.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;nearest&apos;</span>\n        }\n    }\n})\n</code></pre>\n<h2 id=\"single-deprecated\">single (deprecated)</h2>\n<p>Finds the first item that intersects the point and returns it. Behaves like &apos;nearest&apos; mode with intersect = true.</p>\n<h2 id=\"label-deprecated\">label (deprecated)</h2>\n<p>See <code>&apos;index&apos;</code> mode</p>\n<h2 id=\"index\">index</h2>\n<p>Finds item at the same index. If the <code>intersect</code> setting is true, the first intersecting item is used to determine the index in the data. If <code>intersect</code> false the nearest item, in the x direction, is used to determine the index. </p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;index&apos;</span>\n        }\n    }\n})\n</code></pre>\n<p>To use index mode in a chart like the horizontal bar chart, where we search along the y direction, you can use the <code>axis</code> setting introduced in v2.7.0. By setting this value to <code>&apos;y&apos;</code> on the y direction is used.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;horizontalBar&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;index&apos;</span>,\n            axis: <span class=\"hljs-string\">&apos;y&apos;</span>\n        }\n    }\n})\n</code></pre>\n<h2 id=\"x-axis-deprecated\">x-axis (deprecated)</h2>\n<p>Behaves like <code>&apos;index&apos;</code> mode with <code>intersect = false</code>.</p>\n<h2 id=\"dataset\">dataset</h2>\n<p>Finds items in the same dataset. If the <code>intersect</code> setting is true, the first intersecting item is used to determine the index in the data. If <code>intersect</code> false the nearest item is used to determine the index.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;dataset&apos;</span>\n        }\n    }\n})\n</code></pre>\n<h2 id=\"x\">x</h2>\n<p>Returns all items that would intersect based on the <code>X</code> coordinate of the position only. Would be useful for a vertical cursor implementation. Note that this only applies to cartesian charts</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;x&apos;</span>\n        }\n    }\n})\n</code></pre>\n<h2 id=\"y\">y</h2>\n<p>Returns all items that would intersect based on the <code>Y</code> coordinate of the position. This would be useful for a horizontal cursor implementation. Note that this only applies to cartesian charts.</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n    data: data,\n    options: {\n        tooltips: {\n            mode: <span class=\"hljs-string\">&apos;y&apos;</span>\n        }\n    }\n})\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"events.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Events\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../options.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Options\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"next\":{\"title\":\"Options\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"general/options.md\",\"ref\":\"general/options.md\",\"articles\":[]},\"previous\":{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"path\":\"general/interactions/events.md\",\"ref\":\"general/interactions/events.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/interactions/modes.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"../..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../../gitbook/gitbook.js\"></script>\n    <script src=\"../../gitbook/theme.js\"></script>\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/options.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Options · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"colors.html\" />\n\n\n    <link rel=\"prev\" href=\"interactions/modes.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"responsive.html\">\n\n                <a href=\"responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"interactions/\">\n\n                <a href=\"interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"interactions/events.html\">\n\n                <a href=\"interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"interactions/modes.html\">\n\n                <a href=\"interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.3.3\" data-path=\"options.html\">\n\n                <a href=\"options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"colors.html\">\n\n                <a href=\"colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"fonts.html\">\n\n                <a href=\"fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Options</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"options\">Options</h1>\n<h2 id=\"scriptable-options\">Scriptable Options</h2>\n<p>Scriptable options also accept a function which is called for each data and that takes the unique argument <code>context</code> representing contextual information (see <a href=\"options.html#option-context\">option context</a>).</p>\n<p>Example:</p>\n<pre><code class=\"lang-javascript\">color: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">context</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> index = context.dataIndex;\n    <span class=\"hljs-keyword\">var</span> value = context.dataset.data[index];\n    <span class=\"hljs-keyword\">return</span> value &lt; <span class=\"hljs-number\">0</span> ? <span class=\"hljs-string\">&apos;red&apos;</span> :  <span class=\"hljs-comment\">// draw negative values in red</span>\n        index % <span class=\"hljs-number\">2</span> ? <span class=\"hljs-string\">&apos;blue&apos;</span> :    <span class=\"hljs-comment\">// else, alternate values in blue and green</span>\n        <span class=\"hljs-string\">&apos;green&apos;</span>;\n}\n</code></pre>\n<blockquote>\n<p><strong>Note:</strong> scriptable options are only supported by a few bubble chart options.</p>\n</blockquote>\n<h2 id=\"indexable-options\">Indexable Options</h2>\n<p>Indexable options also accept an array in which each item corresponds to the element at the same index. Note that this method requires to provide as many items as data, so, in most cases, using a <a href=\"#scriptable-options\">function</a> is more appropriated if supported.</p>\n<p>Example:</p>\n<pre><code class=\"lang-javascript\">color: [\n    <span class=\"hljs-string\">&apos;red&apos;</span>,    <span class=\"hljs-comment\">// color for data at index 0</span>\n    <span class=\"hljs-string\">&apos;blue&apos;</span>,   <span class=\"hljs-comment\">// color for data at index 1</span>\n    <span class=\"hljs-string\">&apos;green&apos;</span>,  <span class=\"hljs-comment\">// color for data at index 2</span>\n    <span class=\"hljs-string\">&apos;black&apos;</span>,  <span class=\"hljs-comment\">// color for data at index 3</span>\n    <span class=\"hljs-comment\">//...</span>\n]\n</code></pre>\n<h2 id=\"option-context\">Option Context</h2>\n<p>The option context is used to give contextual information when resolving options and currently only applies to <a href=\"#scriptable-options\">scriptable options</a>.</p>\n<p>The context object contains the following properties:</p>\n<ul>\n<li><code>chart</code>: the associated chart</li>\n<li><code>dataIndex</code>: index of the current data</li>\n<li><code>dataset</code>: dataset at index <code>datasetIndex</code></li>\n<li><code>datasetIndex</code>: index of the current dataset</li>\n</ul>\n<p><strong>Important</strong>: since the context can represent different types of entities (dataset, data, etc.), some properties may be <code>undefined</code> so be sure to test any context property before using it.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"interactions/modes.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Modes\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"colors.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Colors\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Options\",\"level\":\"1.3.3\",\"depth\":2,\"next\":{\"title\":\"Colors\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"general/colors.md\",\"ref\":\"general/colors.md\",\"articles\":[]},\"previous\":{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"path\":\"general/interactions/modes.md\",\"ref\":\"general/interactions/modes.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/options.md\",\"mtime\":\"2017-10-28T15:03:49.266Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/general/responsive.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Responsive · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"interactions/\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.3.1\" data-path=\"responsive.html\">\n\n                <a href=\"responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"interactions/\">\n\n                <a href=\"interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"interactions/events.html\">\n\n                <a href=\"interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"interactions/modes.html\">\n\n                <a href=\"interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"options.html\">\n\n                <a href=\"options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"colors.html\">\n\n                <a href=\"colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"fonts.html\">\n\n                <a href=\"fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Responsive</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"responsive-charts\">Responsive Charts</h1>\n<p>When it comes to change the chart size based on the window size, a major limitation is that the canvas <em>render</em> size (<code>canvas.width</code> and <code>.height</code>) can <strong>not</strong> be expressed with relative values, contrary to the <em>display</em> size (<code>canvas.style.width</code> and <code>.height</code>). Furthermore, these sizes are independent from each other and thus the canvas <em>render</em> size does not adjust automatically based on the <em>display</em> size, making the rendering inaccurate.</p>\n<p>The following examples <strong>do not work</strong>:</p>\n<ul>\n<li><code>&lt;canvas height=&quot;40vh&quot; width=&quot;80vw&quot;&gt;</code>: <strong>invalid</strong> values, the canvas doesn&apos;t resize (<a href=\"https://codepen.io/chartjs/pen/oWLZaR\" target=\"_blank\">example</a>)</li>\n<li><code>&lt;canvas style=&quot;height:40vh; width:80vw&quot;&gt;</code>: <strong>invalid</strong> behavior, the canvas is resized but becomes blurry (<a href=\"https://codepen.io/chartjs/pen/WjxpmO\" target=\"_blank\">example</a>)</li>\n</ul>\n<p>Chart.js provides a <a href=\"#configuration-options\">few options</a> to enable responsiveness and control the resize behavior of charts by detecting when the canvas <em>display</em> size changes and update the <em>render</em> size accordingly.</p>\n<h2 id=\"configuration-options\">Configuration Options</h2>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>responsive</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>Resizes the chart canvas when its container does (<a href=\"#important-note\">important note...</a>).</td>\n</tr>\n<tr>\n<td><code>responsiveAnimationDuration</code></td>\n<td><code>Number</code></td>\n<td><code>0</code></td>\n<td>Duration in milliseconds it takes to animate to new size after a resize event.</td>\n</tr>\n<tr>\n<td><code>maintainAspectRatio</code></td>\n<td><code>Boolean</code></td>\n<td><code>true</code></td>\n<td>Maintain the original canvas aspect ratio <code>(width / height)</code> when resizing.</td>\n</tr>\n<tr>\n<td><code>onResize</code></td>\n<td><code>Function</code></td>\n<td><code>null</code></td>\n<td>Called when a resize occurs. Gets passed two arguments: the chart instance and the new size.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"important-note\">Important Note</h2>\n<p>Detecting when the canvas size changes can not be done directly from the <code>CANVAS</code> element. Chart.js uses its parent container to update the canvas <em>render</em> and <em>display</em> sizes. However, this method requires the container to be <strong>relatively positioned</strong> and <strong>dedicated to the chart canvas only</strong>. Responsiveness can then be achieved by setting relative values for the container size (<a href=\"https://codepen.io/chartjs/pen/YVWZbz\" target=\"_blank\">example</a>):</p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">&quot;chart-container&quot;</span> <span class=\"hljs-attr\">style</span>=<span class=\"hljs-string\">&quot;position: relative; height:40vh; width:80vw&quot;</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">canvas</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;chart&quot;</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">canvas</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">div</span>&gt;</span>\n</code></pre>\n<p>The chart can also be programmatically resized by modifying the container size:</p>\n<pre><code class=\"lang-javascript\">chart.canvas.parentNode.style.height = <span class=\"hljs-string\">&apos;128px&apos;</span>;\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: General\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"interactions/\" class=\"navigation navigation-next \" aria-label=\"Next page: Interactions\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Responsive\",\"level\":\"1.3.1\",\"depth\":2,\"next\":{\"title\":\"Interactions\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"general/interactions/README.md\",\"ref\":\"general/interactions/README.md\",\"articles\":[{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"path\":\"general/interactions/events.md\",\"ref\":\"general/interactions/events.md\",\"articles\":[]},{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"path\":\"general/interactions/modes.md\",\"ref\":\"general/interactions/modes.md\",\"articles\":[]}]},\"previous\":{\"title\":\"General\",\"level\":\"1.3\",\"depth\":1,\"path\":\"general/README.md\",\"ref\":\"general/README.md\",\"articles\":[{\"title\":\"Responsive\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"general/responsive.md\",\"ref\":\"general/responsive.md\",\"articles\":[]},{\"title\":\"Interactions\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"general/interactions/README.md\",\"ref\":\"general/interactions/README.md\",\"articles\":[{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"path\":\"general/interactions/events.md\",\"ref\":\"general/interactions/events.md\",\"articles\":[]},{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"path\":\"general/interactions/modes.md\",\"ref\":\"general/interactions/modes.md\",\"articles\":[]}]},{\"title\":\"Options\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"general/options.md\",\"ref\":\"general/options.md\",\"articles\":[]},{\"title\":\"Colors\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"general/colors.md\",\"ref\":\"general/colors.md\",\"articles\":[]},{\"title\":\"Fonts\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"general/fonts.md\",\"ref\":\"general/fonts.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"general/responsive.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/getting-started/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Getting Started · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"installation.html\" />\n\n\n    <link rel=\"prev\" href=\"../\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"installation.html\">\n\n                <a href=\"installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"integration.html\">\n\n                <a href=\"integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"usage.html\">\n\n                <a href=\"usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Getting Started</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"getting-started\">Getting Started</h1>\n<p>Let&apos;s get started using Chart.js!</p>\n<p>First, we need to have a canvas in our page.</p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">canvas</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;myChart&quot;</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">canvas</span>&gt;</span>\n</code></pre>\n<p>Now that we have a canvas we can use, we need to include Chart.js in our page.</p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span> <span class=\"hljs-attr\">src</span>=<span class=\"hljs-string\">&quot;https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js&quot;</span>&gt;</span><span class=\"undefined\"></span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n<p>Now, we can create a chart. We add a script to our page:</p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&apos;myChart&apos;</span>).getContext(<span class=\"hljs-string\">&apos;2d&apos;</span>);\n<span class=\"hljs-keyword\">var</span> chart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    <span class=\"hljs-comment\">// The type of chart we want to create</span>\n    type: <span class=\"hljs-string\">&apos;line&apos;</span>,\n\n    <span class=\"hljs-comment\">// The data for our dataset</span>\n    data: {\n        labels: [<span class=\"hljs-string\">&quot;January&quot;</span>, <span class=\"hljs-string\">&quot;February&quot;</span>, <span class=\"hljs-string\">&quot;March&quot;</span>, <span class=\"hljs-string\">&quot;April&quot;</span>, <span class=\"hljs-string\">&quot;May&quot;</span>, <span class=\"hljs-string\">&quot;June&quot;</span>, <span class=\"hljs-string\">&quot;July&quot;</span>],\n        datasets: [{\n            label: <span class=\"hljs-string\">&quot;My First dataset&quot;</span>,\n            backgroundColor: <span class=\"hljs-string\">&apos;rgb(255, 99, 132)&apos;</span>,\n            borderColor: <span class=\"hljs-string\">&apos;rgb(255, 99, 132)&apos;</span>,\n            data: [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">10</span>, <span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">20</span>, <span class=\"hljs-number\">30</span>, <span class=\"hljs-number\">45</span>],\n        }]\n    },\n\n    <span class=\"hljs-comment\">// Configuration options go here</span>\n    options: {}\n});\n</code></pre>\n<p>It&apos;s that easy to get started using Chart.js! From here you can explore the many options that can help you customise your charts with scales, tooltips, labels, colors, custom actions, and much more.</p>\n<p>There are many examples of Chart.js that are available in the <code>/samples</code> folder of <code>Chart.js.zip</code> that is attatched to every <a href=\"https://github.com/chartjs/Chart.js/releases\" target=\"_blank\">release</a>.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Chart.js\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"installation.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Installation\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Getting Started\",\"level\":\"1.2\",\"depth\":1,\"next\":{\"title\":\"Installation\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"getting-started/installation.md\",\"ref\":\"getting-started/installation.md\",\"articles\":[]},\"previous\":{\"title\":\"Chart.js\",\"level\":\"1.1\",\"depth\":1,\"path\":\"README.md\",\"ref\":\"README.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"getting-started/README.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/getting-started/installation.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Installation · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"integration.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.2.1\" data-path=\"installation.html\">\n\n                <a href=\"installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"integration.html\">\n\n                <a href=\"integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"usage.html\">\n\n                <a href=\"usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Installation</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"installation\">Installation</h1>\n<p>Chart.js can be installed via npm or bower. It is recommended to get Chart.js this way.</p>\n<h2 id=\"npm\">npm</h2>\n<p><a href=\"https://npmjs.com/package/chart.js\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/chart.js.svg?style=flat-square&amp;maxAge=600\" alt=\"npm\"></a>\n<a href=\"https://npmjs.com/package/chart.js\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dm/chart.js.svg?style=flat-square&amp;maxAge=600\" alt=\"npm\"></a></p>\n<pre><code class=\"lang-bash\">npm install chart.js --save\n</code></pre>\n<h2 id=\"bower\">Bower</h2>\n<p><a href=\"https://libraries.io/bower/chartjs\" target=\"_blank\"><img src=\"https://img.shields.io/bower/v/chartjs.svg?style=flat-square&amp;maxAge=600\" alt=\"bower\"></a></p>\n<pre><code class=\"lang-bash\">bower install chart.js --save\n</code></pre>\n<h2 id=\"cdn\">CDN</h2>\n<h3 id=\"cdnjs\">CDNJS</h3>\n<p><a href=\"https://cdnjs.com/libraries/Chart.js\" target=\"_blank\"><img src=\"https://img.shields.io/cdnjs/v/Chart.js.svg?style=flat-square&amp;maxAge=600\" alt=\"cdnjs\"></a></p>\n<p>Chart.js built files are available on <a href=\"https://cdnjs.com/\" target=\"_blank\">CDNJS</a>:</p>\n<p><a href=\"https://cdnjs.com/libraries/Chart.js\" target=\"_blank\">https://cdnjs.com/libraries/Chart.js</a></p>\n<h3 id=\"jsdelivr\">jsDelivr</h3>\n<p><a href=\"https://cdn.jsdelivr.net/npm/chart.js@latest/dist/\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/chart.js.svg?label=jsdelivr&amp;style=flat-square&amp;maxAge=600\" alt=\"jsdelivr\"></a> <a href=\"https://www.jsdelivr.com/package/npm/chart.js\" target=\"_blank\"><img src=\"https://data.jsdelivr.com/v1/package/npm/chart.js/badge\" alt=\"jsdelivr hits\"></a></p>\n<p>Chart.js built files are also available through <a href=\"http://www.jsdelivr.com/\" target=\"_blank\">jsDelivr</a>:</p>\n<p><a href=\"https://www.jsdelivr.com/package/npm/chart.js?path=dist\" target=\"_blank\">https://www.jsdelivr.com/package/npm/chart.js?path=dist</a></p>\n<h2 id=\"github\">Github</h2>\n<p><a href=\"https://github.com/chartjs/Chart.js/releases/latest\" target=\"_blank\"><img src=\"https://img.shields.io/github/release/chartjs/Chart.js.svg?style=flat-square&amp;maxAge=600\" alt=\"github\"></a></p>\n<p>You can download the latest version of <a href=\"https://github.com/chartjs/Chart.js/releases/latest\" target=\"_blank\">Chart.js on GitHub</a>.</p>\n<p>If you download or clone the repository, you must <a href=\"../developers/contributing.html#building-chartjs\">build</a> Chart.js to generate the dist files. Chart.js no longer comes with prebuilt release versions, so an alternative option to downloading the repo is <strong>strongly</strong> advised.</p>\n<h1 id=\"selecting-the-correct-build\">Selecting the Correct Build</h1>\n<p>Chart.js provides two different builds that are available for your use.</p>\n<h2 id=\"stand-alone-build\">Stand-Alone Build</h2>\n<p>Files:</p>\n<ul>\n<li><code>dist/Chart.js</code></li>\n<li><code>dist/Chart.min.js</code></li>\n</ul>\n<p>This version only includes Chart.js. If this version is used and you require the use of the time axis, <a href=\"http://momentjs.com/\" target=\"_blank\">Moment.js</a> will need to be included before Chart.js.</p>\n<h2 id=\"bundled-build\">Bundled Build</h2>\n<p>Files:</p>\n<ul>\n<li><code>dist/Chart.bundle.js</code></li>\n<li><code>dist/Chart.bundle.min.js</code></li>\n</ul>\n<p>The bundled version includes Moment.js built into the same file. This version should be used if you wish to use time axes and want a single file to include. Do not use this build if your application already includes Moment.js. If you do, Moment.js will be included twice, increasing the page load time and potentially introducing version issues.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Getting Started\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"integration.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Integration\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Installation\",\"level\":\"1.2.1\",\"depth\":2,\"next\":{\"title\":\"Integration\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"getting-started/integration.md\",\"ref\":\"getting-started/integration.md\",\"articles\":[]},\"previous\":{\"title\":\"Getting Started\",\"level\":\"1.2\",\"depth\":1,\"path\":\"getting-started/README.md\",\"ref\":\"getting-started/README.md\",\"articles\":[{\"title\":\"Installation\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"getting-started/installation.md\",\"ref\":\"getting-started/installation.md\",\"articles\":[]},{\"title\":\"Integration\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"getting-started/integration.md\",\"ref\":\"getting-started/integration.md\",\"articles\":[]},{\"title\":\"Usage\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"getting-started/usage.md\",\"ref\":\"getting-started/usage.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"getting-started/installation.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/getting-started/integration.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Integration · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"usage.html\" />\n\n\n    <link rel=\"prev\" href=\"installation.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"installation.html\">\n\n                <a href=\"installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.2.2\" data-path=\"integration.html\">\n\n                <a href=\"integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"usage.html\">\n\n                <a href=\"usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Integration</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"integration\">Integration</h1>\n<p>Chart.js can be integrated with plain JavaScript or with different module loaders. The examples below show how to load Chart.js in different systems.</p>\n<h2 id=\"es6-modules\">ES6 Modules</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">import</span> Chart <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&apos;chart.js&apos;</span>;\n<span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {...});\n</code></pre>\n<h2 id=\"script-tag\">Script Tag</h2>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span> <span class=\"hljs-attr\">src</span>=<span class=\"hljs-string\">&quot;path/to/chartjs/dist/Chart.js&quot;</span>&gt;</span><span class=\"undefined\"></span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span>&gt;</span><span class=\"actionscript\">\n    <span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {...});\n</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n<h2 id=\"common-js\">Common JS</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-keyword\">var</span> Chart = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">&apos;chart.js&apos;</span>);\n<span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {...});\n</code></pre>\n<h2 id=\"require-js\">Require JS</h2>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-built_in\">require</span>([<span class=\"hljs-string\">&apos;path/to/chartjs/dist/Chart.js&apos;</span>], <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">Chart</span>)</span>{\n    <span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {...});\n});\n</code></pre>\n<blockquote>\n<p><strong>Important:</strong> RequireJS <a href=\"http://www.requirejs.org/docs/commonjs.html#intro\" target=\"_blank\">can <strong>not</strong> load CommonJS module as is</a>, so be sure to require one of the built UMD files instead (i.e. <code>dist/Chart.js</code>, <code>dist/Chart.min.js</code>, etc.).</p>\n</blockquote>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"installation.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Installation\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"usage.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Usage\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Integration\",\"level\":\"1.2.2\",\"depth\":2,\"next\":{\"title\":\"Usage\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"getting-started/usage.md\",\"ref\":\"getting-started/usage.md\",\"articles\":[]},\"previous\":{\"title\":\"Installation\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"getting-started/installation.md\",\"ref\":\"getting-started/installation.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"getting-started/integration.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/getting-started/usage.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Usage · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"../general/\" />\n\n\n    <link rel=\"prev\" href=\"integration.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"installation.html\">\n\n                <a href=\"installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"integration.html\">\n\n                <a href=\"integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.2.3\" data-path=\"usage.html\">\n\n                <a href=\"usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"../notes/\">\n\n                <a href=\"../notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"../notes/comparison.html\">\n\n                <a href=\"../notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"../notes/extensions.html\">\n\n                <a href=\"../notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"../notes/license.html\">\n\n                <a href=\"../notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Usage</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"usage\">Usage</h1>\n<p>Chart.js can be used with ES6 modules, plain JavaScript and module loaders.</p>\n<h2 id=\"creating-a-chart\">Creating a Chart</h2>\n<p>To create a chart, we need to instantiate the <code>Chart</code> class. To do this, we need to pass in the node, jQuery instance, or 2d context of the canvas of where we want to draw the chart. Here&apos;s an example.</p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">canvas</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;myChart&quot;</span> <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">&quot;400&quot;</span> <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">&quot;400&quot;</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">canvas</span>&gt;</span>\n</code></pre>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">// Any of the following formats may be used</span>\n<span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&quot;myChart&quot;</span>);\n<span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&quot;myChart&quot;</span>).getContext(<span class=\"hljs-string\">&quot;2d&quot;</span>);\n<span class=\"hljs-keyword\">var</span> ctx = $(<span class=\"hljs-string\">&quot;#myChart&quot;</span>);\n<span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-string\">&quot;myChart&quot;</span>;\n</code></pre>\n<p>Once you have the element or context, you&apos;re ready to instantiate a pre-defined chart-type or create your own!</p>\n<p>The following example instantiates a bar chart showing the number of votes for different colors and the y-axis starting at 0.</p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">canvas</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;myChart&quot;</span> <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">&quot;400&quot;</span> <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">&quot;400&quot;</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">canvas</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span>&gt;</span><span class=\"javascript\">\n<span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&quot;myChart&quot;</span>);\n<span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n    data: {\n        labels: [<span class=\"hljs-string\">&quot;Red&quot;</span>, <span class=\"hljs-string\">&quot;Blue&quot;</span>, <span class=\"hljs-string\">&quot;Yellow&quot;</span>, <span class=\"hljs-string\">&quot;Green&quot;</span>, <span class=\"hljs-string\">&quot;Purple&quot;</span>, <span class=\"hljs-string\">&quot;Orange&quot;</span>],\n        datasets: [{\n            label: <span class=\"hljs-string\">&apos;# of Votes&apos;</span>,\n            data: [<span class=\"hljs-number\">12</span>, <span class=\"hljs-number\">19</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>],\n            backgroundColor: [\n                <span class=\"hljs-string\">&apos;rgba(255, 99, 132, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(54, 162, 235, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 206, 86, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(75, 192, 192, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(153, 102, 255, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 159, 64, 0.2)&apos;</span>\n            ],\n            borderColor: [\n                <span class=\"hljs-string\">&apos;rgba(255,99,132,1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(54, 162, 235, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 206, 86, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(75, 192, 192, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(153, 102, 255, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 159, 64, 1)&apos;</span>\n            ],\n            borderWidth: <span class=\"hljs-number\">1</span>\n        }]\n    },\n    options: {\n        scales: {\n            yAxes: [{\n                ticks: {\n                    beginAtZero:<span class=\"hljs-literal\">true</span>\n                }\n            }]\n        }\n    }\n});\n</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"integration.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Integration\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"../general/\" class=\"navigation navigation-next \" aria-label=\"Next page: General\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Usage\",\"level\":\"1.2.3\",\"depth\":2,\"next\":{\"title\":\"General\",\"level\":\"1.3\",\"depth\":1,\"path\":\"general/README.md\",\"ref\":\"general/README.md\",\"articles\":[{\"title\":\"Responsive\",\"level\":\"1.3.1\",\"depth\":2,\"path\":\"general/responsive.md\",\"ref\":\"general/responsive.md\",\"articles\":[]},{\"title\":\"Interactions\",\"level\":\"1.3.2\",\"depth\":2,\"path\":\"general/interactions/README.md\",\"ref\":\"general/interactions/README.md\",\"articles\":[{\"title\":\"Events\",\"level\":\"1.3.2.1\",\"depth\":3,\"path\":\"general/interactions/events.md\",\"ref\":\"general/interactions/events.md\",\"articles\":[]},{\"title\":\"Modes\",\"level\":\"1.3.2.2\",\"depth\":3,\"path\":\"general/interactions/modes.md\",\"ref\":\"general/interactions/modes.md\",\"articles\":[]}]},{\"title\":\"Options\",\"level\":\"1.3.3\",\"depth\":2,\"path\":\"general/options.md\",\"ref\":\"general/options.md\",\"articles\":[]},{\"title\":\"Colors\",\"level\":\"1.3.4\",\"depth\":2,\"path\":\"general/colors.md\",\"ref\":\"general/colors.md\",\"articles\":[]},{\"title\":\"Fonts\",\"level\":\"1.3.5\",\"depth\":2,\"path\":\"general/fonts.md\",\"ref\":\"general/fonts.md\",\"articles\":[]}]},\"previous\":{\"title\":\"Integration\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"getting-started/integration.md\",\"ref\":\"getting-started/integration.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"getting-started/usage.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-anchorjs/anchor-style.js",
    "content": "gitbook.events.bind('start', function(e, config) {\n    anchors.options = config.anchorjs || {};\n});\n\ngitbook.events.bind('page.change', function() {\n    anchors.add('h1,h2,h3,h4,h5');\n});\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-chartjs/Chart.bundle.js",
    "content": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.5.0\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/* MIT license */\nvar colorNames = require(5);\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getHwb: getHwb,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   hwbString: hwbString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3})$/,\n       hex =  /^#([a-fA-F0-9]{6})$/,\n       rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/,\n       per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/,\n       keyword = /(\\w+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr);\n   if (match) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n   }\n   else if (match = string.match(hex)) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = colorNames[match[1]];\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb[3] = a;\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getHwb(string) {\n   if (!string) {\n      return;\n   }\n   var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hwb);\n   if (match) {\n    var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n   }\n}\n\nfunction getRgb(string) {\n   var rgba = getRgba(string);\n   return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n  var hsla = getHsla(string);\n  return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n   else if (vals = getHwb(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgb) {\n   return \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1])\n              + hexDouble(rgb[2]);\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n   if (alpha === undefined) {\n      alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n   }\n   return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n           + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n  return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorNames) {\n   reverseNames[colorNames[name]] = name;\n}\n\n},{\"5\":5}],2:[function(require,module,exports){\n/* MIT license */\nvar convert = require(4);\nvar string = require(1);\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = string.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else {\n\t\t\tthrow new Error('Unable to parse color from string \"' + obj + '\"');\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t} else {\n\t\t\tthrow new Error('Unable to parse color from object ' + JSON.stringify(obj));\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn string.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nmodule.exports = Color;\n\n},{\"1\":1,\"4\":4}],3:[function(require,module,exports){\n/* MIT license */\n\nmodule.exports = {\n  rgb2hsl: rgb2hsl,\n  rgb2hsv: rgb2hsv,\n  rgb2hwb: rgb2hwb,\n  rgb2cmyk: rgb2cmyk,\n  rgb2keyword: rgb2keyword,\n  rgb2xyz: rgb2xyz,\n  rgb2lab: rgb2lab,\n  rgb2lch: rgb2lch,\n\n  hsl2rgb: hsl2rgb,\n  hsl2hsv: hsl2hsv,\n  hsl2hwb: hsl2hwb,\n  hsl2cmyk: hsl2cmyk,\n  hsl2keyword: hsl2keyword,\n\n  hsv2rgb: hsv2rgb,\n  hsv2hsl: hsv2hsl,\n  hsv2hwb: hsv2hwb,\n  hsv2cmyk: hsv2cmyk,\n  hsv2keyword: hsv2keyword,\n\n  hwb2rgb: hwb2rgb,\n  hwb2hsl: hwb2hsl,\n  hwb2hsv: hwb2hsv,\n  hwb2cmyk: hwb2cmyk,\n  hwb2keyword: hwb2keyword,\n\n  cmyk2rgb: cmyk2rgb,\n  cmyk2hsl: cmyk2hsl,\n  cmyk2hsv: cmyk2hsv,\n  cmyk2hwb: cmyk2hwb,\n  cmyk2keyword: cmyk2keyword,\n\n  keyword2rgb: keyword2rgb,\n  keyword2hsl: keyword2hsl,\n  keyword2hsv: keyword2hsv,\n  keyword2hwb: keyword2hwb,\n  keyword2cmyk: keyword2cmyk,\n  keyword2lab: keyword2lab,\n  keyword2xyz: keyword2xyz,\n\n  xyz2rgb: xyz2rgb,\n  xyz2lab: xyz2lab,\n  xyz2lch: xyz2lch,\n\n  lab2xyz: lab2xyz,\n  lab2rgb: lab2rgb,\n  lab2lch: lab2lch,\n\n  lch2lab: lch2lab,\n  lch2xyz: lch2xyz,\n  lch2rgb: lch2rgb\n}\n\n\nfunction rgb2hsl(rgb) {\n  var r = rgb[0]/255,\n      g = rgb[1]/255,\n      b = rgb[2]/255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, l;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g)/ delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  l = (min + max) / 2;\n\n  if (max == min)\n    s = 0;\n  else if (l <= 0.5)\n    s = delta / (max + min);\n  else\n    s = delta / (2 - max - min);\n\n  return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, v;\n\n  if (max == 0)\n    s = 0;\n  else\n    s = (delta/max * 1000)/10;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g) / delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  v = ((max / 255) * 1000) / 10;\n\n  return [h, s, v];\n}\n\nfunction rgb2hwb(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      h = rgb2hsl(rgb)[0],\n      w = 1/255 * Math.min(r, Math.min(g, b)),\n      b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n  return [h, w * 100, b * 100];\n}\n\nfunction rgb2cmyk(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255,\n      c, m, y, k;\n\n  k = Math.min(1 - r, 1 - g, 1 - b);\n  c = (1 - r - k) / (1 - k) || 0;\n  m = (1 - g - k) / (1 - k) || 0;\n  y = (1 - b - k) / (1 - k) || 0;\n  return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n  return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255;\n\n  // assume sRGB\n  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n  return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n  var xyz = rgb2xyz(rgb),\n        x = xyz[0],\n        y = xyz[1],\n        z = xyz[2],\n        l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction rgb2lch(args) {\n  return lab2lch(rgb2lab(args));\n}\n\nfunction hsl2rgb(hsl) {\n  var h = hsl[0] / 360,\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      t1, t2, t3, rgb, val;\n\n  if (s == 0) {\n    val = l * 255;\n    return [val, val, val];\n  }\n\n  if (l < 0.5)\n    t2 = l * (1 + s);\n  else\n    t2 = l + s - l * s;\n  t1 = 2 * l - t2;\n\n  rgb = [0, 0, 0];\n  for (var i = 0; i < 3; i++) {\n    t3 = h + 1 / 3 * - (i - 1);\n    t3 < 0 && t3++;\n    t3 > 1 && t3--;\n\n    if (6 * t3 < 1)\n      val = t1 + (t2 - t1) * 6 * t3;\n    else if (2 * t3 < 1)\n      val = t2;\n    else if (3 * t3 < 2)\n      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n    else\n      val = t1;\n\n    rgb[i] = val * 255;\n  }\n\n  return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n  var h = hsl[0],\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      sv, v;\n\n  if(l === 0) {\n      // no need to do calc on black\n      // also avoids divide by 0 error\n      return [0, 0, 0];\n  }\n\n  l *= 2;\n  s *= (l <= 1) ? l : 2 - l;\n  v = (l + s) / 2;\n  sv = (2 * s) / (l + s);\n  return [h, sv * 100, v * 100];\n}\n\nfunction hsl2hwb(args) {\n  return rgb2hwb(hsl2rgb(args));\n}\n\nfunction hsl2cmyk(args) {\n  return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n  return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n  var h = hsv[0] / 60,\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      hi = Math.floor(h) % 6;\n\n  var f = h - Math.floor(h),\n      p = 255 * v * (1 - s),\n      q = 255 * v * (1 - (s * f)),\n      t = 255 * v * (1 - (s * (1 - f))),\n      v = 255 * v;\n\n  switch(hi) {\n    case 0:\n      return [v, t, p];\n    case 1:\n      return [q, v, p];\n    case 2:\n      return [p, v, t];\n    case 3:\n      return [p, q, v];\n    case 4:\n      return [t, p, v];\n    case 5:\n      return [v, p, q];\n  }\n}\n\nfunction hsv2hsl(hsv) {\n  var h = hsv[0],\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      sl, l;\n\n  l = (2 - s) * v;\n  sl = s * v;\n  sl /= (l <= 1) ? l : 2 - l;\n  sl = sl || 0;\n  l /= 2;\n  return [h, sl * 100, l * 100];\n}\n\nfunction hsv2hwb(args) {\n  return rgb2hwb(hsv2rgb(args))\n}\n\nfunction hsv2cmyk(args) {\n  return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n  return rgb2keyword(hsv2rgb(args));\n}\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nfunction hwb2rgb(hwb) {\n  var h = hwb[0] / 360,\n      wh = hwb[1] / 100,\n      bl = hwb[2] / 100,\n      ratio = wh + bl,\n      i, v, f, n;\n\n  // wh + bl cant be > 1\n  if (ratio > 1) {\n    wh /= ratio;\n    bl /= ratio;\n  }\n\n  i = Math.floor(6 * h);\n  v = 1 - bl;\n  f = 6 * h - i;\n  if ((i & 0x01) != 0) {\n    f = 1 - f;\n  }\n  n = wh + f * (v - wh);  // linear interpolation\n\n  switch (i) {\n    default:\n    case 6:\n    case 0: r = v; g = n; b = wh; break;\n    case 1: r = n; g = v; b = wh; break;\n    case 2: r = wh; g = v; b = n; break;\n    case 3: r = wh; g = n; b = v; break;\n    case 4: r = n; g = wh; b = v; break;\n    case 5: r = v; g = wh; b = n; break;\n  }\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction hwb2hsl(args) {\n  return rgb2hsl(hwb2rgb(args));\n}\n\nfunction hwb2hsv(args) {\n  return rgb2hsv(hwb2rgb(args));\n}\n\nfunction hwb2cmyk(args) {\n  return rgb2cmyk(hwb2rgb(args));\n}\n\nfunction hwb2keyword(args) {\n  return rgb2keyword(hwb2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n  var c = cmyk[0] / 100,\n      m = cmyk[1] / 100,\n      y = cmyk[2] / 100,\n      k = cmyk[3] / 100,\n      r, g, b;\n\n  r = 1 - Math.min(1, c * (1 - k) + k);\n  g = 1 - Math.min(1, m * (1 - k) + k);\n  b = 1 - Math.min(1, y * (1 - k) + k);\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n  return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n  return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2hwb(args) {\n  return rgb2hwb(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n  return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n  var x = xyz[0] / 100,\n      y = xyz[1] / 100,\n      z = xyz[2] / 100,\n      r, g, b;\n\n  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n  // assume sRGB\n  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n    : r = (r * 12.92);\n\n  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n    : g = (g * 12.92);\n\n  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n    : b = (b * 12.92);\n\n  r = Math.min(Math.max(0, r), 1);\n  g = Math.min(Math.max(0, g), 1);\n  b = Math.min(Math.max(0, b), 1);\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction xyz2lab(xyz) {\n  var x = xyz[0],\n      y = xyz[1],\n      z = xyz[2],\n      l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction xyz2lch(args) {\n  return lab2lch(xyz2lab(args));\n}\n\nfunction lab2xyz(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      x, y, z, y2;\n\n  if (l <= 8) {\n    y = (l * 100) / 903.3;\n    y2 = (7.787 * (y / 100)) + (16 / 116);\n  } else {\n    y = 100 * Math.pow((l + 16) / 116, 3);\n    y2 = Math.pow(y / 100, 1/3);\n  }\n\n  x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n  z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n  return [x, y, z];\n}\n\nfunction lab2lch(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      hr, h, c;\n\n  hr = Math.atan2(b, a);\n  h = hr * 360 / 2 / Math.PI;\n  if (h < 0) {\n    h += 360;\n  }\n  c = Math.sqrt(a * a + b * b);\n  return [l, c, h];\n}\n\nfunction lab2rgb(args) {\n  return xyz2rgb(lab2xyz(args));\n}\n\nfunction lch2lab(lch) {\n  var l = lch[0],\n      c = lch[1],\n      h = lch[2],\n      a, b, hr;\n\n  hr = h / 360 * 2 * Math.PI;\n  a = c * Math.cos(hr);\n  b = c * Math.sin(hr);\n  return [l, a, b];\n}\n\nfunction lch2xyz(args) {\n  return lab2xyz(lch2lab(args));\n}\n\nfunction lch2rgb(args) {\n  return lab2rgb(lch2lab(args));\n}\n\nfunction keyword2rgb(keyword) {\n  return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n  return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n  return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2hwb(args) {\n  return rgb2hwb(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n  return rgb2cmyk(keyword2rgb(args));\n}\n\nfunction keyword2lab(args) {\n  return rgb2lab(keyword2rgb(args));\n}\n\nfunction keyword2xyz(args) {\n  return rgb2xyz(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n  aliceblue:  [240,248,255],\n  antiquewhite: [250,235,215],\n  aqua: [0,255,255],\n  aquamarine: [127,255,212],\n  azure:  [240,255,255],\n  beige:  [245,245,220],\n  bisque: [255,228,196],\n  black:  [0,0,0],\n  blanchedalmond: [255,235,205],\n  blue: [0,0,255],\n  blueviolet: [138,43,226],\n  brown:  [165,42,42],\n  burlywood:  [222,184,135],\n  cadetblue:  [95,158,160],\n  chartreuse: [127,255,0],\n  chocolate:  [210,105,30],\n  coral:  [255,127,80],\n  cornflowerblue: [100,149,237],\n  cornsilk: [255,248,220],\n  crimson:  [220,20,60],\n  cyan: [0,255,255],\n  darkblue: [0,0,139],\n  darkcyan: [0,139,139],\n  darkgoldenrod:  [184,134,11],\n  darkgray: [169,169,169],\n  darkgreen:  [0,100,0],\n  darkgrey: [169,169,169],\n  darkkhaki:  [189,183,107],\n  darkmagenta:  [139,0,139],\n  darkolivegreen: [85,107,47],\n  darkorange: [255,140,0],\n  darkorchid: [153,50,204],\n  darkred:  [139,0,0],\n  darksalmon: [233,150,122],\n  darkseagreen: [143,188,143],\n  darkslateblue:  [72,61,139],\n  darkslategray:  [47,79,79],\n  darkslategrey:  [47,79,79],\n  darkturquoise:  [0,206,209],\n  darkviolet: [148,0,211],\n  deeppink: [255,20,147],\n  deepskyblue:  [0,191,255],\n  dimgray:  [105,105,105],\n  dimgrey:  [105,105,105],\n  dodgerblue: [30,144,255],\n  firebrick:  [178,34,34],\n  floralwhite:  [255,250,240],\n  forestgreen:  [34,139,34],\n  fuchsia:  [255,0,255],\n  gainsboro:  [220,220,220],\n  ghostwhite: [248,248,255],\n  gold: [255,215,0],\n  goldenrod:  [218,165,32],\n  gray: [128,128,128],\n  green:  [0,128,0],\n  greenyellow:  [173,255,47],\n  grey: [128,128,128],\n  honeydew: [240,255,240],\n  hotpink:  [255,105,180],\n  indianred:  [205,92,92],\n  indigo: [75,0,130],\n  ivory:  [255,255,240],\n  khaki:  [240,230,140],\n  lavender: [230,230,250],\n  lavenderblush:  [255,240,245],\n  lawngreen:  [124,252,0],\n  lemonchiffon: [255,250,205],\n  lightblue:  [173,216,230],\n  lightcoral: [240,128,128],\n  lightcyan:  [224,255,255],\n  lightgoldenrodyellow: [250,250,210],\n  lightgray:  [211,211,211],\n  lightgreen: [144,238,144],\n  lightgrey:  [211,211,211],\n  lightpink:  [255,182,193],\n  lightsalmon:  [255,160,122],\n  lightseagreen:  [32,178,170],\n  lightskyblue: [135,206,250],\n  lightslategray: [119,136,153],\n  lightslategrey: [119,136,153],\n  lightsteelblue: [176,196,222],\n  lightyellow:  [255,255,224],\n  lime: [0,255,0],\n  limegreen:  [50,205,50],\n  linen:  [250,240,230],\n  magenta:  [255,0,255],\n  maroon: [128,0,0],\n  mediumaquamarine: [102,205,170],\n  mediumblue: [0,0,205],\n  mediumorchid: [186,85,211],\n  mediumpurple: [147,112,219],\n  mediumseagreen: [60,179,113],\n  mediumslateblue:  [123,104,238],\n  mediumspringgreen:  [0,250,154],\n  mediumturquoise:  [72,209,204],\n  mediumvioletred:  [199,21,133],\n  midnightblue: [25,25,112],\n  mintcream:  [245,255,250],\n  mistyrose:  [255,228,225],\n  moccasin: [255,228,181],\n  navajowhite:  [255,222,173],\n  navy: [0,0,128],\n  oldlace:  [253,245,230],\n  olive:  [128,128,0],\n  olivedrab:  [107,142,35],\n  orange: [255,165,0],\n  orangered:  [255,69,0],\n  orchid: [218,112,214],\n  palegoldenrod:  [238,232,170],\n  palegreen:  [152,251,152],\n  paleturquoise:  [175,238,238],\n  palevioletred:  [219,112,147],\n  papayawhip: [255,239,213],\n  peachpuff:  [255,218,185],\n  peru: [205,133,63],\n  pink: [255,192,203],\n  plum: [221,160,221],\n  powderblue: [176,224,230],\n  purple: [128,0,128],\n  rebeccapurple: [102, 51, 153],\n  red:  [255,0,0],\n  rosybrown:  [188,143,143],\n  royalblue:  [65,105,225],\n  saddlebrown:  [139,69,19],\n  salmon: [250,128,114],\n  sandybrown: [244,164,96],\n  seagreen: [46,139,87],\n  seashell: [255,245,238],\n  sienna: [160,82,45],\n  silver: [192,192,192],\n  skyblue:  [135,206,235],\n  slateblue:  [106,90,205],\n  slategray:  [112,128,144],\n  slategrey:  [112,128,144],\n  snow: [255,250,250],\n  springgreen:  [0,255,127],\n  steelblue:  [70,130,180],\n  tan:  [210,180,140],\n  teal: [0,128,128],\n  thistle:  [216,191,216],\n  tomato: [255,99,71],\n  turquoise:  [64,224,208],\n  violet: [238,130,238],\n  wheat:  [245,222,179],\n  white:  [255,255,255],\n  whitesmoke: [245,245,245],\n  yellow: [255,255,0],\n  yellowgreen:  [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\n},{}],4:[function(require,module,exports){\nvar conversions = require(3);\n\nvar convert = function() {\n   return new Converter();\n}\n\nfor (var func in conversions) {\n  // export Raw versions\n  convert[func + \"Raw\"] =  (function(func) {\n    // accept array or plain args\n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      return conversions[func](arg);\n    }\n  })(func);\n\n  var pair = /(\\w+)2(\\w+)/.exec(func),\n      from = pair[1],\n      to = pair[2];\n\n  // export rgb2hsl and [\"rgb\"][\"hsl\"]\n  convert[from] = convert[from] || {};\n\n  convert[from][to] = convert[func] = (function(func) { \n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      \n      var val = conversions[func](arg);\n      if (typeof val == \"string\" || val === undefined)\n        return val; // keyword\n\n      for (var i = 0; i < val.length; i++)\n        val[i] = Math.round(val[i]);\n      return val;\n    }\n  })(func);\n}\n\n\n/* Converter does lazy conversion and caching */\nvar Converter = function() {\n   this.convs = {};\n};\n\n/* Either get the values for a space or\n  set the values for a space, depending on args */\nConverter.prototype.routeSpace = function(space, args) {\n   var values = args[0];\n   if (values === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n   }\n   // color.rgb(10, 10, 10)\n   if (typeof values == \"number\") {\n      values = Array.prototype.slice.call(args);        \n   }\n\n   return this.setValues(space, values);\n};\n  \n/* Set the values for a space, invalidating cache */\nConverter.prototype.setValues = function(space, values) {\n   this.space = space;\n   this.convs = {};\n   this.convs[space] = values;\n   return this;\n};\n\n/* Get the values for a space. If there's already\n  a conversion for the space, fetch it, otherwise\n  compute it */\nConverter.prototype.getValues = function(space) {\n   var vals = this.convs[space];\n   if (!vals) {\n      var fspace = this.space,\n          from = this.convs[fspace];\n      vals = convert[fspace][space](from);\n\n      this.convs[space] = vals;\n   }\n  return vals;\n};\n\n[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n   Converter.prototype[space] = function(vals) {\n      return this.routeSpace(space, arguments);\n   }\n});\n\nmodule.exports = convert;\n},{\"3\":3}],5:[function(require,module,exports){\nmodule.exports = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n},{}],6:[function(require,module,exports){\n//! moment.js\n//! version : 2.17.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    var k;\n    for (k in obj) {\n        // even if its not own property I'd still call it non-empty\n        return false;\n    }\n    return true;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nvar some$1 = some;\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i in momentProperties) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _ordinalParseLenient.\n    this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar keys$1 = keys;\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid()) {\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nvar indexOf$1 = indexOf;\n\nfunction daysInMonth(year, month) {\n    return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return this._months;\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return this._monthsShort;\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    //can't just apply() to create a date:\n    //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    //the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    //the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return this._weekdays;\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    ordinalParse: defaultOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return null;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            require('./locale/' + name);\n            // because defineLocale currently also sets the global locale, we\n            // want to undo that for lazy loaded locales\n            getSetGlobalLocale(oldLocale);\n        } catch (e) { }\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                if (!localeFamilies[config.parentLocale]) {\n                    localeFamilies[config.parentLocale] = [];\n                }\n                localeFamilies[config.parentLocale].push({\n                    name: name,\n                    config: config\n                });\n                return null;\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, parentConfig = baseConfig;\n        // MERGE\n        if (locales[name] != null) {\n            parentConfig = locales[name]._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys$1(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n        hooks.createFromInputFallback(config);\n    }\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse)) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (input === undefined) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (typeof(input) === 'object') {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        delta, output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    if (units === 'year' || units === 'month' || units === 'quarter') {\n        output = monthDiff(this, that);\n        if (units === 'quarter') {\n            output = output / 3;\n        } else if (units === 'year') {\n            output = output / 12;\n        }\n    } else {\n        delta = this - that;\n        output = units === 'second' ? delta / 1e3 : // 1000\n            units === 'minute' ? delta / 6e4 : // 1000 * 60\n            units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n            units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n            units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n            delta;\n    }\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString () {\n    var m = this.clone().utc();\n    if (0 < m.year() && m.year() <= 9999) {\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            return this.toDate().toISOString();\n        } else {\n            return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n        }\n    } else {\n        return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n    }\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$1 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0], 10);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$1;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\n\n// Year\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\n// Month\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this[units + 's']();\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this._data[name];\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    s: 45,  // seconds to minute\n    m: 45,  // minutes to hour\n    h: 22,  // hours to day\n    d: 26,  // days to month\n    M: 11   // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds < thresholds.s && ['s', seconds]  ||\n            minutes <= 1           && ['m']           ||\n            minutes < thresholds.m && ['mm', minutes] ||\n            hours   <= 1           && ['h']           ||\n            hours   < thresholds.h && ['hh', hours]   ||\n            days    <= 1           && ['d']           ||\n            days    < thresholds.d && ['dd', days]    ||\n            months  <= 1           && ['M']           ||\n            months  < thresholds.M && ['MM', months]  ||\n            years   <= 1           && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds;\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    return (total < 0 ? '-' : '') +\n        'P' +\n        (Y ? Y + 'Y' : '') +\n        (M ? M + 'M' : '') +\n        (D ? D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? h + 'H' : '') +\n        (m ? m + 'M' : '') +\n        (s ? s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.17.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\nreturn hooks;\n\n})));\n\n},{}],7:[function(require,module,exports){\n/**\n * @namespace Chart\n */\nvar Chart = require(28)();\n\nrequire(26)(Chart);\nrequire(42)(Chart);\nrequire(22)(Chart);\nrequire(31)(Chart);\nrequire(25)(Chart);\nrequire(21)(Chart);\nrequire(23)(Chart);\nrequire(24)(Chart);\nrequire(29)(Chart);\nrequire(33)(Chart);\nrequire(34)(Chart);\nrequire(32)(Chart);\nrequire(35)(Chart);\nrequire(30)(Chart);\nrequire(27)(Chart);\nrequire(36)(Chart);\n\nrequire(37)(Chart);\nrequire(38)(Chart);\nrequire(39)(Chart);\nrequire(40)(Chart);\n\nrequire(45)(Chart);\nrequire(43)(Chart);\nrequire(44)(Chart);\nrequire(46)(Chart);\nrequire(47)(Chart);\nrequire(48)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire(15)(Chart);\nrequire(16)(Chart);\nrequire(17)(Chart);\nrequire(18)(Chart);\nrequire(19)(Chart);\nrequire(20)(Chart);\n\nrequire(8)(Chart);\nrequire(9)(Chart);\nrequire(10)(Chart);\nrequire(11)(Chart);\nrequire(12)(Chart);\nrequire(13)(Chart);\nrequire(14)(Chart);\n\nwindow.Chart = module.exports = Chart;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"34\":34,\"35\":35,\"36\":36,\"37\":37,\"38\":38,\"39\":39,\"40\":40,\"42\":42,\"43\":43,\"44\":44,\"45\":45,\"46\":46,\"47\":47,\"48\":48,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],9:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],10:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],11:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],12:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],14:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\t\tposition: 'bottom',\n\t\t\t\tid: 'x-axis-1' // need an ID so datasets can reference the scale\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'left',\n\t\t\t\tid: 'y-axis-1'\n\t\t\t}]\n\t\t},\n\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem) {\n\t\t\t\t\treturn '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Register the default config for this type\n\tChart.defaults.scatter = defaultConfig;\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\n\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],15:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.bar = {\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'category',\n\n\t\t\t\t// Specific to Bar Controller\n\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\toffsetGridLines: true\n\t\t\t\t}\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear'\n\t\t\t}]\n\t\t}\n\t};\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Rectangle,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tChart.DatasetController.prototype.initialize.call(this, chart, datasetIndex);\n\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tmeta.stack = dataset.stack;\n\t\t\t// Use this to indicate that this is a bar dataset.\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\t// Correctly calculate the bar width accounting for stacks and the fact that not all bars are visible\n\t\tgetStackCount: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\n\t\t\tvar stacks = [];\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (dsMeta.bar && me.chart.isDatasetVisible(datasetIndex) &&\n\t\t\t\t\t(yScale.options.stacked === false ||\n\t\t\t\t\t(yScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(yScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.getMeta().data, function(rectangle, index) {\n\t\t\t\tme.updateElement(rectangle, index, reset);\n\t\t\t}, me);\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar scaleBase = yScale.getBasePixel();\n\t\t\tvar rectangleElementOptions = me.chart.options.elements.rectangle;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\trectangle._xScale = xScale;\n\t\t\trectangle._yScale = yScale;\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\tvar ruler = me.getRuler(index); // The index argument for compatible\n\t\t\trectangle._model = {\n\t\t\t\tx: me.calculateBarX(index, me.index, ruler),\n\t\t\t\ty: reset ? scaleBase : me.calculateBarY(index, me.index),\n\n\t\t\t\t// Tooltip\n\t\t\t\tlabel: me.chart.data.labels[index],\n\t\t\t\tdatasetLabel: dataset.label,\n\n\t\t\t\t// Appearance\n\t\t\t\thorizontal: false,\n\t\t\t\tbase: reset ? scaleBase : me.calculateBarBase(me.index, index),\n\t\t\t\twidth: me.calculateBarWidth(ruler),\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth)\n\t\t\t};\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\tcalculateBarBase: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar base = yScale.getBaseValue();\n\t\t\tvar original = base;\n\n\t\t\tif ((yScale.options.stacked === true) ||\n\t\t\t\t(yScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar chart = me.chart;\n\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\tvar value = Number(datasets[datasetIndex].data[index]);\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar currentDs = datasets[i];\n\t\t\t\t\tvar currentDsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (currentDsMeta.bar && currentDsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === currentDsMeta.stack) {\n\t\t\t\t\t\tvar currentVal = Number(currentDs.data[index]);\n\t\t\t\t\t\tbase += value < 0 ? Math.min(currentVal, original) : Math.max(currentVal, original);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn yScale.getPixelForValue(base);\n\t\t\t}\n\n\t\t\treturn yScale.getBasePixel();\n\t\t},\n\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar stackCount = me.getStackCount();\n\n\t\t\tvar tickWidth = xScale.width / xScale.ticks.length;\n\t\t\tvar categoryWidth = tickWidth * xScale.options.categoryPercentage;\n\t\t\tvar categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;\n\t\t\tvar fullBarWidth = categoryWidth / stackCount;\n\n\t\t\tvar barWidth = fullBarWidth * xScale.options.barPercentage;\n\t\t\tvar barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage);\n\n\t\t\treturn {\n\t\t\t\tstackCount: stackCount,\n\t\t\t\ttickWidth: tickWidth,\n\t\t\t\tcategoryWidth: categoryWidth,\n\t\t\t\tcategorySpacing: categorySpacing,\n\t\t\t\tfullBarWidth: fullBarWidth,\n\t\t\t\tbarWidth: barWidth,\n\t\t\t\tbarSpacing: barSpacing\n\t\t\t};\n\t\t},\n\n\t\tcalculateBarWidth: function(ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tif (xScale.options.barThickness) {\n\t\t\t\treturn xScale.options.barThickness;\n\t\t\t}\n\t\t\treturn ruler.barWidth;\n\t\t},\n\n\t\t// Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar dsMeta, j;\n\t\t\tvar stacks = [meta.stack];\n\n\t\t\tfor (j = 0; j < datasetIndex; ++j) {\n\t\t\t\tdsMeta = this.chart.getDatasetMeta(j);\n\t\t\t\tif (dsMeta.bar && this.chart.isDatasetVisible(j) &&\n\t\t\t\t\t(yScale.options.stacked === false ||\n\t\t\t\t\t(yScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(yScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length - 1;\n\t\t},\n\n\t\tcalculateBarX: function(index, datasetIndex, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar leftTick = xScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\n\t\t\tleftTick -= me.chart.isCombo ? (ruler.tickWidth / 2) : 0;\n\n\t\t\treturn leftTick +\n\t\t\t\t(ruler.barWidth / 2) +\n\t\t\t\truler.categorySpacing +\n\t\t\t\t(ruler.barWidth * stackIndex) +\n\t\t\t\t(ruler.barSpacing / 2) +\n\t\t\t\t(ruler.barSpacing * stackIndex);\n\t\t},\n\n\t\tcalculateBarY: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar value = Number(me.getDataset().data[index]);\n\n\t\t\tif (yScale.options.stacked ||\n\t\t\t\t(yScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar base = yScale.getBaseValue();\n\t\t\t\tvar sumPos = base,\n\t\t\t\t\tsumNeg = base;\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar ds = me.chart.data.datasets[i];\n\t\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.bar && dsMeta.yAxisID === yScale.id && me.chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === dsMeta.stack) {\n\t\t\t\t\t\tvar stackedVal = Number(ds.data[index]);\n\t\t\t\t\t\tif (stackedVal < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedVal || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedVal || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + value);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + value);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tdraw: function(ease) {\n\t\t\tvar me = this;\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tvar metaData = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar i, len;\n\n\t\t\tChart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea);\n\t\t\tfor (i = 0, len = metaData.length; i < len; ++i) {\n\t\t\t\tvar d = dataset.data[i];\n\t\t\t\tif (d !== null && d !== undefined && !isNaN(d)) {\n\t\t\t\t\tmetaData[i].transition(easingDecimal).draw();\n\t\t\t\t}\n\t\t\t}\n\t\t\tChart.canvasHelpers.unclipArea(me.chart.chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\n\t});\n\n\n\t// including horizontalBar in the bar file, instead of a file of its own\n\t// it extends bar (like pie extends doughnut)\n\tChart.defaults.horizontalBar = {\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'bottom'\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\tposition: 'left',\n\t\t\t\ttype: 'category',\n\n\t\t\t\t// Specific to Horizontal Bar Controller\n\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\toffsetGridLines: true\n\t\t\t\t}\n\t\t\t}]\n\t\t},\n\t\telements: {\n\t\t\trectangle: {\n\t\t\t\tborderSkipped: 'left'\n\t\t\t}\n\t\t},\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\tvar title = '';\n\n\t\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\t\tif (tooltipItems[0].yLabel) {\n\t\t\t\t\t\t\ttitle = tooltipItems[0].yLabel;\n\t\t\t\t\t\t} else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {\n\t\t\t\t\t\t\ttitle = data.labels[tooltipItems[0].index];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn title;\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\t\treturn datasetLabel + ': ' + tooltipItem.xLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\n\t\t// Correctly calculate the bar width accounting for stacks and the fact that not all bars are visible\n\t\tgetStackCount: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\n\t\t\tvar stacks = [];\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (dsMeta.bar && me.chart.isDatasetVisible(datasetIndex) &&\n\t\t\t\t\t(xScale.options.stacked === false ||\n\t\t\t\t\t(xScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(xScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar scaleBase = xScale.getBasePixel();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar rectangleElementOptions = me.chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = xScale;\n\t\t\trectangle._yScale = yScale;\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\tvar ruler = me.getRuler(index); // The index argument for compatible\n\t\t\trectangle._model = {\n\t\t\t\tx: reset ? scaleBase : me.calculateBarX(index, me.index),\n\t\t\t\ty: me.calculateBarY(index, me.index, ruler),\n\n\t\t\t\t// Tooltip\n\t\t\t\tlabel: me.chart.data.labels[index],\n\t\t\t\tdatasetLabel: dataset.label,\n\n\t\t\t\t// Appearance\n\t\t\t\thorizontal: true,\n\t\t\t\tbase: reset ? scaleBase : me.calculateBarBase(me.index, index),\n\t\t\t\theight: me.calculateBarHeight(ruler),\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth)\n\t\t\t};\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\tcalculateBarBase: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar base = xScale.getBaseValue();\n\t\t\tvar originalBase = base;\n\n\t\t\tif (xScale.options.stacked ||\n\t\t\t\t(xScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar chart = me.chart;\n\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\tvar value = Number(datasets[datasetIndex].data[index]);\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar currentDs = datasets[i];\n\t\t\t\t\tvar currentDsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (currentDsMeta.bar && currentDsMeta.xAxisID === xScale.id && chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === currentDsMeta.stack) {\n\t\t\t\t\t\tvar currentVal = Number(currentDs.data[index]);\n\t\t\t\t\t\tbase += value < 0 ? Math.min(currentVal, originalBase) : Math.max(currentVal, originalBase);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn xScale.getPixelForValue(base);\n\t\t\t}\n\n\t\t\treturn xScale.getBasePixel();\n\t\t},\n\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar stackCount = me.getStackCount();\n\n\t\t\tvar tickHeight = yScale.height / yScale.ticks.length;\n\t\t\tvar categoryHeight = tickHeight * yScale.options.categoryPercentage;\n\t\t\tvar categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2;\n\t\t\tvar fullBarHeight = categoryHeight / stackCount;\n\n\t\t\tvar barHeight = fullBarHeight * yScale.options.barPercentage;\n\t\t\tvar barSpacing = fullBarHeight - (fullBarHeight * yScale.options.barPercentage);\n\n\t\t\treturn {\n\t\t\t\tstackCount: stackCount,\n\t\t\t\ttickHeight: tickHeight,\n\t\t\t\tcategoryHeight: categoryHeight,\n\t\t\t\tcategorySpacing: categorySpacing,\n\t\t\t\tfullBarHeight: fullBarHeight,\n\t\t\t\tbarHeight: barHeight,\n\t\t\t\tbarSpacing: barSpacing\n\t\t\t};\n\t\t},\n\n\t\tcalculateBarHeight: function(ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tif (yScale.options.barThickness) {\n\t\t\t\treturn yScale.options.barThickness;\n\t\t\t}\n\t\t\treturn ruler.barHeight;\n\t\t},\n\n\t\t// Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar dsMeta, j;\n\t\t\tvar stacks = [meta.stack];\n\n\t\t\tfor (j = 0; j < datasetIndex; ++j) {\n\t\t\t\tdsMeta = this.chart.getDatasetMeta(j);\n\t\t\t\tif (dsMeta.bar && this.chart.isDatasetVisible(j) &&\n\t\t\t\t\t(xScale.options.stacked === false ||\n\t\t\t\t\t(xScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(xScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length - 1;\n\t\t},\n\n\t\tcalculateBarX: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar value = Number(me.getDataset().data[index]);\n\n\t\t\tif (xScale.options.stacked ||\n\t\t\t\t(xScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar base = xScale.getBaseValue();\n\t\t\t\tvar sumPos = base,\n\t\t\t\t\tsumNeg = base;\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar ds = me.chart.data.datasets[i];\n\t\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.bar && dsMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === dsMeta.stack) {\n\t\t\t\t\t\tvar stackedVal = Number(ds.data[index]);\n\t\t\t\t\t\tif (stackedVal < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedVal || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedVal || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value < 0) {\n\t\t\t\t\treturn xScale.getPixelForValue(sumNeg + value);\n\t\t\t\t}\n\t\t\t\treturn xScale.getPixelForValue(sumPos + value);\n\t\t\t}\n\n\t\t\treturn xScale.getPixelForValue(value);\n\t\t},\n\n\t\tcalculateBarY: function(index, datasetIndex, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar topTick = yScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\n\t\t\ttopTick -= me.chart.isCombo ? (ruler.tickHeight / 2) : 0;\n\n\t\t\treturn topTick +\n\t\t\t\t(ruler.barHeight / 2) +\n\t\t\t\truler.categorySpacing +\n\t\t\t\t(ruler.barHeight * stackIndex) +\n\t\t\t\t(ruler.barSpacing / 2) +\n\t\t\t\t(ruler.barSpacing * stackIndex);\n\t\t}\n\t});\n};\n\n},{}],16:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.bubble = {\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\t\tposition: 'bottom',\n\t\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'left',\n\t\t\t\tid: 'y-axis-0'\n\t\t\t}]\n\t\t},\n\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\t\tvar dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\t\t\t\t\treturn datasetLabel + ': (' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar dsIndex = me.index;\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_xScale: xScale,\n\t\t\t\t_yScale: yScale,\n\t\t\t\t_datasetIndex: dsIndex,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex, me.chart.isCombo),\n\t\t\t\t\ty: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex),\n\t\t\t\t\t// Appearance\n\t\t\t\t\tradius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Trick to reset the styles of the point\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(me, point, pointElementOptions);\n\n\t\t\tvar model = point._model;\n\t\t\tmodel.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y));\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\tgetRadius: function(value) {\n\t\t\treturn value.r || this.chart.options.elements.point.radius;\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tChart.DatasetController.prototype.setHoverStyle.call(me, point);\n\n\t\t\t// Radius\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, me.chart.options.elements.point.hoverRadius)) + me.getRadius(dataset.data[index]);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(me, point, me.chart.options.elements.point);\n\n\t\t\tvar dataVal = me.chart.data.datasets[point._datasetIndex].data[point._index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : me.getRadius(dataVal);\n\t\t}\n\t});\n};\n\n},{}],17:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tdefaults = Chart.defaults;\n\n\tdefaults.doughnut = {\n\t\tanimation: {\n\t\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\t\tanimateRotate: true,\n\t\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\t\tanimateScale: false\n\t\t},\n\t\taspectRatio: 1,\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\t\tlegendCallback: function(chart) {\n\t\t\tvar text = [];\n\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar labels = data.labels;\n\n\t\t\tif (datasets.length) {\n\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttext.push('</ul>');\n\t\t\treturn text.join('');\n\t\t},\n\t\tlegend: {\n\t\t\tlabels: {\n\t\t\t\tgenerateLabels: function(chart) {\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonClick: function(e, legendItem) {\n\t\t\t\tvar index = legendItem.index;\n\t\t\t\tvar chart = this.chart;\n\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t// toggle visibility of index if exists\n\t\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tchart.update();\n\t\t\t}\n\t\t},\n\n\t\t// The percentage of the chart that we cut out of the middle.\n\t\tcutoutPercentage: 50,\n\n\t\t// The rotation of the chart, where the first data arc begins.\n\t\trotation: Math.PI * -0.5,\n\n\t\t// The total circumference of the chart.\n\t\tcircumference: Math.PI * 2.0,\n\n\t\t// Need to override these to give a nice default\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdataLabel += value;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn dataLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tdefaults.pie = helpers.clone(defaults.doughnut);\n\thelpers.extend(defaults.pie, {\n\t\tcutoutPercentage: 0\n\t});\n\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart,\n\t\t\t\tchartArea = chart.chartArea,\n\t\t\t\topts = chart.options,\n\t\t\t\tarcOpts = opts.elements.arc,\n\t\t\t\tavailableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth,\n\t\t\t\tavailableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth,\n\t\t\t\tminSize = Math.min(availableWidth, availableHeight),\n\t\t\t\toffset = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0\n\t\t\t\t},\n\t\t\t\tmeta = me.getMeta(),\n\t\t\t\tcutoutPercentage = opts.cutoutPercentage,\n\t\t\t\tcircumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart,\n\t\t\t\tchartArea = chart.chartArea,\n\t\t\t\topts = chart.options,\n\t\t\t\tanimationOpts = opts.animation,\n\t\t\t\tcenterX = (chartArea.left + chartArea.right) / 2,\n\t\t\t\tcenterY = (chartArea.top + chartArea.bottom) / 2,\n\t\t\t\tstartAngle = opts.rotation, // non reset case handled later\n\t\t\t\tendAngle = opts.rotation, // non reset case handled later\n\t\t\t\tdataset = me.getDataset(),\n\t\t\t\tcircumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\n\t\t\t\tinnerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius,\n\t\t\t\touterRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius,\n\t\t\t\tvalueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (value / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(elements) {\n\t\t\tvar max = 0,\n\t\t\t\tindex = this.index,\n\t\t\t\tlength = elements.length,\n\t\t\t\tborderWidth,\n\t\t\t\thoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = elements[i]._model ? elements[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = elements[i]._chart ? elements[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n\n},{}],18:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.line = {\n\t\tshowLines: true,\n\t\tspanGaps: false,\n\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'category',\n\t\t\t\tid: 'x-axis-0'\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tid: 'y-axis-0'\n\t\t\t}]\n\t\t}\n\t};\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.getValueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: Chart.elements.Line,\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.getValueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.getValueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t\t// Scale\n\t\t\t\t\tscaleTop: scale.top,\n\t\t\t\t\tscaleBottom: scale.bottom,\n\t\t\t\t\tscaleZero: scale.getBasePixel()\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\t\t\tvar labels = me.chart.data.labels || [];\n\t\t\tvar includeOffset = (labels.length === 1 || dataset.data.length === 1) || me.chart.isCombo;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex, includeOffset);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.getValueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function(ease) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tvar i, ilen;\n\n\t\t\t// Transition Point Locations\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].transition(easingDecimal);\n\t\t\t}\n\n\t\t\tChart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea);\n\t\t\t// Transition and Draw the line\n\t\t\tif (lineEnabled(me.getDataset(), me.chart.options)) {\n\t\t\t\tmeta.dataset.transition(easingDecimal).draw();\n\t\t\t}\n\t\t\tChart.canvasHelpers.unclipArea(me.chart.chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].draw(me.chart.chartArea);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n\n},{}],19:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.polarArea = {\n\n\t\tscale: {\n\t\t\ttype: 'radialLinear',\n\t\t\tlineArc: true, // so that lines are circular\n\t\t\tticks: {\n\t\t\t\tbeginAtZero: true\n\t\t\t}\n\t\t},\n\n\t\t// Boolean - Whether to animate the rotation of the chart\n\t\tanimation: {\n\t\t\tanimateRotate: true,\n\t\t\tanimateScale: true\n\t\t},\n\n\t\tstartAngle: -0.5 * Math.PI,\n\t\taspectRatio: 1,\n\t\tlegendCallback: function(chart) {\n\t\t\tvar text = [];\n\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar labels = data.labels;\n\n\t\t\tif (datasets.length) {\n\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttext.push('</ul>');\n\t\t\treturn text.join('');\n\t\t},\n\t\tlegend: {\n\t\t\tlabels: {\n\t\t\t\tgenerateLabels: function(chart) {\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonClick: function(e, legendItem) {\n\t\t\t\tvar index = legendItem.index;\n\t\t\t\tvar chart = this.chart;\n\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\n\t\t\t\tchart.update();\n\t\t\t}\n\t\t},\n\n\t\t// Need to override these to give a nice default\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\treturn data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: getValueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n\n},{}],20:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.radar = {\n\t\taspectRatio: 1,\n\t\tscale: {\n\t\t\ttype: 'radialLinear'\n\t\t},\n\t\telements: {\n\t\t\tline: {\n\t\t\t\ttension: 0 // no bezier in radar\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: Chart.elements.Line,\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\n\t\t\t\t\t// Scale\n\t\t\t\t\tscaleTop: scale.top,\n\t\t\t\t\tscaleBottom: scale.bottom,\n\t\t\t\t\tscaleZero: scale.getBasePosition()\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tdraw: function(ease) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar easingDecimal = ease || 1;\n\n\t\t\t// Transition Point Locations\n\t\t\thelpers.each(meta.data, function(point) {\n\t\t\t\tpoint.transition(easingDecimal);\n\t\t\t});\n\n\t\t\t// Transition and Draw the line\n\t\t\tmeta.dataset.transition(easingDecimal).draw();\n\n\t\t\t// Draw the points\n\t\t\thelpers.each(meta.data, function(point) {\n\t\t\t\tpoint.draw();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.radius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n\n},{}],21:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.animation = {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t};\n\n\tChart.Animation = Chart.Element.extend({\n\t\tcurrentStep: null, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @function Chart.animationService.addAnimation\n\t\t * @param chartInstance {ChartController} the chart to animate\n\t\t * @param animationObject {IAnimation} the animation that we will animate\n\t\t * @param duration {Number} length of animation in ms\n\t\t * @param lazy {Boolean} if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chartInstance, animationObject, duration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchartInstance.animating = true;\n\t\t\t}\n\n\t\t\tfor (var index = 0; index < me.animations.length; ++index) {\n\t\t\t\tif (me.animations[index].chartInstance === chartInstance) {\n\t\t\t\t\t// replacing an in progress animation\n\t\t\t\t\tme.animations[index].animationObject = animationObject;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.animations.push({\n\t\t\t\tchartInstance: chartInstance,\n\t\t\t\tanimationObject: animationObject\n\t\t\t});\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (me.animations.length === 1) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\t\t// Cancel the animation for a given chart instance\n\t\tcancelAnimation: function(chartInstance) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animationWrapper) {\n\t\t\t\treturn animationWrapper.chartInstance === chartInstance;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchartInstance.animating = false;\n\t\t\t}\n\t\t},\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tvar i = 0;\n\t\t\twhile (i < me.animations.length) {\n\t\t\t\tif (me.animations[i].animationObject.currentStep === null) {\n\t\t\t\t\tme.animations[i].animationObject.currentStep = 0;\n\t\t\t\t}\n\n\t\t\t\tme.animations[i].animationObject.currentStep += 1 + framesToDrop;\n\n\t\t\t\tif (me.animations[i].animationObject.currentStep > me.animations[i].animationObject.numSteps) {\n\t\t\t\t\tme.animations[i].animationObject.currentStep = me.animations[i].animationObject.numSteps;\n\t\t\t\t}\n\n\t\t\t\tme.animations[i].animationObject.render(me.animations[i].chartInstance, me.animations[i].animationObject);\n\t\t\t\tif (me.animations[i].animationObject.onAnimationProgress && me.animations[i].animationObject.onAnimationProgress.call) {\n\t\t\t\t\tme.animations[i].animationObject.onAnimationProgress.call(me.animations[i].chartInstance, me.animations[i]);\n\t\t\t\t}\n\n\t\t\t\tif (me.animations[i].animationObject.currentStep === me.animations[i].animationObject.numSteps) {\n\t\t\t\t\tif (me.animations[i].animationObject.onAnimationComplete && me.animations[i].animationObject.onAnimationComplete.call) {\n\t\t\t\t\t\tme.animations[i].animationObject.onAnimationComplete.call(me.animations[i].chartInstance, me.animations[i]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// executed the last frame. Remove the animation.\n\t\t\t\t\tme.animations[i].chartInstance.animating = false;\n\n\t\t\t\t\tme.animations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar endTime = Date.now();\n\t\t\tvar dropFrames = (endTime - startTime) / me.frameDuration;\n\n\t\t\tme.dropFrames += dropFrames;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{}],22:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\t// Global Chart canvas helpers object for drawing items to canvas\n\tvar helpers = Chart.canvasHelpers = {};\n\n\thelpers.drawPoint = function(ctx, pointStyle, radius, x, y) {\n\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\n\t\tif (typeof pointStyle === 'object') {\n\t\t\ttype = pointStyle.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (pointStyle) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(x, y, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.beginPath();\n\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\tctx.moveTo(x - edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x + edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x, y - 2 * height / 3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\tvar leftX = x - offset;\n\t\t\tvar topY = y - offset;\n\t\t\tvar sideSize = Math.SQRT2 * radius;\n\t\t\tChart.helpers.drawRoundedRectangle(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rectRot':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - size, y);\n\t\t\tctx.lineTo(x, y + size);\n\t\t\tctx.lineTo(x + size, y);\n\t\t\tctx.lineTo(x, y - size);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'cross':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\tctx.beginPath();\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.stroke();\n\t};\n\n\thelpers.clipArea = function(ctx, clipArea) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(clipArea.left, clipArea.top, clipArea.right - clipArea.left, clipArea.bottom - clipArea.top);\n\t\tctx.clip();\n\t};\n\n\thelpers.unclipArea = function(ctx) {\n\t\tctx.restore();\n\t};\n\n};\n\n},{}],23:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar plugins = Chart.plugins;\n\tvar platform = Chart.platform;\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tChart.defaults.global,\n\t\t\tChart.defaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart.Controller} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\t// Update Scale(s) with options\n\t\tif (newOptions.scale) {\n\t\t\tchart.scale.options = newOptions.scale;\n\t\t} else if (newOptions.scales) {\n\t\t\tnewOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n\t\t\t\tchart.scales[scaleOptions.id].options = scaleOptions;\n\t\t\t});\n\t\t}\n\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t}\n\n\t/**\n\t * @class Chart.Controller\n\t * The main controller of a chart.\n\t */\n\tChart.Controller = function(item, config, instance) {\n\t\tvar me = this;\n\n\t\tconfig = initConfig(config);\n\n\t\tvar context = platform.acquireContext(item, config);\n\t\tvar canvas = context && context.canvas;\n\t\tvar height = canvas && canvas.height;\n\t\tvar width = canvas && canvas.width;\n\n\t\tinstance.ctx = context;\n\t\tinstance.canvas = canvas;\n\t\tinstance.config = config;\n\t\tinstance.width = width;\n\t\tinstance.height = height;\n\t\tinstance.aspectRatio = height? width / height : null;\n\n\t\tme.id = helpers.uid();\n\t\tme.chart = instance;\n\t\tme.config = config;\n\t\tme.options = config.options;\n\t\tme._bufferedRender = false;\n\n\t\t// Add the chart instance to the global namespace\n\t\tChart.instances[me.id] = me;\n\n\t\tObject.defineProperty(me, 'data', {\n\t\t\tget: function() {\n\t\t\t\treturn me.config.data;\n\t\t\t}\n\t\t});\n\n\t\tif (!context || !canvas) {\n\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\treturn me;\n\t\t}\n\n\t\tme.initialize();\n\t\tme.update();\n\n\t\treturn me;\n\t};\n\n\thelpers.extend(Chart.Controller.prototype, /** @lends Chart.Controller.prototype */ {\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me.chart);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.clear(this.chart);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = chart.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && chart.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\t\t\tvar newWidth = Math.floor(helpers.getMaximumWidth(canvas));\n\t\t\tvar newHeight = Math.floor(aspectRatio? newWidth / aspectRatio : helpers.getMaximumHeight(canvas));\n\n\t\t\tif (chart.width === newWidth && chart.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = chart.width = newWidth;\n\t\t\tcanvas.height = chart.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(chart);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales = {};\n\t\t\tvar items = [];\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({options: options.scale, dtype: 'radialLinear', isDefault: true});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar scaleType = helpers.getValueOrDefault(scaleOptions.type, item.dtype);\n\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\tif (!scaleClass) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar scale = new scaleClass({\n\t\t\t\t\tid: scaleOptions.id,\n\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\tctx: me.chart.ctx,\n\t\t\t\t\tchart: me\n\t\t\t\t});\n\n\t\t\t\tscales[scale.id] = scale;\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tif (!meta.type) {\n\t\t\t\t\tmeta.type = dataset.type || me.config.type;\n\t\t\t\t}\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t} else {\n\t\t\t\t\tmeta.controller = new Chart.controllers[meta.type](me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\tif (types.length > 1) {\n\t\t\t\tfor (var i = 1; i < types.length; i++) {\n\t\t\t\t\tif (types[i] !== types[i - 1]) {\n\t\t\t\t\t\tme.isCombo = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(animationDuration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tupdateConfig(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\tcontroller.reset();\n\t\t\t});\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tlazy: lazy,\n\t\t\t\t\tduration: animationDuration\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(animationDuration, lazy);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tChart.layoutService.update(this, this.chart.width, this.chart.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.getDatasetMeta(i).controller.update();\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\trender: function(duration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function() {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\tvar callback = animationOptions && animationOptions.onComplete;\n\t\t\t\tif (callback && callback.call) {\n\t\t\t\t\tcallback.call(me);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation();\n\t\t\t\tanimation.numSteps = (duration || animationOptions.duration) / 16.66; // 60 fps\n\t\t\t\tanimation.easing = animationOptions.easing;\n\n\t\t\t\t// render function\n\t\t\t\tanimation.render = function(chartInstance, animationObject) {\n\t\t\t\t\tvar easingFunction = helpers.easingEffects[animationObject.easing];\n\t\t\t\t\tvar stepDecimal = animationObject.currentStep / animationObject.numSteps;\n\t\t\t\t\tvar easeDecimal = easingFunction(stepDecimal);\n\n\t\t\t\t\tchartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep);\n\t\t\t\t};\n\n\t\t\t\t// user events\n\t\t\t\tanimation.onAnimationProgress = animationOptions.onProgress;\n\t\t\t\tanimation.onAnimationComplete = onComplete;\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\t\t\t\tonComplete();\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (easingValue === undefined || easingValue === null) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\n\t\t\t// Finally draw the tooltip\n\t\t\tme.tooltip.transition(easingValue).draw();\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw each dataset via its respective controller (reversed to support proper line stacking)\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (me.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tme.getDatasetMeta(datasetIndex).controller.draw(easingValue);\n\t\t\t\t}\n\t\t\t}, me, true);\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Chart.Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Chart.Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i<ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean'? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.chart.canvas;\n\t\t\tvar meta, i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tmeta = me.getDatasetMeta(i);\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.destroy();\n\t\t\t\t\tmeta.controller = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.clear(me.chart);\n\t\t\t\tplatform.releaseContext(me.chart.ctx);\n\t\t\t\tme.chart.canvas = null;\n\t\t\t\tme.chart.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_chartInstance: me,\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t\tme.tooltip.initialize();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Responsiveness is currently based on the use of an iframe, however this method causes\n\t\t\t// performance issues and could be troublesome when used with ad blockers. So make sure\n\t\t\t// that the user is still able to create a chart without iframe when responsive is false.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i=0, ilen=elements.length; i<ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\tchanged |= tooltip && tooltip.handleEvent(e);\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest.duration, bufferedRequest.lazy);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// On Hover hook\n\t\t\tif (hoverOptions.onHover) {\n\t\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\t\thoverOptions.onHover.call(me, e.native, me.active);\n\t\t\t}\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n};\n\n},{}],24:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i=0, ilen=data.length; i<ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\tdraw: function(ease) {\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tvar i, len;\n\t\t\tvar metaData = this.getMeta().data;\n\t\t\tfor (i = 0, len = metaData.length; i < len; ++i) {\n\t\t\t\tmetaData[i].transition(easingDecimal).draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex],\n\t\t\t\tindex = element._index,\n\t\t\t\tcustom = element.custom || {},\n\t\t\t\tvalueOrDefault = helpers.getValueAtIndexOrDefault,\n\t\t\t\tmodel = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex],\n\t\t\t\tindex = element._index,\n\t\t\t\tcustom = element.custom || {},\n\t\t\t\tvalueOrDefault = helpers.getValueAtIndexOrDefault,\n\t\t\t\tgetHoverColor = helpers.getHoverColor,\n\t\t\t\tmodel = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i=0; i<count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length-1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n\n},{}],25:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.elements = {};\n\n\tChart.Element = function(configuration) {\n\t\thelpers.extend(this, configuration);\n\t\tthis.initialize.apply(this, arguments);\n\t};\n\n\thelpers.extend(Chart.Element.prototype, {\n\n\t\tinitialize: function() {\n\t\t\tthis.hidden = false;\n\t\t},\n\n\t\tpivot: function() {\n\t\t\tvar me = this;\n\t\t\tif (!me._view) {\n\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t}\n\t\t\tme._start = helpers.clone(me._view);\n\t\t\treturn me;\n\t\t},\n\n\t\ttransition: function(ease) {\n\t\t\tvar me = this;\n\n\t\t\tif (!me._view) {\n\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t}\n\n\t\t\t// No animation -> No Transition\n\t\t\tif (ease === 1) {\n\t\t\t\tme._view = me._model;\n\t\t\t\tme._start = null;\n\t\t\t\treturn me;\n\t\t\t}\n\n\t\t\tif (!me._start) {\n\t\t\t\tme.pivot();\n\t\t\t}\n\n\t\t\thelpers.each(me._model, function(value, key) {\n\n\t\t\t\tif (key[0] === '_') {\n\t\t\t\t\t// Only non-underscored properties\n\t\t\t\t// Init if doesn't exist\n\t\t\t\t} else if (!me._view.hasOwnProperty(key)) {\n\t\t\t\t\tif (typeof value === 'number' && !isNaN(me._view[key])) {\n\t\t\t\t\t\tme._view[key] = value * ease;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme._view[key] = value;\n\t\t\t\t\t}\n\t\t\t\t// No unnecessary computations\n\t\t\t\t} else if (value === me._view[key]) {\n\t\t\t\t\t// It's the same! Woohoo!\n\t\t\t\t// Color transitions if possible\n\t\t\t\t} else if (typeof value === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar color = helpers.color(me._model[key]).mix(helpers.color(me._start[key]), ease);\n\t\t\t\t\t\tme._view[key] = color.rgbString();\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tme._view[key] = value;\n\t\t\t\t\t}\n\t\t\t\t// Number transitions\n\t\t\t\t} else if (typeof value === 'number') {\n\t\t\t\t\tvar startVal = me._start[key] !== undefined && isNaN(me._start[key]) === false ? me._start[key] : 0;\n\t\t\t\t\tme._view[key] = ((me._model[key] - startVal) * ease) + startVal;\n\t\t\t\t// Everything else\n\t\t\t\t} else {\n\t\t\t\t\tme._view[key] = value;\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn me;\n\t\t},\n\n\t\ttooltipPosition: function() {\n\t\t\treturn {\n\t\t\t\tx: this._model.x,\n\t\t\t\ty: this._model.y\n\t\t\t};\n\t\t},\n\n\t\thasValue: function() {\n\t\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t\t}\n\t});\n\n\tChart.Element.extend = helpers.inherits;\n\n};\n\n},{}],26:[function(require,module,exports){\n/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require(2);\n\nmodule.exports = function(Chart) {\n\t// Global Chart helpers object for utility methods and classes\n\tvar helpers = Chart.helpers = {};\n\n\t// -- Basic js utility methods\n\thelpers.each = function(loopable, callback, self, reverse) {\n\t\t// Check to see if null or undefined firstly.\n\t\tvar i, len;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tcallback.call(self, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tcallback.call(self, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof loopable === 'object') {\n\t\t\tvar keys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tcallback.call(self, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t};\n\thelpers.clone = function(obj) {\n\t\tvar objClone = {};\n\t\thelpers.each(obj, function(value, key) {\n\t\t\tif (helpers.isArray(value)) {\n\t\t\t\tobjClone[key] = value.slice(0);\n\t\t\t} else if (typeof value === 'object' && value !== null) {\n\t\t\t\tobjClone[key] = helpers.clone(value);\n\t\t\t} else {\n\t\t\t\tobjClone[key] = value;\n\t\t\t}\n\t\t});\n\t\treturn objClone;\n\t};\n\thelpers.extend = function(base) {\n\t\tvar setFn = function(value, key) {\n\t\t\tbase[key] = value;\n\t\t};\n\t\tfor (var i = 1, ilen = arguments.length; i < ilen; i++) {\n\t\t\thelpers.each(arguments[i], setFn);\n\t\t}\n\t\treturn base;\n\t};\n\t// Need a special merge function to chart configs since they are now grouped\n\thelpers.configMerge = function(_base) {\n\t\tvar base = helpers.clone(_base);\n\t\thelpers.each(Array.prototype.slice.call(arguments, 1), function(extension) {\n\t\t\thelpers.each(extension, function(value, key) {\n\t\t\t\tvar baseHasProperty = base.hasOwnProperty(key);\n\t\t\t\tvar baseVal = baseHasProperty ? base[key] : {};\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// Scale config merging is complex. Add our own function here for that\n\t\t\t\t\tbase[key] = helpers.scaleMerge(baseVal, value);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// Used in polar area & radar charts since there is only one scale\n\t\t\t\t\tbase[key] = helpers.configMerge(baseVal, Chart.scaleService.getScaleDefaults(value.type), value);\n\t\t\t\t} else if (baseHasProperty\n\t\t\t\t\t\t&& typeof baseVal === 'object'\n\t\t\t\t\t\t&& !helpers.isArray(baseVal)\n\t\t\t\t\t\t&& baseVal !== null\n\t\t\t\t\t\t&& typeof value === 'object'\n\t\t\t\t\t\t&& !helpers.isArray(value)) {\n\t\t\t\t\t// If we are overwriting an object with an object, do a merge of the properties.\n\t\t\t\t\tbase[key] = helpers.configMerge(baseVal, value);\n\t\t\t\t} else {\n\t\t\t\t\t// can just overwrite the value in this case\n\t\t\t\t\tbase[key] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn base;\n\t};\n\thelpers.scaleMerge = function(_base, extension) {\n\t\tvar base = helpers.clone(_base);\n\n\t\thelpers.each(extension, function(value, key) {\n\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t// These properties are arrays of items\n\t\t\t\tif (base.hasOwnProperty(key)) {\n\t\t\t\t\thelpers.each(value, function(valueObj, index) {\n\t\t\t\t\t\tvar axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');\n\t\t\t\t\t\tvar axisDefaults = Chart.scaleService.getScaleDefaults(axisType);\n\t\t\t\t\t\tif (index >= base[key].length || !base[key][index].type) {\n\t\t\t\t\t\t\tbase[key].push(helpers.configMerge(axisDefaults, valueObj));\n\t\t\t\t\t\t} else if (valueObj.type && valueObj.type !== base[key][index].type) {\n\t\t\t\t\t\t\t// Type changed. Bring in the new defaults before we bring in valueObj so that valueObj can override the correct scale defaults\n\t\t\t\t\t\t\tbase[key][index] = helpers.configMerge(base[key][index], axisDefaults, valueObj);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Type is the same\n\t\t\t\t\t\t\tbase[key][index] = helpers.configMerge(base[key][index], valueObj);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tbase[key] = [];\n\t\t\t\t\thelpers.each(value, function(valueObj) {\n\t\t\t\t\t\tvar axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');\n\t\t\t\t\t\tbase[key].push(helpers.configMerge(Chart.scaleService.getScaleDefaults(axisType), valueObj));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (base.hasOwnProperty(key) && typeof base[key] === 'object' && base[key] !== null && typeof value === 'object') {\n\t\t\t\t// If we are overwriting an object with an object, do a merge of the properties.\n\t\t\t\tbase[key] = helpers.configMerge(base[key], value);\n\n\t\t\t} else {\n\t\t\t\t// can just overwrite the value in this case\n\t\t\t\tbase[key] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn base;\n\t};\n\thelpers.getValueAtIndexOrDefault = function(value, index, defaultValue) {\n\t\tif (value === undefined || value === null) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif (helpers.isArray(value)) {\n\t\t\treturn index < value.length ? value[index] : defaultValue;\n\t\t}\n\n\t\treturn value;\n\t};\n\thelpers.getValueOrDefault = function(value, defaultValue) {\n\t\treturn value === undefined ? defaultValue : value;\n\t};\n\thelpers.indexOf = Array.prototype.indexOf?\n\t\tfunction(array, item) {\n\t\t\treturn array.indexOf(item);\n\t\t}:\n\t\tfunction(array, item) {\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (array[i] === item) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (startIndex === undefined || startIndex === null) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (startIndex === undefined || startIndex === null) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.inherits = function(extensions) {\n\t\t// Basic javascript inheritance based on the model created in Backbone.js\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\n\t\treturn ChartElement;\n\t};\n\thelpers.noop = function() {};\n\thelpers.uid = (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}());\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\treturn Math.log(x) / Math.LN10;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x,\n\t\t\tdistanceFromYCenter = anglePoint.y - centrePoint.y,\n\t\t\tradialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint,\n\t\t\tcurrent = middlePoint,\n\t\t\tnext = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Easing functions adapted from Robert Penner's easing equations\n\t// http://www.robertpenner.com/easing/\n\tvar easingEffects = helpers.easingEffects = {\n\t\tlinear: function(t) {\n\t\t\treturn t;\n\t\t},\n\t\teaseInQuad: function(t) {\n\t\t\treturn t * t;\n\t\t},\n\t\teaseOutQuad: function(t) {\n\t\t\treturn -1 * t * (t - 2);\n\t\t},\n\t\teaseInOutQuad: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t;\n\t\t\t}\n\t\t\treturn -1 / 2 * ((--t) * (t - 2) - 1);\n\t\t},\n\t\teaseInCubic: function(t) {\n\t\t\treturn t * t * t;\n\t\t},\n\t\teaseOutCubic: function(t) {\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * t + 1);\n\t\t},\n\t\teaseInOutCubic: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t;\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * t + 2);\n\t\t},\n\t\teaseInQuart: function(t) {\n\t\t\treturn t * t * t * t;\n\t\t},\n\t\teaseOutQuart: function(t) {\n\t\t\treturn -1 * ((t = t / 1 - 1) * t * t * t - 1);\n\t\t},\n\t\teaseInOutQuart: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t * t;\n\t\t\t}\n\t\t\treturn -1 / 2 * ((t -= 2) * t * t * t - 2);\n\t\t},\n\t\teaseInQuint: function(t) {\n\t\t\treturn 1 * (t /= 1) * t * t * t * t;\n\t\t},\n\t\teaseOutQuint: function(t) {\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * t * t * t + 1);\n\t\t},\n\t\teaseInOutQuint: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t * t * t;\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * t * t * t + 2);\n\t\t},\n\t\teaseInSine: function(t) {\n\t\t\treturn -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;\n\t\t},\n\t\teaseOutSine: function(t) {\n\t\t\treturn 1 * Math.sin(t / 1 * (Math.PI / 2));\n\t\t},\n\t\teaseInOutSine: function(t) {\n\t\t\treturn -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);\n\t\t},\n\t\teaseInExpo: function(t) {\n\t\t\treturn (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));\n\t\t},\n\t\teaseOutExpo: function(t) {\n\t\t\treturn (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);\n\t\t},\n\t\teaseInOutExpo: function(t) {\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (t === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * Math.pow(2, 10 * (t - 1));\n\t\t\t}\n\t\t\treturn 1 / 2 * (-Math.pow(2, -10 * --t) + 2);\n\t\t},\n\t\teaseInCirc: function(t) {\n\t\t\tif (t >= 1) {\n\t\t\t\treturn t;\n\t\t\t}\n\t\t\treturn -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);\n\t\t},\n\t\teaseOutCirc: function(t) {\n\t\t\treturn 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);\n\t\t},\n\t\teaseInOutCirc: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn -1 / 2 * (Math.sqrt(1 - t * t) - 1);\n\t\t\t}\n\t\t\treturn 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t\t},\n\t\teaseInElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1) === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * 0.3;\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t},\n\t\teaseOutElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1) === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * 0.3;\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;\n\t\t},\n\t\teaseInOutElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1 / 2) === 2) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * (0.3 * 1.5);\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\tif (t < 1) {\n\t\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t\t}\n\t\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t\t},\n\t\teaseInBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\treturn 1 * (t /= 1) * t * ((s + 1) * t - s);\n\t\t},\n\t\teaseOutBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);\n\t\t},\n\t\teaseInOutBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t\t},\n\t\teaseInBounce: function(t) {\n\t\t\treturn 1 - easingEffects.easeOutBounce(1 - t);\n\t\t},\n\t\teaseOutBounce: function(t) {\n\t\t\tif ((t /= 1) < (1 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * t * t);\n\t\t\t} else if (t < (2 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);\n\t\t\t} else if (t < (2.5 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);\n\t\t\t}\n\t\t\treturn 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);\n\t\t},\n\t\teaseInOutBounce: function(t) {\n\t\t\tif (t < 1 / 2) {\n\t\t\t\treturn easingEffects.easeInBounce(t * 2) * 0.5;\n\t\t\t}\n\t\t\treturn easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;\n\t\t}\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt,\n\t\t\tcanvas = evt.currentTarget || evt.srcElement,\n\t\t\tboundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\thelpers.addEvent = function(node, eventType, method) {\n\t\tif (node.addEventListener) {\n\t\t\tnode.addEventListener(eventType, method);\n\t\t} else if (node.attachEvent) {\n\t\t\tnode.attachEvent('on' + eventType, method);\n\t\t} else {\n\t\t\tnode['on' + eventType] = method;\n\t\t}\n\t};\n\thelpers.removeEvent = function(node, eventType, handler) {\n\t\tif (node.removeEventListener) {\n\t\t\tnode.removeEventListener(eventType, handler, false);\n\t\t} else if (node.detachEvent) {\n\t\t\tnode.detachEvent('on' + eventType, handler);\n\t\t} else {\n\t\t\tnode['on' + eventType] = helpers.noop;\n\t\t}\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof(styleValue) === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw)? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch)? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tcanvas.style.height = height + 'px';\n\t\tcanvas.style.width = width + 'px';\n\t};\n\t// -- Canvas methods\n\thelpers.clear = function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t};\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\thelpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + radius, y);\n\t\tctx.lineTo(x + width - radius, y);\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\tctx.lineTo(x + width, y + height - radius);\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\tctx.lineTo(x + radius, y + height);\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\tctx.lineTo(x, y + radius);\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\tctx.closePath();\n\t};\n\thelpers.color = function(c) {\n\t\tif (!color) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn c;\n\t\t}\n\n\t\t/* global CanvasGradient */\n\t\tif (c instanceof CanvasGradient) {\n\t\t\treturn color(Chart.defaults.global.defaultColor);\n\t\t}\n\n\t\treturn color(c);\n\t};\n\thelpers.isArray = Array.isArray?\n\t\tfunction(obj) {\n\t\t\treturn Array.isArray(obj);\n\t\t} :\n\t\tfunction(obj) {\n\t\t\treturn Object.prototype.toString.call(obj) === '[object Array]';\n\t\t};\n\t// ! @see http://stackoverflow.com/a/14853974\n\thelpers.arrayEquals = function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen=a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\thelpers.callCallback = function(fn, args, _tArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\tfn.apply(_tArg, args);\n\t\t}\n\t};\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n\n},{\"2\":2}],27:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\tvar helpers = Chart.helpers;\n\n\t/**\n\t * Helper function to get relative position for an event\n\t * @param {Event|IEvent} event - The event to get the position for\n\t * @param {Chart} chart - The chart\n\t * @returns {Point} the event position\n\t */\n\tfunction getRelativePosition(e, chart) {\n\t\tif (e.native) {\n\t\t\treturn {\n\t\t\t\tx: e.x,\n\t\t\t\ty: e.y\n\t\t\t};\n\t\t}\n\n\t\treturn helpers.getRelativePosition(e, chart);\n\t}\n\n\t/**\n\t * Helper function to traverse all of the visible elements in the chart\n\t * @param chart {chart} the chart\n\t * @param handler {Function} the callback to execute for each visible item\n\t */\n\tfunction parseVisibleItems(chart, handler) {\n\t\tvar datasets = chart.data.datasets;\n\t\tvar meta, i, j, ilen, jlen;\n\n\t\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\t\tvar element = meta.data[j];\n\t\t\t\tif (!element._view.skip) {\n\t\t\t\t\thandler(element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to get the items that intersect the event position\n\t * @param items {ChartElement[]} elements to filter\n\t * @param position {Point} the point to be nearest to\n\t * @return {ChartElement[]} the nearest items\n\t */\n\tfunction getIntersectItems(chart, position) {\n\t\tvar elements = [];\n\n\t\tparseVisibleItems(chart, function(element) {\n\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn elements;\n\t}\n\n\t/**\n\t * Helper function to get the items nearest to the event position considering all visible items in teh chart\n\t * @param chart {Chart} the chart to look at elements from\n\t * @param position {Point} the point to be nearest to\n\t * @param intersect {Boolean} if true, only consider items that intersect the position\n\t * @param distanceMetric {Function} Optional function to provide the distance between\n\t * @return {ChartElement[]} the nearest items\n\t */\n\tfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\tvar nearestItems = [];\n\n\t\tif (!distanceMetric) {\n\t\t\tdistanceMetric = helpers.distanceBetweenPoints;\n\t\t}\n\n\t\tparseVisibleItems(chart, function(element) {\n\t\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar center = element.getCenterPoint();\n\t\t\tvar distance = distanceMetric(position, center);\n\n\t\t\tif (distance < minDistance) {\n\t\t\t\tnearestItems = [element];\n\t\t\t\tminDistance = distance;\n\t\t\t} else if (distance === minDistance) {\n\t\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\t\tnearestItems.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn nearestItems;\n\t}\n\n\tfunction indexMode(chart, e, options) {\n\t\tvar position = getRelativePosition(e, chart.chart);\n\t\tvar distanceMetric = function(pt1, pt2) {\n\t\t\treturn Math.abs(pt1.x - pt2.x);\n\t\t};\n\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\t\tvar elements = [];\n\n\t\tif (!items.length) {\n\t\t\treturn [];\n\t\t}\n\n\t\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex),\n\t\t\t\t\telement = meta.data[items[0]._index];\n\n\t\t\t\t// don't count items that are skipped (null data)\n\t\t\t\tif (element && !element._view.skip) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn elements;\n\t}\n\n\t/**\n\t * @interface IInteractionOptions\n\t */\n\t/**\n\t * If true, only consider items that intersect the point\n\t * @name IInterfaceOptions#boolean\n\t * @type Boolean\n\t */\n\n\t/**\n\t * Contains interaction related functions\n\t * @namespace Chart.Interaction\n\t */\n\tChart.Interaction = {\n\t\t// Helper function for different modes\n\t\tmodes: {\n\t\t\tsingle: function(chart, e) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar elements = [];\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\treturn elements;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements.slice(0, 1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @function Chart.Interaction.modes.label\n\t\t\t * @deprecated since version 2.4.0\n\t\t\t */\n\t\t\tlabel: indexMode,\n\n\t\t\t/**\n\t\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t\t * @function Chart.Interaction.modes.index\n\t\t\t * @since v2.4.0\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tindex: indexMode,\n\n\t\t\t/**\n\t\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t\t * @function Chart.Interaction.modes.dataset\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tdataset: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false);\n\n\t\t\t\tif (items.length > 0) {\n\t\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t\t}\n\n\t\t\t\treturn items;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @function Chart.Interaction.modes.x-axis\n\t\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t\t */\n\t\t\t'x-axis': function(chart, e) {\n\t\t\t\treturn indexMode(chart, e, true);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Point mode returns all elements that hit test based on the event position\n\t\t\t * of the event\n\t\t\t * @function Chart.Interaction.modes.intersect\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tpoint: function(chart, e) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\treturn getIntersectItems(chart, position);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * nearest mode returns the element closest to the point\n\t\t\t * @function Chart.Interaction.modes.intersect\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tnearest: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect);\n\n\t\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\t\tif (nearestItems.length > 1) {\n\t\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ret;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Return only 1 item\n\t\t\t\treturn nearestItems.slice(0, 1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t\t * @function Chart.Interaction.modes.x\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tx: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar items = [];\n\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t// that intersect the position, return nothing\n\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\titems = [];\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t\t * @function Chart.Interaction.modes.y\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\ty: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar items = [];\n\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t// that intersect the position, return nothing\n\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\titems = [];\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{}],28:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.controller = new Chart.Controller(item, config, this);\n\t\treturn this.controller;\n\t};\n\n\t// Globally expose the defaults to allow for user updating/changing\n\tChart.defaults = {\n\t\tglobal: {\n\t\t\tresponsive: true,\n\t\t\tresponsiveAnimationDuration: 0,\n\t\t\tmaintainAspectRatio: true,\n\t\t\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\t\t\thover: {\n\t\t\t\tonHover: null,\n\t\t\t\tmode: 'nearest',\n\t\t\t\tintersect: true,\n\t\t\t\tanimationDuration: 400\n\t\t\t},\n\t\t\tonClick: null,\n\t\t\tdefaultColor: 'rgba(0,0,0,0.1)',\n\t\t\tdefaultFontColor: '#666',\n\t\t\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\t\t\tdefaultFontSize: 12,\n\t\t\tdefaultFontStyle: 'normal',\n\t\t\tshowLines: true,\n\n\t\t\t// Element defaults defined in element extensions\n\t\t\telements: {},\n\n\t\t\t// Legend callback string\n\t\t\tlegendCallback: function(chart) {\n\t\t\t\tvar text = [];\n\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\t\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t\ttext.push('</ul>');\n\n\t\t\t\treturn text.join('');\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n\n},{}],29:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t// The layout service is very self explanatory.  It's responsible for the layout within a chart.\n\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t// It is this service's responsibility of carrying out that layout.\n\tChart.layoutService = {\n\t\tdefaults: {},\n\n\t\t// Register a box to a chartInstance. A box is simply a reference to an object that requires layout. eg. Scales, Legend, Plugins.\n\t\taddBox: function(chartInstance, box) {\n\t\t\tif (!chartInstance.boxes) {\n\t\t\t\tchartInstance.boxes = [];\n\t\t\t}\n\t\t\tchartInstance.boxes.push(box);\n\t\t},\n\n\t\tremoveBox: function(chartInstance, box) {\n\t\t\tif (!chartInstance.boxes) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchartInstance.boxes.splice(chartInstance.boxes.indexOf(box), 1);\n\t\t},\n\n\t\t// The most important function\n\t\tupdate: function(chartInstance, width, height) {\n\n\t\t\tif (!chartInstance) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar layoutOptions = chartInstance.options.layout;\n\t\t\tvar padding = layoutOptions ? layoutOptions.padding : null;\n\n\t\t\tvar leftPadding = 0;\n\t\t\tvar rightPadding = 0;\n\t\t\tvar topPadding = 0;\n\t\t\tvar bottomPadding = 0;\n\n\t\t\tif (!isNaN(padding)) {\n\t\t\t\t// options.layout.padding is a number. assign to all\n\t\t\t\tleftPadding = padding;\n\t\t\t\trightPadding = padding;\n\t\t\t\ttopPadding = padding;\n\t\t\t\tbottomPadding = padding;\n\t\t\t} else {\n\t\t\t\tleftPadding = padding.left || 0;\n\t\t\t\trightPadding = padding.right || 0;\n\t\t\t\ttopPadding = padding.top || 0;\n\t\t\t\tbottomPadding = padding.bottom || 0;\n\t\t\t}\n\n\t\t\tvar leftBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'left';\n\t\t\t});\n\t\t\tvar rightBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'right';\n\t\t\t});\n\t\t\tvar topBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'top';\n\t\t\t});\n\t\t\tvar bottomBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'bottom';\n\t\t\t});\n\n\t\t\t// Boxes that overlay the chartarea such as the radialLinear scale\n\t\t\tvar chartAreaBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'chartArea';\n\t\t\t});\n\n\t\t\t// Ensure that full width boxes are at the very top / bottom\n\t\t\ttopBoxes.sort(function(a, b) {\n\t\t\t\treturn (b.options.fullWidth ? 1 : 0) - (a.options.fullWidth ? 1 : 0);\n\t\t\t});\n\t\t\tbottomBoxes.sort(function(a, b) {\n\t\t\t\treturn (a.options.fullWidth ? 1 : 0) - (b.options.fullWidth ? 1 : 0);\n\t\t\t});\n\n\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t// Our canvas looks like the following.\n\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t// B1 is the bottom axis\n\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t// an error will be thrown.\n\t\t\t//\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  T1 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |    |    |                 T2                  |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    | C1 |                           | C2 |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// | L1 | L2 |           ChartArea (C0)            | R1 |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    | C3 |                           | C4 |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    |                 B1                  |    |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  B2 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t//\n\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t// 6. Refit each axis\n\t\t\t// 7. Position each axis in the final location\n\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t// Step 1\n\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t// Step 2\n\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t// Step 3\n\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t// Step 4\n\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\tvar minBoxSizes = [];\n\n\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\tvar minSize;\n\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize = box.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t} else {\n\t\t\t\t\tminSize = box.update(verticalBoxWidth, chartAreaHeight);\n\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t}\n\n\t\t\t\tminBoxSizes.push({\n\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\tminSize: minSize,\n\t\t\t\t\tbox: box,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t// Steps 5 & 6\n\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t// Function to fit a box\n\t\t\tfunction fitBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t});\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\tbox.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t});\n\n\t\t\t\tvar scaleMargin = {\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t};\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Let the left layout know the final margin\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t// without calling `fit` again\n\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\t\tif (!box.options.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\t\tif (!box.options.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t}\n\n\t\t\t// Step 7 - Position the boxes\n\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\tfunction placeBox(box) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tbox.left = box.options.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\tbox.right = box.options.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\tbox.top = top;\n\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\ttop = box.bottom;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.left = left;\n\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\tleft = box.right;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t// Account for chart width and height\n\t\t\tleft += maxChartAreaWidth;\n\t\t\ttop += maxChartAreaHeight;\n\n\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t// Step 8\n\t\t\tchartInstance.chartArea = {\n\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t};\n\n\t\t\t// Step 9\n\t\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\t\tbox.left = chartInstance.chartArea.left;\n\t\t\t\tbox.top = chartInstance.chartArea.top;\n\t\t\t\tbox.right = chartInstance.chartArea.right;\n\t\t\t\tbox.bottom = chartInstance.chartArea.bottom;\n\n\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{}],30:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar noop = helpers.noop;\n\n\tChart.defaults.global.legend = {\n\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)\n\t\treverse: false,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Helper function to get the box width based on the usePointStyle option\n\t * @param labelopts {Object} the label options on the legend\n\t * @param fontSize {Number} the label font size\n\t * @return {Number} width of the color box area\n\t */\n\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\treturn labelOpts.usePointStyle ?\n\t\t\tfontSize * Math.SQRT2 :\n\t\t\tlabelOpts.boxWidth;\n\t}\n\n\tChart.Legend = Chart.Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\thelpers.extend(this, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\tthis.doughnutMode = false;\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t// Any function defined here is inherited by all legend types.\n\t\t// Any function can be extended by the legend type\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: function() {\n\t\t\tvar me = this;\n\t\t\tvar labelOpts = me.options.labels;\n\t\t\tvar legendItems = labelOpts.generateLabels.call(me, me.chart);\n\n\t\t\tif (labelOpts.filter) {\n\t\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (me.options.reverse) {\n\t\t\t\tlegendItems.reverse();\n\t\t\t}\n\n\t\t\tme.legendItems = legendItems;\n\t\t},\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar display = opts.display;\n\n\t\t\tvar ctx = me.ctx;\n\n\t\t\tvar globalDefault = Chart.defaults.global,\n\t\t\t\titemOrDefault = helpers.getValueOrDefault,\n\t\t\t\tfontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\n\t\t\t\tfontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),\n\t\t\t\tfontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\n\t\t\t\tlabelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t// Reset hit boxes\n\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Increase sizes here\n\t\t\tif (display) {\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// Labels\n\n\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\ttotalHeight += fontSize + (labelOpts.padding);\n\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t});\n\n\t\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t\t} else {\n\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\n\t\t// Actually draw the legend on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar globalDefault = Chart.defaults.global,\n\t\t\t\tlineDefault = globalDefault.elements.line,\n\t\t\t\tlegendWidth = me.width,\n\t\t\t\tlineWidths = me.lineWidths;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx,\n\t\t\t\t\tcursor,\n\t\t\t\t\titemOrDefault = helpers.getValueOrDefault,\n\t\t\t\t\tfontColor = itemOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor),\n\t\t\t\t\tfontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\n\t\t\t\t\tfontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),\n\t\t\t\t\tfontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\n\t\t\t\t\tlabelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t// Canvas setup\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'top';\n\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize),\n\t\t\t\t\thitboxes = me.legendHitBoxes;\n\n\t\t\t\t// current position\n\t\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\tctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\tctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\tctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\tctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\tctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\tctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\tvar isLineWidthZero = (itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\tctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\tChart.canvasHelpers.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.restore();\n\t\t\t\t};\n\t\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\t\tctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\n\n\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\tctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\n\t\t\t\t\t\tctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Horizontal\n\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2),\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width,\n\t\t\t\t\t\twidth = boxWidth + (fontSize / 2) + textWidth,\n\t\t\t\t\t\tx = cursor.x,\n\t\t\t\t\t\ty = cursor.y;\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t// Fill the actual label\n\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tcursor.x += width + (labelOpts.padding);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @return {Boolean} true if a change occured\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\tvar changed = false;\n\n\t\t\tif (type === 'mousemove') {\n\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (type === 'click') {\n\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Chart event already has relative position in it\n\t\t\tvar x = e.x,\n\t\t\t\ty = e.y;\n\n\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\tfunction createNewLegendAndAttach(chartInstance, legendOpts) {\n\t\tvar legend = new Chart.Legend({\n\t\t\tctx: chartInstance.chart.ctx,\n\t\t\toptions: legendOpts,\n\t\t\tchart: chartInstance\n\t\t});\n\t\tchartInstance.legend = legend;\n\t\tChart.layoutService.addBox(chartInstance, legend);\n\t}\n\n\t// Register the legend plugin\n\tChart.plugins.register({\n\t\tbeforeInit: function(chartInstance) {\n\t\t\tvar legendOpts = chartInstance.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tcreateNewLegendAndAttach(chartInstance, legendOpts);\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function(chartInstance) {\n\t\t\tvar legendOpts = chartInstance.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tlegendOpts = helpers.configMerge(Chart.defaults.global.legend, legendOpts);\n\n\t\t\t\tif (chartInstance.legend) {\n\t\t\t\t\tchartInstance.legend.options = legendOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewLegendAndAttach(chartInstance, legendOpts);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tChart.layoutService.removeBox(chartInstance, chartInstance.legend);\n\t\t\t\tdelete chartInstance.legend;\n\t\t\t}\n\t\t},\n\t\tafterEvent: function(chartInstance, e) {\n\t\t\tvar legend = chartInstance.legend;\n\t\t\tif (legend) {\n\t\t\t\tlegend.handleEvent(e);\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],31:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.plugins = {};\n\n\t/**\n\t * The plugin service singleton\n\t * @namespace Chart.plugins\n\t * @since 2.1.0\n\t */\n\tChart.plugins = {\n\t\t/**\n\t\t * Globally registered plugins.\n\t\t * @private\n\t\t */\n\t\t_plugins: [],\n\n\t\t/**\n\t\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t\t * incremented and descriptors are regenerated during following API calls.\n\t\t * @private\n\t\t */\n\t\t_cacheId: 0,\n\n\t\t/**\n\t\t * Registers the given plugin(s) if not already registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\tp.push(plugin);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Unregisters the given plugin(s) only if registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tunregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Remove all registered plugins.\n\t\t * @since 2.1.5\n\t\t */\n\t\tclear: function() {\n\t\t\tthis._plugins = [];\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Returns the number of registered plugins?\n\t\t * @returns {Number}\n\t\t * @since 2.1.5\n\t\t */\n\t\tcount: function() {\n\t\t\treturn this._plugins.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns all registered plugin instances.\n\t\t * @returns {Array} array of plugin objects.\n\t\t * @since 2.1.5\n\t\t */\n\t\tgetAll: function() {\n\t\t\treturn this._plugins;\n\t\t},\n\n\t\t/**\n\t\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t\t * returned value can be used, for instance, to interrupt the current action.\n\t\t * @param {Object} chart - The chart instance for which plugins should be called.\n\t\t * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t\t * @param {Array} [args] - Extra arguments to apply to the hook call.\n\t\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t\t */\n\t\tnotify: function(chart, hook, args) {\n\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\tvar ilen = descriptors.length;\n\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\tfor (i=0; i<ilen; ++i) {\n\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\tmethod = plugin[hook];\n\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\tif (method.apply(plugin, params) === false) {\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\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Returns descriptors of enabled plugins for the given chart.\n\t\t * @returns {Array} [{ plugin, options }]\n\t\t * @private\n\t\t */\n\t\tdescriptors: function(chart) {\n\t\t\tvar cache = chart._plugins || (chart._plugins = {});\n\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\treturn cache.descriptors;\n\t\t\t}\n\n\t\t\tvar plugins = [];\n\t\t\tvar descriptors = [];\n\t\t\tvar config = (chart && chart.config) || {};\n\t\t\tvar defaults = Chart.defaults.global.plugins;\n\t\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar id = plugin.id;\n\t\t\t\tvar opts = options[id];\n\t\t\t\tif (opts === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (opts === true) {\n\t\t\t\t\topts = helpers.clone(defaults[id]);\n\t\t\t\t}\n\n\t\t\t\tplugins.push(plugin);\n\t\t\t\tdescriptors.push({\n\t\t\t\t\tplugin: plugin,\n\t\t\t\t\toptions: opts || {}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcache.descriptors = descriptors;\n\t\t\tcache.id = this._cacheId;\n\t\t\treturn descriptors;\n\t\t}\n\t};\n\n\t/**\n\t * Plugin extension hooks.\n\t * @interface IPlugin\n\t * @since 2.1.0\n\t */\n\t/**\n\t * @method IPlugin#beforeInit\n\t * @desc Called before initializing `chart`.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterInit\n\t * @desc Called after `chart` has been initialized and before the first update.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeUpdate\n\t * @desc Called before updating `chart`. If any plugin returns `false`, the update\n\t * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart update.\n\t */\n\t/**\n\t * @method IPlugin#afterUpdate\n\t * @desc Called after `chart` has been updated and before rendering. Note that this\n\t * hook will not be called if the chart update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsUpdate\n \t * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n\t * the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} false to cancel the datasets update.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsUpdate\n\t * @desc Called after the `chart` datasets have been updated. Note that this hook\n\t * will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#beforeLayout\n\t * @desc Called before laying out `chart`. If any plugin returns `false`,\n\t * the layout update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart layout.\n\t */\n\t/**\n\t * @method IPlugin#afterLayout\n\t * @desc Called after the `chart` has been layed out. Note that this hook will not\n\t * be called if the layout update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeRender\n\t * @desc Called before rendering `chart`. If any plugin returns `false`,\n\t * the rendering is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart rendering.\n\t */\n\t/**\n\t * @method IPlugin#afterRender\n\t * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n\t * that this hook will not be called if the rendering has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDraw\n\t * @desc Called before drawing `chart` at every animation frame specified by the given\n\t * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n\t * another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDraw\n\t * @desc Called after the `chart` has been drawn for the specific easing value. Note\n\t * that this hook will not be called if the drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsDraw\n \t * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n\t * the datasets drawing is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsDraw\n\t * @desc Called after the `chart` datasets have been drawn. Note that this hook\n\t * will not be called if the datasets drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeEvent\n \t * @desc Called before processing the specified `event`. If any plugin returns `false`,\n\t * the event will be discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterEvent\n\t * @desc Called after the `event` has been consumed. Note that this hook\n\t * will not be called if the `event` has been previously discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#resize\n\t * @desc Called after the chart as been resized.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#destroy\n\t * @desc Called after the chart as been destroyed.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\n\t/**\n\t * Provided for backward compatibility, use Chart.plugins instead\n\t * @namespace Chart.pluginService\n\t * @deprecated since version 2.1.5\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.pluginService = Chart.plugins;\n\n\t/**\n\t * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n\t * effect, instead simply create/register plugins via plain JavaScript objects.\n\t * @interface Chart.PluginBase\n\t * @deprecated since version 2.5.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.PluginBase = helpers.inherits({});\n};\n\n},{}],32:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.scale = {\n\t\tdisplay: true,\n\t\tposition: 'left',\n\n\t\t// grid line settings\n\t\tgridLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1,\n\t\t\tdrawBorder: true,\n\t\t\tdrawOnChartArea: true,\n\t\t\tdrawTicks: true,\n\t\t\ttickMarkLength: 10,\n\t\t\tzeroLineWidth: 1,\n\t\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\t\toffsetGridLines: false,\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0\n\t\t},\n\n\t\t// scale label\n\t\tscaleLabel: {\n\t\t\t// actual label\n\t\t\tlabelString: '',\n\n\t\t\t// display property\n\t\t\tdisplay: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tbeginAtZero: false,\n\t\t\tminRotation: 0,\n\t\t\tmaxRotation: 50,\n\t\t\tmirror: false,\n\t\t\tpadding: 0,\n\t\t\treverse: false,\n\t\t\tdisplay: true,\n\t\t\tautoSkip: true,\n\t\t\tautoSkipPadding: 0,\n\t\t\tlabelOffset: 0,\n\t\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\t\tcallback: Chart.Ticks.formatters.values\n\t\t}\n\t};\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\tvar globalDefaults = Chart.defaults.global;\n\t\tvar size = getValueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = getValueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = getValueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tChart.Scale = Chart.Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callCallback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks\n\t\t\tme.beforeBuildTicks();\n\t\t\tme.buildTicks();\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\t\t\tme.convertTicksToLabels();\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callCallback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callCallback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callCallback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callCallback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callCallback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callCallback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callCallback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callCallback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callCallback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callCallback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, me.ticks, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation;\n\t\t\t\tvar sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callCallback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callCallback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar scaleLabelFontSize = parseFontOptions(scaleLabelOpts).size * 1.5;\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += scaleLabelFontSize;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += scaleLabelFontSize;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, me.ticks, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(me.ticks);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * tallestLabelHeightInLines);\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight);\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\n\t\t\t\t\tvar firstTick = me.ticks[0];\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, firstTick, tickFont.font);\n\n\t\t\t\t\tvar lastTick = me.ticks[me.ticks.length - 1];\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, lastTick, tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned which means that the right padding is dominated\n\t\t\t\t\t// by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom'? (cosRotation * firstLabelWidth) + 3: (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom'? (cosRotation * lineSpace) + 3: (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the dominant factor here, so get that length first\n\t\t\t\t\t// Account for padding\n\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlargestTextWidth += me.options.ticks.padding;\n\t\t\t\t\t}\n\t\t\t\t\tminSize.width += largestTextWidth;\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callCallback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (rawValue === null || typeof(rawValue) === 'undefined') {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof(rawValue) === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (typeof(rawValue) === 'object') {\n\t\t\t\tif ((rawValue instanceof Date) || (rawValue.isValid)) {\n\t\t\t\t\treturn rawValue;\n\t\t\t\t}\n\t\t\t\treturn this.getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t// Used to get the value to display in the tooltip for the data at the given index\n\t\t// function getLabelForIndex(index, datasetIndex)\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t// Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t// Used for tick location, should\n\t\tgetPixelForTick: function(index, includeOffset) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (includeOffset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me.ticks.length - 1)));\n\t\t},\n\n\t\t// Utility for getting the pixel location of a percentage of scale\n\t\tgetPixelForDecimal: function(decimal /* , includeOffset*/) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.beginAtZero ? 0:\n\t\t\t\tmin < 0 && max < 0? max :\n\t\t\t\tmin > 0 && max > 0? min :\n\t\t\t\t0;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = Chart.defaults.global;\n\t\t\tvar optionTicks = options.ticks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar skipRatio;\n\t\t\tvar useAutoskipper = optionTicks.autoSkip;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tvar tickFontColor = helpers.getValueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\t\t\tvar borderDash = helpers.getValueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\tvar borderDashOffset = helpers.getValueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\n\t\t\tvar scaleLabelFontColor = helpers.getValueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\n\t\t\t// Make sure we draw text in the correct color and font\n\t\t\tcontext.fillStyle = tickFontColor;\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\t// Only calculate the skip ratio with the half width of longestRotateLabel if we got an actual rotation\n\t\t\t\t// See #2584\n\t\t\t\tif (isRotated) {\n\t\t\t\t\tlongestRotatedLabel /= 2;\n\t\t\t\t}\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && me.ticks.length > maxTicks) {\n\t\t\t\t\twhile (!skipRatio || me.ticks.length / (skipRatio || 1) > maxTicks) {\n\t\t\t\t\t\tif (!skipRatio) {\n\t\t\t\t\t\t\tskipRatio = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipRatio += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!useAutoskipper) {\n\t\t\t\t\tskipRatio = false;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t// If the callback returned a null or undefined value, do not draw this line\n\t\t\t\tif (label === undefined || label === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar isLastTick = me.ticks.length === index + 1;\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tvar shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= me.ticks.length);\n\t\t\t\tif (shouldSkip && !isLastTick || (label === undefined || label === null)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar lineWidth, lineColor;\n\t\t\t\tif (index === (typeof me.zeroLineIndex !== 'undefined' ? me.zeroLineIndex : 0)) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.getValueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\n\t\t\t\tif (isHorizontal) {\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated? 'top':'middle';\n\t\t\t\t\t\ttextAlign = !isRotated? 'center': 'right';\n\t\t\t\t\t\tlabelY = me.top + tl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated? 'bottom':'middle';\n\t\t\t\t\t\ttextAlign = !isRotated? 'center': 'left';\n\t\t\t\t\t\tlabelY = me.bottom - tl;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = me.getPixelForTick(index) + helpers.aliasPixel(lineWidth); // xvalues for grid lines\n\t\t\t\t\tlabelX = me.getPixelForTick(index, gridLines.offsetGridLines) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar tickPadding = optionTicks.padding;\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = me.getPixelForTick(index); // xvalues for grid lines\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\t\t\t\t\tlabelY = me.getPixelForTick(index, gridLines.offsetGridLines);\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = tickFont.font;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tfor (var i = 0, y = 0; i < label.length; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += (tickFont.size * 1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom' ? me.bottom - (scaleLabelFont.size / 2) : me.top + (scaleLabelFont.size / 2);\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft ? me.left + (scaleLabelFont.size / 2) : me.right - (scaleLabelFont.size / 2);\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.getValueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left,\n\t\t\t\t\tx2 = me.right,\n\t\t\t\t\ty1 = me.top,\n\t\t\t\t\ty2 = me.bottom;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],33:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, defaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(defaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.scaleMerge(Chart.defaults.scale, this.defaults[type]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar defaults = this.defaults;\n\t\t\tif (defaults.hasOwnProperty(type)) {\n\t\t\t\tdefaults[type] = helpers.extend(defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chartInstance) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chartInstance.scales, function(scale) {\n\t\t\t\tChart.layoutService.addBox(chartInstance, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{}],34:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t/**\n\t * Namespace to hold static tick generation functions\n\t * @namespace Chart.Ticks\n\t */\n\tChart.Ticks = {\n\t\t/**\n\t\t * Namespace to hold generators for different types of ticks\n\t\t * @namespace Chart.Ticks.generators\n\t\t */\n\t\tgenerators: {\n\t\t\t/**\n\t\t\t * Interface for the options provided to the numeric tick generator\n\t\t\t * @interface INumericTickGenerationOptions\n\t\t\t */\n\t\t\t/**\n\t\t\t * The maximum number of ticks to display\n\t\t\t * @name INumericTickGenerationOptions#maxTicks\n\t\t\t * @type Number\n\t\t\t */\n\t\t\t/**\n\t\t\t * The distance between each tick.\n\t\t\t * @name INumericTickGenerationOptions#stepSize\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\t\t\t/**\n\t\t\t * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n\t\t\t * @name INumericTickGenerationOptions#min\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\t\t\t/**\n\t\t\t * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n\t\t\t * @name INumericTickGenerationOptions#max\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Generate a set of linear ticks\n\t\t\t * @method Chart.Ticks.generators.linear\n\t\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t\t * @param dataRange {IRange} the range of the data\n\t\t\t * @returns {Array<Number>} array of tick values\n\t\t\t */\n\t\t\tlinear: function(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t\t// for details.\n\n\t\t\t\tvar spacing;\n\t\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t\t} else {\n\t\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\t\t\t\t}\n\t\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\t\tif (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n\t\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t\t// If very close to our rounded value, use it.\n\t\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t\t} else {\n\t\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t\t}\n\n\t\t\t\t// Put the values into the ticks array\n\t\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\t\tticks.push(niceMin + (j * spacing));\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\t\treturn ticks;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Generate a set of logarithmic ticks\n\t\t\t * @method Chart.Ticks.generators.logarithmic\n\t\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t\t * @param dataRange {IRange} the range of the data\n\t\t\t * @returns {Array<Number>} array of tick values\n\t\t\t */\n\t\t\tlogarithmic: function(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t// the graph\n\t\t\t\tvar tickVal = getValueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\t\tvar exp;\n\t\t\t\tvar significand;\n\n\t\t\t\tif (tickVal === 0) {\n\t\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\t\tticks.push(tickVal);\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} else {\n\t\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t\t}\n\n\t\t\t\tdo {\n\t\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t\t++significand;\n\t\t\t\t\tif (significand === 10) {\n\t\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t\t++exp;\n\t\t\t\t\t}\n\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\t\t\t\tvar lastTick = getValueOrDefault(generationOptions.max, tickVal);\n\t\t\t\tticks.push(lastTick);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Namespace to hold formatters for different types of ticks\n\t\t * @namespace Chart.Ticks.formatters\n\t\t */\n\t\tformatters: {\n\t\t\t/**\n\t\t\t * Formatter for value labels\n\t\t\t * @method Chart.Ticks.formatters.values\n\t\t\t * @param value the value to display\n\t\t\t * @return {String|Array} the label to display\n\t\t\t */\n\t\t\tvalues: function(value) {\n\t\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Formatter for linear numeric ticks\n\t\t\t * @method Chart.Ticks.formatters.linear\n\t\t\t * @param tickValue {Number} the value to be formatted\n\t\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t\t * @param ticks {Array<Number>} the list of ticks being converted\n\t\t\t * @return {String} string representation of the tickValue parameter\n\t\t\t */\n\t\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t\t// not an integer\n\t\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\t\tvar tickString = '';\n\n\t\t\t\tif (tickValue !== 0) {\n\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t\t} else {\n\t\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t\t}\n\n\t\t\t\treturn tickString;\n\t\t\t},\n\n\t\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\t\tif (tickValue === 0) {\n\t\t\t\t\treturn '0';\n\t\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\t\treturn tickValue.toExponential();\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{}],35:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.title = {\n\t\tdisplay: false,\n\t\tposition: 'top',\n\t\tfullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)\n\n\t\tfontStyle: 'bold',\n\t\tpadding: 10,\n\n\t\t// actual title\n\t\ttext: ''\n\t};\n\n\tvar noop = helpers.noop;\n\tChart.Title = Chart.Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\tvar me = this;\n\t\t\thelpers.extend(me, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tme.legendHitBoxes = [];\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: noop,\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this,\n\t\t\t\tvalueOrDefault = helpers.getValueOrDefault,\n\t\t\t\topts = me.options,\n\t\t\t\tglobalDefaults = Chart.defaults.global,\n\t\t\t\tdisplay = opts.display,\n\t\t\t\tfontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\n\t\t\t\tminSize = me.minSize;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? fontSize + (opts.padding * 2) : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? fontSize + (opts.padding * 2) : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\tvar pos = this.options.position;\n\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t},\n\n\t\t// Actually draw the title block on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this,\n\t\t\t\tctx = me.ctx,\n\t\t\t\tvalueOrDefault = helpers.getValueOrDefault,\n\t\t\t\topts = me.options,\n\t\t\t\tglobalDefaults = Chart.defaults.global;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\tfontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\tfontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\ttitleFont = helpers.fontString(fontSize, fontStyle, fontFamily),\n\t\t\t\t\trotation = 0,\n\t\t\t\t\ttitleX,\n\t\t\t\t\ttitleY,\n\t\t\t\t\ttop = me.top,\n\t\t\t\t\tleft = me.left,\n\t\t\t\t\tbottom = me.bottom,\n\t\t\t\t\tright = me.right,\n\t\t\t\t\tmaxWidth;\n\n\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t// Horizontal\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2); // midpoint of the height\n\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t} else {\n\t\t\t\t\ttitleX = opts.position === 'left' ? left + (fontSize / 2) : right - (fontSize / 2);\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t}\n\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\tctx.rotate(rotation);\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.fillText(opts.text, 0, 0, maxWidth);\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction createNewTitleBlockAndAttach(chartInstance, titleOpts) {\n\t\tvar title = new Chart.Title({\n\t\t\tctx: chartInstance.chart.ctx,\n\t\t\toptions: titleOpts,\n\t\t\tchart: chartInstance\n\t\t});\n\t\tchartInstance.titleBlock = title;\n\t\tChart.layoutService.addBox(chartInstance, title);\n\t}\n\n\t// Register the title plugin\n\tChart.plugins.register({\n\t\tbeforeInit: function(chartInstance) {\n\t\t\tvar titleOpts = chartInstance.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\tcreateNewTitleBlockAndAttach(chartInstance, titleOpts);\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function(chartInstance) {\n\t\t\tvar titleOpts = chartInstance.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\ttitleOpts = helpers.configMerge(Chart.defaults.global.title, titleOpts);\n\n\t\t\t\tif (chartInstance.titleBlock) {\n\t\t\t\t\tchartInstance.titleBlock.options = titleOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewTitleBlockAndAttach(chartInstance, titleOpts);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tChart.layoutService.removeBox(chartInstance, chartInstance.titleBlock);\n\t\t\t\tdelete chartInstance.titleBlock;\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],36:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\tChart.defaults.global.tooltips = {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\treturn datasetLabel + ': ' + tooltipItem.yLabel;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chartInstance) {\n\t\t\t\tvar meta = chartInstance.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t};\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index,\n\t\t\tdatasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = Chart.defaults.global;\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: getValueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: getValueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: getValueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: getValueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: getValueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: getValueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: getValueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: getValueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: getValueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize,\n\t\t\tbodyFontSize = model.bodyFontSize,\n\t\t\tfooterFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chartInstance.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n\t */\n\tfunction getBackgroundPoint(vm, size, alignment) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize,\n\t\t\tcaretPadding = vm.caretPadding,\n\t\t\tcornerRadius = vm.cornerRadius,\n\t\t\txAlign = alignment.xAlign,\n\t\t\tyAlign = alignment.yAlign,\n\t\t\tpaddingAndSize = caretSize + caretPadding,\n\t\t\tradiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Chart.Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments),\n\t\t\t\ttitle = callbacks.title.apply(me, arguments),\n\t\t\t\tafterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\t\t\tvar chartInstance = me._chartInstance;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position](active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, chartInstance));\n\t\t\t\t});\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = helpers.getValueOrDefault(tooltipPosition.padding, 2);\n\t\t\t\tmodel.labelColors = labelColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size, opacity) {\n\t\t\tvar vm = this._view;\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar x1, x2, x3;\n\t\t\tvar y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign,\n\t\t\t\tyAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x,\n\t\t\t\tptY = tooltipPoint.y;\n\t\t\tvar width = size.width,\n\t\t\t\theight = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\t// Left or right side\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t}\n\n\t\t\t\ty2 = ptY + (height / 2);\n\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\ty3 = y2 + caretSize;\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX + cornerRadius;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx1 = ptX + width - cornerRadius;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = ptX + (width / 2);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x1, y1);\n\t\t\tctx.lineTo(x2, y2);\n\t\t\tctx.lineTo(x3, y3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize,\n\t\t\t\t\ttitleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\n\t\t\tvar textColor = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\tctx.fillStyle = textColor;\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\thelpers.drawRoundedRectangle(ctx, pt.x, pt.y, tooltipSize.width, tooltipSize.height, vm.cornerRadius);\n\t\t\tctx.fill();\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\tif (this._options.enabled) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Caret\n\t\t\t\tthis.drawCaret(pt, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chartInstance.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\t\t\tme._lastActive = me._active;\n\n\t\t\tif (options.enabled || options.custom) {\n\t\t\t\tme._eventPosition = {\n\t\t\t\t\tx: e.x,\n\t\t\t\t\ty: e.y\n\t\t\t\t};\n\n\t\t\t\tvar model = me._model;\n\t\t\t\tme.update(true);\n\t\t\t\tme.pivot();\n\n\t\t\t\t// See if our tooltip position changed\n\t\t\t\tchanged |= (model.x !== me._model.x) || (model.y !== me._model.y);\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\n\t\t\tvar nearestElement;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len;\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\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\t};\n};\n\n},{}],37:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tglobalOpts = Chart.defaults.global;\n\n\tglobalOpts.elements.arc = {\n\t\tbackgroundColor: globalOpts.defaultColor,\n\t\tborderColor: '#fff',\n\t\tborderWidth: 2\n\t};\n\n\tChart.elements.Arc = Chart.Element.extend({\n\t\tinLabelRange: function(mouseX) {\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm) {\n\t\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tinRange: function(chartX, chartY) {\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm) {\n\t\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, {\n\t\t\t\t\t\tx: chartX,\n\t\t\t\t\t\ty: chartY\n\t\t\t\t\t}),\n\t\t\t\t\tangle = pointRelativePosition.angle,\n\t\t\t\t\tdistance = pointRelativePosition.distance;\n\n\t\t\t\t// Sanitise angle range\n\t\t\t\tvar startAngle = vm.startAngle;\n\t\t\t\tvar endAngle = vm.endAngle;\n\t\t\t\twhile (endAngle < startAngle) {\n\t\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t\t}\n\t\t\t\twhile (angle > endAngle) {\n\t\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t\t}\n\t\t\t\twhile (angle < startAngle) {\n\t\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\t// Check if within the range of the open/close angle\n\t\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle),\n\t\t\t\t\twithinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\t\treturn (betweenAngles && withinRadius);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\t\treturn {\n\t\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t\t};\n\t\t},\n\t\tgetArea: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\n\t\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2),\n\t\t\t\trangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\t\t\treturn {\n\t\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t\t};\n\t\t},\n\t\tdraw: function() {\n\n\t\t\tvar ctx = this._chart.ctx,\n\t\t\t\tvm = this._view,\n\t\t\t\tsA = vm.startAngle,\n\t\t\t\teA = vm.endAngle;\n\n\t\t\tctx.beginPath();\n\n\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\t\tctx.closePath();\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.lineWidth = vm.borderWidth;\n\n\t\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\t\tctx.fill();\n\t\t\tctx.lineJoin = 'bevel';\n\n\t\t\tif (vm.borderWidth) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],38:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar globalDefaults = Chart.defaults.global;\n\n\tChart.defaults.global.elements.line = {\n\t\ttension: 0.4,\n\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\tborderWidth: 3,\n\t\tborderColor: globalDefaults.defaultColor,\n\t\tborderCapStyle: 'butt',\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0,\n\t\tborderJoinStyle: 'miter',\n\t\tcapBezierPoints: true,\n\t\tfill: true, // do we fill in the area between the line and its base axis\n\t};\n\n\tChart.elements.Line = Chart.Element.extend({\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar vm = me._view;\n\t\t\tvar spanGaps = vm.spanGaps;\n\t\t\tvar fillPoint = vm.scaleZero;\n\t\t\tvar loop = me._loop;\n\n\t\t\t// Handle different fill modes for cartesian lines\n\t\t\tif (!loop) {\n\t\t\t\tif (vm.fill === 'top') {\n\t\t\t\t\tfillPoint = vm.scaleTop;\n\t\t\t\t} else if (vm.fill === 'bottom') {\n\t\t\t\t\tfillPoint = vm.scaleBottom;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar ctx = me._chart.ctx;\n\t\t\tctx.save();\n\n\t\t\t// Helper function to draw a line to a point\n\t\t\tfunction lineToPoint(previousPoint, point) {\n\t\t\t\tvar pointVM = point._view;\n\t\t\t\tif (point._view.steppedLine === true) {\n\t\t\t\t\tctx.lineTo(pointVM.x, previousPoint._view.y);\n\t\t\t\t\tctx.lineTo(pointVM.x, pointVM.y);\n\t\t\t\t} else if (point._view.tension === 0) {\n\t\t\t\t\tctx.lineTo(pointVM.x, pointVM.y);\n\t\t\t\t} else {\n\t\t\t\t\tctx.bezierCurveTo(\n\t\t\t\t\t\tpreviousPoint._view.controlPointNextX,\n\t\t\t\t\t\tpreviousPoint._view.controlPointNextY,\n\t\t\t\t\t\tpointVM.controlPointPreviousX,\n\t\t\t\t\t\tpointVM.controlPointPreviousY,\n\t\t\t\t\t\tpointVM.x,\n\t\t\t\t\t\tpointVM.y\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar points = me._children.slice(); // clone array\n\t\t\tvar lastDrawnIndex = -1;\n\n\t\t\t// If we are looping, adding the first point again\n\t\t\tif (loop && points.length) {\n\t\t\t\tpoints.push(points[0]);\n\t\t\t}\n\n\t\t\tvar index, current, previous, currentVM;\n\n\t\t\t// Fill Line\n\t\t\tif (points.length && vm.fill) {\n\t\t\t\tctx.beginPath();\n\n\t\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\t\tcurrent = points[index];\n\t\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tif (loop) {\n\t\t\t\t\t\t\tctx.moveTo(fillPoint.x, fillPoint.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.moveTo(currentVM.x, fillPoint);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t\tctx.lineTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\t\tif (currentVM.skip) {\n\t\t\t\t\t\t\t// Only do this if this is the first point that is skipped\n\t\t\t\t\t\t\tif (!spanGaps && lastDrawnIndex === (index - 1)) {\n\t\t\t\t\t\t\t\tif (loop) {\n\t\t\t\t\t\t\t\t\tctx.lineTo(fillPoint.x, fillPoint.y);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.lineTo(previous._view.x, fillPoint);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (lastDrawnIndex !== (index - 1)) {\n\t\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap. If we've never drawn a point, this is a special case.\n\t\t\t\t\t\t\t\t// If the first data point is NaN, then there is no real gap to skip\n\t\t\t\t\t\t\t\tif (spanGaps && lastDrawnIndex !== -1) {\n\t\t\t\t\t\t\t\t\t// We are spanning the gap, so simple draw a line to this point\n\t\t\t\t\t\t\t\t\tlineToPoint(previous, current);\n\t\t\t\t\t\t\t\t} else if (loop) {\n\t\t\t\t\t\t\t\t\tctx.lineTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.lineTo(currentVM.x, fillPoint);\n\t\t\t\t\t\t\t\t\tctx.lineTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\t\tlineToPoint(previous, current);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!loop && lastDrawnIndex !== -1) {\n\t\t\t\t\tctx.lineTo(points[lastDrawnIndex]._view.x, fillPoint);\n\t\t\t\t}\n\n\t\t\t\tctx.fillStyle = vm.backgroundColor || globalDefaults.defaultColor;\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.fill();\n\t\t\t}\n\n\t\t\t// Stroke Line Options\n\t\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t\t// IE 9 and 10 do not support line dash\n\t\t\tif (ctx.setLineDash) {\n\t\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t\t}\n\n\t\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t\t// Stroke Line\n\t\t\tctx.beginPath();\n\t\t\tlastDrawnIndex = -1;\n\n\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\tcurrent = points[index];\n\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\tlineToPoint(previous, current);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.stroke();\n\t\t\tctx.restore();\n\t\t}\n\t});\n};\n\n},{}],39:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tglobalOpts = Chart.defaults.global,\n\t\tdefaultColor = globalOpts.defaultColor;\n\n\tglobalOpts.elements.point = {\n\t\tradius: 3,\n\t\tpointStyle: 'circle',\n\t\tbackgroundColor: defaultColor,\n\t\tborderWidth: 1,\n\t\tborderColor: defaultColor,\n\t\t// Hover\n\t\thitRadius: 1,\n\t\thoverRadius: 4,\n\t\thoverBorderWidth: 1\n\t};\n\n\tfunction xRange(mouseX) {\n\t\tvar vm = this._view;\n\t\treturn vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n\t}\n\n\tfunction yRange(mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n\t}\n\n\tChart.elements.Point = Chart.Element.extend({\n\t\tinRange: function(mouseX, mouseY) {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t\t},\n\n\t\tinLabelRange: xRange,\n\t\tinXRange: xRange,\n\t\tinYRange: yRange,\n\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\t\t},\n\t\tgetArea: function() {\n\t\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y,\n\t\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t\t};\n\t\t},\n\t\tdraw: function(chartArea) {\n\t\t\tvar vm = this._view;\n\t\t\tvar model = this._model;\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar pointStyle = vm.pointStyle;\n\t\t\tvar radius = vm.radius;\n\t\t\tvar x = vm.x;\n\t\t\tvar y = vm.y;\n\t\t\tvar color = Chart.helpers.color;\n\t\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\t\t\tvar ratio = 0;\n\n\t\t\tif (vm.skip) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\tctx.lineWidth = helpers.getValueOrDefault(vm.borderWidth, globalOpts.elements.point.borderWidth);\n\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\n\t\t\t// Cliping for Points.\n\t\t\t// going out from inner charArea?\n\t\t\tif ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right*errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom*errMargin < model.y))) {\n\t\t\t\t// Point fade out\n\t\t\t\tif (model.x < chartArea.left) {\n\t\t\t\t\tratio = (x - model.x) / (chartArea.left - model.x);\n\t\t\t\t} else if (chartArea.right*errMargin < model.x) {\n\t\t\t\t\tratio = (model.x - x) / (model.x - chartArea.right);\n\t\t\t\t} else if (model.y < chartArea.top) {\n\t\t\t\t\tratio = (y - model.y) / (chartArea.top - model.y);\n\t\t\t\t} else if (chartArea.bottom*errMargin < model.y) {\n\t\t\t\t\tratio = (model.y - y) / (model.y - chartArea.bottom);\n\t\t\t\t}\n\t\t\t\tratio = Math.round(ratio*100) / 100;\n\t\t\t\tctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n\t\t\t\tctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n\t\t\t}\n\n\t\t\tChart.canvasHelpers.drawPoint(ctx, pointStyle, radius, x, y);\n\t\t}\n\t});\n};\n\n},{}],40:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar globalOpts = Chart.defaults.global;\n\n\tglobalOpts.elements.rectangle = {\n\t\tbackgroundColor: globalOpts.defaultColor,\n\t\tborderWidth: 0,\n\t\tborderColor: globalOpts.defaultColor,\n\t\tborderSkipped: 'bottom'\n\t};\n\n\tfunction isVertical(bar) {\n\t\treturn bar._view.width !== undefined;\n\t}\n\n\t/**\n\t * Helper function to get the bounds of the bar regardless of the orientation\n\t * @private\n\t * @param bar {Chart.Element.Rectangle} the bar\n\t * @return {Bounds} bounds of the bar\n\t */\n\tfunction getBarBounds(bar) {\n\t\tvar vm = bar._view;\n\t\tvar x1, x2, y1, y2;\n\n\t\tif (isVertical(bar)) {\n\t\t\t// vertical\n\t\t\tvar halfWidth = vm.width / 2;\n\t\t\tx1 = vm.x - halfWidth;\n\t\t\tx2 = vm.x + halfWidth;\n\t\t\ty1 = Math.min(vm.y, vm.base);\n\t\t\ty2 = Math.max(vm.y, vm.base);\n\t\t} else {\n\t\t\t// horizontal bar\n\t\t\tvar halfHeight = vm.height / 2;\n\t\t\tx1 = Math.min(vm.x, vm.base);\n\t\t\tx2 = Math.max(vm.x, vm.base);\n\t\t\ty1 = vm.y - halfHeight;\n\t\t\ty2 = vm.y + halfHeight;\n\t\t}\n\n\t\treturn {\n\t\t\tleft: x1,\n\t\t\ttop: y1,\n\t\t\tright: x2,\n\t\t\tbottom: y2\n\t\t};\n\t}\n\n\tChart.elements.Rectangle = Chart.Element.extend({\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\t\tvar borderWidth = vm.borderWidth;\n\n\t\t\tif (!vm.horizontal) {\n\t\t\t\t// bar\n\t\t\t\tleft = vm.x - vm.width / 2;\n\t\t\t\tright = vm.x + vm.width / 2;\n\t\t\t\ttop = vm.y;\n\t\t\t\tbottom = vm.base;\n\t\t\t\tsignX = 1;\n\t\t\t\tsignY = bottom > top? 1: -1;\n\t\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t\t} else {\n\t\t\t\t// horizontal bar\n\t\t\t\tleft = vm.base;\n\t\t\t\tright = vm.x;\n\t\t\t\ttop = vm.y - vm.height / 2;\n\t\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\t\tsignX = right > left? 1: -1;\n\t\t\t\tsignY = 1;\n\t\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t\t}\n\n\t\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\t\tif (borderWidth) {\n\t\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\t\tborderWidth = borderWidth > barSize? barSize: borderWidth;\n\t\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\t\tvar borderLeft = left + (borderSkipped !== 'left'? halfStroke * signX: 0);\n\t\t\t\tvar borderRight = right + (borderSkipped !== 'right'? -halfStroke * signX: 0);\n\t\t\t\tvar borderTop = top + (borderSkipped !== 'top'? halfStroke * signY: 0);\n\t\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom'? -halfStroke * signY: 0);\n\t\t\t\t// not become a vertical line?\n\t\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\t\ttop = borderTop;\n\t\t\t\t\tbottom = borderBottom;\n\t\t\t\t}\n\t\t\t\t// not become a horizontal line?\n\t\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\t\tleft = borderLeft;\n\t\t\t\t\tright = borderRight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tctx.fillStyle = vm.backgroundColor;\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.lineWidth = borderWidth;\n\n\t\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t\t// | 1 2 |\n\t\t\t// | 0 3 |\n\t\t\tvar corners = [\n\t\t\t\t[left, bottom],\n\t\t\t\t[left, top],\n\t\t\t\t[right, top],\n\t\t\t\t[right, bottom]\n\t\t\t];\n\n\t\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\t\tif (startCorner === -1) {\n\t\t\t\tstartCorner = 0;\n\t\t\t}\n\n\t\t\tfunction cornerAt(index) {\n\t\t\t\treturn corners[(startCorner + index) % 4];\n\t\t\t}\n\n\t\t\t// Draw rectangle from 'startCorner'\n\t\t\tvar corner = cornerAt(0);\n\t\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\t\tfor (var i = 1; i < 4; i++) {\n\t\t\t\tcorner = cornerAt(i);\n\t\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t\t}\n\n\t\t\tctx.fill();\n\t\t\tif (borderWidth) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\theight: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm.base - vm.y;\n\t\t},\n\t\tinRange: function(mouseX, mouseY) {\n\t\t\tvar inRange = false;\n\n\t\t\tif (this._view) {\n\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t}\n\n\t\t\treturn inRange;\n\t\t},\n\t\tinLabelRange: function(mouseX, mouseY) {\n\t\t\tvar me = this;\n\t\t\tif (!me._view) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar inRange = false;\n\t\t\tvar bounds = getBarBounds(me);\n\n\t\t\tif (isVertical(me)) {\n\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t} else {\n\t\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t}\n\n\t\t\treturn inRange;\n\t\t},\n\t\tinXRange: function(mouseX) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t},\n\t\tinYRange: function(mouseY) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t},\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\tvar x, y;\n\t\t\tif (isVertical(this)) {\n\t\t\t\tx = vm.x;\n\t\t\t\ty = (vm.y + vm.base) / 2;\n\t\t\t} else {\n\t\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\t\ty = vm.y;\n\t\t\t}\n\n\t\t\treturn {x: x, y: y};\n\t\t},\n\t\tgetArea: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\t\t}\n\t});\n\n};\n\n},{}],41:[function(require,module,exports){\n'use strict';\n\n// Chart.Platform implementation for targeting a web browser\nmodule.exports = function(Chart) {\n\tvar helpers = Chart.helpers;\n\n\t// DOM event types -> Chart.js event types.\n\t// Note: only events with different types are mapped.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events\n\tvar eventTypeMap = {\n\t\t// Touch events\n\t\ttouchstart: 'mousedown',\n\t\ttouchmove: 'mousemove',\n\t\ttouchend: 'mouseup',\n\n\t\t// Pointer events\n\t\tpointerenter: 'mouseenter',\n\t\tpointerdown: 'mousedown',\n\t\tpointermove: 'mousemove',\n\t\tpointerup: 'mouseup',\n\t\tpointerleave: 'mouseout',\n\t\tpointerout: 'mouseout'\n\t};\n\n\t/**\n\t * The \"used\" size is the final value of a dimension property after all calculations have\n\t * been performed. This method uses the computed style of `element` but returns undefined\n\t * if the computed style is not expressed in pixels. That can happen in some cases where\n\t * `element` has a size relative to its parent and this last one is not yet displayed,\n\t * for example because of `display: none` on a parent node.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n\t * @returns {Number} Size in pixels or undefined if unknown.\n\t */\n\tfunction readUsedSize(element, property) {\n\t\tvar value = helpers.getStyle(element, property);\n\t\tvar matches = value && value.match(/(\\d+)px/);\n\t\treturn matches? Number(matches[1]) : undefined;\n\t}\n\n\t/**\n\t * Initializes the canvas style and render size without modifying the canvas display size,\n\t * since responsiveness is handled by the controller.resize() method. The config is used\n\t * to determine the aspect ratio to apply in case no explicit height has been specified.\n\t */\n\tfunction initCanvas(canvas, config) {\n\t\tvar style = canvas.style;\n\n\t\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\t\tvar renderHeight = canvas.getAttribute('height');\n\t\tvar renderWidth = canvas.getAttribute('width');\n\n\t\t// Chart.js modifies some canvas values that we want to restore on destroy\n\t\tcanvas._chartjs = {\n\t\t\tinitial: {\n\t\t\t\theight: renderHeight,\n\t\t\t\twidth: renderWidth,\n\t\t\t\tstyle: {\n\t\t\t\t\tdisplay: style.display,\n\t\t\t\t\theight: style.height,\n\t\t\t\t\twidth: style.width\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Force canvas to display as block to avoid extra space caused by inline\n\t\t// elements, which would interfere with the responsive resize process.\n\t\t// https://github.com/chartjs/Chart.js/issues/2538\n\t\tstyle.display = style.display || 'block';\n\n\t\tif (renderWidth === null || renderWidth === '') {\n\t\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.width = displayWidth;\n\t\t\t}\n\t\t}\n\n\t\tif (renderHeight === null || renderHeight === '') {\n\t\t\tif (canvas.style.height === '') {\n\t\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t\t} else {\n\t\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\tcanvas.height = displayHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn canvas;\n\t}\n\n\tfunction createEvent(type, chart, x, y, native) {\n\t\treturn {\n\t\t\ttype: type,\n\t\t\tchart: chart,\n\t\t\tnative: native || null,\n\t\t\tx: x !== undefined? x : null,\n\t\t\ty: y !== undefined? y : null,\n\t\t};\n\t}\n\n\tfunction fromNativeEvent(event, chart) {\n\t\tvar type = eventTypeMap[event.type] || event.type;\n\t\tvar pos = helpers.getRelativePosition(event, chart);\n\t\treturn createEvent(type, chart, pos.x, pos.y, event);\n\t}\n\n\tfunction createResizer(handler) {\n\t\tvar iframe = document.createElement('iframe');\n\t\tiframe.className = 'chartjs-hidden-iframe';\n\t\tiframe.style.cssText =\n\t\t\t'display:block;'+\n\t\t\t'overflow:hidden;'+\n\t\t\t'border:0;'+\n\t\t\t'margin:0;'+\n\t\t\t'top:0;'+\n\t\t\t'left:0;'+\n\t\t\t'bottom:0;'+\n\t\t\t'right:0;'+\n\t\t\t'height:100%;'+\n\t\t\t'width:100%;'+\n\t\t\t'position:absolute;'+\n\t\t\t'pointer-events:none;'+\n\t\t\t'z-index:-1;';\n\n\t\t// Prevent the iframe to gain focus on tab.\n\t\t// https://github.com/chartjs/Chart.js/issues/3090\n\t\tiframe.tabIndex = -1;\n\n\t\t// If the iframe is re-attached to the DOM, the resize listener is removed because the\n\t\t// content is reloaded, so make sure to install the handler after the iframe is loaded.\n\t\t// https://github.com/chartjs/Chart.js/issues/3521\n\t\thelpers.addEvent(iframe, 'load', function() {\n\t\t\thelpers.addEvent(iframe.contentWindow || iframe, 'resize', handler);\n\n\t\t\t// The iframe size might have changed while loading, which can also\n\t\t\t// happen if the size has been changed while detached from the DOM.\n\t\t\thandler();\n\t\t});\n\n\t\treturn iframe;\n\t}\n\n\tfunction addResizeListener(node, listener, chart) {\n\t\tvar stub = node._chartjs = {\n\t\t\tticking: false\n\t\t};\n\n\t\t// Throttle the callback notification until the next animation frame.\n\t\tvar notify = function() {\n\t\t\tif (!stub.ticking) {\n\t\t\t\tstub.ticking = true;\n\t\t\t\thelpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tif (stub.resizer) {\n\t\t\t\t\t\tstub.ticking = false;\n\t\t\t\t\t\treturn listener(createEvent('resize', chart));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Let's keep track of this added iframe and thus avoid DOM query when removing it.\n\t\tstub.resizer = createResizer(notify);\n\n\t\tnode.insertBefore(stub.resizer, node.firstChild);\n\t}\n\n\tfunction removeResizeListener(node) {\n\t\tif (!node || !node._chartjs) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar resizer = node._chartjs.resizer;\n\t\tif (resizer) {\n\t\t\tresizer.parentNode.removeChild(resizer);\n\t\t\tnode._chartjs.resizer = null;\n\t\t}\n\n\t\tdelete node._chartjs;\n\t}\n\n\treturn {\n\t\tacquireContext: function(item, config) {\n\t\t\tif (typeof item === 'string') {\n\t\t\t\titem = document.getElementById(item);\n\t\t\t} else if (item.length) {\n\t\t\t\t// Support for array based queries (such as jQuery)\n\t\t\t\titem = item[0];\n\t\t\t}\n\n\t\t\tif (item && item.canvas) {\n\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\titem = item.canvas;\n\t\t\t}\n\n\t\t\tif (item instanceof HTMLCanvasElement) {\n\t\t\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tvar context = item.getContext && item.getContext('2d');\n\t\t\t\tif (context instanceof CanvasRenderingContext2D) {\n\t\t\t\t\tinitCanvas(item, config);\n\t\t\t\t\treturn context;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\n\t\treleaseContext: function(context) {\n\t\t\tvar canvas = context.canvas;\n\t\t\tif (!canvas._chartjs) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar initial = canvas._chartjs.initial;\n\t\t\t['height', 'width'].forEach(function(prop) {\n\t\t\t\tvar value = initial[prop];\n\t\t\t\tif (value === undefined || value === null) {\n\t\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t\t} else {\n\t\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(initial.style || {}, function(value, key) {\n\t\t\t\tcanvas.style[key] = value;\n\t\t\t});\n\n\t\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\t\tcanvas.width = canvas.width;\n\n\t\t\tdelete canvas._chartjs;\n\t\t},\n\n\t\taddEventListener: function(chart, type, listener) {\n\t\t\tvar canvas = chart.chart.canvas;\n\t\t\tif (type === 'resize') {\n\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\taddResizeListener(canvas.parentNode, listener, chart.chart);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar stub = listener._chartjs || (listener._chartjs = {});\n\t\t\tvar proxies = stub.proxies || (stub.proxies = {});\n\t\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\t\tlistener(fromNativeEvent(event, chart.chart));\n\t\t\t};\n\n\t\t\thelpers.addEvent(canvas, type, proxy);\n\t\t},\n\n\t\tremoveEventListener: function(chart, type, listener) {\n\t\t\tvar canvas = chart.chart.canvas;\n\t\t\tif (type === 'resize') {\n\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\tremoveResizeListener(canvas.parentNode, listener);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar stub = listener._chartjs || {};\n\t\t\tvar proxies = stub.proxies || {};\n\t\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\t\tif (!proxy) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thelpers.removeEvent(canvas, type, proxy);\n\t\t}\n\t};\n};\n\n},{}],42:[function(require,module,exports){\n'use strict';\n\n// By default, select the browser (DOM) platform.\n// @TODO Make possible to select another platform at build time.\nvar implementation = require(41);\n\nmodule.exports = function(Chart) {\n\t/**\n\t * @namespace Chart.platform\n\t * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n\t * @since 2.4.0\n\t */\n\tChart.platform = {\n\t\t/**\n\t\t * Called at chart construction time, returns a context2d instance implementing\n\t\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t\t * @param {Object} options - The chart options\n\t\t * @returns {CanvasRenderingContext2D} context2d instance\n\t\t */\n\t\tacquireContext: function() {},\n\n\t\t/**\n\t\t * Called at chart destruction time, releases any resources associated to the context\n\t\t * previously returned by the acquireContext() method.\n\t\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t\t * @returns {Boolean} true if the method succeeded, else false\n\t\t */\n\t\treleaseContext: function() {},\n\n\t\t/**\n\t\t * Registers the specified listener on the given chart.\n\t\t * @param {Chart} chart - Chart from which to listen for event\n\t\t * @param {String} type - The ({@link IEvent}) type to listen for\n\t\t * @param {Function} listener - Receives a notification (an object that implements\n\t\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t\t */\n\t\taddEventListener: function() {},\n\n\t\t/**\n\t\t * Removes the specified listener previously registered with addEventListener.\n\t\t * @param {Chart} chart -Chart from which to remove the listener\n\t\t * @param {String} type - The ({@link IEvent}) type to remove\n\t\t * @param {Function} listener - The listener function to remove from the event target.\n\t\t */\n\t\tremoveEventListener: function() {}\n\t};\n\n\t/**\n\t * @interface IPlatform\n\t * Allows abstracting platform dependencies away from the chart\n\t * @borrows Chart.platform.acquireContext as acquireContext\n\t * @borrows Chart.platform.releaseContext as releaseContext\n\t * @borrows Chart.platform.addEventListener as addEventListener\n\t * @borrows Chart.platform.removeEventListener as removeEventListener\n\t */\n\n\t/**\n\t * @interface IEvent\n\t * @prop {String} type - The event type name, possible values are:\n\t * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n\t * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n\t * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n\t * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n\t * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n\t */\n\n\tChart.helpers.extend(Chart.platform, implementation(Chart));\n};\n\n},{\"41\":41}],43:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\t// Default config for a category scale\n\tvar defaultConfig = {\n\t\tposition: 'bottom'\n\t};\n\n\tvar DatasetScale = Chart.Scale.extend({\n\t\t/**\n\t\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t\t* else fall back to data.labels\n\t\t* @private\n\t\t*/\n\t\tgetLabels: function() {\n\t\t\tvar data = this.chart.data;\n\t\t\treturn (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t},\n\t\t// Implement this so that\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\tme.minIndex = 0;\n\t\t\tme.maxIndex = labels.length - 1;\n\t\t\tvar findIndex;\n\n\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t// user specified min value\n\t\t\t\tfindIndex = helpers.indexOf(labels, me.options.ticks.min);\n\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t}\n\n\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t// user specified max value\n\t\t\t\tfindIndex = helpers.indexOf(labels, me.options.ticks.max);\n\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t}\n\n\t\t\tme.min = labels[me.minIndex];\n\t\t\tme.max = labels[me.maxIndex];\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t}\n\t\t\treturn me.ticks[index - me.minIndex];\n\t\t},\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: function(value, index, datasetIndex, includeOffset) {\n\t\t\tvar me = this;\n\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\n\t\t\tif (value !== undefined && isNaN(index)) {\n\t\t\t\tvar labels = me.getLabels();\n\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t}\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\t\tif (me.options.gridLines.offsetGridLines && includeOffset || me.maxIndex === me.minIndex && includeOffset) {\n\t\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t\t}\n\n\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t}\n\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\t\tif (me.options.gridLines.offsetGridLines && includeOffset) {\n\t\t\t\theightOffset += (valueHeight / 2);\n\t\t\t}\n\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForTick: function(index, includeOffset) {\n\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null, includeOffset);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar value;\n\t\t\tvar offsetAmt = Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\t\t\tvar horz = me.isHorizontal();\n\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\tif (me.options.gridLines.offsetGridLines) {\n\t\t\t\tpixel -= (valueDimension / 2);\n\t\t\t}\n\n\t\t\tif (pixel <= 0) {\n\t\t\t\tvalue = 0;\n\t\t\t} else {\n\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\t\tgetBasePixel: function() {\n\t\t\treturn this.bottom;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n};\n\n},{}],44:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\t\tticks: {\n\t\t\tcallback: Chart.Ticks.formatters.linear\n\t\t}\n\t};\n\n\tvar LinearScale = Chart.LinearScaleBase.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// First Calculate the range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store these per type\n\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar maxTicks;\n\t\t\tvar me = this;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t} else {\n\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t}\n\n\t\t\treturn maxTicks;\n\t\t},\n\t\t// Called after the ticks are built. We need\n\t\thandleDirectionalChanges: function() {\n\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tthis.ticks.reverse();\n\t\t\t}\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\t// Utils\n\t\tgetPixelForValue: function(value) {\n\t\t\t// This must be called after fit has been run so that\n\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\n\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\tvar pixel;\n\t\t\tvar range = me.end - start;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t\t\treturn Math.round(pixel);\n\t\t\t}\n\n\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t\treturn Math.round(pixel);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\treturn me.start + ((me.end - me.start) * offset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n};\n\n},{}],45:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tnoop = helpers.noop;\n\n\tChart.LinearScaleBase = Chart.Scale.extend({\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t// axis, they can manually override it\n\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t// move the top up to 0\n\t\t\t\t\tme.max = 0;\n\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\tme.min = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\tme.min = tickOpts.min;\n\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t}\n\n\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\tme.max = tickOpts.max;\n\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t}\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tme.max++;\n\n\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\tme.min--;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTickLimit: noop,\n\t\thandleDirectionalChanges: noop,\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\tvar numericGeneratorOptions = {\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max,\n\t\t\t\tstepSize: helpers.getValueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Chart.Ticks.generators.linear(numericGeneratorOptions, me);\n\n\t\t\tme.handleDirectionalChanges();\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(me);\n\t\t}\n\t});\n};\n\n},{}],46:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tcallback: Chart.Ticks.formatters.logarithmic\n\t\t}\n\t};\n\n\tvar LogarithmicScale = Chart.Scale.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// Calculate Range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\t\t\tme.minNotZero = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tvalues[index] = 100;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Don't need to split positive and negative since the log scale can't handle a 0 crossing\n\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = getValueOrDefault(tickOpts.min, me.min);\n\t\t\tme.max = getValueOrDefault(tickOpts.max, me.max);\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tme.min = 1;\n\t\t\t\t\tme.max = 10;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tvar generationOptions = {\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Chart.Ticks.generators.logarithmic(generationOptions, me);\n\n\t\t\tif (!me.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tticks.reverse();\n\t\t\t}\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(this);\n\t\t},\n\t\t// Get the correct tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t},\n\t\tgetPixelForValue: function(value) {\n\t\t\tvar me = this;\n\t\t\tvar innerDimension;\n\t\t\tvar pixel;\n\n\t\t\tvar start = me.start;\n\t\t\tvar newVal = +me.getRightValue(value);\n\t\t\tvar range;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n\t\t\t\tif (newVal === 0) {\n\t\t\t\t\tpixel = me.left;\n\t\t\t\t} else {\n\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\tpixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Bottom - top since pixels increase downward on a screen\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tif (start === 0 && !tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === start) {\n\t\t\t\t\t\tpixel = me.bottom;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (me.end === 0 && tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === me.end) {\n\t\t\t\t\t\tpixel = me.top;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start);\n\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\tpixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar range = helpers.log10(me.end) - helpers.log10(me.start);\n\t\t\tvar value, innerDimension;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tvalue = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n\t\t\t} else {  // todo: if start === 0\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tvalue = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n};\n\n},{}],47:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar globalDefaults = Chart.defaults.global;\n\n\tvar defaultConfig = {\n\t\tdisplay: true,\n\n\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\tanimate: true,\n\t\tlineArc: false,\n\t\tposition: 'chartArea',\n\n\t\tangleLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\tshowLabelBackdrop: true,\n\n\t\t\t// String - The colour of the label backdrop\n\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\tbackdropPaddingY: 2,\n\n\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\tbackdropPaddingX: 2,\n\n\t\t\tcallback: Chart.Ticks.formatters.linear\n\t\t},\n\n\t\tpointLabels: {\n\t\t\t// Number - Point label font size in pixels\n\t\t\tfontSize: 10,\n\n\t\t\t// Function - Used to convert point labels\n\t\t\tcallback: function(label) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction getValueCount(scale) {\n\t\treturn !scale.options.lineArc ? scale.chart.data.labels.length : 0;\n\t}\n\n\tfunction getPointLabelFontOptions(scale) {\n\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\tvar fontSize = helpers.getValueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\tvar fontStyle = helpers.getValueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar fontFamily = helpers.getValueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\treturn {\n\t\t\tsize: fontSize,\n\t\t\tstyle: fontStyle,\n\t\t\tfamily: fontFamily,\n\t\t\tfont: font\n\t\t};\n\t}\n\n\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\tif (helpers.isArray(label)) {\n\t\t\treturn {\n\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\th: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tw: ctx.measureText(label).width,\n\t\t\th: fontSize\n\t\t};\n\t}\n\n\tfunction determineLimits(angle, pos, size, min, max) {\n\t\tif (angle === min || angle === max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - (size / 2),\n\t\t\t\tend: pos + (size / 2)\n\t\t\t};\n\t\t} else if (angle < min || angle > max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - size - 5,\n\t\t\t\tend: pos\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstart: pos,\n\t\t\tend: pos + size + 5\n\t\t};\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with point labels\n\t */\n\tfunction fitWithPointLabels(scale) {\n\t\t/*\n\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t *\n\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t *\n\t\t * Solution:\n\t\t *\n\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t * at each index we check if the text overlaps.\n\t\t *\n\t\t * Where it does, we store that angle and that index.\n\t\t *\n\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t * from the shape radius to move the point inwards by that x.\n\t\t *\n\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t * along with labels.\n\t\t *\n\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t *\n\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t * and position it in the most space efficient manner\n\t\t *\n\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t */\n\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tvar furthestLimits = {\n\t\t\tl: scale.width,\n\t\t\tr: 0,\n\t\t\tt: scale.height,\n\t\t\tb: 0\n\t\t};\n\t\tvar furthestAngles = {};\n\t\tvar i;\n\t\tvar textSize;\n\t\tvar pointPosition;\n\n\t\tscale.ctx.font = plFont.font;\n\t\tscale._pointLabelSizes = [];\n\n\t\tvar valueCount = getValueCount(scale);\n\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t}\n\n\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t}\n\t\t}\n\n\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with no point labels\n\t */\n\tfunction fit(scale) {\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t}\n\n\tfunction getTextAlignForAngle(angle) {\n\t\tif (angle === 0 || angle === 180) {\n\t\t\treturn 'center';\n\t\t} else if (angle < 180) {\n\t\t\treturn 'left';\n\t\t}\n\n\t\treturn 'right';\n\t}\n\n\tfunction fillText(ctx, text, position, fontSize) {\n\t\tif (helpers.isArray(text)) {\n\t\t\tvar y = position.y;\n\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\ty+= spacing;\n\t\t\t}\n\t\t} else {\n\t\t\tctx.fillText(text, position.x, position.y);\n\t\t}\n\t}\n\n\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\tif (angle === 90 || angle === 270) {\n\t\t\tposition.y -= (textSize.h / 2);\n\t\t} else if (angle > 270 || angle < 90) {\n\t\t\tposition.y -= textSize.h;\n\t\t}\n\t}\n\n\tfunction drawPointLabels(scale) {\n\t\tvar ctx = scale.ctx;\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\tvar opts = scale.options;\n\t\tvar angleLineOpts = opts.angleLines;\n\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.reverse ? scale.min : scale.max);\n\n\t\t// Point Label Font\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\tctx.textBaseline = 'top';\n\n\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\tif (angleLineOpts.display) {\n\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t\t// Extra 3px out for some label spacing\n\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t// Keep this in loop since we may support array properties here\n\t\t\tvar pointLabelFontColor = getValueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\tctx.font = plFont.font;\n\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t}\n\t}\n\n\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\tvar ctx = scale.ctx;\n\t\tctx.strokeStyle = helpers.getValueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\tctx.lineWidth = helpers.getValueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\tif (scale.options.lineArc) {\n\t\t\t// Draw circular arcs between the points\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t} else {\n\t\t\t// Draw straight lines connecting each index\n\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\tif (valueCount === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t}\n\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tfunction numberOrZero(param) {\n\t\treturn helpers.isNumber(param) ? param : 0;\n\t}\n\n\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.height = me.maxHeight;\n\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tme.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\thelpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tme.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t// Point labels\n\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tfit: function() {\n\t\t\tif (this.options.lineArc) {\n\t\t\t\tfit(this);\n\t\t\t} else {\n\t\t\t\tfitWithPointLabels(this);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set radius reductions and determine new radius and center point\n\t\t * @private\n\t\t */\n\t\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\tvar me = this;\n\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\tme.drawingArea = Math.min(\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\tvar me = this;\n\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea,\n\t\t\t\tmaxLeft = leftMovement + me.drawingArea,\n\t\t\t\tmaxTop = topMovement + me.drawingArea,\n\t\t\t\tmaxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\tme.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n\t\t\tme.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n\t\t},\n\n\t\tgetIndexAngle: function(index) {\n\t\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\t\tthis.chart.options.startAngle :\n\t\t\t\t0;\n\n\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t},\n\t\tgetDistanceFromCenterForValue: function(value) {\n\t\t\tvar me = this;\n\n\t\t\tif (value === null) {\n\t\t\t\treturn 0; // null always in center\n\t\t\t}\n\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\tif (me.options.reverse) {\n\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t}\n\t\t\treturn (value - me.min) * scalingFactor;\n\t\t},\n\t\tgetPointPosition: function(index, distanceFromCenter) {\n\t\t\tvar me = this;\n\t\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\t\treturn {\n\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t};\n\t\t},\n\t\tgetPointPositionForValue: function(index, value) {\n\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t},\n\n\t\tgetBasePosition: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.getPointPositionForValue(0,\n\t\t\t\tme.beginAtZero? 0:\n\t\t\t\tmin < 0 && max < 0? max :\n\t\t\t\tmin > 0 && max > 0? min :\n\t\t\t\t0);\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\n\t\t\t\t// Tick Font\n\t\t\t\tvar tickFontSize = getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar tickFontStyle = getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar tickFontFamily = getValueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\tif (index > 0 || opts.reverse) {\n\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\t\t\t\t\t\tvar yHeight = me.yCenter - yCenterOffset;\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\tvar tickFontColor = getValueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t\tme.xCenter - labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t\tyHeight - tickFontSize / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\t\ttickFontSize + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\tctx.fillText(label, me.xCenter, yHeight);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (!opts.lineArc) {\n\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n};\n\n},{}],48:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nvar moment = require(6);\nmoment = typeof(moment) === 'function' ? moment : window.moment;\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar time = {\n\t\tunits: [{\n\t\t\tname: 'millisecond',\n\t\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t\t}, {\n\t\t\tname: 'second',\n\t\t\tsteps: [1, 2, 5, 10, 30]\n\t\t}, {\n\t\t\tname: 'minute',\n\t\t\tsteps: [1, 2, 5, 10, 30]\n\t\t}, {\n\t\t\tname: 'hour',\n\t\t\tsteps: [1, 2, 3, 6, 12]\n\t\t}, {\n\t\t\tname: 'day',\n\t\t\tsteps: [1, 2, 5]\n\t\t}, {\n\t\t\tname: 'week',\n\t\t\tmaxStep: 4\n\t\t}, {\n\t\t\tname: 'month',\n\t\t\tmaxStep: 3\n\t\t}, {\n\t\t\tname: 'quarter',\n\t\t\tmaxStep: 4\n\t\t}, {\n\t\t\tname: 'year',\n\t\t\tmaxStep: false\n\t\t}]\n\t};\n\n\tvar defaultConfig = {\n\t\tposition: 'bottom',\n\n\t\ttime: {\n\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\tminUnit: 'millisecond',\n\n\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\tdisplayFormats: {\n\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\tminute: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\thour: 'MMM D, hA', // Sept 4, 5PM\n\t\t\t\tday: 'll', // Sep 4 2015\n\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t}\n\t\t},\n\t\tticks: {\n\t\t\tautoSkip: false\n\t\t}\n\t};\n\n\tvar TimeScale = Chart.Scale.extend({\n\t\tinitialize: function() {\n\t\t\tif (!moment) {\n\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t}\n\n\t\t\tChart.Scale.prototype.initialize.call(this);\n\t\t},\n\t\tgetLabelMoment: function(datasetIndex, index) {\n\t\t\tif (datasetIndex === null || index === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (typeof this.labelMoments[datasetIndex] !== 'undefined') {\n\t\t\t\treturn this.labelMoments[datasetIndex][index];\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tgetLabelDiff: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tif (datasetIndex === null || index === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (me.labelDiffs === undefined) {\n\t\t\t\tme.buildLabelDiffs();\n\t\t\t}\n\n\t\t\tif (typeof me.labelDiffs[datasetIndex] !== 'undefined') {\n\t\t\t\treturn me.labelDiffs[datasetIndex][index];\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tgetMomentStartOf: function(tick) {\n\t\t\tvar me = this;\n\t\t\tif (me.options.time.unit === 'week' && me.options.time.isoWeekday !== false) {\n\t\t\t\treturn tick.clone().startOf('isoWeek').isoWeekday(me.options.time.isoWeekday);\n\t\t\t}\n\t\t\treturn tick.clone().startOf(me.tickUnit);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tme.labelMoments = [];\n\n\t\t\t// Only parse these once. If the dataset does not have data as x,y pairs, we will use\n\t\t\t// these\n\t\t\tvar scaleLabelMoments = [];\n\t\t\tif (me.chart.data.labels && me.chart.data.labels.length > 0) {\n\t\t\t\thelpers.each(me.chart.data.labels, function(label) {\n\t\t\t\t\tvar labelMoment = me.parseTime(label);\n\n\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tscaleLabelMoments.push(labelMoment);\n\t\t\t\t\t}\n\t\t\t\t}, me);\n\n\t\t\t\tme.firstTick = moment.min.call(me, scaleLabelMoments);\n\t\t\t\tme.lastTick = moment.max.call(me, scaleLabelMoments);\n\t\t\t} else {\n\t\t\t\tme.firstTick = null;\n\t\t\t\tme.lastTick = null;\n\t\t\t}\n\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar momentsForDataset = [];\n\t\t\t\tvar datasetVisible = me.chart.isDatasetVisible(datasetIndex);\n\n\t\t\t\tif (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {\n\t\t\t\t\thelpers.each(dataset.data, function(value) {\n\t\t\t\t\t\tvar labelMoment = me.parseTime(me.getRightValue(value));\n\n\t\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmomentsForDataset.push(labelMoment);\n\n\t\t\t\t\t\t\tif (datasetVisible) {\n\t\t\t\t\t\t\t\t// May have gone outside the scale ranges, make sure we keep the first and last ticks updated\n\t\t\t\t\t\t\t\tme.firstTick = me.firstTick !== null ? moment.min(me.firstTick, labelMoment) : labelMoment;\n\t\t\t\t\t\t\t\tme.lastTick = me.lastTick !== null ? moment.max(me.lastTick, labelMoment) : labelMoment;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, me);\n\t\t\t\t} else {\n\t\t\t\t\t// We have no labels. Use the ones from the scale\n\t\t\t\t\tmomentsForDataset = scaleLabelMoments;\n\t\t\t\t}\n\n\t\t\t\tme.labelMoments.push(momentsForDataset);\n\t\t\t}, me);\n\n\t\t\t// Set these after we've done all the data\n\t\t\tif (me.options.time.min) {\n\t\t\t\tme.firstTick = me.parseTime(me.options.time.min);\n\t\t\t}\n\n\t\t\tif (me.options.time.max) {\n\t\t\t\tme.lastTick = me.parseTime(me.options.time.max);\n\t\t\t}\n\n\t\t\t// We will modify these, so clone for later\n\t\t\tme.firstTick = (me.firstTick || moment()).clone();\n\t\t\tme.lastTick = (me.lastTick || moment()).clone();\n\t\t},\n\t\tbuildLabelDiffs: function() {\n\t\t\tvar me = this;\n\t\t\tme.labelDiffs = [];\n\t\t\tvar scaleLabelDiffs = [];\n\t\t\t// Parse common labels once\n\t\t\tif (me.chart.data.labels && me.chart.data.labels.length > 0) {\n\t\t\t\thelpers.each(me.chart.data.labels, function(label) {\n\t\t\t\t\tvar labelMoment = me.parseTime(label);\n\n\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tscaleLabelDiffs.push(labelMoment.diff(me.firstTick, me.tickUnit, true));\n\t\t\t\t\t}\n\t\t\t\t}, me);\n\t\t\t}\n\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset) {\n\t\t\t\tvar diffsForDataset = [];\n\n\t\t\t\tif (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {\n\t\t\t\t\thelpers.each(dataset.data, function(value) {\n\t\t\t\t\t\tvar labelMoment = me.parseTime(me.getRightValue(value));\n\n\t\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdiffsForDataset.push(labelMoment.diff(me.firstTick, me.tickUnit, true));\n\t\t\t\t\t\t}\n\t\t\t\t\t}, me);\n\t\t\t\t} else {\n\t\t\t\t\t// We have no labels. Use common ones\n\t\t\t\t\tdiffsForDataset = scaleLabelDiffs;\n\t\t\t\t}\n\n\t\t\t\tme.labelDiffs.push(diffsForDataset);\n\t\t\t}, me);\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\n\t\t\tme.ctx.save();\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\tvar tickFontStyle = helpers.getValueOrDefault(me.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);\n\t\t\tvar tickFontFamily = helpers.getValueOrDefault(me.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);\n\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\t\t\tme.ctx.font = tickLabelFont;\n\n\t\t\tme.ticks = [];\n\t\t\tme.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step\n\t\t\tme.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)\n\n\t\t\t// Set unit override if applicable\n\t\t\tif (me.options.time.unit) {\n\t\t\t\tme.tickUnit = me.options.time.unit || 'day';\n\t\t\t\tme.displayFormat = me.options.time.displayFormats[me.tickUnit];\n\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\tme.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, 1);\n\t\t\t} else {\n\t\t\t\t// Determine the smallest needed unit of the time\n\t\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\t\t// Crude approximation of what the label length might be\n\t\t\t\tvar tempFirstLabel = me.tickFormatFunction(me.firstTick, 0, []);\n\t\t\t\tvar tickLabelWidth = me.ctx.measureText(tempFirstLabel).width;\n\t\t\t\tvar cosRotation = Math.cos(helpers.toRadians(me.options.ticks.maxRotation));\n\t\t\t\tvar sinRotation = Math.sin(helpers.toRadians(me.options.ticks.maxRotation));\n\t\t\t\ttickLabelWidth = (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t\t\t\tvar labelCapacity = innerWidth / (tickLabelWidth);\n\n\t\t\t\t// Start as small as possible\n\t\t\t\tme.tickUnit = me.options.time.minUnit;\n\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\tme.displayFormat = me.options.time.displayFormats[me.tickUnit];\n\n\t\t\t\tvar unitDefinitionIndex = 0;\n\t\t\t\tvar unitDefinition = time.units[unitDefinitionIndex];\n\n\t\t\t\t// While we aren't ideal and we don't have units left\n\t\t\t\twhile (unitDefinitionIndex < time.units.length) {\n\t\t\t\t\t// Can we scale this unit. If `false` we can scale infinitely\n\t\t\t\t\tme.unitScale = 1;\n\n\t\t\t\t\tif (helpers.isArray(unitDefinition.steps) && Math.ceil(me.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {\n\t\t\t\t\t\t// Use one of the predefined steps\n\t\t\t\t\t\tfor (var idx = 0; idx < unitDefinition.steps.length; ++idx) {\n\t\t\t\t\t\t\tif (unitDefinition.steps[idx] >= Math.ceil(me.scaleSizeInUnits / labelCapacity)) {\n\t\t\t\t\t\t\t\tme.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, unitDefinition.steps[idx]);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if ((unitDefinition.maxStep === false) || (Math.ceil(me.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {\n\t\t\t\t\t\t// We have a max step. Scale this unit\n\t\t\t\t\t\tme.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, Math.ceil(me.scaleSizeInUnits / labelCapacity));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Move to the next unit up\n\t\t\t\t\t\t++unitDefinitionIndex;\n\t\t\t\t\t\tunitDefinition = time.units[unitDefinitionIndex];\n\n\t\t\t\t\t\tme.tickUnit = unitDefinition.name;\n\t\t\t\t\t\tvar leadingUnitBuffer = me.firstTick.diff(me.getMomentStartOf(me.firstTick), me.tickUnit, true);\n\t\t\t\t\t\tvar trailingUnitBuffer = me.getMomentStartOf(me.lastTick.clone().add(1, me.tickUnit)).diff(me.lastTick, me.tickUnit, true);\n\t\t\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true) + leadingUnitBuffer + trailingUnitBuffer;\n\t\t\t\t\t\tme.displayFormat = me.options.time.displayFormats[unitDefinition.name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar roundedStart;\n\n\t\t\t// Only round the first tick if we have no hard minimum\n\t\t\tif (!me.options.time.min) {\n\t\t\t\tme.firstTick = me.getMomentStartOf(me.firstTick);\n\t\t\t\troundedStart = me.firstTick;\n\t\t\t} else {\n\t\t\t\troundedStart = me.getMomentStartOf(me.firstTick);\n\t\t\t}\n\n\t\t\t// Only round the last tick if we have no hard maximum\n\t\t\tif (!me.options.time.max) {\n\t\t\t\tvar roundedEnd = me.getMomentStartOf(me.lastTick);\n\t\t\t\tvar delta = roundedEnd.diff(me.lastTick, me.tickUnit, true);\n\t\t\t\tif (delta < 0) {\n\t\t\t\t\t// Do not use end of because we need me to be in the next time unit\n\t\t\t\t\tme.lastTick = me.getMomentStartOf(me.lastTick.add(1, me.tickUnit));\n\t\t\t\t} else if (delta >= 0) {\n\t\t\t\t\tme.lastTick = roundedEnd;\n\t\t\t\t}\n\n\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t}\n\n\t\t\t// Tick displayFormat override\n\t\t\tif (me.options.time.displayFormat) {\n\t\t\t\tme.displayFormat = me.options.time.displayFormat;\n\t\t\t}\n\n\t\t\t// first tick. will have been rounded correctly if options.time.min is not specified\n\t\t\tme.ticks.push(me.firstTick.clone());\n\n\t\t\t// For every unit in between the first and last moment, create a moment and add it to the ticks tick\n\t\t\tfor (var i = me.unitScale; i <= me.scaleSizeInUnits; i += me.unitScale) {\n\t\t\t\tvar newTick = roundedStart.clone().add(i, me.tickUnit);\n\n\t\t\t\t// Are we greater than the max time\n\t\t\t\tif (me.options.time.max && newTick.diff(me.lastTick, me.tickUnit, true) >= 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tme.ticks.push(newTick);\n\t\t\t}\n\n\t\t\t// Always show the right tick\n\t\t\tvar diff = me.ticks[me.ticks.length - 1].diff(me.lastTick, me.tickUnit);\n\t\t\tif (diff !== 0 || me.scaleSizeInUnits === 0) {\n\t\t\t\t// this is a weird case. If the <max> option is the same as the end option, we can't just diff the times because the tick was created from the roundedStart\n\t\t\t\t// but the last tick was not rounded.\n\t\t\t\tif (me.options.time.max) {\n\t\t\t\t\tme.ticks.push(me.lastTick.clone());\n\t\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.ticks[0], me.tickUnit, true);\n\t\t\t\t} else {\n\t\t\t\t\tme.ticks.push(me.lastTick.clone());\n\t\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.ctx.restore();\n\n\t\t\t// Invalidate label diffs cache\n\t\t\tme.labelDiffs = undefined;\n\t\t},\n\t\t// Get tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar label = me.chart.data.labels && index < me.chart.data.labels.length ? me.chart.data.labels[index] : '';\n\t\t\tvar value = me.chart.data.datasets[datasetIndex].data[index];\n\n\t\t\tif (value !== null && typeof value === 'object') {\n\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t}\n\n\t\t\t// Format nicely\n\t\t\tif (me.options.time.tooltipFormat) {\n\t\t\t\tlabel = me.parseTime(label).format(me.options.time.tooltipFormat);\n\t\t\t}\n\n\t\t\treturn label;\n\t\t},\n\t\t// Function to format an individual tick mark\n\t\ttickFormatFunction: function(tick, index, ticks) {\n\t\t\tvar formattedTick = tick.format(this.displayFormat);\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar callback = helpers.getValueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\tif (callback) {\n\t\t\t\treturn callback(formattedTick, index, ticks);\n\t\t\t}\n\t\t\treturn formattedTick;\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.tickMoments = me.ticks;\n\t\t\tme.ticks = me.ticks.map(me.tickFormatFunction, me);\n\t\t},\n\t\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar offset = null;\n\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\toffset = me.getLabelDiff(datasetIndex, index);\n\t\t\t}\n\n\t\t\tif (offset === null) {\n\t\t\t\tif (!value || !value.isValid) {\n\t\t\t\t\t// not already a moment object\n\t\t\t\t\tvalue = me.parseTime(me.getRightValue(value));\n\t\t\t\t}\n\t\t\t\tif (value && value.isValid && value.isValid()) {\n\t\t\t\t\toffset = value.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (offset !== null) {\n\t\t\t\tvar decimal = offset !== 0 ? offset / me.scaleSizeInUnits : offset;\n\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\tvar valueOffset = (me.width * decimal);\n\t\t\t\t\treturn me.left + Math.round(valueOffset);\n\t\t\t\t}\n\n\t\t\t\tvar heightOffset = (me.height * decimal);\n\t\t\t\treturn me.top + Math.round(heightOffset);\n\t\t\t}\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickMoments[index], null, null);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar innerDimension = me.isHorizontal() ? me.width : me.height;\n\t\t\tvar offset = (pixel - (me.isHorizontal() ? me.left : me.top)) / innerDimension;\n\t\t\toffset *= me.scaleSizeInUnits;\n\t\t\treturn me.firstTick.clone().add(moment.duration(offset, me.tickUnit).asSeconds(), 'seconds');\n\t\t},\n\t\tparseTime: function(label) {\n\t\t\tvar me = this;\n\t\t\tif (typeof me.options.time.parser === 'string') {\n\t\t\t\treturn moment(label, me.options.time.parser);\n\t\t\t}\n\t\t\tif (typeof me.options.time.parser === 'function') {\n\t\t\t\treturn me.options.time.parser(label);\n\t\t\t}\n\t\t\t// Date objects\n\t\t\tif (typeof label.getMonth === 'function' || typeof label === 'number') {\n\t\t\t\treturn moment(label);\n\t\t\t}\n\t\t\t// Moment support\n\t\t\tif (label.isValid && label.isValid()) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t\t// Custom parsing (return an instance of moment)\n\t\t\tif (typeof me.options.time.format !== 'string' && me.options.time.format.call) {\n\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale');\n\t\t\t\treturn me.options.time.format(label);\n\t\t\t}\n\t\t\t// Moment format parsing\n\t\t\treturn moment(label, me.options.time.format);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n\n};\n\n},{\"6\":6}]},{},[7])(7)\n});"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-chartjs/Chart.js",
    "content": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.5.0\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n\n},{}],2:[function(require,module,exports){\n/* MIT license */\nvar colorNames = require(6);\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getHwb: getHwb,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   hwbString: hwbString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3})$/,\n       hex =  /^#([a-fA-F0-9]{6})$/,\n       rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/,\n       per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/,\n       keyword = /(\\w+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr);\n   if (match) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n   }\n   else if (match = string.match(hex)) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = colorNames[match[1]];\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb[3] = a;\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getHwb(string) {\n   if (!string) {\n      return;\n   }\n   var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hwb);\n   if (match) {\n    var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n   }\n}\n\nfunction getRgb(string) {\n   var rgba = getRgba(string);\n   return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n  var hsla = getHsla(string);\n  return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n   else if (vals = getHwb(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgb) {\n   return \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1])\n              + hexDouble(rgb[2]);\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n   if (alpha === undefined) {\n      alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n   }\n   return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n           + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n  return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorNames) {\n   reverseNames[colorNames[name]] = name;\n}\n\n},{\"6\":6}],3:[function(require,module,exports){\n/* MIT license */\nvar convert = require(5);\nvar string = require(2);\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = string.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else {\n\t\t\tthrow new Error('Unable to parse color from string \"' + obj + '\"');\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t} else {\n\t\t\tthrow new Error('Unable to parse color from object ' + JSON.stringify(obj));\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn string.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nmodule.exports = Color;\n\n},{\"2\":2,\"5\":5}],4:[function(require,module,exports){\n/* MIT license */\n\nmodule.exports = {\n  rgb2hsl: rgb2hsl,\n  rgb2hsv: rgb2hsv,\n  rgb2hwb: rgb2hwb,\n  rgb2cmyk: rgb2cmyk,\n  rgb2keyword: rgb2keyword,\n  rgb2xyz: rgb2xyz,\n  rgb2lab: rgb2lab,\n  rgb2lch: rgb2lch,\n\n  hsl2rgb: hsl2rgb,\n  hsl2hsv: hsl2hsv,\n  hsl2hwb: hsl2hwb,\n  hsl2cmyk: hsl2cmyk,\n  hsl2keyword: hsl2keyword,\n\n  hsv2rgb: hsv2rgb,\n  hsv2hsl: hsv2hsl,\n  hsv2hwb: hsv2hwb,\n  hsv2cmyk: hsv2cmyk,\n  hsv2keyword: hsv2keyword,\n\n  hwb2rgb: hwb2rgb,\n  hwb2hsl: hwb2hsl,\n  hwb2hsv: hwb2hsv,\n  hwb2cmyk: hwb2cmyk,\n  hwb2keyword: hwb2keyword,\n\n  cmyk2rgb: cmyk2rgb,\n  cmyk2hsl: cmyk2hsl,\n  cmyk2hsv: cmyk2hsv,\n  cmyk2hwb: cmyk2hwb,\n  cmyk2keyword: cmyk2keyword,\n\n  keyword2rgb: keyword2rgb,\n  keyword2hsl: keyword2hsl,\n  keyword2hsv: keyword2hsv,\n  keyword2hwb: keyword2hwb,\n  keyword2cmyk: keyword2cmyk,\n  keyword2lab: keyword2lab,\n  keyword2xyz: keyword2xyz,\n\n  xyz2rgb: xyz2rgb,\n  xyz2lab: xyz2lab,\n  xyz2lch: xyz2lch,\n\n  lab2xyz: lab2xyz,\n  lab2rgb: lab2rgb,\n  lab2lch: lab2lch,\n\n  lch2lab: lch2lab,\n  lch2xyz: lch2xyz,\n  lch2rgb: lch2rgb\n}\n\n\nfunction rgb2hsl(rgb) {\n  var r = rgb[0]/255,\n      g = rgb[1]/255,\n      b = rgb[2]/255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, l;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g)/ delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  l = (min + max) / 2;\n\n  if (max == min)\n    s = 0;\n  else if (l <= 0.5)\n    s = delta / (max + min);\n  else\n    s = delta / (2 - max - min);\n\n  return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, v;\n\n  if (max == 0)\n    s = 0;\n  else\n    s = (delta/max * 1000)/10;\n\n  if (max == min)\n    h = 0;\n  else if (r == max)\n    h = (g - b) / delta;\n  else if (g == max)\n    h = 2 + (b - r) / delta;\n  else if (b == max)\n    h = 4 + (r - g) / delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  v = ((max / 255) * 1000) / 10;\n\n  return [h, s, v];\n}\n\nfunction rgb2hwb(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      h = rgb2hsl(rgb)[0],\n      w = 1/255 * Math.min(r, Math.min(g, b)),\n      b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n  return [h, w * 100, b * 100];\n}\n\nfunction rgb2cmyk(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255,\n      c, m, y, k;\n\n  k = Math.min(1 - r, 1 - g, 1 - b);\n  c = (1 - r - k) / (1 - k) || 0;\n  m = (1 - g - k) / (1 - k) || 0;\n  y = (1 - b - k) / (1 - k) || 0;\n  return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n  return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255;\n\n  // assume sRGB\n  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n  return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n  var xyz = rgb2xyz(rgb),\n        x = xyz[0],\n        y = xyz[1],\n        z = xyz[2],\n        l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction rgb2lch(args) {\n  return lab2lch(rgb2lab(args));\n}\n\nfunction hsl2rgb(hsl) {\n  var h = hsl[0] / 360,\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      t1, t2, t3, rgb, val;\n\n  if (s == 0) {\n    val = l * 255;\n    return [val, val, val];\n  }\n\n  if (l < 0.5)\n    t2 = l * (1 + s);\n  else\n    t2 = l + s - l * s;\n  t1 = 2 * l - t2;\n\n  rgb = [0, 0, 0];\n  for (var i = 0; i < 3; i++) {\n    t3 = h + 1 / 3 * - (i - 1);\n    t3 < 0 && t3++;\n    t3 > 1 && t3--;\n\n    if (6 * t3 < 1)\n      val = t1 + (t2 - t1) * 6 * t3;\n    else if (2 * t3 < 1)\n      val = t2;\n    else if (3 * t3 < 2)\n      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n    else\n      val = t1;\n\n    rgb[i] = val * 255;\n  }\n\n  return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n  var h = hsl[0],\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      sv, v;\n\n  if(l === 0) {\n      // no need to do calc on black\n      // also avoids divide by 0 error\n      return [0, 0, 0];\n  }\n\n  l *= 2;\n  s *= (l <= 1) ? l : 2 - l;\n  v = (l + s) / 2;\n  sv = (2 * s) / (l + s);\n  return [h, sv * 100, v * 100];\n}\n\nfunction hsl2hwb(args) {\n  return rgb2hwb(hsl2rgb(args));\n}\n\nfunction hsl2cmyk(args) {\n  return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n  return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n  var h = hsv[0] / 60,\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      hi = Math.floor(h) % 6;\n\n  var f = h - Math.floor(h),\n      p = 255 * v * (1 - s),\n      q = 255 * v * (1 - (s * f)),\n      t = 255 * v * (1 - (s * (1 - f))),\n      v = 255 * v;\n\n  switch(hi) {\n    case 0:\n      return [v, t, p];\n    case 1:\n      return [q, v, p];\n    case 2:\n      return [p, v, t];\n    case 3:\n      return [p, q, v];\n    case 4:\n      return [t, p, v];\n    case 5:\n      return [v, p, q];\n  }\n}\n\nfunction hsv2hsl(hsv) {\n  var h = hsv[0],\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      sl, l;\n\n  l = (2 - s) * v;\n  sl = s * v;\n  sl /= (l <= 1) ? l : 2 - l;\n  sl = sl || 0;\n  l /= 2;\n  return [h, sl * 100, l * 100];\n}\n\nfunction hsv2hwb(args) {\n  return rgb2hwb(hsv2rgb(args))\n}\n\nfunction hsv2cmyk(args) {\n  return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n  return rgb2keyword(hsv2rgb(args));\n}\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nfunction hwb2rgb(hwb) {\n  var h = hwb[0] / 360,\n      wh = hwb[1] / 100,\n      bl = hwb[2] / 100,\n      ratio = wh + bl,\n      i, v, f, n;\n\n  // wh + bl cant be > 1\n  if (ratio > 1) {\n    wh /= ratio;\n    bl /= ratio;\n  }\n\n  i = Math.floor(6 * h);\n  v = 1 - bl;\n  f = 6 * h - i;\n  if ((i & 0x01) != 0) {\n    f = 1 - f;\n  }\n  n = wh + f * (v - wh);  // linear interpolation\n\n  switch (i) {\n    default:\n    case 6:\n    case 0: r = v; g = n; b = wh; break;\n    case 1: r = n; g = v; b = wh; break;\n    case 2: r = wh; g = v; b = n; break;\n    case 3: r = wh; g = n; b = v; break;\n    case 4: r = n; g = wh; b = v; break;\n    case 5: r = v; g = wh; b = n; break;\n  }\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction hwb2hsl(args) {\n  return rgb2hsl(hwb2rgb(args));\n}\n\nfunction hwb2hsv(args) {\n  return rgb2hsv(hwb2rgb(args));\n}\n\nfunction hwb2cmyk(args) {\n  return rgb2cmyk(hwb2rgb(args));\n}\n\nfunction hwb2keyword(args) {\n  return rgb2keyword(hwb2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n  var c = cmyk[0] / 100,\n      m = cmyk[1] / 100,\n      y = cmyk[2] / 100,\n      k = cmyk[3] / 100,\n      r, g, b;\n\n  r = 1 - Math.min(1, c * (1 - k) + k);\n  g = 1 - Math.min(1, m * (1 - k) + k);\n  b = 1 - Math.min(1, y * (1 - k) + k);\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n  return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n  return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2hwb(args) {\n  return rgb2hwb(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n  return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n  var x = xyz[0] / 100,\n      y = xyz[1] / 100,\n      z = xyz[2] / 100,\n      r, g, b;\n\n  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n  // assume sRGB\n  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n    : r = (r * 12.92);\n\n  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n    : g = (g * 12.92);\n\n  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n    : b = (b * 12.92);\n\n  r = Math.min(Math.max(0, r), 1);\n  g = Math.min(Math.max(0, g), 1);\n  b = Math.min(Math.max(0, b), 1);\n\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction xyz2lab(xyz) {\n  var x = xyz[0],\n      y = xyz[1],\n      z = xyz[2],\n      l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n\n  return [l, a, b];\n}\n\nfunction xyz2lch(args) {\n  return lab2lch(xyz2lab(args));\n}\n\nfunction lab2xyz(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      x, y, z, y2;\n\n  if (l <= 8) {\n    y = (l * 100) / 903.3;\n    y2 = (7.787 * (y / 100)) + (16 / 116);\n  } else {\n    y = 100 * Math.pow((l + 16) / 116, 3);\n    y2 = Math.pow(y / 100, 1/3);\n  }\n\n  x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n  z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n  return [x, y, z];\n}\n\nfunction lab2lch(lab) {\n  var l = lab[0],\n      a = lab[1],\n      b = lab[2],\n      hr, h, c;\n\n  hr = Math.atan2(b, a);\n  h = hr * 360 / 2 / Math.PI;\n  if (h < 0) {\n    h += 360;\n  }\n  c = Math.sqrt(a * a + b * b);\n  return [l, c, h];\n}\n\nfunction lab2rgb(args) {\n  return xyz2rgb(lab2xyz(args));\n}\n\nfunction lch2lab(lch) {\n  var l = lch[0],\n      c = lch[1],\n      h = lch[2],\n      a, b, hr;\n\n  hr = h / 360 * 2 * Math.PI;\n  a = c * Math.cos(hr);\n  b = c * Math.sin(hr);\n  return [l, a, b];\n}\n\nfunction lch2xyz(args) {\n  return lab2xyz(lch2lab(args));\n}\n\nfunction lch2rgb(args) {\n  return lab2rgb(lch2lab(args));\n}\n\nfunction keyword2rgb(keyword) {\n  return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n  return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n  return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2hwb(args) {\n  return rgb2hwb(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n  return rgb2cmyk(keyword2rgb(args));\n}\n\nfunction keyword2lab(args) {\n  return rgb2lab(keyword2rgb(args));\n}\n\nfunction keyword2xyz(args) {\n  return rgb2xyz(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n  aliceblue:  [240,248,255],\n  antiquewhite: [250,235,215],\n  aqua: [0,255,255],\n  aquamarine: [127,255,212],\n  azure:  [240,255,255],\n  beige:  [245,245,220],\n  bisque: [255,228,196],\n  black:  [0,0,0],\n  blanchedalmond: [255,235,205],\n  blue: [0,0,255],\n  blueviolet: [138,43,226],\n  brown:  [165,42,42],\n  burlywood:  [222,184,135],\n  cadetblue:  [95,158,160],\n  chartreuse: [127,255,0],\n  chocolate:  [210,105,30],\n  coral:  [255,127,80],\n  cornflowerblue: [100,149,237],\n  cornsilk: [255,248,220],\n  crimson:  [220,20,60],\n  cyan: [0,255,255],\n  darkblue: [0,0,139],\n  darkcyan: [0,139,139],\n  darkgoldenrod:  [184,134,11],\n  darkgray: [169,169,169],\n  darkgreen:  [0,100,0],\n  darkgrey: [169,169,169],\n  darkkhaki:  [189,183,107],\n  darkmagenta:  [139,0,139],\n  darkolivegreen: [85,107,47],\n  darkorange: [255,140,0],\n  darkorchid: [153,50,204],\n  darkred:  [139,0,0],\n  darksalmon: [233,150,122],\n  darkseagreen: [143,188,143],\n  darkslateblue:  [72,61,139],\n  darkslategray:  [47,79,79],\n  darkslategrey:  [47,79,79],\n  darkturquoise:  [0,206,209],\n  darkviolet: [148,0,211],\n  deeppink: [255,20,147],\n  deepskyblue:  [0,191,255],\n  dimgray:  [105,105,105],\n  dimgrey:  [105,105,105],\n  dodgerblue: [30,144,255],\n  firebrick:  [178,34,34],\n  floralwhite:  [255,250,240],\n  forestgreen:  [34,139,34],\n  fuchsia:  [255,0,255],\n  gainsboro:  [220,220,220],\n  ghostwhite: [248,248,255],\n  gold: [255,215,0],\n  goldenrod:  [218,165,32],\n  gray: [128,128,128],\n  green:  [0,128,0],\n  greenyellow:  [173,255,47],\n  grey: [128,128,128],\n  honeydew: [240,255,240],\n  hotpink:  [255,105,180],\n  indianred:  [205,92,92],\n  indigo: [75,0,130],\n  ivory:  [255,255,240],\n  khaki:  [240,230,140],\n  lavender: [230,230,250],\n  lavenderblush:  [255,240,245],\n  lawngreen:  [124,252,0],\n  lemonchiffon: [255,250,205],\n  lightblue:  [173,216,230],\n  lightcoral: [240,128,128],\n  lightcyan:  [224,255,255],\n  lightgoldenrodyellow: [250,250,210],\n  lightgray:  [211,211,211],\n  lightgreen: [144,238,144],\n  lightgrey:  [211,211,211],\n  lightpink:  [255,182,193],\n  lightsalmon:  [255,160,122],\n  lightseagreen:  [32,178,170],\n  lightskyblue: [135,206,250],\n  lightslategray: [119,136,153],\n  lightslategrey: [119,136,153],\n  lightsteelblue: [176,196,222],\n  lightyellow:  [255,255,224],\n  lime: [0,255,0],\n  limegreen:  [50,205,50],\n  linen:  [250,240,230],\n  magenta:  [255,0,255],\n  maroon: [128,0,0],\n  mediumaquamarine: [102,205,170],\n  mediumblue: [0,0,205],\n  mediumorchid: [186,85,211],\n  mediumpurple: [147,112,219],\n  mediumseagreen: [60,179,113],\n  mediumslateblue:  [123,104,238],\n  mediumspringgreen:  [0,250,154],\n  mediumturquoise:  [72,209,204],\n  mediumvioletred:  [199,21,133],\n  midnightblue: [25,25,112],\n  mintcream:  [245,255,250],\n  mistyrose:  [255,228,225],\n  moccasin: [255,228,181],\n  navajowhite:  [255,222,173],\n  navy: [0,0,128],\n  oldlace:  [253,245,230],\n  olive:  [128,128,0],\n  olivedrab:  [107,142,35],\n  orange: [255,165,0],\n  orangered:  [255,69,0],\n  orchid: [218,112,214],\n  palegoldenrod:  [238,232,170],\n  palegreen:  [152,251,152],\n  paleturquoise:  [175,238,238],\n  palevioletred:  [219,112,147],\n  papayawhip: [255,239,213],\n  peachpuff:  [255,218,185],\n  peru: [205,133,63],\n  pink: [255,192,203],\n  plum: [221,160,221],\n  powderblue: [176,224,230],\n  purple: [128,0,128],\n  rebeccapurple: [102, 51, 153],\n  red:  [255,0,0],\n  rosybrown:  [188,143,143],\n  royalblue:  [65,105,225],\n  saddlebrown:  [139,69,19],\n  salmon: [250,128,114],\n  sandybrown: [244,164,96],\n  seagreen: [46,139,87],\n  seashell: [255,245,238],\n  sienna: [160,82,45],\n  silver: [192,192,192],\n  skyblue:  [135,206,235],\n  slateblue:  [106,90,205],\n  slategray:  [112,128,144],\n  slategrey:  [112,128,144],\n  snow: [255,250,250],\n  springgreen:  [0,255,127],\n  steelblue:  [70,130,180],\n  tan:  [210,180,140],\n  teal: [0,128,128],\n  thistle:  [216,191,216],\n  tomato: [255,99,71],\n  turquoise:  [64,224,208],\n  violet: [238,130,238],\n  wheat:  [245,222,179],\n  white:  [255,255,255],\n  whitesmoke: [245,245,245],\n  yellow: [255,255,0],\n  yellowgreen:  [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\n},{}],5:[function(require,module,exports){\nvar conversions = require(4);\n\nvar convert = function() {\n   return new Converter();\n}\n\nfor (var func in conversions) {\n  // export Raw versions\n  convert[func + \"Raw\"] =  (function(func) {\n    // accept array or plain args\n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      return conversions[func](arg);\n    }\n  })(func);\n\n  var pair = /(\\w+)2(\\w+)/.exec(func),\n      from = pair[1],\n      to = pair[2];\n\n  // export rgb2hsl and [\"rgb\"][\"hsl\"]\n  convert[from] = convert[from] || {};\n\n  convert[from][to] = convert[func] = (function(func) { \n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      \n      var val = conversions[func](arg);\n      if (typeof val == \"string\" || val === undefined)\n        return val; // keyword\n\n      for (var i = 0; i < val.length; i++)\n        val[i] = Math.round(val[i]);\n      return val;\n    }\n  })(func);\n}\n\n\n/* Converter does lazy conversion and caching */\nvar Converter = function() {\n   this.convs = {};\n};\n\n/* Either get the values for a space or\n  set the values for a space, depending on args */\nConverter.prototype.routeSpace = function(space, args) {\n   var values = args[0];\n   if (values === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n   }\n   // color.rgb(10, 10, 10)\n   if (typeof values == \"number\") {\n      values = Array.prototype.slice.call(args);        \n   }\n\n   return this.setValues(space, values);\n};\n  \n/* Set the values for a space, invalidating cache */\nConverter.prototype.setValues = function(space, values) {\n   this.space = space;\n   this.convs = {};\n   this.convs[space] = values;\n   return this;\n};\n\n/* Get the values for a space. If there's already\n  a conversion for the space, fetch it, otherwise\n  compute it */\nConverter.prototype.getValues = function(space) {\n   var vals = this.convs[space];\n   if (!vals) {\n      var fspace = this.space,\n          from = this.convs[fspace];\n      vals = convert[fspace][space](from);\n\n      this.convs[space] = vals;\n   }\n  return vals;\n};\n\n[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n   Converter.prototype[space] = function(vals) {\n      return this.routeSpace(space, arguments);\n   }\n});\n\nmodule.exports = convert;\n},{\"4\":4}],6:[function(require,module,exports){\nmodule.exports = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n},{}],7:[function(require,module,exports){\n/**\n * @namespace Chart\n */\nvar Chart = require(28)();\n\nrequire(26)(Chart);\nrequire(42)(Chart);\nrequire(22)(Chart);\nrequire(31)(Chart);\nrequire(25)(Chart);\nrequire(21)(Chart);\nrequire(23)(Chart);\nrequire(24)(Chart);\nrequire(29)(Chart);\nrequire(33)(Chart);\nrequire(34)(Chart);\nrequire(32)(Chart);\nrequire(35)(Chart);\nrequire(30)(Chart);\nrequire(27)(Chart);\nrequire(36)(Chart);\n\nrequire(37)(Chart);\nrequire(38)(Chart);\nrequire(39)(Chart);\nrequire(40)(Chart);\n\nrequire(45)(Chart);\nrequire(43)(Chart);\nrequire(44)(Chart);\nrequire(46)(Chart);\nrequire(47)(Chart);\nrequire(48)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire(15)(Chart);\nrequire(16)(Chart);\nrequire(17)(Chart);\nrequire(18)(Chart);\nrequire(19)(Chart);\nrequire(20)(Chart);\n\nrequire(8)(Chart);\nrequire(9)(Chart);\nrequire(10)(Chart);\nrequire(11)(Chart);\nrequire(12)(Chart);\nrequire(13)(Chart);\nrequire(14)(Chart);\n\nwindow.Chart = module.exports = Chart;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"34\":34,\"35\":35,\"36\":36,\"37\":37,\"38\":38,\"39\":39,\"40\":40,\"42\":42,\"43\":43,\"44\":44,\"45\":45,\"46\":46,\"47\":47,\"48\":48,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],9:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],10:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],11:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],12:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],14:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\t\tposition: 'bottom',\n\t\t\t\tid: 'x-axis-1' // need an ID so datasets can reference the scale\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'left',\n\t\t\t\tid: 'y-axis-1'\n\t\t\t}]\n\t\t},\n\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem) {\n\t\t\t\t\treturn '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Register the default config for this type\n\tChart.defaults.scatter = defaultConfig;\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\n\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n\n},{}],15:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.bar = {\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'category',\n\n\t\t\t\t// Specific to Bar Controller\n\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\toffsetGridLines: true\n\t\t\t\t}\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear'\n\t\t\t}]\n\t\t}\n\t};\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Rectangle,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tChart.DatasetController.prototype.initialize.call(this, chart, datasetIndex);\n\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tmeta.stack = dataset.stack;\n\t\t\t// Use this to indicate that this is a bar dataset.\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\t// Correctly calculate the bar width accounting for stacks and the fact that not all bars are visible\n\t\tgetStackCount: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\n\t\t\tvar stacks = [];\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (dsMeta.bar && me.chart.isDatasetVisible(datasetIndex) &&\n\t\t\t\t\t(yScale.options.stacked === false ||\n\t\t\t\t\t(yScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(yScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.getMeta().data, function(rectangle, index) {\n\t\t\t\tme.updateElement(rectangle, index, reset);\n\t\t\t}, me);\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar scaleBase = yScale.getBasePixel();\n\t\t\tvar rectangleElementOptions = me.chart.options.elements.rectangle;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\trectangle._xScale = xScale;\n\t\t\trectangle._yScale = yScale;\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\tvar ruler = me.getRuler(index); // The index argument for compatible\n\t\t\trectangle._model = {\n\t\t\t\tx: me.calculateBarX(index, me.index, ruler),\n\t\t\t\ty: reset ? scaleBase : me.calculateBarY(index, me.index),\n\n\t\t\t\t// Tooltip\n\t\t\t\tlabel: me.chart.data.labels[index],\n\t\t\t\tdatasetLabel: dataset.label,\n\n\t\t\t\t// Appearance\n\t\t\t\thorizontal: false,\n\t\t\t\tbase: reset ? scaleBase : me.calculateBarBase(me.index, index),\n\t\t\t\twidth: me.calculateBarWidth(ruler),\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth)\n\t\t\t};\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\tcalculateBarBase: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar base = yScale.getBaseValue();\n\t\t\tvar original = base;\n\n\t\t\tif ((yScale.options.stacked === true) ||\n\t\t\t\t(yScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar chart = me.chart;\n\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\tvar value = Number(datasets[datasetIndex].data[index]);\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar currentDs = datasets[i];\n\t\t\t\t\tvar currentDsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (currentDsMeta.bar && currentDsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === currentDsMeta.stack) {\n\t\t\t\t\t\tvar currentVal = Number(currentDs.data[index]);\n\t\t\t\t\t\tbase += value < 0 ? Math.min(currentVal, original) : Math.max(currentVal, original);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn yScale.getPixelForValue(base);\n\t\t\t}\n\n\t\t\treturn yScale.getBasePixel();\n\t\t},\n\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar stackCount = me.getStackCount();\n\n\t\t\tvar tickWidth = xScale.width / xScale.ticks.length;\n\t\t\tvar categoryWidth = tickWidth * xScale.options.categoryPercentage;\n\t\t\tvar categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;\n\t\t\tvar fullBarWidth = categoryWidth / stackCount;\n\n\t\t\tvar barWidth = fullBarWidth * xScale.options.barPercentage;\n\t\t\tvar barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage);\n\n\t\t\treturn {\n\t\t\t\tstackCount: stackCount,\n\t\t\t\ttickWidth: tickWidth,\n\t\t\t\tcategoryWidth: categoryWidth,\n\t\t\t\tcategorySpacing: categorySpacing,\n\t\t\t\tfullBarWidth: fullBarWidth,\n\t\t\t\tbarWidth: barWidth,\n\t\t\t\tbarSpacing: barSpacing\n\t\t\t};\n\t\t},\n\n\t\tcalculateBarWidth: function(ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tif (xScale.options.barThickness) {\n\t\t\t\treturn xScale.options.barThickness;\n\t\t\t}\n\t\t\treturn ruler.barWidth;\n\t\t},\n\n\t\t// Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar dsMeta, j;\n\t\t\tvar stacks = [meta.stack];\n\n\t\t\tfor (j = 0; j < datasetIndex; ++j) {\n\t\t\t\tdsMeta = this.chart.getDatasetMeta(j);\n\t\t\t\tif (dsMeta.bar && this.chart.isDatasetVisible(j) &&\n\t\t\t\t\t(yScale.options.stacked === false ||\n\t\t\t\t\t(yScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(yScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length - 1;\n\t\t},\n\n\t\tcalculateBarX: function(index, datasetIndex, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar leftTick = xScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\n\t\t\tleftTick -= me.chart.isCombo ? (ruler.tickWidth / 2) : 0;\n\n\t\t\treturn leftTick +\n\t\t\t\t(ruler.barWidth / 2) +\n\t\t\t\truler.categorySpacing +\n\t\t\t\t(ruler.barWidth * stackIndex) +\n\t\t\t\t(ruler.barSpacing / 2) +\n\t\t\t\t(ruler.barSpacing * stackIndex);\n\t\t},\n\n\t\tcalculateBarY: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar value = Number(me.getDataset().data[index]);\n\n\t\t\tif (yScale.options.stacked ||\n\t\t\t\t(yScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar base = yScale.getBaseValue();\n\t\t\t\tvar sumPos = base,\n\t\t\t\t\tsumNeg = base;\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar ds = me.chart.data.datasets[i];\n\t\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.bar && dsMeta.yAxisID === yScale.id && me.chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === dsMeta.stack) {\n\t\t\t\t\t\tvar stackedVal = Number(ds.data[index]);\n\t\t\t\t\t\tif (stackedVal < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedVal || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedVal || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + value);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + value);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tdraw: function(ease) {\n\t\t\tvar me = this;\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tvar metaData = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar i, len;\n\n\t\t\tChart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea);\n\t\t\tfor (i = 0, len = metaData.length; i < len; ++i) {\n\t\t\t\tvar d = dataset.data[i];\n\t\t\t\tif (d !== null && d !== undefined && !isNaN(d)) {\n\t\t\t\t\tmetaData[i].transition(easingDecimal).draw();\n\t\t\t\t}\n\t\t\t}\n\t\t\tChart.canvasHelpers.unclipArea(me.chart.chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\n\t});\n\n\n\t// including horizontalBar in the bar file, instead of a file of its own\n\t// it extends bar (like pie extends doughnut)\n\tChart.defaults.horizontalBar = {\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'bottom'\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\tposition: 'left',\n\t\t\t\ttype: 'category',\n\n\t\t\t\t// Specific to Horizontal Bar Controller\n\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\toffsetGridLines: true\n\t\t\t\t}\n\t\t\t}]\n\t\t},\n\t\telements: {\n\t\t\trectangle: {\n\t\t\t\tborderSkipped: 'left'\n\t\t\t}\n\t\t},\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\tvar title = '';\n\n\t\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\t\tif (tooltipItems[0].yLabel) {\n\t\t\t\t\t\t\ttitle = tooltipItems[0].yLabel;\n\t\t\t\t\t\t} else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {\n\t\t\t\t\t\t\ttitle = data.labels[tooltipItems[0].index];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn title;\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\t\treturn datasetLabel + ': ' + tooltipItem.xLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\n\t\t// Correctly calculate the bar width accounting for stacks and the fact that not all bars are visible\n\t\tgetStackCount: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\n\t\t\tvar stacks = [];\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\t\tif (dsMeta.bar && me.chart.isDatasetVisible(datasetIndex) &&\n\t\t\t\t\t(xScale.options.stacked === false ||\n\t\t\t\t\t(xScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(xScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar scaleBase = xScale.getBasePixel();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar rectangleElementOptions = me.chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = xScale;\n\t\t\trectangle._yScale = yScale;\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\tvar ruler = me.getRuler(index); // The index argument for compatible\n\t\t\trectangle._model = {\n\t\t\t\tx: reset ? scaleBase : me.calculateBarX(index, me.index),\n\t\t\t\ty: me.calculateBarY(index, me.index, ruler),\n\n\t\t\t\t// Tooltip\n\t\t\t\tlabel: me.chart.data.labels[index],\n\t\t\t\tdatasetLabel: dataset.label,\n\n\t\t\t\t// Appearance\n\t\t\t\thorizontal: true,\n\t\t\t\tbase: reset ? scaleBase : me.calculateBarBase(me.index, index),\n\t\t\t\theight: me.calculateBarHeight(ruler),\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth)\n\t\t\t};\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\tcalculateBarBase: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar base = xScale.getBaseValue();\n\t\t\tvar originalBase = base;\n\n\t\t\tif (xScale.options.stacked ||\n\t\t\t\t(xScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar chart = me.chart;\n\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\tvar value = Number(datasets[datasetIndex].data[index]);\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar currentDs = datasets[i];\n\t\t\t\t\tvar currentDsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (currentDsMeta.bar && currentDsMeta.xAxisID === xScale.id && chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === currentDsMeta.stack) {\n\t\t\t\t\t\tvar currentVal = Number(currentDs.data[index]);\n\t\t\t\t\t\tbase += value < 0 ? Math.min(currentVal, originalBase) : Math.max(currentVal, originalBase);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn xScale.getPixelForValue(base);\n\t\t\t}\n\n\t\t\treturn xScale.getBasePixel();\n\t\t},\n\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar stackCount = me.getStackCount();\n\n\t\t\tvar tickHeight = yScale.height / yScale.ticks.length;\n\t\t\tvar categoryHeight = tickHeight * yScale.options.categoryPercentage;\n\t\t\tvar categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2;\n\t\t\tvar fullBarHeight = categoryHeight / stackCount;\n\n\t\t\tvar barHeight = fullBarHeight * yScale.options.barPercentage;\n\t\t\tvar barSpacing = fullBarHeight - (fullBarHeight * yScale.options.barPercentage);\n\n\t\t\treturn {\n\t\t\t\tstackCount: stackCount,\n\t\t\t\ttickHeight: tickHeight,\n\t\t\t\tcategoryHeight: categoryHeight,\n\t\t\t\tcategorySpacing: categorySpacing,\n\t\t\t\tfullBarHeight: fullBarHeight,\n\t\t\t\tbarHeight: barHeight,\n\t\t\t\tbarSpacing: barSpacing\n\t\t\t};\n\t\t},\n\n\t\tcalculateBarHeight: function(ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tif (yScale.options.barThickness) {\n\t\t\t\treturn yScale.options.barThickness;\n\t\t\t}\n\t\t\treturn ruler.barHeight;\n\t\t},\n\n\t\t// Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.chart.getDatasetMeta(datasetIndex);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar dsMeta, j;\n\t\t\tvar stacks = [meta.stack];\n\n\t\t\tfor (j = 0; j < datasetIndex; ++j) {\n\t\t\t\tdsMeta = this.chart.getDatasetMeta(j);\n\t\t\t\tif (dsMeta.bar && this.chart.isDatasetVisible(j) &&\n\t\t\t\t\t(xScale.options.stacked === false ||\n\t\t\t\t\t(xScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) ||\n\t\t\t\t\t(xScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(dsMeta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length - 1;\n\t\t},\n\n\t\tcalculateBarX: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar value = Number(me.getDataset().data[index]);\n\n\t\t\tif (xScale.options.stacked ||\n\t\t\t\t(xScale.options.stacked === undefined && meta.stack !== undefined)) {\n\t\t\t\tvar base = xScale.getBaseValue();\n\t\t\t\tvar sumPos = base,\n\t\t\t\t\tsumNeg = base;\n\n\t\t\t\tfor (var i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tvar ds = me.chart.data.datasets[i];\n\t\t\t\t\tvar dsMeta = me.chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.bar && dsMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i) &&\n\t\t\t\t\t\tmeta.stack === dsMeta.stack) {\n\t\t\t\t\t\tvar stackedVal = Number(ds.data[index]);\n\t\t\t\t\t\tif (stackedVal < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedVal || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedVal || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value < 0) {\n\t\t\t\t\treturn xScale.getPixelForValue(sumNeg + value);\n\t\t\t\t}\n\t\t\t\treturn xScale.getPixelForValue(sumPos + value);\n\t\t\t}\n\n\t\t\treturn xScale.getPixelForValue(value);\n\t\t},\n\n\t\tcalculateBarY: function(index, datasetIndex, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar topTick = yScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\n\t\t\ttopTick -= me.chart.isCombo ? (ruler.tickHeight / 2) : 0;\n\n\t\t\treturn topTick +\n\t\t\t\t(ruler.barHeight / 2) +\n\t\t\t\truler.categorySpacing +\n\t\t\t\t(ruler.barHeight * stackIndex) +\n\t\t\t\t(ruler.barSpacing / 2) +\n\t\t\t\t(ruler.barSpacing * stackIndex);\n\t\t}\n\t});\n};\n\n},{}],16:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.bubble = {\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\t\tposition: 'bottom',\n\t\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'left',\n\t\t\t\tid: 'y-axis-0'\n\t\t\t}]\n\t\t},\n\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\t\tvar dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\t\t\t\t\treturn datasetLabel + ': (' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar dsIndex = me.index;\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_xScale: xScale,\n\t\t\t\t_yScale: yScale,\n\t\t\t\t_datasetIndex: dsIndex,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex, me.chart.isCombo),\n\t\t\t\t\ty: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex),\n\t\t\t\t\t// Appearance\n\t\t\t\t\tradius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Trick to reset the styles of the point\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(me, point, pointElementOptions);\n\n\t\t\tvar model = point._model;\n\t\t\tmodel.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y));\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\tgetRadius: function(value) {\n\t\t\treturn value.r || this.chart.options.elements.point.radius;\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tChart.DatasetController.prototype.setHoverStyle.call(me, point);\n\n\t\t\t// Radius\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, me.chart.options.elements.point.hoverRadius)) + me.getRadius(dataset.data[index]);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(me, point, me.chart.options.elements.point);\n\n\t\t\tvar dataVal = me.chart.data.datasets[point._datasetIndex].data[point._index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : me.getRadius(dataVal);\n\t\t}\n\t});\n};\n\n},{}],17:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tdefaults = Chart.defaults;\n\n\tdefaults.doughnut = {\n\t\tanimation: {\n\t\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\t\tanimateRotate: true,\n\t\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\t\tanimateScale: false\n\t\t},\n\t\taspectRatio: 1,\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\t\tlegendCallback: function(chart) {\n\t\t\tvar text = [];\n\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar labels = data.labels;\n\n\t\t\tif (datasets.length) {\n\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttext.push('</ul>');\n\t\t\treturn text.join('');\n\t\t},\n\t\tlegend: {\n\t\t\tlabels: {\n\t\t\t\tgenerateLabels: function(chart) {\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonClick: function(e, legendItem) {\n\t\t\t\tvar index = legendItem.index;\n\t\t\t\tvar chart = this.chart;\n\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t// toggle visibility of index if exists\n\t\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tchart.update();\n\t\t\t}\n\t\t},\n\n\t\t// The percentage of the chart that we cut out of the middle.\n\t\tcutoutPercentage: 50,\n\n\t\t// The rotation of the chart, where the first data arc begins.\n\t\trotation: Math.PI * -0.5,\n\n\t\t// The total circumference of the chart.\n\t\tcircumference: Math.PI * 2.0,\n\n\t\t// Need to override these to give a nice default\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdataLabel += value;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn dataLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tdefaults.pie = helpers.clone(defaults.doughnut);\n\thelpers.extend(defaults.pie, {\n\t\tcutoutPercentage: 0\n\t});\n\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart,\n\t\t\t\tchartArea = chart.chartArea,\n\t\t\t\topts = chart.options,\n\t\t\t\tarcOpts = opts.elements.arc,\n\t\t\t\tavailableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth,\n\t\t\t\tavailableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth,\n\t\t\t\tminSize = Math.min(availableWidth, availableHeight),\n\t\t\t\toffset = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0\n\t\t\t\t},\n\t\t\t\tmeta = me.getMeta(),\n\t\t\t\tcutoutPercentage = opts.cutoutPercentage,\n\t\t\t\tcircumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart,\n\t\t\t\tchartArea = chart.chartArea,\n\t\t\t\topts = chart.options,\n\t\t\t\tanimationOpts = opts.animation,\n\t\t\t\tcenterX = (chartArea.left + chartArea.right) / 2,\n\t\t\t\tcenterY = (chartArea.top + chartArea.bottom) / 2,\n\t\t\t\tstartAngle = opts.rotation, // non reset case handled later\n\t\t\t\tendAngle = opts.rotation, // non reset case handled later\n\t\t\t\tdataset = me.getDataset(),\n\t\t\t\tcircumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\n\t\t\t\tinnerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius,\n\t\t\t\touterRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius,\n\t\t\t\tvalueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (value / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(elements) {\n\t\t\tvar max = 0,\n\t\t\t\tindex = this.index,\n\t\t\t\tlength = elements.length,\n\t\t\t\tborderWidth,\n\t\t\t\thoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = elements[i]._model ? elements[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = elements[i]._chart ? elements[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n\n},{}],18:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.line = {\n\t\tshowLines: true,\n\t\tspanGaps: false,\n\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'category',\n\t\t\t\tid: 'x-axis-0'\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tid: 'y-axis-0'\n\t\t\t}]\n\t\t}\n\t};\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.getValueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: Chart.elements.Line,\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.getValueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.getValueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t\t// Scale\n\t\t\t\t\tscaleTop: scale.top,\n\t\t\t\t\tscaleBottom: scale.bottom,\n\t\t\t\t\tscaleZero: scale.getBasePixel()\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\t\t\tvar labels = me.chart.data.labels || [];\n\t\t\tvar includeOffset = (labels.length === 1 || dataset.data.length === 1) || me.chart.isCombo;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex, includeOffset);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.getValueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function(ease) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tvar i, ilen;\n\n\t\t\t// Transition Point Locations\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].transition(easingDecimal);\n\t\t\t}\n\n\t\t\tChart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea);\n\t\t\t// Transition and Draw the line\n\t\t\tif (lineEnabled(me.getDataset(), me.chart.options)) {\n\t\t\t\tmeta.dataset.transition(easingDecimal).draw();\n\t\t\t}\n\t\t\tChart.canvasHelpers.unclipArea(me.chart.chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].draw(me.chart.chartArea);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n\n},{}],19:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.polarArea = {\n\n\t\tscale: {\n\t\t\ttype: 'radialLinear',\n\t\t\tlineArc: true, // so that lines are circular\n\t\t\tticks: {\n\t\t\t\tbeginAtZero: true\n\t\t\t}\n\t\t},\n\n\t\t// Boolean - Whether to animate the rotation of the chart\n\t\tanimation: {\n\t\t\tanimateRotate: true,\n\t\t\tanimateScale: true\n\t\t},\n\n\t\tstartAngle: -0.5 * Math.PI,\n\t\taspectRatio: 1,\n\t\tlegendCallback: function(chart) {\n\t\t\tvar text = [];\n\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar labels = data.labels;\n\n\t\t\tif (datasets.length) {\n\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttext.push('</ul>');\n\t\t\treturn text.join('');\n\t\t},\n\t\tlegend: {\n\t\t\tlabels: {\n\t\t\t\tgenerateLabels: function(chart) {\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonClick: function(e, legendItem) {\n\t\t\t\tvar index = legendItem.index;\n\t\t\t\tvar chart = this.chart;\n\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\n\t\t\t\tchart.update();\n\t\t\t}\n\t\t},\n\n\t\t// Need to override these to give a nice default\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\treturn data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: getValueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n\n},{}],20:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.radar = {\n\t\taspectRatio: 1,\n\t\tscale: {\n\t\t\ttype: 'radialLinear'\n\t\t},\n\t\telements: {\n\t\t\tline: {\n\t\t\t\ttension: 0 // no bezier in radar\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: Chart.elements.Line,\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\n\t\t\t\t\t// Scale\n\t\t\t\t\tscaleTop: scale.top,\n\t\t\t\t\tscaleBottom: scale.bottom,\n\t\t\t\t\tscaleZero: scale.getBasePosition()\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tdraw: function(ease) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar easingDecimal = ease || 1;\n\n\t\t\t// Transition Point Locations\n\t\t\thelpers.each(meta.data, function(point) {\n\t\t\t\tpoint.transition(easingDecimal);\n\t\t\t});\n\n\t\t\t// Transition and Draw the line\n\t\t\tmeta.dataset.transition(easingDecimal).draw();\n\n\t\t\t// Draw the points\n\t\t\thelpers.each(meta.data, function(point) {\n\t\t\t\tpoint.draw();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.radius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n\n},{}],21:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.animation = {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t};\n\n\tChart.Animation = Chart.Element.extend({\n\t\tcurrentStep: null, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @function Chart.animationService.addAnimation\n\t\t * @param chartInstance {ChartController} the chart to animate\n\t\t * @param animationObject {IAnimation} the animation that we will animate\n\t\t * @param duration {Number} length of animation in ms\n\t\t * @param lazy {Boolean} if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chartInstance, animationObject, duration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchartInstance.animating = true;\n\t\t\t}\n\n\t\t\tfor (var index = 0; index < me.animations.length; ++index) {\n\t\t\t\tif (me.animations[index].chartInstance === chartInstance) {\n\t\t\t\t\t// replacing an in progress animation\n\t\t\t\t\tme.animations[index].animationObject = animationObject;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.animations.push({\n\t\t\t\tchartInstance: chartInstance,\n\t\t\t\tanimationObject: animationObject\n\t\t\t});\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (me.animations.length === 1) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\t\t// Cancel the animation for a given chart instance\n\t\tcancelAnimation: function(chartInstance) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animationWrapper) {\n\t\t\t\treturn animationWrapper.chartInstance === chartInstance;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchartInstance.animating = false;\n\t\t\t}\n\t\t},\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tvar i = 0;\n\t\t\twhile (i < me.animations.length) {\n\t\t\t\tif (me.animations[i].animationObject.currentStep === null) {\n\t\t\t\t\tme.animations[i].animationObject.currentStep = 0;\n\t\t\t\t}\n\n\t\t\t\tme.animations[i].animationObject.currentStep += 1 + framesToDrop;\n\n\t\t\t\tif (me.animations[i].animationObject.currentStep > me.animations[i].animationObject.numSteps) {\n\t\t\t\t\tme.animations[i].animationObject.currentStep = me.animations[i].animationObject.numSteps;\n\t\t\t\t}\n\n\t\t\t\tme.animations[i].animationObject.render(me.animations[i].chartInstance, me.animations[i].animationObject);\n\t\t\t\tif (me.animations[i].animationObject.onAnimationProgress && me.animations[i].animationObject.onAnimationProgress.call) {\n\t\t\t\t\tme.animations[i].animationObject.onAnimationProgress.call(me.animations[i].chartInstance, me.animations[i]);\n\t\t\t\t}\n\n\t\t\t\tif (me.animations[i].animationObject.currentStep === me.animations[i].animationObject.numSteps) {\n\t\t\t\t\tif (me.animations[i].animationObject.onAnimationComplete && me.animations[i].animationObject.onAnimationComplete.call) {\n\t\t\t\t\t\tme.animations[i].animationObject.onAnimationComplete.call(me.animations[i].chartInstance, me.animations[i]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// executed the last frame. Remove the animation.\n\t\t\t\t\tme.animations[i].chartInstance.animating = false;\n\n\t\t\t\t\tme.animations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar endTime = Date.now();\n\t\t\tvar dropFrames = (endTime - startTime) / me.frameDuration;\n\n\t\t\tme.dropFrames += dropFrames;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{}],22:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\t// Global Chart canvas helpers object for drawing items to canvas\n\tvar helpers = Chart.canvasHelpers = {};\n\n\thelpers.drawPoint = function(ctx, pointStyle, radius, x, y) {\n\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\n\t\tif (typeof pointStyle === 'object') {\n\t\t\ttype = pointStyle.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (pointStyle) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(x, y, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.beginPath();\n\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\tctx.moveTo(x - edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x + edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x, y - 2 * height / 3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\tvar leftX = x - offset;\n\t\t\tvar topY = y - offset;\n\t\t\tvar sideSize = Math.SQRT2 * radius;\n\t\t\tChart.helpers.drawRoundedRectangle(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rectRot':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - size, y);\n\t\t\tctx.lineTo(x, y + size);\n\t\t\tctx.lineTo(x + size, y);\n\t\t\tctx.lineTo(x, y - size);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'cross':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\tctx.beginPath();\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.stroke();\n\t};\n\n\thelpers.clipArea = function(ctx, clipArea) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(clipArea.left, clipArea.top, clipArea.right - clipArea.left, clipArea.bottom - clipArea.top);\n\t\tctx.clip();\n\t};\n\n\thelpers.unclipArea = function(ctx) {\n\t\tctx.restore();\n\t};\n\n};\n\n},{}],23:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar plugins = Chart.plugins;\n\tvar platform = Chart.platform;\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tChart.defaults.global,\n\t\t\tChart.defaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart.Controller} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\t// Update Scale(s) with options\n\t\tif (newOptions.scale) {\n\t\t\tchart.scale.options = newOptions.scale;\n\t\t} else if (newOptions.scales) {\n\t\t\tnewOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n\t\t\t\tchart.scales[scaleOptions.id].options = scaleOptions;\n\t\t\t});\n\t\t}\n\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t}\n\n\t/**\n\t * @class Chart.Controller\n\t * The main controller of a chart.\n\t */\n\tChart.Controller = function(item, config, instance) {\n\t\tvar me = this;\n\n\t\tconfig = initConfig(config);\n\n\t\tvar context = platform.acquireContext(item, config);\n\t\tvar canvas = context && context.canvas;\n\t\tvar height = canvas && canvas.height;\n\t\tvar width = canvas && canvas.width;\n\n\t\tinstance.ctx = context;\n\t\tinstance.canvas = canvas;\n\t\tinstance.config = config;\n\t\tinstance.width = width;\n\t\tinstance.height = height;\n\t\tinstance.aspectRatio = height? width / height : null;\n\n\t\tme.id = helpers.uid();\n\t\tme.chart = instance;\n\t\tme.config = config;\n\t\tme.options = config.options;\n\t\tme._bufferedRender = false;\n\n\t\t// Add the chart instance to the global namespace\n\t\tChart.instances[me.id] = me;\n\n\t\tObject.defineProperty(me, 'data', {\n\t\t\tget: function() {\n\t\t\t\treturn me.config.data;\n\t\t\t}\n\t\t});\n\n\t\tif (!context || !canvas) {\n\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\treturn me;\n\t\t}\n\n\t\tme.initialize();\n\t\tme.update();\n\n\t\treturn me;\n\t};\n\n\thelpers.extend(Chart.Controller.prototype, /** @lends Chart.Controller.prototype */ {\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me.chart);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.clear(this.chart);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = chart.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && chart.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\t\t\tvar newWidth = Math.floor(helpers.getMaximumWidth(canvas));\n\t\t\tvar newHeight = Math.floor(aspectRatio? newWidth / aspectRatio : helpers.getMaximumHeight(canvas));\n\n\t\t\tif (chart.width === newWidth && chart.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = chart.width = newWidth;\n\t\t\tcanvas.height = chart.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(chart);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales = {};\n\t\t\tvar items = [];\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({options: options.scale, dtype: 'radialLinear', isDefault: true});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar scaleType = helpers.getValueOrDefault(scaleOptions.type, item.dtype);\n\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\tif (!scaleClass) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar scale = new scaleClass({\n\t\t\t\t\tid: scaleOptions.id,\n\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\tctx: me.chart.ctx,\n\t\t\t\t\tchart: me\n\t\t\t\t});\n\n\t\t\t\tscales[scale.id] = scale;\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tif (!meta.type) {\n\t\t\t\t\tmeta.type = dataset.type || me.config.type;\n\t\t\t\t}\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t} else {\n\t\t\t\t\tmeta.controller = new Chart.controllers[meta.type](me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\tif (types.length > 1) {\n\t\t\t\tfor (var i = 1; i < types.length; i++) {\n\t\t\t\t\tif (types[i] !== types[i - 1]) {\n\t\t\t\t\t\tme.isCombo = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(animationDuration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tupdateConfig(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\tcontroller.reset();\n\t\t\t});\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tlazy: lazy,\n\t\t\t\t\tduration: animationDuration\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(animationDuration, lazy);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tChart.layoutService.update(this, this.chart.width, this.chart.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.getDatasetMeta(i).controller.update();\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\trender: function(duration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function() {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\tvar callback = animationOptions && animationOptions.onComplete;\n\t\t\t\tif (callback && callback.call) {\n\t\t\t\t\tcallback.call(me);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation();\n\t\t\t\tanimation.numSteps = (duration || animationOptions.duration) / 16.66; // 60 fps\n\t\t\t\tanimation.easing = animationOptions.easing;\n\n\t\t\t\t// render function\n\t\t\t\tanimation.render = function(chartInstance, animationObject) {\n\t\t\t\t\tvar easingFunction = helpers.easingEffects[animationObject.easing];\n\t\t\t\t\tvar stepDecimal = animationObject.currentStep / animationObject.numSteps;\n\t\t\t\t\tvar easeDecimal = easingFunction(stepDecimal);\n\n\t\t\t\t\tchartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep);\n\t\t\t\t};\n\n\t\t\t\t// user events\n\t\t\t\tanimation.onAnimationProgress = animationOptions.onProgress;\n\t\t\t\tanimation.onAnimationComplete = onComplete;\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\t\t\t\tonComplete();\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (easingValue === undefined || easingValue === null) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\n\t\t\t// Finally draw the tooltip\n\t\t\tme.tooltip.transition(easingValue).draw();\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw each dataset via its respective controller (reversed to support proper line stacking)\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (me.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tme.getDatasetMeta(datasetIndex).controller.draw(easingValue);\n\t\t\t\t}\n\t\t\t}, me, true);\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Chart.Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Chart.Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i<ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean'? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.chart.canvas;\n\t\t\tvar meta, i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tmeta = me.getDatasetMeta(i);\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.destroy();\n\t\t\t\t\tmeta.controller = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.clear(me.chart);\n\t\t\t\tplatform.releaseContext(me.chart.ctx);\n\t\t\t\tme.chart.canvas = null;\n\t\t\t\tme.chart.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_chartInstance: me,\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t\tme.tooltip.initialize();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Responsiveness is currently based on the use of an iframe, however this method causes\n\t\t\t// performance issues and could be troublesome when used with ad blockers. So make sure\n\t\t\t// that the user is still able to create a chart without iframe when responsive is false.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i=0, ilen=elements.length; i<ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\tchanged |= tooltip && tooltip.handleEvent(e);\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest.duration, bufferedRequest.lazy);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// On Hover hook\n\t\t\tif (hoverOptions.onHover) {\n\t\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\t\thoverOptions.onHover.call(me, e.native, me.active);\n\t\t\t}\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n};\n\n},{}],24:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i=0, ilen=data.length; i<ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\tdraw: function(ease) {\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tvar i, len;\n\t\t\tvar metaData = this.getMeta().data;\n\t\t\tfor (i = 0, len = metaData.length; i < len; ++i) {\n\t\t\t\tmetaData[i].transition(easingDecimal).draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex],\n\t\t\t\tindex = element._index,\n\t\t\t\tcustom = element.custom || {},\n\t\t\t\tvalueOrDefault = helpers.getValueAtIndexOrDefault,\n\t\t\t\tmodel = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex],\n\t\t\t\tindex = element._index,\n\t\t\t\tcustom = element.custom || {},\n\t\t\t\tvalueOrDefault = helpers.getValueAtIndexOrDefault,\n\t\t\t\tgetHoverColor = helpers.getHoverColor,\n\t\t\t\tmodel = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i=0; i<count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length-1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n\n},{}],25:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.elements = {};\n\n\tChart.Element = function(configuration) {\n\t\thelpers.extend(this, configuration);\n\t\tthis.initialize.apply(this, arguments);\n\t};\n\n\thelpers.extend(Chart.Element.prototype, {\n\n\t\tinitialize: function() {\n\t\t\tthis.hidden = false;\n\t\t},\n\n\t\tpivot: function() {\n\t\t\tvar me = this;\n\t\t\tif (!me._view) {\n\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t}\n\t\t\tme._start = helpers.clone(me._view);\n\t\t\treturn me;\n\t\t},\n\n\t\ttransition: function(ease) {\n\t\t\tvar me = this;\n\n\t\t\tif (!me._view) {\n\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t}\n\n\t\t\t// No animation -> No Transition\n\t\t\tif (ease === 1) {\n\t\t\t\tme._view = me._model;\n\t\t\t\tme._start = null;\n\t\t\t\treturn me;\n\t\t\t}\n\n\t\t\tif (!me._start) {\n\t\t\t\tme.pivot();\n\t\t\t}\n\n\t\t\thelpers.each(me._model, function(value, key) {\n\n\t\t\t\tif (key[0] === '_') {\n\t\t\t\t\t// Only non-underscored properties\n\t\t\t\t// Init if doesn't exist\n\t\t\t\t} else if (!me._view.hasOwnProperty(key)) {\n\t\t\t\t\tif (typeof value === 'number' && !isNaN(me._view[key])) {\n\t\t\t\t\t\tme._view[key] = value * ease;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme._view[key] = value;\n\t\t\t\t\t}\n\t\t\t\t// No unnecessary computations\n\t\t\t\t} else if (value === me._view[key]) {\n\t\t\t\t\t// It's the same! Woohoo!\n\t\t\t\t// Color transitions if possible\n\t\t\t\t} else if (typeof value === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar color = helpers.color(me._model[key]).mix(helpers.color(me._start[key]), ease);\n\t\t\t\t\t\tme._view[key] = color.rgbString();\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tme._view[key] = value;\n\t\t\t\t\t}\n\t\t\t\t// Number transitions\n\t\t\t\t} else if (typeof value === 'number') {\n\t\t\t\t\tvar startVal = me._start[key] !== undefined && isNaN(me._start[key]) === false ? me._start[key] : 0;\n\t\t\t\t\tme._view[key] = ((me._model[key] - startVal) * ease) + startVal;\n\t\t\t\t// Everything else\n\t\t\t\t} else {\n\t\t\t\t\tme._view[key] = value;\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn me;\n\t\t},\n\n\t\ttooltipPosition: function() {\n\t\t\treturn {\n\t\t\t\tx: this._model.x,\n\t\t\t\ty: this._model.y\n\t\t\t};\n\t\t},\n\n\t\thasValue: function() {\n\t\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t\t}\n\t});\n\n\tChart.Element.extend = helpers.inherits;\n\n};\n\n},{}],26:[function(require,module,exports){\n/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require(3);\n\nmodule.exports = function(Chart) {\n\t// Global Chart helpers object for utility methods and classes\n\tvar helpers = Chart.helpers = {};\n\n\t// -- Basic js utility methods\n\thelpers.each = function(loopable, callback, self, reverse) {\n\t\t// Check to see if null or undefined firstly.\n\t\tvar i, len;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tcallback.call(self, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tcallback.call(self, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof loopable === 'object') {\n\t\t\tvar keys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tcallback.call(self, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t};\n\thelpers.clone = function(obj) {\n\t\tvar objClone = {};\n\t\thelpers.each(obj, function(value, key) {\n\t\t\tif (helpers.isArray(value)) {\n\t\t\t\tobjClone[key] = value.slice(0);\n\t\t\t} else if (typeof value === 'object' && value !== null) {\n\t\t\t\tobjClone[key] = helpers.clone(value);\n\t\t\t} else {\n\t\t\t\tobjClone[key] = value;\n\t\t\t}\n\t\t});\n\t\treturn objClone;\n\t};\n\thelpers.extend = function(base) {\n\t\tvar setFn = function(value, key) {\n\t\t\tbase[key] = value;\n\t\t};\n\t\tfor (var i = 1, ilen = arguments.length; i < ilen; i++) {\n\t\t\thelpers.each(arguments[i], setFn);\n\t\t}\n\t\treturn base;\n\t};\n\t// Need a special merge function to chart configs since they are now grouped\n\thelpers.configMerge = function(_base) {\n\t\tvar base = helpers.clone(_base);\n\t\thelpers.each(Array.prototype.slice.call(arguments, 1), function(extension) {\n\t\t\thelpers.each(extension, function(value, key) {\n\t\t\t\tvar baseHasProperty = base.hasOwnProperty(key);\n\t\t\t\tvar baseVal = baseHasProperty ? base[key] : {};\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// Scale config merging is complex. Add our own function here for that\n\t\t\t\t\tbase[key] = helpers.scaleMerge(baseVal, value);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// Used in polar area & radar charts since there is only one scale\n\t\t\t\t\tbase[key] = helpers.configMerge(baseVal, Chart.scaleService.getScaleDefaults(value.type), value);\n\t\t\t\t} else if (baseHasProperty\n\t\t\t\t\t\t&& typeof baseVal === 'object'\n\t\t\t\t\t\t&& !helpers.isArray(baseVal)\n\t\t\t\t\t\t&& baseVal !== null\n\t\t\t\t\t\t&& typeof value === 'object'\n\t\t\t\t\t\t&& !helpers.isArray(value)) {\n\t\t\t\t\t// If we are overwriting an object with an object, do a merge of the properties.\n\t\t\t\t\tbase[key] = helpers.configMerge(baseVal, value);\n\t\t\t\t} else {\n\t\t\t\t\t// can just overwrite the value in this case\n\t\t\t\t\tbase[key] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn base;\n\t};\n\thelpers.scaleMerge = function(_base, extension) {\n\t\tvar base = helpers.clone(_base);\n\n\t\thelpers.each(extension, function(value, key) {\n\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t// These properties are arrays of items\n\t\t\t\tif (base.hasOwnProperty(key)) {\n\t\t\t\t\thelpers.each(value, function(valueObj, index) {\n\t\t\t\t\t\tvar axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');\n\t\t\t\t\t\tvar axisDefaults = Chart.scaleService.getScaleDefaults(axisType);\n\t\t\t\t\t\tif (index >= base[key].length || !base[key][index].type) {\n\t\t\t\t\t\t\tbase[key].push(helpers.configMerge(axisDefaults, valueObj));\n\t\t\t\t\t\t} else if (valueObj.type && valueObj.type !== base[key][index].type) {\n\t\t\t\t\t\t\t// Type changed. Bring in the new defaults before we bring in valueObj so that valueObj can override the correct scale defaults\n\t\t\t\t\t\t\tbase[key][index] = helpers.configMerge(base[key][index], axisDefaults, valueObj);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Type is the same\n\t\t\t\t\t\t\tbase[key][index] = helpers.configMerge(base[key][index], valueObj);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tbase[key] = [];\n\t\t\t\t\thelpers.each(value, function(valueObj) {\n\t\t\t\t\t\tvar axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');\n\t\t\t\t\t\tbase[key].push(helpers.configMerge(Chart.scaleService.getScaleDefaults(axisType), valueObj));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (base.hasOwnProperty(key) && typeof base[key] === 'object' && base[key] !== null && typeof value === 'object') {\n\t\t\t\t// If we are overwriting an object with an object, do a merge of the properties.\n\t\t\t\tbase[key] = helpers.configMerge(base[key], value);\n\n\t\t\t} else {\n\t\t\t\t// can just overwrite the value in this case\n\t\t\t\tbase[key] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn base;\n\t};\n\thelpers.getValueAtIndexOrDefault = function(value, index, defaultValue) {\n\t\tif (value === undefined || value === null) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif (helpers.isArray(value)) {\n\t\t\treturn index < value.length ? value[index] : defaultValue;\n\t\t}\n\n\t\treturn value;\n\t};\n\thelpers.getValueOrDefault = function(value, defaultValue) {\n\t\treturn value === undefined ? defaultValue : value;\n\t};\n\thelpers.indexOf = Array.prototype.indexOf?\n\t\tfunction(array, item) {\n\t\t\treturn array.indexOf(item);\n\t\t}:\n\t\tfunction(array, item) {\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (array[i] === item) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (startIndex === undefined || startIndex === null) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (startIndex === undefined || startIndex === null) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.inherits = function(extensions) {\n\t\t// Basic javascript inheritance based on the model created in Backbone.js\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\n\t\treturn ChartElement;\n\t};\n\thelpers.noop = function() {};\n\thelpers.uid = (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}());\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\treturn Math.log(x) / Math.LN10;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x,\n\t\t\tdistanceFromYCenter = anglePoint.y - centrePoint.y,\n\t\t\tradialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint,\n\t\t\tcurrent = middlePoint,\n\t\t\tnext = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Easing functions adapted from Robert Penner's easing equations\n\t// http://www.robertpenner.com/easing/\n\tvar easingEffects = helpers.easingEffects = {\n\t\tlinear: function(t) {\n\t\t\treturn t;\n\t\t},\n\t\teaseInQuad: function(t) {\n\t\t\treturn t * t;\n\t\t},\n\t\teaseOutQuad: function(t) {\n\t\t\treturn -1 * t * (t - 2);\n\t\t},\n\t\teaseInOutQuad: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t;\n\t\t\t}\n\t\t\treturn -1 / 2 * ((--t) * (t - 2) - 1);\n\t\t},\n\t\teaseInCubic: function(t) {\n\t\t\treturn t * t * t;\n\t\t},\n\t\teaseOutCubic: function(t) {\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * t + 1);\n\t\t},\n\t\teaseInOutCubic: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t;\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * t + 2);\n\t\t},\n\t\teaseInQuart: function(t) {\n\t\t\treturn t * t * t * t;\n\t\t},\n\t\teaseOutQuart: function(t) {\n\t\t\treturn -1 * ((t = t / 1 - 1) * t * t * t - 1);\n\t\t},\n\t\teaseInOutQuart: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t * t;\n\t\t\t}\n\t\t\treturn -1 / 2 * ((t -= 2) * t * t * t - 2);\n\t\t},\n\t\teaseInQuint: function(t) {\n\t\t\treturn 1 * (t /= 1) * t * t * t * t;\n\t\t},\n\t\teaseOutQuint: function(t) {\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * t * t * t + 1);\n\t\t},\n\t\teaseInOutQuint: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t * t * t;\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * t * t * t + 2);\n\t\t},\n\t\teaseInSine: function(t) {\n\t\t\treturn -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;\n\t\t},\n\t\teaseOutSine: function(t) {\n\t\t\treturn 1 * Math.sin(t / 1 * (Math.PI / 2));\n\t\t},\n\t\teaseInOutSine: function(t) {\n\t\t\treturn -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);\n\t\t},\n\t\teaseInExpo: function(t) {\n\t\t\treturn (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));\n\t\t},\n\t\teaseOutExpo: function(t) {\n\t\t\treturn (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);\n\t\t},\n\t\teaseInOutExpo: function(t) {\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (t === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * Math.pow(2, 10 * (t - 1));\n\t\t\t}\n\t\t\treturn 1 / 2 * (-Math.pow(2, -10 * --t) + 2);\n\t\t},\n\t\teaseInCirc: function(t) {\n\t\t\tif (t >= 1) {\n\t\t\t\treturn t;\n\t\t\t}\n\t\t\treturn -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);\n\t\t},\n\t\teaseOutCirc: function(t) {\n\t\t\treturn 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);\n\t\t},\n\t\teaseInOutCirc: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn -1 / 2 * (Math.sqrt(1 - t * t) - 1);\n\t\t\t}\n\t\t\treturn 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t\t},\n\t\teaseInElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1) === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * 0.3;\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t},\n\t\teaseOutElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1) === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * 0.3;\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;\n\t\t},\n\t\teaseInOutElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1 / 2) === 2) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * (0.3 * 1.5);\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\tif (t < 1) {\n\t\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t\t}\n\t\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t\t},\n\t\teaseInBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\treturn 1 * (t /= 1) * t * ((s + 1) * t - s);\n\t\t},\n\t\teaseOutBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);\n\t\t},\n\t\teaseInOutBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t\t},\n\t\teaseInBounce: function(t) {\n\t\t\treturn 1 - easingEffects.easeOutBounce(1 - t);\n\t\t},\n\t\teaseOutBounce: function(t) {\n\t\t\tif ((t /= 1) < (1 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * t * t);\n\t\t\t} else if (t < (2 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);\n\t\t\t} else if (t < (2.5 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);\n\t\t\t}\n\t\t\treturn 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);\n\t\t},\n\t\teaseInOutBounce: function(t) {\n\t\t\tif (t < 1 / 2) {\n\t\t\t\treturn easingEffects.easeInBounce(t * 2) * 0.5;\n\t\t\t}\n\t\t\treturn easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;\n\t\t}\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt,\n\t\t\tcanvas = evt.currentTarget || evt.srcElement,\n\t\t\tboundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\thelpers.addEvent = function(node, eventType, method) {\n\t\tif (node.addEventListener) {\n\t\t\tnode.addEventListener(eventType, method);\n\t\t} else if (node.attachEvent) {\n\t\t\tnode.attachEvent('on' + eventType, method);\n\t\t} else {\n\t\t\tnode['on' + eventType] = method;\n\t\t}\n\t};\n\thelpers.removeEvent = function(node, eventType, handler) {\n\t\tif (node.removeEventListener) {\n\t\t\tnode.removeEventListener(eventType, handler, false);\n\t\t} else if (node.detachEvent) {\n\t\t\tnode.detachEvent('on' + eventType, handler);\n\t\t} else {\n\t\t\tnode['on' + eventType] = helpers.noop;\n\t\t}\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof(styleValue) === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw)? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch)? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tcanvas.style.height = height + 'px';\n\t\tcanvas.style.width = width + 'px';\n\t};\n\t// -- Canvas methods\n\thelpers.clear = function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t};\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\thelpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + radius, y);\n\t\tctx.lineTo(x + width - radius, y);\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\tctx.lineTo(x + width, y + height - radius);\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\tctx.lineTo(x + radius, y + height);\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\tctx.lineTo(x, y + radius);\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\tctx.closePath();\n\t};\n\thelpers.color = function(c) {\n\t\tif (!color) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn c;\n\t\t}\n\n\t\t/* global CanvasGradient */\n\t\tif (c instanceof CanvasGradient) {\n\t\t\treturn color(Chart.defaults.global.defaultColor);\n\t\t}\n\n\t\treturn color(c);\n\t};\n\thelpers.isArray = Array.isArray?\n\t\tfunction(obj) {\n\t\t\treturn Array.isArray(obj);\n\t\t} :\n\t\tfunction(obj) {\n\t\t\treturn Object.prototype.toString.call(obj) === '[object Array]';\n\t\t};\n\t// ! @see http://stackoverflow.com/a/14853974\n\thelpers.arrayEquals = function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen=a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\thelpers.callCallback = function(fn, args, _tArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\tfn.apply(_tArg, args);\n\t\t}\n\t};\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n\n},{\"3\":3}],27:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\tvar helpers = Chart.helpers;\n\n\t/**\n\t * Helper function to get relative position for an event\n\t * @param {Event|IEvent} event - The event to get the position for\n\t * @param {Chart} chart - The chart\n\t * @returns {Point} the event position\n\t */\n\tfunction getRelativePosition(e, chart) {\n\t\tif (e.native) {\n\t\t\treturn {\n\t\t\t\tx: e.x,\n\t\t\t\ty: e.y\n\t\t\t};\n\t\t}\n\n\t\treturn helpers.getRelativePosition(e, chart);\n\t}\n\n\t/**\n\t * Helper function to traverse all of the visible elements in the chart\n\t * @param chart {chart} the chart\n\t * @param handler {Function} the callback to execute for each visible item\n\t */\n\tfunction parseVisibleItems(chart, handler) {\n\t\tvar datasets = chart.data.datasets;\n\t\tvar meta, i, j, ilen, jlen;\n\n\t\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\t\tvar element = meta.data[j];\n\t\t\t\tif (!element._view.skip) {\n\t\t\t\t\thandler(element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to get the items that intersect the event position\n\t * @param items {ChartElement[]} elements to filter\n\t * @param position {Point} the point to be nearest to\n\t * @return {ChartElement[]} the nearest items\n\t */\n\tfunction getIntersectItems(chart, position) {\n\t\tvar elements = [];\n\n\t\tparseVisibleItems(chart, function(element) {\n\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn elements;\n\t}\n\n\t/**\n\t * Helper function to get the items nearest to the event position considering all visible items in teh chart\n\t * @param chart {Chart} the chart to look at elements from\n\t * @param position {Point} the point to be nearest to\n\t * @param intersect {Boolean} if true, only consider items that intersect the position\n\t * @param distanceMetric {Function} Optional function to provide the distance between\n\t * @return {ChartElement[]} the nearest items\n\t */\n\tfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\tvar nearestItems = [];\n\n\t\tif (!distanceMetric) {\n\t\t\tdistanceMetric = helpers.distanceBetweenPoints;\n\t\t}\n\n\t\tparseVisibleItems(chart, function(element) {\n\t\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar center = element.getCenterPoint();\n\t\t\tvar distance = distanceMetric(position, center);\n\n\t\t\tif (distance < minDistance) {\n\t\t\t\tnearestItems = [element];\n\t\t\t\tminDistance = distance;\n\t\t\t} else if (distance === minDistance) {\n\t\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\t\tnearestItems.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn nearestItems;\n\t}\n\n\tfunction indexMode(chart, e, options) {\n\t\tvar position = getRelativePosition(e, chart.chart);\n\t\tvar distanceMetric = function(pt1, pt2) {\n\t\t\treturn Math.abs(pt1.x - pt2.x);\n\t\t};\n\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\t\tvar elements = [];\n\n\t\tif (!items.length) {\n\t\t\treturn [];\n\t\t}\n\n\t\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex),\n\t\t\t\t\telement = meta.data[items[0]._index];\n\n\t\t\t\t// don't count items that are skipped (null data)\n\t\t\t\tif (element && !element._view.skip) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn elements;\n\t}\n\n\t/**\n\t * @interface IInteractionOptions\n\t */\n\t/**\n\t * If true, only consider items that intersect the point\n\t * @name IInterfaceOptions#boolean\n\t * @type Boolean\n\t */\n\n\t/**\n\t * Contains interaction related functions\n\t * @namespace Chart.Interaction\n\t */\n\tChart.Interaction = {\n\t\t// Helper function for different modes\n\t\tmodes: {\n\t\t\tsingle: function(chart, e) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar elements = [];\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\treturn elements;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements.slice(0, 1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @function Chart.Interaction.modes.label\n\t\t\t * @deprecated since version 2.4.0\n\t\t\t */\n\t\t\tlabel: indexMode,\n\n\t\t\t/**\n\t\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t\t * @function Chart.Interaction.modes.index\n\t\t\t * @since v2.4.0\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tindex: indexMode,\n\n\t\t\t/**\n\t\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t\t * @function Chart.Interaction.modes.dataset\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tdataset: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false);\n\n\t\t\t\tif (items.length > 0) {\n\t\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t\t}\n\n\t\t\t\treturn items;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @function Chart.Interaction.modes.x-axis\n\t\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t\t */\n\t\t\t'x-axis': function(chart, e) {\n\t\t\t\treturn indexMode(chart, e, true);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Point mode returns all elements that hit test based on the event position\n\t\t\t * of the event\n\t\t\t * @function Chart.Interaction.modes.intersect\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tpoint: function(chart, e) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\treturn getIntersectItems(chart, position);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * nearest mode returns the element closest to the point\n\t\t\t * @function Chart.Interaction.modes.intersect\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tnearest: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect);\n\n\t\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\t\tif (nearestItems.length > 1) {\n\t\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ret;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Return only 1 item\n\t\t\t\treturn nearestItems.slice(0, 1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t\t * @function Chart.Interaction.modes.x\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tx: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar items = [];\n\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t// that intersect the position, return nothing\n\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\titems = [];\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t\t * @function Chart.Interaction.modes.y\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\ty: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart.chart);\n\t\t\t\tvar items = [];\n\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t// that intersect the position, return nothing\n\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\titems = [];\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{}],28:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.controller = new Chart.Controller(item, config, this);\n\t\treturn this.controller;\n\t};\n\n\t// Globally expose the defaults to allow for user updating/changing\n\tChart.defaults = {\n\t\tglobal: {\n\t\t\tresponsive: true,\n\t\t\tresponsiveAnimationDuration: 0,\n\t\t\tmaintainAspectRatio: true,\n\t\t\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\t\t\thover: {\n\t\t\t\tonHover: null,\n\t\t\t\tmode: 'nearest',\n\t\t\t\tintersect: true,\n\t\t\t\tanimationDuration: 400\n\t\t\t},\n\t\t\tonClick: null,\n\t\t\tdefaultColor: 'rgba(0,0,0,0.1)',\n\t\t\tdefaultFontColor: '#666',\n\t\t\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\t\t\tdefaultFontSize: 12,\n\t\t\tdefaultFontStyle: 'normal',\n\t\t\tshowLines: true,\n\n\t\t\t// Element defaults defined in element extensions\n\t\t\telements: {},\n\n\t\t\t// Legend callback string\n\t\t\tlegendCallback: function(chart) {\n\t\t\t\tvar text = [];\n\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\t\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t\ttext.push('</ul>');\n\n\t\t\t\treturn text.join('');\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n\n},{}],29:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t// The layout service is very self explanatory.  It's responsible for the layout within a chart.\n\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t// It is this service's responsibility of carrying out that layout.\n\tChart.layoutService = {\n\t\tdefaults: {},\n\n\t\t// Register a box to a chartInstance. A box is simply a reference to an object that requires layout. eg. Scales, Legend, Plugins.\n\t\taddBox: function(chartInstance, box) {\n\t\t\tif (!chartInstance.boxes) {\n\t\t\t\tchartInstance.boxes = [];\n\t\t\t}\n\t\t\tchartInstance.boxes.push(box);\n\t\t},\n\n\t\tremoveBox: function(chartInstance, box) {\n\t\t\tif (!chartInstance.boxes) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchartInstance.boxes.splice(chartInstance.boxes.indexOf(box), 1);\n\t\t},\n\n\t\t// The most important function\n\t\tupdate: function(chartInstance, width, height) {\n\n\t\t\tif (!chartInstance) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar layoutOptions = chartInstance.options.layout;\n\t\t\tvar padding = layoutOptions ? layoutOptions.padding : null;\n\n\t\t\tvar leftPadding = 0;\n\t\t\tvar rightPadding = 0;\n\t\t\tvar topPadding = 0;\n\t\t\tvar bottomPadding = 0;\n\n\t\t\tif (!isNaN(padding)) {\n\t\t\t\t// options.layout.padding is a number. assign to all\n\t\t\t\tleftPadding = padding;\n\t\t\t\trightPadding = padding;\n\t\t\t\ttopPadding = padding;\n\t\t\t\tbottomPadding = padding;\n\t\t\t} else {\n\t\t\t\tleftPadding = padding.left || 0;\n\t\t\t\trightPadding = padding.right || 0;\n\t\t\t\ttopPadding = padding.top || 0;\n\t\t\t\tbottomPadding = padding.bottom || 0;\n\t\t\t}\n\n\t\t\tvar leftBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'left';\n\t\t\t});\n\t\t\tvar rightBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'right';\n\t\t\t});\n\t\t\tvar topBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'top';\n\t\t\t});\n\t\t\tvar bottomBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'bottom';\n\t\t\t});\n\n\t\t\t// Boxes that overlay the chartarea such as the radialLinear scale\n\t\t\tvar chartAreaBoxes = helpers.where(chartInstance.boxes, function(box) {\n\t\t\t\treturn box.options.position === 'chartArea';\n\t\t\t});\n\n\t\t\t// Ensure that full width boxes are at the very top / bottom\n\t\t\ttopBoxes.sort(function(a, b) {\n\t\t\t\treturn (b.options.fullWidth ? 1 : 0) - (a.options.fullWidth ? 1 : 0);\n\t\t\t});\n\t\t\tbottomBoxes.sort(function(a, b) {\n\t\t\t\treturn (a.options.fullWidth ? 1 : 0) - (b.options.fullWidth ? 1 : 0);\n\t\t\t});\n\n\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t// Our canvas looks like the following.\n\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t// B1 is the bottom axis\n\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t// an error will be thrown.\n\t\t\t//\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  T1 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |    |    |                 T2                  |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    | C1 |                           | C2 |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// | L1 | L2 |           ChartArea (C0)            | R1 |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    | C3 |                           | C4 |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    |                 B1                  |    |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  B2 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t//\n\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t// 6. Refit each axis\n\t\t\t// 7. Position each axis in the final location\n\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t// Step 1\n\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t// Step 2\n\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t// Step 3\n\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t// Step 4\n\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\tvar minBoxSizes = [];\n\n\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\tvar minSize;\n\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize = box.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t} else {\n\t\t\t\t\tminSize = box.update(verticalBoxWidth, chartAreaHeight);\n\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t}\n\n\t\t\t\tminBoxSizes.push({\n\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\tminSize: minSize,\n\t\t\t\t\tbox: box,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t// Steps 5 & 6\n\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t// Function to fit a box\n\t\t\tfunction fitBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t});\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\tbox.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t});\n\n\t\t\t\tvar scaleMargin = {\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t};\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Let the left layout know the final margin\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t// without calling `fit` again\n\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\t\tif (!box.options.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\t\tif (!box.options.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t}\n\n\t\t\t// Step 7 - Position the boxes\n\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\tfunction placeBox(box) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tbox.left = box.options.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\tbox.right = box.options.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\tbox.top = top;\n\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\ttop = box.bottom;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.left = left;\n\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\tleft = box.right;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t// Account for chart width and height\n\t\t\tleft += maxChartAreaWidth;\n\t\t\ttop += maxChartAreaHeight;\n\n\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t// Step 8\n\t\t\tchartInstance.chartArea = {\n\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t};\n\n\t\t\t// Step 9\n\t\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\t\tbox.left = chartInstance.chartArea.left;\n\t\t\t\tbox.top = chartInstance.chartArea.top;\n\t\t\t\tbox.right = chartInstance.chartArea.right;\n\t\t\t\tbox.bottom = chartInstance.chartArea.bottom;\n\n\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{}],30:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar noop = helpers.noop;\n\n\tChart.defaults.global.legend = {\n\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)\n\t\treverse: false,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Helper function to get the box width based on the usePointStyle option\n\t * @param labelopts {Object} the label options on the legend\n\t * @param fontSize {Number} the label font size\n\t * @return {Number} width of the color box area\n\t */\n\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\treturn labelOpts.usePointStyle ?\n\t\t\tfontSize * Math.SQRT2 :\n\t\t\tlabelOpts.boxWidth;\n\t}\n\n\tChart.Legend = Chart.Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\thelpers.extend(this, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\tthis.doughnutMode = false;\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t// Any function defined here is inherited by all legend types.\n\t\t// Any function can be extended by the legend type\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: function() {\n\t\t\tvar me = this;\n\t\t\tvar labelOpts = me.options.labels;\n\t\t\tvar legendItems = labelOpts.generateLabels.call(me, me.chart);\n\n\t\t\tif (labelOpts.filter) {\n\t\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (me.options.reverse) {\n\t\t\t\tlegendItems.reverse();\n\t\t\t}\n\n\t\t\tme.legendItems = legendItems;\n\t\t},\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar display = opts.display;\n\n\t\t\tvar ctx = me.ctx;\n\n\t\t\tvar globalDefault = Chart.defaults.global,\n\t\t\t\titemOrDefault = helpers.getValueOrDefault,\n\t\t\t\tfontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\n\t\t\t\tfontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),\n\t\t\t\tfontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\n\t\t\t\tlabelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t// Reset hit boxes\n\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Increase sizes here\n\t\t\tif (display) {\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// Labels\n\n\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\ttotalHeight += fontSize + (labelOpts.padding);\n\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t});\n\n\t\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t\t} else {\n\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\n\t\t// Actually draw the legend on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar globalDefault = Chart.defaults.global,\n\t\t\t\tlineDefault = globalDefault.elements.line,\n\t\t\t\tlegendWidth = me.width,\n\t\t\t\tlineWidths = me.lineWidths;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx,\n\t\t\t\t\tcursor,\n\t\t\t\t\titemOrDefault = helpers.getValueOrDefault,\n\t\t\t\t\tfontColor = itemOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor),\n\t\t\t\t\tfontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\n\t\t\t\t\tfontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),\n\t\t\t\t\tfontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\n\t\t\t\t\tlabelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t// Canvas setup\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'top';\n\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize),\n\t\t\t\t\thitboxes = me.legendHitBoxes;\n\n\t\t\t\t// current position\n\t\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\tctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\tctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\tctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\tctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\tctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\tctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\tvar isLineWidthZero = (itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\tctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\tChart.canvasHelpers.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.restore();\n\t\t\t\t};\n\t\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\t\tctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\n\n\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\tctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\n\t\t\t\t\t\tctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Horizontal\n\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2),\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width,\n\t\t\t\t\t\twidth = boxWidth + (fontSize / 2) + textWidth,\n\t\t\t\t\t\tx = cursor.x,\n\t\t\t\t\t\ty = cursor.y;\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t// Fill the actual label\n\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tcursor.x += width + (labelOpts.padding);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @return {Boolean} true if a change occured\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\tvar changed = false;\n\n\t\t\tif (type === 'mousemove') {\n\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (type === 'click') {\n\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Chart event already has relative position in it\n\t\t\tvar x = e.x,\n\t\t\t\ty = e.y;\n\n\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\tfunction createNewLegendAndAttach(chartInstance, legendOpts) {\n\t\tvar legend = new Chart.Legend({\n\t\t\tctx: chartInstance.chart.ctx,\n\t\t\toptions: legendOpts,\n\t\t\tchart: chartInstance\n\t\t});\n\t\tchartInstance.legend = legend;\n\t\tChart.layoutService.addBox(chartInstance, legend);\n\t}\n\n\t// Register the legend plugin\n\tChart.plugins.register({\n\t\tbeforeInit: function(chartInstance) {\n\t\t\tvar legendOpts = chartInstance.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tcreateNewLegendAndAttach(chartInstance, legendOpts);\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function(chartInstance) {\n\t\t\tvar legendOpts = chartInstance.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tlegendOpts = helpers.configMerge(Chart.defaults.global.legend, legendOpts);\n\n\t\t\t\tif (chartInstance.legend) {\n\t\t\t\t\tchartInstance.legend.options = legendOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewLegendAndAttach(chartInstance, legendOpts);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tChart.layoutService.removeBox(chartInstance, chartInstance.legend);\n\t\t\t\tdelete chartInstance.legend;\n\t\t\t}\n\t\t},\n\t\tafterEvent: function(chartInstance, e) {\n\t\t\tvar legend = chartInstance.legend;\n\t\t\tif (legend) {\n\t\t\t\tlegend.handleEvent(e);\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],31:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.plugins = {};\n\n\t/**\n\t * The plugin service singleton\n\t * @namespace Chart.plugins\n\t * @since 2.1.0\n\t */\n\tChart.plugins = {\n\t\t/**\n\t\t * Globally registered plugins.\n\t\t * @private\n\t\t */\n\t\t_plugins: [],\n\n\t\t/**\n\t\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t\t * incremented and descriptors are regenerated during following API calls.\n\t\t * @private\n\t\t */\n\t\t_cacheId: 0,\n\n\t\t/**\n\t\t * Registers the given plugin(s) if not already registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\tp.push(plugin);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Unregisters the given plugin(s) only if registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tunregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Remove all registered plugins.\n\t\t * @since 2.1.5\n\t\t */\n\t\tclear: function() {\n\t\t\tthis._plugins = [];\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Returns the number of registered plugins?\n\t\t * @returns {Number}\n\t\t * @since 2.1.5\n\t\t */\n\t\tcount: function() {\n\t\t\treturn this._plugins.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns all registered plugin instances.\n\t\t * @returns {Array} array of plugin objects.\n\t\t * @since 2.1.5\n\t\t */\n\t\tgetAll: function() {\n\t\t\treturn this._plugins;\n\t\t},\n\n\t\t/**\n\t\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t\t * returned value can be used, for instance, to interrupt the current action.\n\t\t * @param {Object} chart - The chart instance for which plugins should be called.\n\t\t * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t\t * @param {Array} [args] - Extra arguments to apply to the hook call.\n\t\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t\t */\n\t\tnotify: function(chart, hook, args) {\n\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\tvar ilen = descriptors.length;\n\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\tfor (i=0; i<ilen; ++i) {\n\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\tmethod = plugin[hook];\n\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\tif (method.apply(plugin, params) === false) {\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\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Returns descriptors of enabled plugins for the given chart.\n\t\t * @returns {Array} [{ plugin, options }]\n\t\t * @private\n\t\t */\n\t\tdescriptors: function(chart) {\n\t\t\tvar cache = chart._plugins || (chart._plugins = {});\n\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\treturn cache.descriptors;\n\t\t\t}\n\n\t\t\tvar plugins = [];\n\t\t\tvar descriptors = [];\n\t\t\tvar config = (chart && chart.config) || {};\n\t\t\tvar defaults = Chart.defaults.global.plugins;\n\t\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar id = plugin.id;\n\t\t\t\tvar opts = options[id];\n\t\t\t\tif (opts === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (opts === true) {\n\t\t\t\t\topts = helpers.clone(defaults[id]);\n\t\t\t\t}\n\n\t\t\t\tplugins.push(plugin);\n\t\t\t\tdescriptors.push({\n\t\t\t\t\tplugin: plugin,\n\t\t\t\t\toptions: opts || {}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcache.descriptors = descriptors;\n\t\t\tcache.id = this._cacheId;\n\t\t\treturn descriptors;\n\t\t}\n\t};\n\n\t/**\n\t * Plugin extension hooks.\n\t * @interface IPlugin\n\t * @since 2.1.0\n\t */\n\t/**\n\t * @method IPlugin#beforeInit\n\t * @desc Called before initializing `chart`.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterInit\n\t * @desc Called after `chart` has been initialized and before the first update.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeUpdate\n\t * @desc Called before updating `chart`. If any plugin returns `false`, the update\n\t * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart update.\n\t */\n\t/**\n\t * @method IPlugin#afterUpdate\n\t * @desc Called after `chart` has been updated and before rendering. Note that this\n\t * hook will not be called if the chart update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsUpdate\n \t * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n\t * the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} false to cancel the datasets update.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsUpdate\n\t * @desc Called after the `chart` datasets have been updated. Note that this hook\n\t * will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#beforeLayout\n\t * @desc Called before laying out `chart`. If any plugin returns `false`,\n\t * the layout update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart layout.\n\t */\n\t/**\n\t * @method IPlugin#afterLayout\n\t * @desc Called after the `chart` has been layed out. Note that this hook will not\n\t * be called if the layout update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeRender\n\t * @desc Called before rendering `chart`. If any plugin returns `false`,\n\t * the rendering is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart rendering.\n\t */\n\t/**\n\t * @method IPlugin#afterRender\n\t * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n\t * that this hook will not be called if the rendering has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDraw\n\t * @desc Called before drawing `chart` at every animation frame specified by the given\n\t * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n\t * another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDraw\n\t * @desc Called after the `chart` has been drawn for the specific easing value. Note\n\t * that this hook will not be called if the drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsDraw\n \t * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n\t * the datasets drawing is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsDraw\n\t * @desc Called after the `chart` datasets have been drawn. Note that this hook\n\t * will not be called if the datasets drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeEvent\n \t * @desc Called before processing the specified `event`. If any plugin returns `false`,\n\t * the event will be discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterEvent\n\t * @desc Called after the `event` has been consumed. Note that this hook\n\t * will not be called if the `event` has been previously discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#resize\n\t * @desc Called after the chart as been resized.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#destroy\n\t * @desc Called after the chart as been destroyed.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\n\t/**\n\t * Provided for backward compatibility, use Chart.plugins instead\n\t * @namespace Chart.pluginService\n\t * @deprecated since version 2.1.5\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.pluginService = Chart.plugins;\n\n\t/**\n\t * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n\t * effect, instead simply create/register plugins via plain JavaScript objects.\n\t * @interface Chart.PluginBase\n\t * @deprecated since version 2.5.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.PluginBase = helpers.inherits({});\n};\n\n},{}],32:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.scale = {\n\t\tdisplay: true,\n\t\tposition: 'left',\n\n\t\t// grid line settings\n\t\tgridLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1,\n\t\t\tdrawBorder: true,\n\t\t\tdrawOnChartArea: true,\n\t\t\tdrawTicks: true,\n\t\t\ttickMarkLength: 10,\n\t\t\tzeroLineWidth: 1,\n\t\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\t\toffsetGridLines: false,\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0\n\t\t},\n\n\t\t// scale label\n\t\tscaleLabel: {\n\t\t\t// actual label\n\t\t\tlabelString: '',\n\n\t\t\t// display property\n\t\t\tdisplay: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tbeginAtZero: false,\n\t\t\tminRotation: 0,\n\t\t\tmaxRotation: 50,\n\t\t\tmirror: false,\n\t\t\tpadding: 0,\n\t\t\treverse: false,\n\t\t\tdisplay: true,\n\t\t\tautoSkip: true,\n\t\t\tautoSkipPadding: 0,\n\t\t\tlabelOffset: 0,\n\t\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\t\tcallback: Chart.Ticks.formatters.values\n\t\t}\n\t};\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\tvar globalDefaults = Chart.defaults.global;\n\t\tvar size = getValueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = getValueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = getValueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tChart.Scale = Chart.Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callCallback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks\n\t\t\tme.beforeBuildTicks();\n\t\t\tme.buildTicks();\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\t\t\tme.convertTicksToLabels();\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callCallback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callCallback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callCallback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callCallback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callCallback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callCallback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callCallback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callCallback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callCallback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callCallback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, me.ticks, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation;\n\t\t\t\tvar sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callCallback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callCallback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar scaleLabelFontSize = parseFontOptions(scaleLabelOpts).size * 1.5;\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += scaleLabelFontSize;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += scaleLabelFontSize;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, me.ticks, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(me.ticks);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * tallestLabelHeightInLines);\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight);\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\n\t\t\t\t\tvar firstTick = me.ticks[0];\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, firstTick, tickFont.font);\n\n\t\t\t\t\tvar lastTick = me.ticks[me.ticks.length - 1];\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, lastTick, tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned which means that the right padding is dominated\n\t\t\t\t\t// by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom'? (cosRotation * firstLabelWidth) + 3: (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom'? (cosRotation * lineSpace) + 3: (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the dominant factor here, so get that length first\n\t\t\t\t\t// Account for padding\n\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlargestTextWidth += me.options.ticks.padding;\n\t\t\t\t\t}\n\t\t\t\t\tminSize.width += largestTextWidth;\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callCallback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (rawValue === null || typeof(rawValue) === 'undefined') {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof(rawValue) === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (typeof(rawValue) === 'object') {\n\t\t\t\tif ((rawValue instanceof Date) || (rawValue.isValid)) {\n\t\t\t\t\treturn rawValue;\n\t\t\t\t}\n\t\t\t\treturn this.getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t// Used to get the value to display in the tooltip for the data at the given index\n\t\t// function getLabelForIndex(index, datasetIndex)\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t// Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t// Used for tick location, should\n\t\tgetPixelForTick: function(index, includeOffset) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (includeOffset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me.ticks.length - 1)));\n\t\t},\n\n\t\t// Utility for getting the pixel location of a percentage of scale\n\t\tgetPixelForDecimal: function(decimal /* , includeOffset*/) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.beginAtZero ? 0:\n\t\t\t\tmin < 0 && max < 0? max :\n\t\t\t\tmin > 0 && max > 0? min :\n\t\t\t\t0;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = Chart.defaults.global;\n\t\t\tvar optionTicks = options.ticks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar skipRatio;\n\t\t\tvar useAutoskipper = optionTicks.autoSkip;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tvar tickFontColor = helpers.getValueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\t\t\tvar borderDash = helpers.getValueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\tvar borderDashOffset = helpers.getValueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\n\t\t\tvar scaleLabelFontColor = helpers.getValueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\n\t\t\t// Make sure we draw text in the correct color and font\n\t\t\tcontext.fillStyle = tickFontColor;\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\t// Only calculate the skip ratio with the half width of longestRotateLabel if we got an actual rotation\n\t\t\t\t// See #2584\n\t\t\t\tif (isRotated) {\n\t\t\t\t\tlongestRotatedLabel /= 2;\n\t\t\t\t}\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && me.ticks.length > maxTicks) {\n\t\t\t\t\twhile (!skipRatio || me.ticks.length / (skipRatio || 1) > maxTicks) {\n\t\t\t\t\t\tif (!skipRatio) {\n\t\t\t\t\t\t\tskipRatio = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipRatio += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!useAutoskipper) {\n\t\t\t\t\tskipRatio = false;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t// If the callback returned a null or undefined value, do not draw this line\n\t\t\t\tif (label === undefined || label === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar isLastTick = me.ticks.length === index + 1;\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tvar shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= me.ticks.length);\n\t\t\t\tif (shouldSkip && !isLastTick || (label === undefined || label === null)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar lineWidth, lineColor;\n\t\t\t\tif (index === (typeof me.zeroLineIndex !== 'undefined' ? me.zeroLineIndex : 0)) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.getValueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\n\t\t\t\tif (isHorizontal) {\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated? 'top':'middle';\n\t\t\t\t\t\ttextAlign = !isRotated? 'center': 'right';\n\t\t\t\t\t\tlabelY = me.top + tl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated? 'bottom':'middle';\n\t\t\t\t\t\ttextAlign = !isRotated? 'center': 'left';\n\t\t\t\t\t\tlabelY = me.bottom - tl;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = me.getPixelForTick(index) + helpers.aliasPixel(lineWidth); // xvalues for grid lines\n\t\t\t\t\tlabelX = me.getPixelForTick(index, gridLines.offsetGridLines) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar tickPadding = optionTicks.padding;\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = me.getPixelForTick(index); // xvalues for grid lines\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\t\t\t\t\tlabelY = me.getPixelForTick(index, gridLines.offsetGridLines);\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = tickFont.font;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tfor (var i = 0, y = 0; i < label.length; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += (tickFont.size * 1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom' ? me.bottom - (scaleLabelFont.size / 2) : me.top + (scaleLabelFont.size / 2);\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft ? me.left + (scaleLabelFont.size / 2) : me.right - (scaleLabelFont.size / 2);\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.getValueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left,\n\t\t\t\t\tx2 = me.right,\n\t\t\t\t\ty1 = me.top,\n\t\t\t\t\ty2 = me.bottom;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],33:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, defaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(defaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.scaleMerge(Chart.defaults.scale, this.defaults[type]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar defaults = this.defaults;\n\t\t\tif (defaults.hasOwnProperty(type)) {\n\t\t\t\tdefaults[type] = helpers.extend(defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chartInstance) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chartInstance.scales, function(scale) {\n\t\t\t\tChart.layoutService.addBox(chartInstance, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n\n},{}],34:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t/**\n\t * Namespace to hold static tick generation functions\n\t * @namespace Chart.Ticks\n\t */\n\tChart.Ticks = {\n\t\t/**\n\t\t * Namespace to hold generators for different types of ticks\n\t\t * @namespace Chart.Ticks.generators\n\t\t */\n\t\tgenerators: {\n\t\t\t/**\n\t\t\t * Interface for the options provided to the numeric tick generator\n\t\t\t * @interface INumericTickGenerationOptions\n\t\t\t */\n\t\t\t/**\n\t\t\t * The maximum number of ticks to display\n\t\t\t * @name INumericTickGenerationOptions#maxTicks\n\t\t\t * @type Number\n\t\t\t */\n\t\t\t/**\n\t\t\t * The distance between each tick.\n\t\t\t * @name INumericTickGenerationOptions#stepSize\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\t\t\t/**\n\t\t\t * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n\t\t\t * @name INumericTickGenerationOptions#min\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\t\t\t/**\n\t\t\t * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n\t\t\t * @name INumericTickGenerationOptions#max\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Generate a set of linear ticks\n\t\t\t * @method Chart.Ticks.generators.linear\n\t\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t\t * @param dataRange {IRange} the range of the data\n\t\t\t * @returns {Array<Number>} array of tick values\n\t\t\t */\n\t\t\tlinear: function(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t\t// for details.\n\n\t\t\t\tvar spacing;\n\t\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t\t} else {\n\t\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\t\t\t\t}\n\t\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\t\tif (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n\t\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t\t// If very close to our rounded value, use it.\n\t\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t\t} else {\n\t\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t\t}\n\n\t\t\t\t// Put the values into the ticks array\n\t\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\t\tticks.push(niceMin + (j * spacing));\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\t\treturn ticks;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Generate a set of logarithmic ticks\n\t\t\t * @method Chart.Ticks.generators.logarithmic\n\t\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t\t * @param dataRange {IRange} the range of the data\n\t\t\t * @returns {Array<Number>} array of tick values\n\t\t\t */\n\t\t\tlogarithmic: function(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t// the graph\n\t\t\t\tvar tickVal = getValueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\t\tvar exp;\n\t\t\t\tvar significand;\n\n\t\t\t\tif (tickVal === 0) {\n\t\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\t\tticks.push(tickVal);\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} else {\n\t\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t\t}\n\n\t\t\t\tdo {\n\t\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t\t++significand;\n\t\t\t\t\tif (significand === 10) {\n\t\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t\t++exp;\n\t\t\t\t\t}\n\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\t\t\t\tvar lastTick = getValueOrDefault(generationOptions.max, tickVal);\n\t\t\t\tticks.push(lastTick);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Namespace to hold formatters for different types of ticks\n\t\t * @namespace Chart.Ticks.formatters\n\t\t */\n\t\tformatters: {\n\t\t\t/**\n\t\t\t * Formatter for value labels\n\t\t\t * @method Chart.Ticks.formatters.values\n\t\t\t * @param value the value to display\n\t\t\t * @return {String|Array} the label to display\n\t\t\t */\n\t\t\tvalues: function(value) {\n\t\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Formatter for linear numeric ticks\n\t\t\t * @method Chart.Ticks.formatters.linear\n\t\t\t * @param tickValue {Number} the value to be formatted\n\t\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t\t * @param ticks {Array<Number>} the list of ticks being converted\n\t\t\t * @return {String} string representation of the tickValue parameter\n\t\t\t */\n\t\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t\t// not an integer\n\t\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\t\tvar tickString = '';\n\n\t\t\t\tif (tickValue !== 0) {\n\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t\t} else {\n\t\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t\t}\n\n\t\t\t\treturn tickString;\n\t\t\t},\n\n\t\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\t\tif (tickValue === 0) {\n\t\t\t\t\treturn '0';\n\t\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\t\treturn tickValue.toExponential();\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t};\n};\n\n},{}],35:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.title = {\n\t\tdisplay: false,\n\t\tposition: 'top',\n\t\tfullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)\n\n\t\tfontStyle: 'bold',\n\t\tpadding: 10,\n\n\t\t// actual title\n\t\ttext: ''\n\t};\n\n\tvar noop = helpers.noop;\n\tChart.Title = Chart.Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\tvar me = this;\n\t\t\thelpers.extend(me, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tme.legendHitBoxes = [];\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: noop,\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this,\n\t\t\t\tvalueOrDefault = helpers.getValueOrDefault,\n\t\t\t\topts = me.options,\n\t\t\t\tglobalDefaults = Chart.defaults.global,\n\t\t\t\tdisplay = opts.display,\n\t\t\t\tfontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\n\t\t\t\tminSize = me.minSize;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? fontSize + (opts.padding * 2) : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? fontSize + (opts.padding * 2) : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\tvar pos = this.options.position;\n\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t},\n\n\t\t// Actually draw the title block on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this,\n\t\t\t\tctx = me.ctx,\n\t\t\t\tvalueOrDefault = helpers.getValueOrDefault,\n\t\t\t\topts = me.options,\n\t\t\t\tglobalDefaults = Chart.defaults.global;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\tfontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\tfontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\ttitleFont = helpers.fontString(fontSize, fontStyle, fontFamily),\n\t\t\t\t\trotation = 0,\n\t\t\t\t\ttitleX,\n\t\t\t\t\ttitleY,\n\t\t\t\t\ttop = me.top,\n\t\t\t\t\tleft = me.left,\n\t\t\t\t\tbottom = me.bottom,\n\t\t\t\t\tright = me.right,\n\t\t\t\t\tmaxWidth;\n\n\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t// Horizontal\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2); // midpoint of the height\n\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t} else {\n\t\t\t\t\ttitleX = opts.position === 'left' ? left + (fontSize / 2) : right - (fontSize / 2);\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t}\n\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\tctx.rotate(rotation);\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.fillText(opts.text, 0, 0, maxWidth);\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction createNewTitleBlockAndAttach(chartInstance, titleOpts) {\n\t\tvar title = new Chart.Title({\n\t\t\tctx: chartInstance.chart.ctx,\n\t\t\toptions: titleOpts,\n\t\t\tchart: chartInstance\n\t\t});\n\t\tchartInstance.titleBlock = title;\n\t\tChart.layoutService.addBox(chartInstance, title);\n\t}\n\n\t// Register the title plugin\n\tChart.plugins.register({\n\t\tbeforeInit: function(chartInstance) {\n\t\t\tvar titleOpts = chartInstance.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\tcreateNewTitleBlockAndAttach(chartInstance, titleOpts);\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function(chartInstance) {\n\t\t\tvar titleOpts = chartInstance.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\ttitleOpts = helpers.configMerge(Chart.defaults.global.title, titleOpts);\n\n\t\t\t\tif (chartInstance.titleBlock) {\n\t\t\t\t\tchartInstance.titleBlock.options = titleOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewTitleBlockAndAttach(chartInstance, titleOpts);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tChart.layoutService.removeBox(chartInstance, chartInstance.titleBlock);\n\t\t\t\tdelete chartInstance.titleBlock;\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],36:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\tChart.defaults.global.tooltips = {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\treturn datasetLabel + ': ' + tooltipItem.yLabel;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chartInstance) {\n\t\t\t\tvar meta = chartInstance.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t};\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index,\n\t\t\tdatasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = Chart.defaults.global;\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: getValueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: getValueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: getValueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: getValueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: getValueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: getValueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: getValueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: getValueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: getValueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize,\n\t\t\tbodyFontSize = model.bodyFontSize,\n\t\t\tfooterFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chartInstance.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n\t */\n\tfunction getBackgroundPoint(vm, size, alignment) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize,\n\t\t\tcaretPadding = vm.caretPadding,\n\t\t\tcornerRadius = vm.cornerRadius,\n\t\t\txAlign = alignment.xAlign,\n\t\t\tyAlign = alignment.yAlign,\n\t\t\tpaddingAndSize = caretSize + caretPadding,\n\t\t\tradiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Chart.Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments),\n\t\t\t\ttitle = callbacks.title.apply(me, arguments),\n\t\t\t\tafterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\t\t\tvar chartInstance = me._chartInstance;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position](active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, chartInstance));\n\t\t\t\t});\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = helpers.getValueOrDefault(tooltipPosition.padding, 2);\n\t\t\t\tmodel.labelColors = labelColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size, opacity) {\n\t\t\tvar vm = this._view;\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar x1, x2, x3;\n\t\t\tvar y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign,\n\t\t\t\tyAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x,\n\t\t\t\tptY = tooltipPoint.y;\n\t\t\tvar width = size.width,\n\t\t\t\theight = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\t// Left or right side\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t}\n\n\t\t\t\ty2 = ptY + (height / 2);\n\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\ty3 = y2 + caretSize;\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX + cornerRadius;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx1 = ptX + width - cornerRadius;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = ptX + (width / 2);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x1, y1);\n\t\t\tctx.lineTo(x2, y2);\n\t\t\tctx.lineTo(x3, y3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize,\n\t\t\t\t\ttitleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\n\t\t\tvar textColor = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\tctx.fillStyle = textColor;\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\thelpers.drawRoundedRectangle(ctx, pt.x, pt.y, tooltipSize.width, tooltipSize.height, vm.cornerRadius);\n\t\t\tctx.fill();\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\tif (this._options.enabled) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Caret\n\t\t\t\tthis.drawCaret(pt, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chartInstance.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\t\t\tme._lastActive = me._active;\n\n\t\t\tif (options.enabled || options.custom) {\n\t\t\t\tme._eventPosition = {\n\t\t\t\t\tx: e.x,\n\t\t\t\t\ty: e.y\n\t\t\t\t};\n\n\t\t\t\tvar model = me._model;\n\t\t\t\tme.update(true);\n\t\t\t\tme.pivot();\n\n\t\t\t\t// See if our tooltip position changed\n\t\t\t\tchanged |= (model.x !== me._model.x) || (model.y !== me._model.y);\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\n\t\t\tvar nearestElement;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len;\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\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\t};\n};\n\n},{}],37:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tglobalOpts = Chart.defaults.global;\n\n\tglobalOpts.elements.arc = {\n\t\tbackgroundColor: globalOpts.defaultColor,\n\t\tborderColor: '#fff',\n\t\tborderWidth: 2\n\t};\n\n\tChart.elements.Arc = Chart.Element.extend({\n\t\tinLabelRange: function(mouseX) {\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm) {\n\t\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tinRange: function(chartX, chartY) {\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm) {\n\t\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, {\n\t\t\t\t\t\tx: chartX,\n\t\t\t\t\t\ty: chartY\n\t\t\t\t\t}),\n\t\t\t\t\tangle = pointRelativePosition.angle,\n\t\t\t\t\tdistance = pointRelativePosition.distance;\n\n\t\t\t\t// Sanitise angle range\n\t\t\t\tvar startAngle = vm.startAngle;\n\t\t\t\tvar endAngle = vm.endAngle;\n\t\t\t\twhile (endAngle < startAngle) {\n\t\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t\t}\n\t\t\t\twhile (angle > endAngle) {\n\t\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t\t}\n\t\t\t\twhile (angle < startAngle) {\n\t\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\t// Check if within the range of the open/close angle\n\t\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle),\n\t\t\t\t\twithinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\t\treturn (betweenAngles && withinRadius);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\t\treturn {\n\t\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t\t};\n\t\t},\n\t\tgetArea: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\n\t\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2),\n\t\t\t\trangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\t\t\treturn {\n\t\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t\t};\n\t\t},\n\t\tdraw: function() {\n\n\t\t\tvar ctx = this._chart.ctx,\n\t\t\t\tvm = this._view,\n\t\t\t\tsA = vm.startAngle,\n\t\t\t\teA = vm.endAngle;\n\n\t\t\tctx.beginPath();\n\n\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\t\tctx.closePath();\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.lineWidth = vm.borderWidth;\n\n\t\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\t\tctx.fill();\n\t\t\tctx.lineJoin = 'bevel';\n\n\t\t\tif (vm.borderWidth) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n\n},{}],38:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar globalDefaults = Chart.defaults.global;\n\n\tChart.defaults.global.elements.line = {\n\t\ttension: 0.4,\n\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\tborderWidth: 3,\n\t\tborderColor: globalDefaults.defaultColor,\n\t\tborderCapStyle: 'butt',\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0,\n\t\tborderJoinStyle: 'miter',\n\t\tcapBezierPoints: true,\n\t\tfill: true, // do we fill in the area between the line and its base axis\n\t};\n\n\tChart.elements.Line = Chart.Element.extend({\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar vm = me._view;\n\t\t\tvar spanGaps = vm.spanGaps;\n\t\t\tvar fillPoint = vm.scaleZero;\n\t\t\tvar loop = me._loop;\n\n\t\t\t// Handle different fill modes for cartesian lines\n\t\t\tif (!loop) {\n\t\t\t\tif (vm.fill === 'top') {\n\t\t\t\t\tfillPoint = vm.scaleTop;\n\t\t\t\t} else if (vm.fill === 'bottom') {\n\t\t\t\t\tfillPoint = vm.scaleBottom;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar ctx = me._chart.ctx;\n\t\t\tctx.save();\n\n\t\t\t// Helper function to draw a line to a point\n\t\t\tfunction lineToPoint(previousPoint, point) {\n\t\t\t\tvar pointVM = point._view;\n\t\t\t\tif (point._view.steppedLine === true) {\n\t\t\t\t\tctx.lineTo(pointVM.x, previousPoint._view.y);\n\t\t\t\t\tctx.lineTo(pointVM.x, pointVM.y);\n\t\t\t\t} else if (point._view.tension === 0) {\n\t\t\t\t\tctx.lineTo(pointVM.x, pointVM.y);\n\t\t\t\t} else {\n\t\t\t\t\tctx.bezierCurveTo(\n\t\t\t\t\t\tpreviousPoint._view.controlPointNextX,\n\t\t\t\t\t\tpreviousPoint._view.controlPointNextY,\n\t\t\t\t\t\tpointVM.controlPointPreviousX,\n\t\t\t\t\t\tpointVM.controlPointPreviousY,\n\t\t\t\t\t\tpointVM.x,\n\t\t\t\t\t\tpointVM.y\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar points = me._children.slice(); // clone array\n\t\t\tvar lastDrawnIndex = -1;\n\n\t\t\t// If we are looping, adding the first point again\n\t\t\tif (loop && points.length) {\n\t\t\t\tpoints.push(points[0]);\n\t\t\t}\n\n\t\t\tvar index, current, previous, currentVM;\n\n\t\t\t// Fill Line\n\t\t\tif (points.length && vm.fill) {\n\t\t\t\tctx.beginPath();\n\n\t\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\t\tcurrent = points[index];\n\t\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tif (loop) {\n\t\t\t\t\t\t\tctx.moveTo(fillPoint.x, fillPoint.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.moveTo(currentVM.x, fillPoint);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t\tctx.lineTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\t\tif (currentVM.skip) {\n\t\t\t\t\t\t\t// Only do this if this is the first point that is skipped\n\t\t\t\t\t\t\tif (!spanGaps && lastDrawnIndex === (index - 1)) {\n\t\t\t\t\t\t\t\tif (loop) {\n\t\t\t\t\t\t\t\t\tctx.lineTo(fillPoint.x, fillPoint.y);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.lineTo(previous._view.x, fillPoint);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (lastDrawnIndex !== (index - 1)) {\n\t\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap. If we've never drawn a point, this is a special case.\n\t\t\t\t\t\t\t\t// If the first data point is NaN, then there is no real gap to skip\n\t\t\t\t\t\t\t\tif (spanGaps && lastDrawnIndex !== -1) {\n\t\t\t\t\t\t\t\t\t// We are spanning the gap, so simple draw a line to this point\n\t\t\t\t\t\t\t\t\tlineToPoint(previous, current);\n\t\t\t\t\t\t\t\t} else if (loop) {\n\t\t\t\t\t\t\t\t\tctx.lineTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.lineTo(currentVM.x, fillPoint);\n\t\t\t\t\t\t\t\t\tctx.lineTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\t\tlineToPoint(previous, current);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!loop && lastDrawnIndex !== -1) {\n\t\t\t\t\tctx.lineTo(points[lastDrawnIndex]._view.x, fillPoint);\n\t\t\t\t}\n\n\t\t\t\tctx.fillStyle = vm.backgroundColor || globalDefaults.defaultColor;\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.fill();\n\t\t\t}\n\n\t\t\t// Stroke Line Options\n\t\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t\t// IE 9 and 10 do not support line dash\n\t\t\tif (ctx.setLineDash) {\n\t\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t\t}\n\n\t\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t\t// Stroke Line\n\t\t\tctx.beginPath();\n\t\t\tlastDrawnIndex = -1;\n\n\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\tcurrent = points[index];\n\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\tlineToPoint(previous, current);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.stroke();\n\t\t\tctx.restore();\n\t\t}\n\t});\n};\n\n},{}],39:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tglobalOpts = Chart.defaults.global,\n\t\tdefaultColor = globalOpts.defaultColor;\n\n\tglobalOpts.elements.point = {\n\t\tradius: 3,\n\t\tpointStyle: 'circle',\n\t\tbackgroundColor: defaultColor,\n\t\tborderWidth: 1,\n\t\tborderColor: defaultColor,\n\t\t// Hover\n\t\thitRadius: 1,\n\t\thoverRadius: 4,\n\t\thoverBorderWidth: 1\n\t};\n\n\tfunction xRange(mouseX) {\n\t\tvar vm = this._view;\n\t\treturn vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n\t}\n\n\tfunction yRange(mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n\t}\n\n\tChart.elements.Point = Chart.Element.extend({\n\t\tinRange: function(mouseX, mouseY) {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t\t},\n\n\t\tinLabelRange: xRange,\n\t\tinXRange: xRange,\n\t\tinYRange: yRange,\n\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\t\t},\n\t\tgetArea: function() {\n\t\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y,\n\t\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t\t};\n\t\t},\n\t\tdraw: function(chartArea) {\n\t\t\tvar vm = this._view;\n\t\t\tvar model = this._model;\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar pointStyle = vm.pointStyle;\n\t\t\tvar radius = vm.radius;\n\t\t\tvar x = vm.x;\n\t\t\tvar y = vm.y;\n\t\t\tvar color = Chart.helpers.color;\n\t\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\t\t\tvar ratio = 0;\n\n\t\t\tif (vm.skip) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\tctx.lineWidth = helpers.getValueOrDefault(vm.borderWidth, globalOpts.elements.point.borderWidth);\n\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\n\t\t\t// Cliping for Points.\n\t\t\t// going out from inner charArea?\n\t\t\tif ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right*errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom*errMargin < model.y))) {\n\t\t\t\t// Point fade out\n\t\t\t\tif (model.x < chartArea.left) {\n\t\t\t\t\tratio = (x - model.x) / (chartArea.left - model.x);\n\t\t\t\t} else if (chartArea.right*errMargin < model.x) {\n\t\t\t\t\tratio = (model.x - x) / (model.x - chartArea.right);\n\t\t\t\t} else if (model.y < chartArea.top) {\n\t\t\t\t\tratio = (y - model.y) / (chartArea.top - model.y);\n\t\t\t\t} else if (chartArea.bottom*errMargin < model.y) {\n\t\t\t\t\tratio = (model.y - y) / (model.y - chartArea.bottom);\n\t\t\t\t}\n\t\t\t\tratio = Math.round(ratio*100) / 100;\n\t\t\t\tctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n\t\t\t\tctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n\t\t\t}\n\n\t\t\tChart.canvasHelpers.drawPoint(ctx, pointStyle, radius, x, y);\n\t\t}\n\t});\n};\n\n},{}],40:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar globalOpts = Chart.defaults.global;\n\n\tglobalOpts.elements.rectangle = {\n\t\tbackgroundColor: globalOpts.defaultColor,\n\t\tborderWidth: 0,\n\t\tborderColor: globalOpts.defaultColor,\n\t\tborderSkipped: 'bottom'\n\t};\n\n\tfunction isVertical(bar) {\n\t\treturn bar._view.width !== undefined;\n\t}\n\n\t/**\n\t * Helper function to get the bounds of the bar regardless of the orientation\n\t * @private\n\t * @param bar {Chart.Element.Rectangle} the bar\n\t * @return {Bounds} bounds of the bar\n\t */\n\tfunction getBarBounds(bar) {\n\t\tvar vm = bar._view;\n\t\tvar x1, x2, y1, y2;\n\n\t\tif (isVertical(bar)) {\n\t\t\t// vertical\n\t\t\tvar halfWidth = vm.width / 2;\n\t\t\tx1 = vm.x - halfWidth;\n\t\t\tx2 = vm.x + halfWidth;\n\t\t\ty1 = Math.min(vm.y, vm.base);\n\t\t\ty2 = Math.max(vm.y, vm.base);\n\t\t} else {\n\t\t\t// horizontal bar\n\t\t\tvar halfHeight = vm.height / 2;\n\t\t\tx1 = Math.min(vm.x, vm.base);\n\t\t\tx2 = Math.max(vm.x, vm.base);\n\t\t\ty1 = vm.y - halfHeight;\n\t\t\ty2 = vm.y + halfHeight;\n\t\t}\n\n\t\treturn {\n\t\t\tleft: x1,\n\t\t\ttop: y1,\n\t\t\tright: x2,\n\t\t\tbottom: y2\n\t\t};\n\t}\n\n\tChart.elements.Rectangle = Chart.Element.extend({\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\t\tvar borderWidth = vm.borderWidth;\n\n\t\t\tif (!vm.horizontal) {\n\t\t\t\t// bar\n\t\t\t\tleft = vm.x - vm.width / 2;\n\t\t\t\tright = vm.x + vm.width / 2;\n\t\t\t\ttop = vm.y;\n\t\t\t\tbottom = vm.base;\n\t\t\t\tsignX = 1;\n\t\t\t\tsignY = bottom > top? 1: -1;\n\t\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t\t} else {\n\t\t\t\t// horizontal bar\n\t\t\t\tleft = vm.base;\n\t\t\t\tright = vm.x;\n\t\t\t\ttop = vm.y - vm.height / 2;\n\t\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\t\tsignX = right > left? 1: -1;\n\t\t\t\tsignY = 1;\n\t\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t\t}\n\n\t\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\t\tif (borderWidth) {\n\t\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\t\tborderWidth = borderWidth > barSize? barSize: borderWidth;\n\t\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\t\tvar borderLeft = left + (borderSkipped !== 'left'? halfStroke * signX: 0);\n\t\t\t\tvar borderRight = right + (borderSkipped !== 'right'? -halfStroke * signX: 0);\n\t\t\t\tvar borderTop = top + (borderSkipped !== 'top'? halfStroke * signY: 0);\n\t\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom'? -halfStroke * signY: 0);\n\t\t\t\t// not become a vertical line?\n\t\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\t\ttop = borderTop;\n\t\t\t\t\tbottom = borderBottom;\n\t\t\t\t}\n\t\t\t\t// not become a horizontal line?\n\t\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\t\tleft = borderLeft;\n\t\t\t\t\tright = borderRight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tctx.fillStyle = vm.backgroundColor;\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.lineWidth = borderWidth;\n\n\t\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t\t// | 1 2 |\n\t\t\t// | 0 3 |\n\t\t\tvar corners = [\n\t\t\t\t[left, bottom],\n\t\t\t\t[left, top],\n\t\t\t\t[right, top],\n\t\t\t\t[right, bottom]\n\t\t\t];\n\n\t\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\t\tif (startCorner === -1) {\n\t\t\t\tstartCorner = 0;\n\t\t\t}\n\n\t\t\tfunction cornerAt(index) {\n\t\t\t\treturn corners[(startCorner + index) % 4];\n\t\t\t}\n\n\t\t\t// Draw rectangle from 'startCorner'\n\t\t\tvar corner = cornerAt(0);\n\t\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\t\tfor (var i = 1; i < 4; i++) {\n\t\t\t\tcorner = cornerAt(i);\n\t\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t\t}\n\n\t\t\tctx.fill();\n\t\t\tif (borderWidth) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\theight: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm.base - vm.y;\n\t\t},\n\t\tinRange: function(mouseX, mouseY) {\n\t\t\tvar inRange = false;\n\n\t\t\tif (this._view) {\n\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t}\n\n\t\t\treturn inRange;\n\t\t},\n\t\tinLabelRange: function(mouseX, mouseY) {\n\t\t\tvar me = this;\n\t\t\tif (!me._view) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar inRange = false;\n\t\t\tvar bounds = getBarBounds(me);\n\n\t\t\tif (isVertical(me)) {\n\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t} else {\n\t\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t}\n\n\t\t\treturn inRange;\n\t\t},\n\t\tinXRange: function(mouseX) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t},\n\t\tinYRange: function(mouseY) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t},\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\tvar x, y;\n\t\t\tif (isVertical(this)) {\n\t\t\t\tx = vm.x;\n\t\t\t\ty = (vm.y + vm.base) / 2;\n\t\t\t} else {\n\t\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\t\ty = vm.y;\n\t\t\t}\n\n\t\t\treturn {x: x, y: y};\n\t\t},\n\t\tgetArea: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\t\t}\n\t});\n\n};\n\n},{}],41:[function(require,module,exports){\n'use strict';\n\n// Chart.Platform implementation for targeting a web browser\nmodule.exports = function(Chart) {\n\tvar helpers = Chart.helpers;\n\n\t// DOM event types -> Chart.js event types.\n\t// Note: only events with different types are mapped.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events\n\tvar eventTypeMap = {\n\t\t// Touch events\n\t\ttouchstart: 'mousedown',\n\t\ttouchmove: 'mousemove',\n\t\ttouchend: 'mouseup',\n\n\t\t// Pointer events\n\t\tpointerenter: 'mouseenter',\n\t\tpointerdown: 'mousedown',\n\t\tpointermove: 'mousemove',\n\t\tpointerup: 'mouseup',\n\t\tpointerleave: 'mouseout',\n\t\tpointerout: 'mouseout'\n\t};\n\n\t/**\n\t * The \"used\" size is the final value of a dimension property after all calculations have\n\t * been performed. This method uses the computed style of `element` but returns undefined\n\t * if the computed style is not expressed in pixels. That can happen in some cases where\n\t * `element` has a size relative to its parent and this last one is not yet displayed,\n\t * for example because of `display: none` on a parent node.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n\t * @returns {Number} Size in pixels or undefined if unknown.\n\t */\n\tfunction readUsedSize(element, property) {\n\t\tvar value = helpers.getStyle(element, property);\n\t\tvar matches = value && value.match(/(\\d+)px/);\n\t\treturn matches? Number(matches[1]) : undefined;\n\t}\n\n\t/**\n\t * Initializes the canvas style and render size without modifying the canvas display size,\n\t * since responsiveness is handled by the controller.resize() method. The config is used\n\t * to determine the aspect ratio to apply in case no explicit height has been specified.\n\t */\n\tfunction initCanvas(canvas, config) {\n\t\tvar style = canvas.style;\n\n\t\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\t\tvar renderHeight = canvas.getAttribute('height');\n\t\tvar renderWidth = canvas.getAttribute('width');\n\n\t\t// Chart.js modifies some canvas values that we want to restore on destroy\n\t\tcanvas._chartjs = {\n\t\t\tinitial: {\n\t\t\t\theight: renderHeight,\n\t\t\t\twidth: renderWidth,\n\t\t\t\tstyle: {\n\t\t\t\t\tdisplay: style.display,\n\t\t\t\t\theight: style.height,\n\t\t\t\t\twidth: style.width\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Force canvas to display as block to avoid extra space caused by inline\n\t\t// elements, which would interfere with the responsive resize process.\n\t\t// https://github.com/chartjs/Chart.js/issues/2538\n\t\tstyle.display = style.display || 'block';\n\n\t\tif (renderWidth === null || renderWidth === '') {\n\t\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.width = displayWidth;\n\t\t\t}\n\t\t}\n\n\t\tif (renderHeight === null || renderHeight === '') {\n\t\t\tif (canvas.style.height === '') {\n\t\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t\t} else {\n\t\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\tcanvas.height = displayHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn canvas;\n\t}\n\n\tfunction createEvent(type, chart, x, y, native) {\n\t\treturn {\n\t\t\ttype: type,\n\t\t\tchart: chart,\n\t\t\tnative: native || null,\n\t\t\tx: x !== undefined? x : null,\n\t\t\ty: y !== undefined? y : null,\n\t\t};\n\t}\n\n\tfunction fromNativeEvent(event, chart) {\n\t\tvar type = eventTypeMap[event.type] || event.type;\n\t\tvar pos = helpers.getRelativePosition(event, chart);\n\t\treturn createEvent(type, chart, pos.x, pos.y, event);\n\t}\n\n\tfunction createResizer(handler) {\n\t\tvar iframe = document.createElement('iframe');\n\t\tiframe.className = 'chartjs-hidden-iframe';\n\t\tiframe.style.cssText =\n\t\t\t'display:block;'+\n\t\t\t'overflow:hidden;'+\n\t\t\t'border:0;'+\n\t\t\t'margin:0;'+\n\t\t\t'top:0;'+\n\t\t\t'left:0;'+\n\t\t\t'bottom:0;'+\n\t\t\t'right:0;'+\n\t\t\t'height:100%;'+\n\t\t\t'width:100%;'+\n\t\t\t'position:absolute;'+\n\t\t\t'pointer-events:none;'+\n\t\t\t'z-index:-1;';\n\n\t\t// Prevent the iframe to gain focus on tab.\n\t\t// https://github.com/chartjs/Chart.js/issues/3090\n\t\tiframe.tabIndex = -1;\n\n\t\t// If the iframe is re-attached to the DOM, the resize listener is removed because the\n\t\t// content is reloaded, so make sure to install the handler after the iframe is loaded.\n\t\t// https://github.com/chartjs/Chart.js/issues/3521\n\t\thelpers.addEvent(iframe, 'load', function() {\n\t\t\thelpers.addEvent(iframe.contentWindow || iframe, 'resize', handler);\n\n\t\t\t// The iframe size might have changed while loading, which can also\n\t\t\t// happen if the size has been changed while detached from the DOM.\n\t\t\thandler();\n\t\t});\n\n\t\treturn iframe;\n\t}\n\n\tfunction addResizeListener(node, listener, chart) {\n\t\tvar stub = node._chartjs = {\n\t\t\tticking: false\n\t\t};\n\n\t\t// Throttle the callback notification until the next animation frame.\n\t\tvar notify = function() {\n\t\t\tif (!stub.ticking) {\n\t\t\t\tstub.ticking = true;\n\t\t\t\thelpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tif (stub.resizer) {\n\t\t\t\t\t\tstub.ticking = false;\n\t\t\t\t\t\treturn listener(createEvent('resize', chart));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Let's keep track of this added iframe and thus avoid DOM query when removing it.\n\t\tstub.resizer = createResizer(notify);\n\n\t\tnode.insertBefore(stub.resizer, node.firstChild);\n\t}\n\n\tfunction removeResizeListener(node) {\n\t\tif (!node || !node._chartjs) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar resizer = node._chartjs.resizer;\n\t\tif (resizer) {\n\t\t\tresizer.parentNode.removeChild(resizer);\n\t\t\tnode._chartjs.resizer = null;\n\t\t}\n\n\t\tdelete node._chartjs;\n\t}\n\n\treturn {\n\t\tacquireContext: function(item, config) {\n\t\t\tif (typeof item === 'string') {\n\t\t\t\titem = document.getElementById(item);\n\t\t\t} else if (item.length) {\n\t\t\t\t// Support for array based queries (such as jQuery)\n\t\t\t\titem = item[0];\n\t\t\t}\n\n\t\t\tif (item && item.canvas) {\n\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\titem = item.canvas;\n\t\t\t}\n\n\t\t\tif (item instanceof HTMLCanvasElement) {\n\t\t\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tvar context = item.getContext && item.getContext('2d');\n\t\t\t\tif (context instanceof CanvasRenderingContext2D) {\n\t\t\t\t\tinitCanvas(item, config);\n\t\t\t\t\treturn context;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\n\t\treleaseContext: function(context) {\n\t\t\tvar canvas = context.canvas;\n\t\t\tif (!canvas._chartjs) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar initial = canvas._chartjs.initial;\n\t\t\t['height', 'width'].forEach(function(prop) {\n\t\t\t\tvar value = initial[prop];\n\t\t\t\tif (value === undefined || value === null) {\n\t\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t\t} else {\n\t\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(initial.style || {}, function(value, key) {\n\t\t\t\tcanvas.style[key] = value;\n\t\t\t});\n\n\t\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\t\tcanvas.width = canvas.width;\n\n\t\t\tdelete canvas._chartjs;\n\t\t},\n\n\t\taddEventListener: function(chart, type, listener) {\n\t\t\tvar canvas = chart.chart.canvas;\n\t\t\tif (type === 'resize') {\n\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\taddResizeListener(canvas.parentNode, listener, chart.chart);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar stub = listener._chartjs || (listener._chartjs = {});\n\t\t\tvar proxies = stub.proxies || (stub.proxies = {});\n\t\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\t\tlistener(fromNativeEvent(event, chart.chart));\n\t\t\t};\n\n\t\t\thelpers.addEvent(canvas, type, proxy);\n\t\t},\n\n\t\tremoveEventListener: function(chart, type, listener) {\n\t\t\tvar canvas = chart.chart.canvas;\n\t\t\tif (type === 'resize') {\n\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\tremoveResizeListener(canvas.parentNode, listener);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar stub = listener._chartjs || {};\n\t\t\tvar proxies = stub.proxies || {};\n\t\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\t\tif (!proxy) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thelpers.removeEvent(canvas, type, proxy);\n\t\t}\n\t};\n};\n\n},{}],42:[function(require,module,exports){\n'use strict';\n\n// By default, select the browser (DOM) platform.\n// @TODO Make possible to select another platform at build time.\nvar implementation = require(41);\n\nmodule.exports = function(Chart) {\n\t/**\n\t * @namespace Chart.platform\n\t * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n\t * @since 2.4.0\n\t */\n\tChart.platform = {\n\t\t/**\n\t\t * Called at chart construction time, returns a context2d instance implementing\n\t\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t\t * @param {Object} options - The chart options\n\t\t * @returns {CanvasRenderingContext2D} context2d instance\n\t\t */\n\t\tacquireContext: function() {},\n\n\t\t/**\n\t\t * Called at chart destruction time, releases any resources associated to the context\n\t\t * previously returned by the acquireContext() method.\n\t\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t\t * @returns {Boolean} true if the method succeeded, else false\n\t\t */\n\t\treleaseContext: function() {},\n\n\t\t/**\n\t\t * Registers the specified listener on the given chart.\n\t\t * @param {Chart} chart - Chart from which to listen for event\n\t\t * @param {String} type - The ({@link IEvent}) type to listen for\n\t\t * @param {Function} listener - Receives a notification (an object that implements\n\t\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t\t */\n\t\taddEventListener: function() {},\n\n\t\t/**\n\t\t * Removes the specified listener previously registered with addEventListener.\n\t\t * @param {Chart} chart -Chart from which to remove the listener\n\t\t * @param {String} type - The ({@link IEvent}) type to remove\n\t\t * @param {Function} listener - The listener function to remove from the event target.\n\t\t */\n\t\tremoveEventListener: function() {}\n\t};\n\n\t/**\n\t * @interface IPlatform\n\t * Allows abstracting platform dependencies away from the chart\n\t * @borrows Chart.platform.acquireContext as acquireContext\n\t * @borrows Chart.platform.releaseContext as releaseContext\n\t * @borrows Chart.platform.addEventListener as addEventListener\n\t * @borrows Chart.platform.removeEventListener as removeEventListener\n\t */\n\n\t/**\n\t * @interface IEvent\n\t * @prop {String} type - The event type name, possible values are:\n\t * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n\t * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n\t * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n\t * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n\t * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n\t */\n\n\tChart.helpers.extend(Chart.platform, implementation(Chart));\n};\n\n},{\"41\":41}],43:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\t// Default config for a category scale\n\tvar defaultConfig = {\n\t\tposition: 'bottom'\n\t};\n\n\tvar DatasetScale = Chart.Scale.extend({\n\t\t/**\n\t\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t\t* else fall back to data.labels\n\t\t* @private\n\t\t*/\n\t\tgetLabels: function() {\n\t\t\tvar data = this.chart.data;\n\t\t\treturn (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t},\n\t\t// Implement this so that\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\tme.minIndex = 0;\n\t\t\tme.maxIndex = labels.length - 1;\n\t\t\tvar findIndex;\n\n\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t// user specified min value\n\t\t\t\tfindIndex = helpers.indexOf(labels, me.options.ticks.min);\n\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t}\n\n\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t// user specified max value\n\t\t\t\tfindIndex = helpers.indexOf(labels, me.options.ticks.max);\n\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t}\n\n\t\t\tme.min = labels[me.minIndex];\n\t\t\tme.max = labels[me.maxIndex];\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t}\n\t\t\treturn me.ticks[index - me.minIndex];\n\t\t},\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: function(value, index, datasetIndex, includeOffset) {\n\t\t\tvar me = this;\n\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\n\t\t\tif (value !== undefined && isNaN(index)) {\n\t\t\t\tvar labels = me.getLabels();\n\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t}\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\t\tif (me.options.gridLines.offsetGridLines && includeOffset || me.maxIndex === me.minIndex && includeOffset) {\n\t\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t\t}\n\n\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t}\n\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\t\tif (me.options.gridLines.offsetGridLines && includeOffset) {\n\t\t\t\theightOffset += (valueHeight / 2);\n\t\t\t}\n\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForTick: function(index, includeOffset) {\n\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null, includeOffset);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar value;\n\t\t\tvar offsetAmt = Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\t\t\tvar horz = me.isHorizontal();\n\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\tif (me.options.gridLines.offsetGridLines) {\n\t\t\t\tpixel -= (valueDimension / 2);\n\t\t\t}\n\n\t\t\tif (pixel <= 0) {\n\t\t\t\tvalue = 0;\n\t\t\t} else {\n\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\t\tgetBasePixel: function() {\n\t\t\treturn this.bottom;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n};\n\n},{}],44:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\t\tticks: {\n\t\t\tcallback: Chart.Ticks.formatters.linear\n\t\t}\n\t};\n\n\tvar LinearScale = Chart.LinearScaleBase.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// First Calculate the range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store these per type\n\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar maxTicks;\n\t\t\tvar me = this;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t} else {\n\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t}\n\n\t\t\treturn maxTicks;\n\t\t},\n\t\t// Called after the ticks are built. We need\n\t\thandleDirectionalChanges: function() {\n\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tthis.ticks.reverse();\n\t\t\t}\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\t// Utils\n\t\tgetPixelForValue: function(value) {\n\t\t\t// This must be called after fit has been run so that\n\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\n\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\tvar pixel;\n\t\t\tvar range = me.end - start;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t\t\treturn Math.round(pixel);\n\t\t\t}\n\n\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t\treturn Math.round(pixel);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\treturn me.start + ((me.end - me.start) * offset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n};\n\n},{}],45:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tnoop = helpers.noop;\n\n\tChart.LinearScaleBase = Chart.Scale.extend({\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t// axis, they can manually override it\n\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t// move the top up to 0\n\t\t\t\t\tme.max = 0;\n\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\tme.min = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\tme.min = tickOpts.min;\n\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t}\n\n\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\tme.max = tickOpts.max;\n\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t}\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tme.max++;\n\n\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\tme.min--;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTickLimit: noop,\n\t\thandleDirectionalChanges: noop,\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\tvar numericGeneratorOptions = {\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max,\n\t\t\t\tstepSize: helpers.getValueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Chart.Ticks.generators.linear(numericGeneratorOptions, me);\n\n\t\t\tme.handleDirectionalChanges();\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(me);\n\t\t}\n\t});\n};\n\n},{}],46:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tcallback: Chart.Ticks.formatters.logarithmic\n\t\t}\n\t};\n\n\tvar LogarithmicScale = Chart.Scale.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// Calculate Range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\t\t\tme.minNotZero = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tvalues[index] = 100;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Don't need to split positive and negative since the log scale can't handle a 0 crossing\n\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = getValueOrDefault(tickOpts.min, me.min);\n\t\t\tme.max = getValueOrDefault(tickOpts.max, me.max);\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tme.min = 1;\n\t\t\t\t\tme.max = 10;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tvar generationOptions = {\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Chart.Ticks.generators.logarithmic(generationOptions, me);\n\n\t\t\tif (!me.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tticks.reverse();\n\t\t\t}\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(this);\n\t\t},\n\t\t// Get the correct tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t},\n\t\tgetPixelForValue: function(value) {\n\t\t\tvar me = this;\n\t\t\tvar innerDimension;\n\t\t\tvar pixel;\n\n\t\t\tvar start = me.start;\n\t\t\tvar newVal = +me.getRightValue(value);\n\t\t\tvar range;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n\t\t\t\tif (newVal === 0) {\n\t\t\t\t\tpixel = me.left;\n\t\t\t\t} else {\n\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\tpixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Bottom - top since pixels increase downward on a screen\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tif (start === 0 && !tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === start) {\n\t\t\t\t\t\tpixel = me.bottom;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (me.end === 0 && tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === me.end) {\n\t\t\t\t\t\tpixel = me.top;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start);\n\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\tpixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar range = helpers.log10(me.end) - helpers.log10(me.start);\n\t\t\tvar value, innerDimension;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tvalue = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n\t\t\t} else {  // todo: if start === 0\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tvalue = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n};\n\n},{}],47:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar globalDefaults = Chart.defaults.global;\n\n\tvar defaultConfig = {\n\t\tdisplay: true,\n\n\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\tanimate: true,\n\t\tlineArc: false,\n\t\tposition: 'chartArea',\n\n\t\tangleLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\tshowLabelBackdrop: true,\n\n\t\t\t// String - The colour of the label backdrop\n\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\tbackdropPaddingY: 2,\n\n\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\tbackdropPaddingX: 2,\n\n\t\t\tcallback: Chart.Ticks.formatters.linear\n\t\t},\n\n\t\tpointLabels: {\n\t\t\t// Number - Point label font size in pixels\n\t\t\tfontSize: 10,\n\n\t\t\t// Function - Used to convert point labels\n\t\t\tcallback: function(label) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction getValueCount(scale) {\n\t\treturn !scale.options.lineArc ? scale.chart.data.labels.length : 0;\n\t}\n\n\tfunction getPointLabelFontOptions(scale) {\n\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\tvar fontSize = helpers.getValueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\tvar fontStyle = helpers.getValueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar fontFamily = helpers.getValueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\treturn {\n\t\t\tsize: fontSize,\n\t\t\tstyle: fontStyle,\n\t\t\tfamily: fontFamily,\n\t\t\tfont: font\n\t\t};\n\t}\n\n\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\tif (helpers.isArray(label)) {\n\t\t\treturn {\n\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\th: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tw: ctx.measureText(label).width,\n\t\t\th: fontSize\n\t\t};\n\t}\n\n\tfunction determineLimits(angle, pos, size, min, max) {\n\t\tif (angle === min || angle === max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - (size / 2),\n\t\t\t\tend: pos + (size / 2)\n\t\t\t};\n\t\t} else if (angle < min || angle > max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - size - 5,\n\t\t\t\tend: pos\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstart: pos,\n\t\t\tend: pos + size + 5\n\t\t};\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with point labels\n\t */\n\tfunction fitWithPointLabels(scale) {\n\t\t/*\n\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t *\n\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t *\n\t\t * Solution:\n\t\t *\n\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t * at each index we check if the text overlaps.\n\t\t *\n\t\t * Where it does, we store that angle and that index.\n\t\t *\n\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t * from the shape radius to move the point inwards by that x.\n\t\t *\n\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t * along with labels.\n\t\t *\n\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t *\n\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t * and position it in the most space efficient manner\n\t\t *\n\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t */\n\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tvar furthestLimits = {\n\t\t\tl: scale.width,\n\t\t\tr: 0,\n\t\t\tt: scale.height,\n\t\t\tb: 0\n\t\t};\n\t\tvar furthestAngles = {};\n\t\tvar i;\n\t\tvar textSize;\n\t\tvar pointPosition;\n\n\t\tscale.ctx.font = plFont.font;\n\t\tscale._pointLabelSizes = [];\n\n\t\tvar valueCount = getValueCount(scale);\n\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t}\n\n\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t}\n\t\t}\n\n\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with no point labels\n\t */\n\tfunction fit(scale) {\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t}\n\n\tfunction getTextAlignForAngle(angle) {\n\t\tif (angle === 0 || angle === 180) {\n\t\t\treturn 'center';\n\t\t} else if (angle < 180) {\n\t\t\treturn 'left';\n\t\t}\n\n\t\treturn 'right';\n\t}\n\n\tfunction fillText(ctx, text, position, fontSize) {\n\t\tif (helpers.isArray(text)) {\n\t\t\tvar y = position.y;\n\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\ty+= spacing;\n\t\t\t}\n\t\t} else {\n\t\t\tctx.fillText(text, position.x, position.y);\n\t\t}\n\t}\n\n\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\tif (angle === 90 || angle === 270) {\n\t\t\tposition.y -= (textSize.h / 2);\n\t\t} else if (angle > 270 || angle < 90) {\n\t\t\tposition.y -= textSize.h;\n\t\t}\n\t}\n\n\tfunction drawPointLabels(scale) {\n\t\tvar ctx = scale.ctx;\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\tvar opts = scale.options;\n\t\tvar angleLineOpts = opts.angleLines;\n\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.reverse ? scale.min : scale.max);\n\n\t\t// Point Label Font\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\tctx.textBaseline = 'top';\n\n\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\tif (angleLineOpts.display) {\n\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t\t// Extra 3px out for some label spacing\n\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t// Keep this in loop since we may support array properties here\n\t\t\tvar pointLabelFontColor = getValueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\tctx.font = plFont.font;\n\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t}\n\t}\n\n\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\tvar ctx = scale.ctx;\n\t\tctx.strokeStyle = helpers.getValueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\tctx.lineWidth = helpers.getValueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\tif (scale.options.lineArc) {\n\t\t\t// Draw circular arcs between the points\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t} else {\n\t\t\t// Draw straight lines connecting each index\n\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\tif (valueCount === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t}\n\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tfunction numberOrZero(param) {\n\t\treturn helpers.isNumber(param) ? param : 0;\n\t}\n\n\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.height = me.maxHeight;\n\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tme.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\thelpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tme.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t// Point labels\n\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tfit: function() {\n\t\t\tif (this.options.lineArc) {\n\t\t\t\tfit(this);\n\t\t\t} else {\n\t\t\t\tfitWithPointLabels(this);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set radius reductions and determine new radius and center point\n\t\t * @private\n\t\t */\n\t\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\tvar me = this;\n\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\tme.drawingArea = Math.min(\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\tvar me = this;\n\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea,\n\t\t\t\tmaxLeft = leftMovement + me.drawingArea,\n\t\t\t\tmaxTop = topMovement + me.drawingArea,\n\t\t\t\tmaxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\tme.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n\t\t\tme.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n\t\t},\n\n\t\tgetIndexAngle: function(index) {\n\t\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\t\tthis.chart.options.startAngle :\n\t\t\t\t0;\n\n\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t},\n\t\tgetDistanceFromCenterForValue: function(value) {\n\t\t\tvar me = this;\n\n\t\t\tif (value === null) {\n\t\t\t\treturn 0; // null always in center\n\t\t\t}\n\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\tif (me.options.reverse) {\n\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t}\n\t\t\treturn (value - me.min) * scalingFactor;\n\t\t},\n\t\tgetPointPosition: function(index, distanceFromCenter) {\n\t\t\tvar me = this;\n\t\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\t\treturn {\n\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t};\n\t\t},\n\t\tgetPointPositionForValue: function(index, value) {\n\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t},\n\n\t\tgetBasePosition: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.getPointPositionForValue(0,\n\t\t\t\tme.beginAtZero? 0:\n\t\t\t\tmin < 0 && max < 0? max :\n\t\t\t\tmin > 0 && max > 0? min :\n\t\t\t\t0);\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\n\t\t\t\t// Tick Font\n\t\t\t\tvar tickFontSize = getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar tickFontStyle = getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar tickFontFamily = getValueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\tif (index > 0 || opts.reverse) {\n\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\t\t\t\t\t\tvar yHeight = me.yCenter - yCenterOffset;\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\tvar tickFontColor = getValueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t\tme.xCenter - labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t\tyHeight - tickFontSize / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\t\ttickFontSize + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\tctx.fillText(label, me.xCenter, yHeight);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (!opts.lineArc) {\n\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n};\n\n},{}],48:[function(require,module,exports){\n/* global window: false */\n'use strict';\n\nvar moment = require(1);\nmoment = typeof(moment) === 'function' ? moment : window.moment;\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar time = {\n\t\tunits: [{\n\t\t\tname: 'millisecond',\n\t\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t\t}, {\n\t\t\tname: 'second',\n\t\t\tsteps: [1, 2, 5, 10, 30]\n\t\t}, {\n\t\t\tname: 'minute',\n\t\t\tsteps: [1, 2, 5, 10, 30]\n\t\t}, {\n\t\t\tname: 'hour',\n\t\t\tsteps: [1, 2, 3, 6, 12]\n\t\t}, {\n\t\t\tname: 'day',\n\t\t\tsteps: [1, 2, 5]\n\t\t}, {\n\t\t\tname: 'week',\n\t\t\tmaxStep: 4\n\t\t}, {\n\t\t\tname: 'month',\n\t\t\tmaxStep: 3\n\t\t}, {\n\t\t\tname: 'quarter',\n\t\t\tmaxStep: 4\n\t\t}, {\n\t\t\tname: 'year',\n\t\t\tmaxStep: false\n\t\t}]\n\t};\n\n\tvar defaultConfig = {\n\t\tposition: 'bottom',\n\n\t\ttime: {\n\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\tminUnit: 'millisecond',\n\n\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\tdisplayFormats: {\n\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\tminute: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\thour: 'MMM D, hA', // Sept 4, 5PM\n\t\t\t\tday: 'll', // Sep 4 2015\n\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t}\n\t\t},\n\t\tticks: {\n\t\t\tautoSkip: false\n\t\t}\n\t};\n\n\tvar TimeScale = Chart.Scale.extend({\n\t\tinitialize: function() {\n\t\t\tif (!moment) {\n\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t}\n\n\t\t\tChart.Scale.prototype.initialize.call(this);\n\t\t},\n\t\tgetLabelMoment: function(datasetIndex, index) {\n\t\t\tif (datasetIndex === null || index === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (typeof this.labelMoments[datasetIndex] !== 'undefined') {\n\t\t\t\treturn this.labelMoments[datasetIndex][index];\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tgetLabelDiff: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tif (datasetIndex === null || index === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (me.labelDiffs === undefined) {\n\t\t\t\tme.buildLabelDiffs();\n\t\t\t}\n\n\t\t\tif (typeof me.labelDiffs[datasetIndex] !== 'undefined') {\n\t\t\t\treturn me.labelDiffs[datasetIndex][index];\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tgetMomentStartOf: function(tick) {\n\t\t\tvar me = this;\n\t\t\tif (me.options.time.unit === 'week' && me.options.time.isoWeekday !== false) {\n\t\t\t\treturn tick.clone().startOf('isoWeek').isoWeekday(me.options.time.isoWeekday);\n\t\t\t}\n\t\t\treturn tick.clone().startOf(me.tickUnit);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tme.labelMoments = [];\n\n\t\t\t// Only parse these once. If the dataset does not have data as x,y pairs, we will use\n\t\t\t// these\n\t\t\tvar scaleLabelMoments = [];\n\t\t\tif (me.chart.data.labels && me.chart.data.labels.length > 0) {\n\t\t\t\thelpers.each(me.chart.data.labels, function(label) {\n\t\t\t\t\tvar labelMoment = me.parseTime(label);\n\n\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tscaleLabelMoments.push(labelMoment);\n\t\t\t\t\t}\n\t\t\t\t}, me);\n\n\t\t\t\tme.firstTick = moment.min.call(me, scaleLabelMoments);\n\t\t\t\tme.lastTick = moment.max.call(me, scaleLabelMoments);\n\t\t\t} else {\n\t\t\t\tme.firstTick = null;\n\t\t\t\tme.lastTick = null;\n\t\t\t}\n\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar momentsForDataset = [];\n\t\t\t\tvar datasetVisible = me.chart.isDatasetVisible(datasetIndex);\n\n\t\t\t\tif (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {\n\t\t\t\t\thelpers.each(dataset.data, function(value) {\n\t\t\t\t\t\tvar labelMoment = me.parseTime(me.getRightValue(value));\n\n\t\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmomentsForDataset.push(labelMoment);\n\n\t\t\t\t\t\t\tif (datasetVisible) {\n\t\t\t\t\t\t\t\t// May have gone outside the scale ranges, make sure we keep the first and last ticks updated\n\t\t\t\t\t\t\t\tme.firstTick = me.firstTick !== null ? moment.min(me.firstTick, labelMoment) : labelMoment;\n\t\t\t\t\t\t\t\tme.lastTick = me.lastTick !== null ? moment.max(me.lastTick, labelMoment) : labelMoment;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, me);\n\t\t\t\t} else {\n\t\t\t\t\t// We have no labels. Use the ones from the scale\n\t\t\t\t\tmomentsForDataset = scaleLabelMoments;\n\t\t\t\t}\n\n\t\t\t\tme.labelMoments.push(momentsForDataset);\n\t\t\t}, me);\n\n\t\t\t// Set these after we've done all the data\n\t\t\tif (me.options.time.min) {\n\t\t\t\tme.firstTick = me.parseTime(me.options.time.min);\n\t\t\t}\n\n\t\t\tif (me.options.time.max) {\n\t\t\t\tme.lastTick = me.parseTime(me.options.time.max);\n\t\t\t}\n\n\t\t\t// We will modify these, so clone for later\n\t\t\tme.firstTick = (me.firstTick || moment()).clone();\n\t\t\tme.lastTick = (me.lastTick || moment()).clone();\n\t\t},\n\t\tbuildLabelDiffs: function() {\n\t\t\tvar me = this;\n\t\t\tme.labelDiffs = [];\n\t\t\tvar scaleLabelDiffs = [];\n\t\t\t// Parse common labels once\n\t\t\tif (me.chart.data.labels && me.chart.data.labels.length > 0) {\n\t\t\t\thelpers.each(me.chart.data.labels, function(label) {\n\t\t\t\t\tvar labelMoment = me.parseTime(label);\n\n\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tscaleLabelDiffs.push(labelMoment.diff(me.firstTick, me.tickUnit, true));\n\t\t\t\t\t}\n\t\t\t\t}, me);\n\t\t\t}\n\n\t\t\thelpers.each(me.chart.data.datasets, function(dataset) {\n\t\t\t\tvar diffsForDataset = [];\n\n\t\t\t\tif (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {\n\t\t\t\t\thelpers.each(dataset.data, function(value) {\n\t\t\t\t\t\tvar labelMoment = me.parseTime(me.getRightValue(value));\n\n\t\t\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t\t\tif (me.options.time.round) {\n\t\t\t\t\t\t\t\tlabelMoment.startOf(me.options.time.round);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdiffsForDataset.push(labelMoment.diff(me.firstTick, me.tickUnit, true));\n\t\t\t\t\t\t}\n\t\t\t\t\t}, me);\n\t\t\t\t} else {\n\t\t\t\t\t// We have no labels. Use common ones\n\t\t\t\t\tdiffsForDataset = scaleLabelDiffs;\n\t\t\t\t}\n\n\t\t\t\tme.labelDiffs.push(diffsForDataset);\n\t\t\t}, me);\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\n\t\t\tme.ctx.save();\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\tvar tickFontStyle = helpers.getValueOrDefault(me.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);\n\t\t\tvar tickFontFamily = helpers.getValueOrDefault(me.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);\n\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\t\t\tme.ctx.font = tickLabelFont;\n\n\t\t\tme.ticks = [];\n\t\t\tme.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step\n\t\t\tme.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)\n\n\t\t\t// Set unit override if applicable\n\t\t\tif (me.options.time.unit) {\n\t\t\t\tme.tickUnit = me.options.time.unit || 'day';\n\t\t\t\tme.displayFormat = me.options.time.displayFormats[me.tickUnit];\n\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\tme.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, 1);\n\t\t\t} else {\n\t\t\t\t// Determine the smallest needed unit of the time\n\t\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\t\t// Crude approximation of what the label length might be\n\t\t\t\tvar tempFirstLabel = me.tickFormatFunction(me.firstTick, 0, []);\n\t\t\t\tvar tickLabelWidth = me.ctx.measureText(tempFirstLabel).width;\n\t\t\t\tvar cosRotation = Math.cos(helpers.toRadians(me.options.ticks.maxRotation));\n\t\t\t\tvar sinRotation = Math.sin(helpers.toRadians(me.options.ticks.maxRotation));\n\t\t\t\ttickLabelWidth = (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t\t\t\tvar labelCapacity = innerWidth / (tickLabelWidth);\n\n\t\t\t\t// Start as small as possible\n\t\t\t\tme.tickUnit = me.options.time.minUnit;\n\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\tme.displayFormat = me.options.time.displayFormats[me.tickUnit];\n\n\t\t\t\tvar unitDefinitionIndex = 0;\n\t\t\t\tvar unitDefinition = time.units[unitDefinitionIndex];\n\n\t\t\t\t// While we aren't ideal and we don't have units left\n\t\t\t\twhile (unitDefinitionIndex < time.units.length) {\n\t\t\t\t\t// Can we scale this unit. If `false` we can scale infinitely\n\t\t\t\t\tme.unitScale = 1;\n\n\t\t\t\t\tif (helpers.isArray(unitDefinition.steps) && Math.ceil(me.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {\n\t\t\t\t\t\t// Use one of the predefined steps\n\t\t\t\t\t\tfor (var idx = 0; idx < unitDefinition.steps.length; ++idx) {\n\t\t\t\t\t\t\tif (unitDefinition.steps[idx] >= Math.ceil(me.scaleSizeInUnits / labelCapacity)) {\n\t\t\t\t\t\t\t\tme.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, unitDefinition.steps[idx]);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if ((unitDefinition.maxStep === false) || (Math.ceil(me.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {\n\t\t\t\t\t\t// We have a max step. Scale this unit\n\t\t\t\t\t\tme.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, Math.ceil(me.scaleSizeInUnits / labelCapacity));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Move to the next unit up\n\t\t\t\t\t\t++unitDefinitionIndex;\n\t\t\t\t\t\tunitDefinition = time.units[unitDefinitionIndex];\n\n\t\t\t\t\t\tme.tickUnit = unitDefinition.name;\n\t\t\t\t\t\tvar leadingUnitBuffer = me.firstTick.diff(me.getMomentStartOf(me.firstTick), me.tickUnit, true);\n\t\t\t\t\t\tvar trailingUnitBuffer = me.getMomentStartOf(me.lastTick.clone().add(1, me.tickUnit)).diff(me.lastTick, me.tickUnit, true);\n\t\t\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true) + leadingUnitBuffer + trailingUnitBuffer;\n\t\t\t\t\t\tme.displayFormat = me.options.time.displayFormats[unitDefinition.name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar roundedStart;\n\n\t\t\t// Only round the first tick if we have no hard minimum\n\t\t\tif (!me.options.time.min) {\n\t\t\t\tme.firstTick = me.getMomentStartOf(me.firstTick);\n\t\t\t\troundedStart = me.firstTick;\n\t\t\t} else {\n\t\t\t\troundedStart = me.getMomentStartOf(me.firstTick);\n\t\t\t}\n\n\t\t\t// Only round the last tick if we have no hard maximum\n\t\t\tif (!me.options.time.max) {\n\t\t\t\tvar roundedEnd = me.getMomentStartOf(me.lastTick);\n\t\t\t\tvar delta = roundedEnd.diff(me.lastTick, me.tickUnit, true);\n\t\t\t\tif (delta < 0) {\n\t\t\t\t\t// Do not use end of because we need me to be in the next time unit\n\t\t\t\t\tme.lastTick = me.getMomentStartOf(me.lastTick.add(1, me.tickUnit));\n\t\t\t\t} else if (delta >= 0) {\n\t\t\t\t\tme.lastTick = roundedEnd;\n\t\t\t\t}\n\n\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t}\n\n\t\t\t// Tick displayFormat override\n\t\t\tif (me.options.time.displayFormat) {\n\t\t\t\tme.displayFormat = me.options.time.displayFormat;\n\t\t\t}\n\n\t\t\t// first tick. will have been rounded correctly if options.time.min is not specified\n\t\t\tme.ticks.push(me.firstTick.clone());\n\n\t\t\t// For every unit in between the first and last moment, create a moment and add it to the ticks tick\n\t\t\tfor (var i = me.unitScale; i <= me.scaleSizeInUnits; i += me.unitScale) {\n\t\t\t\tvar newTick = roundedStart.clone().add(i, me.tickUnit);\n\n\t\t\t\t// Are we greater than the max time\n\t\t\t\tif (me.options.time.max && newTick.diff(me.lastTick, me.tickUnit, true) >= 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tme.ticks.push(newTick);\n\t\t\t}\n\n\t\t\t// Always show the right tick\n\t\t\tvar diff = me.ticks[me.ticks.length - 1].diff(me.lastTick, me.tickUnit);\n\t\t\tif (diff !== 0 || me.scaleSizeInUnits === 0) {\n\t\t\t\t// this is a weird case. If the <max> option is the same as the end option, we can't just diff the times because the tick was created from the roundedStart\n\t\t\t\t// but the last tick was not rounded.\n\t\t\t\tif (me.options.time.max) {\n\t\t\t\t\tme.ticks.push(me.lastTick.clone());\n\t\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.ticks[0], me.tickUnit, true);\n\t\t\t\t} else {\n\t\t\t\t\tme.ticks.push(me.lastTick.clone());\n\t\t\t\t\tme.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.ctx.restore();\n\n\t\t\t// Invalidate label diffs cache\n\t\t\tme.labelDiffs = undefined;\n\t\t},\n\t\t// Get tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar label = me.chart.data.labels && index < me.chart.data.labels.length ? me.chart.data.labels[index] : '';\n\t\t\tvar value = me.chart.data.datasets[datasetIndex].data[index];\n\n\t\t\tif (value !== null && typeof value === 'object') {\n\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t}\n\n\t\t\t// Format nicely\n\t\t\tif (me.options.time.tooltipFormat) {\n\t\t\t\tlabel = me.parseTime(label).format(me.options.time.tooltipFormat);\n\t\t\t}\n\n\t\t\treturn label;\n\t\t},\n\t\t// Function to format an individual tick mark\n\t\ttickFormatFunction: function(tick, index, ticks) {\n\t\t\tvar formattedTick = tick.format(this.displayFormat);\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar callback = helpers.getValueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\tif (callback) {\n\t\t\t\treturn callback(formattedTick, index, ticks);\n\t\t\t}\n\t\t\treturn formattedTick;\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.tickMoments = me.ticks;\n\t\t\tme.ticks = me.ticks.map(me.tickFormatFunction, me);\n\t\t},\n\t\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar offset = null;\n\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\toffset = me.getLabelDiff(datasetIndex, index);\n\t\t\t}\n\n\t\t\tif (offset === null) {\n\t\t\t\tif (!value || !value.isValid) {\n\t\t\t\t\t// not already a moment object\n\t\t\t\t\tvalue = me.parseTime(me.getRightValue(value));\n\t\t\t\t}\n\t\t\t\tif (value && value.isValid && value.isValid()) {\n\t\t\t\t\toffset = value.diff(me.firstTick, me.tickUnit, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (offset !== null) {\n\t\t\t\tvar decimal = offset !== 0 ? offset / me.scaleSizeInUnits : offset;\n\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\tvar valueOffset = (me.width * decimal);\n\t\t\t\t\treturn me.left + Math.round(valueOffset);\n\t\t\t\t}\n\n\t\t\t\tvar heightOffset = (me.height * decimal);\n\t\t\t\treturn me.top + Math.round(heightOffset);\n\t\t\t}\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickMoments[index], null, null);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar innerDimension = me.isHorizontal() ? me.width : me.height;\n\t\t\tvar offset = (pixel - (me.isHorizontal() ? me.left : me.top)) / innerDimension;\n\t\t\toffset *= me.scaleSizeInUnits;\n\t\t\treturn me.firstTick.clone().add(moment.duration(offset, me.tickUnit).asSeconds(), 'seconds');\n\t\t},\n\t\tparseTime: function(label) {\n\t\t\tvar me = this;\n\t\t\tif (typeof me.options.time.parser === 'string') {\n\t\t\t\treturn moment(label, me.options.time.parser);\n\t\t\t}\n\t\t\tif (typeof me.options.time.parser === 'function') {\n\t\t\t\treturn me.options.time.parser(label);\n\t\t\t}\n\t\t\t// Date objects\n\t\t\tif (typeof label.getMonth === 'function' || typeof label === 'number') {\n\t\t\t\treturn moment(label);\n\t\t\t}\n\t\t\t// Moment support\n\t\t\tif (label.isValid && label.isValid()) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t\t// Custom parsing (return an instance of moment)\n\t\t\tif (typeof me.options.time.format !== 'string' && me.options.time.format.call) {\n\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale');\n\t\t\t\treturn me.options.time.format(label);\n\t\t\t}\n\t\t\t// Moment format parsing\n\t\t\treturn moment(label, me.options.time.format);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n\n};\n\n},{\"1\":1}]},{},[7])(7)\n});"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js",
    "content": "/*!\n * chartjs-plugin-deferred\n * http://chartjs.org/\n * Version: 0.2.0\n *\n * Copyright 2016 Simon Brunel\n * Released under the MIT license\n * https://github.com/chartjs/chartjs-plugin-deferred/blob/master/LICENSE.md\n */\n/* global window: false */\n'use strict';\n\n(function() {\n\n\tvar Chart = window.Chart;\n\tvar helpers = Chart.helpers;\n\tvar STUB_KEY = '_chartjs_deferred';\n\tvar MODEL_KEY = '_deferred_model';\n\n\t/**\n\t * Plugin based on discussion from Chart.js issue #2745.\n\t * @see https://github.com/chartjs/Chart.js/issues/2745\n\t */\n\tChart.Deferred = Chart.Deferred || {};\n\tChart.Deferred.defaults = {\n\t\tenabled: true,\n\t\txOffset: 0,\n\t\tyOffset: 0,\n\t\tdelay: 0\n\t};\n\n\t// DOM implementation\n\t// @TODO move it in Chart.js: src/core/core.platform.js\n\tChart.platform = helpers.extend(Chart.platform || {}, {\n\t\tdefer: function(fn, delay, scope) {\n\t\t\tvar callback = function() {\n\t\t\t\tfn.call(scope);\n\t\t\t};\n\t\t\tif (!delay) {\n\t\t\t\thelpers.requestAnimFrame.call(window, callback);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(callback, delay);\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction computeOffset(value, base) {\n\t\tvar number = parseInt(value, 10);\n\t\tif (isNaN(number)) {\n\t\t\treturn 0;\n\t\t} else if (typeof value === 'string' && value.indexOf('%') !== -1) {\n\t\t\treturn number / 100 * base;\n\t\t}\n\t\treturn number;\n\t}\n\n\tfunction chartInViewport(instance) {\n\t\tvar model = instance[MODEL_KEY];\n\t\tvar canvas = instance.chart.canvas;\n\n\t\t// http://stackoverflow.com/a/21696585\n\t\tif (canvas.offsetParent === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar rect = canvas.getBoundingClientRect();\n\t\tvar dy = computeOffset(model.yOffset || 0, rect.height);\n\t\tvar dx = computeOffset(model.xOffset || 0, rect.width);\n\n\t\treturn rect.right - dx >= 0\n\t\t\t&& rect.bottom - dy >= 0\n\t\t\t&& rect.left + dx <= window.innerWidth\n\t\t\t&& rect.top + dy <= window.innerHeight;\n\t}\n\n\tfunction buildDeferredModel(instance) {\n\t\tvar defaults = Chart.Deferred.defaults;\n\t\tvar options = instance.options.deferred;\n\t\tvar getValue = helpers.getValueOrDefault;\n\n\t\tif (options === undefined) {\n\t\t\toptions = {};\n\t\t} else if (typeof options === 'boolean') {\n\t\t\t// accepting { options: { deferred: true } }\n\t\t\toptions = {enabled: options};\n\t\t}\n\n\t\treturn {\n\t\t\tenabled: getValue(options.enabled, defaults.enabled),\n\t\t\txOffset: getValue(options.xOffset, defaults.xOffset),\n\t\t\tyOffset: getValue(options.yOffset, defaults.yOffset),\n\t\t\tdelay: getValue(options.delay, defaults.delay),\n\t\t\tappeared: false,\n\t\t\tdelayed: false,\n\t\t\tloaded: false,\n\t\t\telements: []\n\t\t};\n\t}\n\n\tfunction onScroll(event) {\n\t\tvar node = event.target;\n\t\tvar stub = node[STUB_KEY];\n\t\tif (stub.ticking) {\n\t\t\treturn;\n\t\t}\n\n\t\tstub.ticking = true;\n\t\tChart.platform.defer(function() {\n\t\t\tvar instances = stub.instances.slice();\n\t\t\tvar ilen = instances.length;\n\t\t\tvar instance, i;\n\n\t\t\tfor (i=0; i<ilen; ++i) {\n\t\t\t\tinstance = instances[i];\n\t\t\t\tif (chartInViewport(instance)) {\n\t\t\t\t\tunwatch(instance); // eslint-disable-line\n\t\t\t\t\tinstance[MODEL_KEY].appeared = true;\n\t\t\t\t\tinstance.update();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstub.ticking = false;\n\t\t});\n\t}\n\n\tfunction isScrollable(node) {\n\t\tvar type = node.nodeType;\n\t\tif (type === Node.ELEMENT_NODE) {\n\t\t\tvar overflowX = helpers.getStyle(node, 'overflow-x');\n\t\t\tvar overflowY = helpers.getStyle(node, 'overflow-y');\n\t\t\treturn overflowX === 'auto' || overflowX === 'scroll'\n\t\t\t\t|| overflowY === 'auto' || overflowY === 'scroll';\n\t\t}\n\n\t\treturn node.nodeType === Node.DOCUMENT_NODE;\n\t}\n\n\tfunction watch(instance) {\n\t\tvar canvas = instance.chart.canvas;\n\t\tvar parent = canvas.parentElement;\n\t\tvar stub, instances;\n\n\t\twhile (parent) {\n\t\t\tif (isScrollable(parent)) {\n\t\t\t\tstub = parent[STUB_KEY] || (parent[STUB_KEY] = {});\n\t\t\t\tinstances = stub.instances || (stub.instances = []);\n\t\t\t\tif (instances.length === 0) {\n\t\t\t\t\tparent.addEventListener('scroll', onScroll, {passive: true});\n\t\t\t\t}\n\n\t\t\t\tinstances.push(instance);\n\t\t\t\tinstance[MODEL_KEY].elements.push(parent);\n\t\t\t}\n\n\t\t\tparent = parent.parentElement || parent.ownerDocument;\n\t\t}\n\t}\n\n\tfunction unwatch(instance) {\n\t\tinstance[MODEL_KEY].elements.forEach(function(element) {\n\t\t\tvar instances = element[STUB_KEY].instances;\n\t\t\tinstances.splice(instances.indexOf(instance), 1);\n\t\t\tif (!instances.length) {\n\t\t\t\thelpers.removeEvent(element, 'scroll', onScroll);\n\t\t\t\tdelete element[STUB_KEY];\n\t\t\t}\n\t\t});\n\n\t\tinstance[MODEL_KEY].elements = [];\n\t}\n\n\tChart.plugins.register({\n\t\tbeforeInit: function(instance) {\n\t\t\tvar model = instance[MODEL_KEY] = buildDeferredModel(instance);\n\t\t\tif (model.enabled) {\n\t\t\t\twatch(instance);\n\t\t\t}\n\t\t},\n\n\t\tbeforeDatasetsUpdate: function(instance) {\n\t\t\tvar model = instance[MODEL_KEY];\n\t\t\tif (!model.enabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!model.loaded) {\n\t\t\t\tif (!model.appeared && !chartInViewport(instance)) {\n\t\t\t\t\t// cancel the datasets update\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tmodel.appeared = true;\n\t\t\t\tmodel.loaded = true;\n\t\t\t\tunwatch(instance);\n\n\t\t\t\tif (model.delay > 0) {\n\t\t\t\t\tmodel.delayed = true;\n\t\t\t\t\tChart.platform.defer(function() {\n\t\t\t\t\t\tmodel.delayed = false;\n\t\t\t\t\t\tinstance.update();\n\t\t\t\t\t}, model.delay);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (model.delayed) {\n\t\t\t\t// in case of delayed update, ensure to block external requests, such\n\t\t\t\t// as interacting with the legend label, or direct calls to update()\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t});\n\n}());\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-chartjs/style.css",
    "content": ".chartjs-wrapper canvas {\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js",
    "content": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    // Configuration\n    var MAX_SIZE       = 4,\n        MIN_SIZE       = 0,\n        BUTTON_ID;\n\n    // Current fontsettings state\n    var fontState;\n\n    // Default themes\n    var THEMES = [\n        {\n            config: 'white',\n            text: 'White',\n            id: 0\n        },\n        {\n            config: 'sepia',\n            text: 'Sepia',\n            id: 1\n        },\n        {\n            config: 'night',\n            text: 'Night',\n            id: 2\n        }\n    ];\n\n    // Default font families\n    var FAMILIES = [\n        {\n            config: 'serif',\n            text: 'Serif',\n            id: 0\n        },\n        {\n            config: 'sans',\n            text: 'Sans',\n            id: 1\n        }\n    ];\n\n    // Return configured themes\n    function getThemes() {\n        return THEMES;\n    }\n\n    // Modify configured themes\n    function setThemes(themes) {\n        THEMES = themes;\n        updateButtons();\n    }\n\n    // Return configured font families\n    function getFamilies() {\n        return FAMILIES;\n    }\n\n    // Modify configured font families\n    function setFamilies(families) {\n        FAMILIES = families;\n        updateButtons();\n    }\n\n    // Save current font settings\n    function saveFontSettings() {\n        gitbook.storage.set('fontState', fontState);\n        update();\n    }\n\n    // Increase font size\n    function enlargeFontSize(e) {\n        e.preventDefault();\n        if (fontState.size >= MAX_SIZE) return;\n\n        fontState.size++;\n        saveFontSettings();\n    }\n\n    // Decrease font size\n    function reduceFontSize(e) {\n        e.preventDefault();\n        if (fontState.size <= MIN_SIZE) return;\n\n        fontState.size--;\n        saveFontSettings();\n    }\n\n    // Change font family\n    function changeFontFamily(configName, e) {\n        if (e && e instanceof Event) {\n            e.preventDefault();\n        }\n\n        var familyId = getFontFamilyId(configName);\n        fontState.family = familyId;\n        saveFontSettings();\n    }\n\n    // Change type of color theme\n    function changeColorTheme(configName, e) {\n        if (e && e instanceof Event) {\n            e.preventDefault();\n        }\n\n        var $book = gitbook.state.$book;\n\n        // Remove currently applied color theme\n        if (fontState.theme !== 0)\n            $book.removeClass('color-theme-'+fontState.theme);\n\n        // Set new color theme\n        var themeId = getThemeId(configName);\n        fontState.theme = themeId;\n        if (fontState.theme !== 0)\n            $book.addClass('color-theme-'+fontState.theme);\n\n        saveFontSettings();\n    }\n\n    // Return the correct id for a font-family config key\n    // Default to first font-family\n    function getFontFamilyId(configName) {\n        // Search for plugin configured font family\n        var configFamily = $.grep(FAMILIES, function(family) {\n            return family.config == configName;\n        })[0];\n        // Fallback to default font family\n        return (!!configFamily)? configFamily.id : 0;\n    }\n\n    // Return the correct id for a theme config key\n    // Default to first theme\n    function getThemeId(configName) {\n        // Search for plugin configured theme\n        var configTheme = $.grep(THEMES, function(theme) {\n            return theme.config == configName;\n        })[0];\n        // Fallback to default theme\n        return (!!configTheme)? configTheme.id : 0;\n    }\n\n    function update() {\n        var $book = gitbook.state.$book;\n\n        $('.font-settings .font-family-list li').removeClass('active');\n        $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active');\n\n        $book[0].className = $book[0].className.replace(/\\bfont-\\S+/g, '');\n        $book.addClass('font-size-'+fontState.size);\n        $book.addClass('font-family-'+fontState.family);\n\n        if(fontState.theme !== 0) {\n            $book[0].className = $book[0].className.replace(/\\bcolor-theme-\\S+/g, '');\n            $book.addClass('color-theme-'+fontState.theme);\n        }\n    }\n\n    function init(config) {\n        // Search for plugin configured font family\n        var configFamily = getFontFamilyId(config.family),\n            configTheme = getThemeId(config.theme);\n\n        // Instantiate font state object\n        fontState = gitbook.storage.get('fontState', {\n            size:   config.size || 2,\n            family: configFamily,\n            theme:  configTheme\n        });\n\n        update();\n    }\n\n    function updateButtons() {\n        // Remove existing fontsettings buttons\n        if (!!BUTTON_ID) {\n            gitbook.toolbar.removeButton(BUTTON_ID);\n        }\n\n        // Create buttons in toolbar\n        BUTTON_ID = gitbook.toolbar.createButton({\n            icon: 'fa fa-font',\n            label: 'Font Settings',\n            className: 'font-settings',\n            dropdown: [\n                [\n                    {\n                        text: 'A',\n                        className: 'font-reduce',\n                        onClick: reduceFontSize\n                    },\n                    {\n                        text: 'A',\n                        className: 'font-enlarge',\n                        onClick: enlargeFontSize\n                    }\n                ],\n                $.map(FAMILIES, function(family) {\n                    family.onClick = function(e) {\n                        return changeFontFamily(family.config, e);\n                    };\n\n                    return family;\n                }),\n                $.map(THEMES, function(theme) {\n                    theme.onClick = function(e) {\n                        return changeColorTheme(theme.config, e);\n                    };\n\n                    return theme;\n                })\n            ]\n        });\n    }\n\n    // Init configuration at start\n    gitbook.events.bind('start', function(e, config) {\n        var opts = config.fontsettings;\n\n        // Generate buttons at start\n        updateButtons();\n\n        // Init current settings\n        init(opts);\n    });\n\n    // Expose API\n    gitbook.fontsettings = {\n        enlargeFontSize: enlargeFontSize,\n        reduceFontSize:  reduceFontSize,\n        setTheme:        changeColorTheme,\n        setFamily:       changeFontFamily,\n        getThemes:       getThemes,\n        setThemes:       setThemes,\n        getFamilies:     getFamilies,\n        setFamilies:     setFamilies\n    };\n});\n\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-fontsettings/website.css",
    "content": "/*\n * Theme 1\n */\n.color-theme-1 .dropdown-menu {\n  background-color: #111111;\n  border-color: #7e888b;\n}\n.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner {\n  border-bottom: 9px solid #111111;\n}\n.color-theme-1 .dropdown-menu .buttons {\n  border-color: #7e888b;\n}\n.color-theme-1 .dropdown-menu .button {\n  color: #afa790;\n}\n.color-theme-1 .dropdown-menu .button:hover {\n  color: #73553c;\n}\n/*\n * Theme 2\n */\n.color-theme-2 .dropdown-menu {\n  background-color: #2d3143;\n  border-color: #272a3a;\n}\n.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner {\n  border-bottom: 9px solid #2d3143;\n}\n.color-theme-2 .dropdown-menu .buttons {\n  border-color: #272a3a;\n}\n.color-theme-2 .dropdown-menu .button {\n  color: #62677f;\n}\n.color-theme-2 .dropdown-menu .button:hover {\n  color: #f4f4f5;\n}\n.book .book-header .font-settings .font-enlarge {\n  line-height: 30px;\n  font-size: 1.4em;\n}\n.book .book-header .font-settings .font-reduce {\n  line-height: 30px;\n  font-size: 1em;\n}\n.book.color-theme-1 .book-body {\n  color: #704214;\n  background: #f3eacb;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section {\n  background: #f3eacb;\n}\n.book.color-theme-2 .book-body {\n  color: #bdcadb;\n  background: #1c1f2b;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section {\n  background: #1c1f2b;\n}\n.book.font-size-0 .book-body .page-inner section {\n  font-size: 1.2rem;\n}\n.book.font-size-1 .book-body .page-inner section {\n  font-size: 1.4rem;\n}\n.book.font-size-2 .book-body .page-inner section {\n  font-size: 1.6rem;\n}\n.book.font-size-3 .book-body .page-inner section {\n  font-size: 2.2rem;\n}\n.book.font-size-4 .book-body .page-inner section {\n  font-size: 4rem;\n}\n.book.font-family-0 {\n  font-family: Georgia, serif;\n}\n.book.font-family-1 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal {\n  color: #704214;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 {\n  border-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr {\n  background-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote {\n  border-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {\n  background: #fdf6e3;\n  color: #657b83;\n  border-color: #f8df9c;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight {\n  background-color: inherit;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td {\n  border-color: #f5d06c;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr {\n  color: inherit;\n  background-color: #fdf6e3;\n  border-color: #444444;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {\n  background-color: #fbeecb;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal {\n  color: #bdcadb;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a {\n  color: #3eb1d0;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: #fffffa;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 {\n  border-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {\n  color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr {\n  background-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote {\n  border-color: #373b4e;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {\n  color: #9dbed8;\n  background: #2d3143;\n  border-color: #2d3143;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight {\n  background-color: #282a39;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td {\n  border-color: #3b3f54;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr {\n  color: #b6c2d2;\n  background-color: #2d3143;\n  border-color: #3b3f54;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {\n  background-color: #35394b;\n}\n.book.color-theme-1 .book-header {\n  color: #afa790;\n  background: transparent;\n}\n.book.color-theme-1 .book-header .btn {\n  color: #afa790;\n}\n.book.color-theme-1 .book-header .btn:hover {\n  color: #73553c;\n  background: none;\n}\n.book.color-theme-1 .book-header h1 {\n  color: #704214;\n}\n.book.color-theme-2 .book-header {\n  color: #7e888b;\n  background: transparent;\n}\n.book.color-theme-2 .book-header .btn {\n  color: #3b3f54;\n}\n.book.color-theme-2 .book-header .btn:hover {\n  color: #fffff5;\n  background: none;\n}\n.book.color-theme-2 .book-header h1 {\n  color: #bdcadb;\n}\n.book.color-theme-1 .book-body .navigation {\n  color: #afa790;\n}\n.book.color-theme-1 .book-body .navigation:hover {\n  color: #73553c;\n}\n.book.color-theme-2 .book-body .navigation {\n  color: #383f52;\n}\n.book.color-theme-2 .book-body .navigation:hover {\n  color: #fffff5;\n}\n/*\n * Theme 1\n */\n.book.color-theme-1 .book-summary {\n  color: #afa790;\n  background: #111111;\n  border-right: 1px solid rgba(0, 0, 0, 0.07);\n}\n.book.color-theme-1 .book-summary .book-search {\n  background: transparent;\n}\n.book.color-theme-1 .book-summary .book-search input,\n.book.color-theme-1 .book-summary .book-search input:focus {\n  border: 1px solid transparent;\n}\n.book.color-theme-1 .book-summary ul.summary li.divider {\n  background: #7e888b;\n  box-shadow: none;\n}\n.book.color-theme-1 .book-summary ul.summary li i.fa-check {\n  color: #33cc33;\n}\n.book.color-theme-1 .book-summary ul.summary li.done > a {\n  color: #877f6a;\n}\n.book.color-theme-1 .book-summary ul.summary li a,\n.book.color-theme-1 .book-summary ul.summary li span {\n  color: #877f6a;\n  background: transparent;\n  font-weight: normal;\n}\n.book.color-theme-1 .book-summary ul.summary li.active > a,\n.book.color-theme-1 .book-summary ul.summary li a:hover {\n  color: #704214;\n  background: transparent;\n  font-weight: normal;\n}\n/*\n * Theme 2\n */\n.book.color-theme-2 .book-summary {\n  color: #bcc1d2;\n  background: #2d3143;\n  border-right: none;\n}\n.book.color-theme-2 .book-summary .book-search {\n  background: transparent;\n}\n.book.color-theme-2 .book-summary .book-search input,\n.book.color-theme-2 .book-summary .book-search input:focus {\n  border: 1px solid transparent;\n}\n.book.color-theme-2 .book-summary ul.summary li.divider {\n  background: #272a3a;\n  box-shadow: none;\n}\n.book.color-theme-2 .book-summary ul.summary li i.fa-check {\n  color: #33cc33;\n}\n.book.color-theme-2 .book-summary ul.summary li.done > a {\n  color: #62687f;\n}\n.book.color-theme-2 .book-summary ul.summary li a,\n.book.color-theme-2 .book-summary ul.summary li span {\n  color: #c1c6d7;\n  background: transparent;\n  font-weight: 600;\n}\n.book.color-theme-2 .book-summary ul.summary li.active > a,\n.book.color-theme-2 .book-summary ul.summary li a:hover {\n  color: #f4f4f5;\n  background: #252737;\n  font-weight: 600;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-ga/plugin.js",
    "content": "require([\"gitbook\"], function(gitbook) {\n    // Load analytics.js\n    gitbook.events.bind(\"start\", function(e, config) {\n        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n        var cfg = config.ga;\n        ga('create', cfg.token, cfg.configuration);\n    });\n\n    // Notify pageview\n    gitbook.events.bind(\"page.change\", function() {\n        ga('send', 'pageview', window.location.pathname+window.location.search);\n    });\n});\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-highlight/ebook.css",
    "content": "pre,\ncode {\n  /* http://jmblog.github.io/color-themes-for-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n  /* Tomorrow Orange */\n  /* Tomorrow Yellow */\n  /* Tomorrow Green */\n  /* Tomorrow Aqua */\n  /* Tomorrow Blue */\n  /* Tomorrow Purple */\n}\npre .hljs-comment,\ncode .hljs-comment,\npre .hljs-title,\ncode .hljs-title {\n  color: #8e908c;\n}\npre .hljs-variable,\ncode .hljs-variable,\npre .hljs-attribute,\ncode .hljs-attribute,\npre .hljs-tag,\ncode .hljs-tag,\npre .hljs-regexp,\ncode .hljs-regexp,\npre .hljs-deletion,\ncode .hljs-deletion,\npre .ruby .hljs-constant,\ncode .ruby .hljs-constant,\npre .xml .hljs-tag .hljs-title,\ncode .xml .hljs-tag .hljs-title,\npre .xml .hljs-pi,\ncode .xml .hljs-pi,\npre .xml .hljs-doctype,\ncode .xml .hljs-doctype,\npre .html .hljs-doctype,\ncode .html .hljs-doctype,\npre .css .hljs-id,\ncode .css .hljs-id,\npre .css .hljs-class,\ncode .css .hljs-class,\npre .css .hljs-pseudo,\ncode .css .hljs-pseudo {\n  color: #c82829;\n}\npre .hljs-number,\ncode .hljs-number,\npre .hljs-preprocessor,\ncode .hljs-preprocessor,\npre .hljs-pragma,\ncode .hljs-pragma,\npre .hljs-built_in,\ncode .hljs-built_in,\npre .hljs-literal,\ncode .hljs-literal,\npre .hljs-params,\ncode .hljs-params,\npre .hljs-constant,\ncode .hljs-constant {\n  color: #f5871f;\n}\npre .ruby .hljs-class .hljs-title,\ncode .ruby .hljs-class .hljs-title,\npre .css .hljs-rules .hljs-attribute,\ncode .css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\npre .hljs-string,\ncode .hljs-string,\npre .hljs-value,\ncode .hljs-value,\npre .hljs-inheritance,\ncode .hljs-inheritance,\npre .hljs-header,\ncode .hljs-header,\npre .hljs-addition,\ncode .hljs-addition,\npre .ruby .hljs-symbol,\ncode .ruby .hljs-symbol,\npre .xml .hljs-cdata,\ncode .xml .hljs-cdata {\n  color: #718c00;\n}\npre .css .hljs-hexcolor,\ncode .css .hljs-hexcolor {\n  color: #3e999f;\n}\npre .hljs-function,\ncode .hljs-function,\npre .python .hljs-decorator,\ncode .python .hljs-decorator,\npre .python .hljs-title,\ncode .python .hljs-title,\npre .ruby .hljs-function .hljs-title,\ncode .ruby .hljs-function .hljs-title,\npre .ruby .hljs-title .hljs-keyword,\ncode .ruby .hljs-title .hljs-keyword,\npre .perl .hljs-sub,\ncode .perl .hljs-sub,\npre .javascript .hljs-title,\ncode .javascript .hljs-title,\npre .coffeescript .hljs-title,\ncode .coffeescript .hljs-title {\n  color: #4271ae;\n}\npre .hljs-keyword,\ncode .hljs-keyword,\npre .javascript .hljs-function,\ncode .javascript .hljs-function {\n  color: #8959a8;\n}\npre .hljs,\ncode .hljs {\n  display: block;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\npre .coffeescript .javascript,\ncode .coffeescript .javascript,\npre .javascript .xml,\ncode .javascript .xml,\npre .tex .hljs-formula,\ncode .tex .hljs-formula,\npre .xml .javascript,\ncode .xml .javascript,\npre .xml .vbscript,\ncode .xml .vbscript,\npre .xml .css,\ncode .xml .css,\npre .xml .hljs-cdata,\ncode .xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-highlight/website.css",
    "content": ".book .book-body .page-wrapper .page-inner section.normal pre,\n.book .book-body .page-wrapper .page-inner section.normal code {\n  /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n  /* Tomorrow Orange */\n  /* Tomorrow Yellow */\n  /* Tomorrow Green */\n  /* Tomorrow Aqua */\n  /* Tomorrow Blue */\n  /* Tomorrow Purple */\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-title {\n  color: #8e908c;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo {\n  color: #c82829;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-number,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-params,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant {\n  color: #f5871f;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-string,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-value,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-value,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-header,\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  color: #718c00;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor,\n.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor {\n  color: #3e999f;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-function,\n.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator,\n.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator,\n.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub,\n.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub,\n.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title,\n.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title {\n  color: #4271ae;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,\n.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function,\n.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function {\n  color: #8959a8;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .hljs,\n.book .book-body .page-wrapper .page-inner section.normal code .hljs {\n  display: block;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript,\n.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript,\n.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml,\n.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml,\n.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .css,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .css,\n.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  opacity: 0.5;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {\n  /*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n  /* Solarized Green */\n  /* Solarized Cyan */\n  /* Solarized Blue */\n  /* Solarized Yellow */\n  /* Solarized Orange */\n  /* Solarized Red */\n  /* Solarized Violet */\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs {\n  display: block;\n  padding: 0.5em;\n  background: #fdf6e3;\n  color: #657b83;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc {\n  color: #93a1a1;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title {\n  color: #859900;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url {\n  color: #2aa198;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function {\n  color: #268bd2;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference {\n  color: #b58900;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header {\n  color: #cb4b16;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important {\n  color: #dc322f;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label {\n  color: #6c71c4;\n}\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula {\n  background: #eee8d5;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {\n  /* Tomorrow Night Bright Theme */\n  /* Original theme - https://github.com/chriskempson/tomorrow-theme */\n  /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n  /* Tomorrow Orange */\n  /* Tomorrow Yellow */\n  /* Tomorrow Green */\n  /* Tomorrow Aqua */\n  /* Tomorrow Blue */\n  /* Tomorrow Purple */\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title {\n  color: #969896;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo {\n  color: #d54e53;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant {\n  color: #e78c45;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute {\n  color: #e7c547;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  color: #b9ca4a;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor {\n  color: #70c0b1;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title {\n  color: #7aa6da;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function {\n  color: #c397d8;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs {\n  display: block;\n  background: black;\n  color: #eaeaea;\n  padding: 0.5em;\n}\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata,\n.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-search-plus/search.css",
    "content": "/*\n    This CSS only styled the search results section, not the search input\n    It defines the basic interraction to hide content when displaying results, etc\n*/\n#book-search-input {\n  background: inherit;\n}\n#book-search-results .search-results {\n  display: none;\n}\n#book-search-results .search-results ul.search-results-list {\n  list-style-type: none;\n  padding-left: 0;\n}\n#book-search-results .search-results ul.search-results-list li {\n  margin-bottom: 1.5rem;\n  padding-bottom: 0.5rem;\n  /* Highlight results */\n}\n#book-search-results .search-results ul.search-results-list li p em {\n  background-color: rgba(255, 220, 0, 0.4);\n  font-style: normal;\n}\n#book-search-results .search-results .no-results {\n  display: none;\n}\n#book-search-results.open .search-results {\n  display: block;\n}\n#book-search-results.open .search-noresults {\n  display: none;\n}\n#book-search-results.no-results .search-results .has-results {\n  display: none;\n}\n#book-search-results.no-results .search-results .no-results {\n  display: block;\n}\n#book-search-results span.search-highlight-keyword {\n  background: #ff0;\n}\n#book-search-results.search-plus .search-results .has-results .search-results-item {\n  color: inherit;\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-search-plus/search.js",
    "content": "require([\n  'gitbook',\n  'jquery'\n], function (gitbook, $) {\n  var MAX_DESCRIPTION_SIZE = 500\n  var state = gitbook.state\n  var INDEX_DATA = {}\n  var usePushState = (typeof window.history.pushState !== 'undefined')\n\n  // DOM Elements\n  var $body = $('body')\n  var $bookSearchResults\n  var $searchList\n  var $searchTitle\n  var $searchResultsCount\n  var $searchQuery\n\n  // Throttle search\n  function throttle (fn, wait) {\n    var timeout\n\n    return function () {\n      var ctx = this\n      var args = arguments\n      if (!timeout) {\n        timeout = setTimeout(function () {\n          timeout = null\n          fn.apply(ctx, args)\n        }, wait)\n      }\n    }\n  }\n\n  function displayResults (res) {\n    $bookSearchResults = $('#book-search-results')\n    $searchList = $bookSearchResults.find('.search-results-list')\n    $searchTitle = $bookSearchResults.find('.search-results-title')\n    $searchResultsCount = $searchTitle.find('.search-results-count')\n    $searchQuery = $searchTitle.find('.search-query')\n\n    $bookSearchResults.addClass('open')\n\n    var noResults = res.count == 0\n    $bookSearchResults.toggleClass('no-results', noResults)\n\n    // Clear old results\n    $searchList.empty()\n\n    // Display title for research\n    $searchResultsCount.text(res.count)\n    $searchQuery.text(res.query)\n\n    // Create an <li> element for each result\n    res.results.forEach(function (item) {\n      var $li = $('<li>', {\n        'class': 'search-results-item'\n      })\n\n      var $title = $('<h3>')\n\n      var $link = $('<a>', {\n        'href': gitbook.state.basePath + '/' + item.url + '?h=' + encodeURIComponent(res.query),\n        'text': item.title,\n        'data-is-search': 1\n      })\n\n      if ($link[0].href.split('?')[0] === window.location.href.split('?')[0]) {\n        $link[0].setAttribute('data-need-reload', 1)\n      }\n\n      var content = item.body.trim()\n      if (content.length > MAX_DESCRIPTION_SIZE) {\n        content = content + '...'\n      }\n      var $content = $('<p>').html(content)\n\n      $link.appendTo($title)\n      $title.appendTo($li)\n      $content.appendTo($li)\n      $li.appendTo($searchList)\n    })\n    $('.body-inner').scrollTop(0)\n  }\n\n  function escapeRegExp (keyword) {\n    // escape regexp prevserve word\n    return String(keyword).replace(/([-.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1')\n  }\n\n  function query (keyword) {\n    if (keyword == null || keyword.trim() === '') return\n    keyword = keyword.toLowerCase()\n    var results = []\n    var index = -1\n    for (var page in INDEX_DATA) {\n      var store = INDEX_DATA[page]\n      if (\n        ~store.keywords.toLowerCase().indexOf(keyword) ||\n        ~(index = store.body.toLowerCase().indexOf(keyword))\n      ) {\n        results.push({\n          url: page,\n          title: store.title,\n          body: store.body.substr(Math.max(0, index - 50), MAX_DESCRIPTION_SIZE)\n                    .replace(/^[^\\s,.]+./, '').replace(/(..*)[\\s,.].*/, '$1') // prevent break word\n                    .replace(new RegExp('(' + escapeRegExp(keyword) + ')', 'gi'), '<span class=\"search-highlight-keyword\">$1</span>')\n        })\n      }\n    }\n    displayResults({\n      count: results.length,\n      query: keyword,\n      results: results\n    })\n  }\n\n  function launchSearch (keyword) {\n    // Add class for loading\n    $body.addClass('with-search')\n    $body.addClass('search-loading')\n\n    function doSearch () {\n      query(keyword)\n      $body.removeClass('search-loading')\n    }\n\n    throttle(doSearch)()\n  }\n\n  function closeSearch () {\n    $body.removeClass('with-search')\n    $('#book-search-results').removeClass('open')\n  }\n\n  function bindSearch () {\n    // Bind DOM\n    var $body = $('body')\n\n    // Launch query based on input content\n    function handleUpdate () {\n      var $searchInput = $('#book-search-input input')\n      var keyword = $searchInput.val()\n\n      if (keyword.length === 0) {\n        closeSearch()\n      } else {\n        launchSearch(keyword)\n      }\n    }\n\n    $body.on('keyup', '#book-search-input input', function (e) {\n      if (e.keyCode === 13) {\n        if (usePushState) {\n          var uri = updateQueryString('q', $(this).val())\n          window.history.pushState({\n            path: uri\n          }, null, uri)\n        }\n      }\n      handleUpdate()\n    })\n\n    // Push to history on blur\n    $body.on('blur', '#book-search-input input', function (e) {\n      // Update history state\n      if (usePushState) {\n        var uri = updateQueryString('q', $(this).val())\n        window.history.pushState({\n          path: uri\n        }, null, uri)\n      }\n    })\n  }\n\n  gitbook.events.on('start', function () {\n    bindSearch()\n    $.getJSON(state.basePath + '/search_plus_index.json').then(function (data) {\n      INDEX_DATA = data\n      showResult()\n      closeSearch()\n    })\n  })\n\n  // highlight\n  var highLightPageInner = function (keyword) {\n    $('.page-inner').mark(keyword, {\n      'ignoreJoiners': true,\n      'acrossElements': true,\n      'separateWordSearch': false\n    })\n\n    setTimeout(function () {\n      var mark = $('mark[data-markjs=\"true\"]')\n      if (mark.length) {\n        mark[0].scrollIntoView()\n      }\n    }, 100)\n  }\n\n  function showResult () {\n    var keyword, type\n    if (/\\b(q|h)=([^&]+)/.test(window.location.search)) {\n      type = RegExp.$1\n      keyword = decodeURIComponent(RegExp.$2)\n      if (type === 'q') {\n        launchSearch(keyword)\n      } else {\n        highLightPageInner(keyword)\n      }\n      $('#book-search-input input').val(keyword)\n    }\n  }\n\n  gitbook.events.on('page.change', showResult)\n\n  function updateQueryString (key, value) {\n    value = encodeURIComponent(value)\n\n    var url = window.location.href.replace(/([?&])(?:q|h)=([^&]+)(&|$)/, function (all, pre, value, end) {\n      if (end === '&') {\n        return pre\n      }\n      return ''\n    })\n    var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi')\n    var hash\n\n    if (re.test(url)) {\n      if (typeof value !== 'undefined' && value !== null) { return url.replace(re, '$1' + key + '=' + value + '$2$3') } else {\n        hash = url.split('#')\n        url = hash[0].replace(re, '$1$3').replace(/(&|\\?)$/, '')\n        if (typeof hash[1] !== 'undefined' && hash[1] !== null) { url += '#' + hash[1] }\n        return url\n      }\n    } else {\n      if (typeof value !== 'undefined' && value !== null) {\n        var separator = url.indexOf('?') !== -1 ? '&' : '?'\n        hash = url.split('#')\n        url = hash[0] + separator + key + '=' + value\n        if (typeof hash[1] !== 'undefined' && hash[1] !== null) { url += '#' + hash[1] }\n        return url\n      } else { return url }\n    }\n  }\n  window.addEventListener('click', function (e) {\n    if (e.target.tagName === 'A' && e.target.getAttribute('data-need-reload')) {\n      setTimeout(function () {\n        window.location.reload()\n      }, 100)\n    }\n  }, true)\n})\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook-plugin-sharing/buttons.js",
    "content": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    var SITES = {\n        'facebook': {\n            'label': 'Facebook',\n            'icon': 'fa fa-facebook',\n            'onClick': function(e) {\n                e.preventDefault();\n                window.open('http://www.facebook.com/sharer/sharer.php?s=100&p[url]='+encodeURIComponent(location.href));\n            }\n        },\n        'twitter': {\n            'label': 'Twitter',\n            'icon': 'fa fa-twitter',\n            'onClick': function(e) {\n                e.preventDefault();\n                window.open('http://twitter.com/home?status='+encodeURIComponent(document.title+' '+location.href));\n            }\n        },\n        'google': {\n            'label': 'Google+',\n            'icon': 'fa fa-google-plus',\n            'onClick': function(e) {\n                e.preventDefault();\n                window.open('https://plus.google.com/share?url='+encodeURIComponent(location.href));\n            }\n        },\n        'weibo': {\n            'label': 'Weibo',\n            'icon': 'fa fa-weibo',\n            'onClick': function(e) {\n                e.preventDefault();\n                window.open('http://service.weibo.com/share/share.php?content=utf-8&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title));\n            }\n        },\n        'instapaper': {\n            'label': 'Instapaper',\n            'icon': 'fa fa-instapaper',\n            'onClick': function(e) {\n                e.preventDefault();\n                window.open('http://www.instapaper.com/text?u='+encodeURIComponent(location.href));\n            }\n        },\n        'vk': {\n            'label': 'VK',\n            'icon': 'fa fa-vk',\n            'onClick': function(e) {\n                e.preventDefault();\n                window.open('http://vkontakte.ru/share.php?url='+encodeURIComponent(location.href));\n            }\n        }\n    };\n\n\n\n    gitbook.events.bind('start', function(e, config) {\n        var opts = config.sharing;\n\n        // Create dropdown menu\n        var menu = $.map(opts.all, function(id) {\n            var site = SITES[id];\n\n            return {\n                text: site.label,\n                onClick: site.onClick\n            };\n        });\n\n        // Create main button with dropdown\n        if (menu.length > 0) {\n            gitbook.toolbar.createButton({\n                icon: 'fa fa-share-alt',\n                label: 'Share',\n                position: 'right',\n                dropdown: [menu]\n            });\n        }\n\n        // Direct actions to share\n        $.each(SITES, function(sideId, site) {\n            if (!opts[sideId]) return;\n\n            gitbook.toolbar.createButton({\n                icon: site.icon,\n                label: site.text,\n                position: 'right',\n                onClick: site.onClick\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/gitbook.js",
    "content": "!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u=\"function\"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i=\"function\"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(e,t,n){!function(e,n){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?n(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return n(e)}:n(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";function n(e,t){t=t||te;var n=t.createElement(\"script\");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&\"length\"in e&&e.length,n=de.type(e);return\"function\"!==n&&!de.isWindow(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener(\"DOMContentLoaded\",l),e.removeEventListener(\"load\",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(Pe,\"-$&\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,\"\")},u=a(),c=n&&n[3]||(de.cssNumber[t]?\"\":\"px\"),l=(de.cssNumber[t]||\"px\"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||\".5\",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===o&&(o=\"block\"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i<s;i++)r=e[i],r.style&&(n=r.style.display,t?(\"none\"===n&&(o[i]=Fe.get(r,\"display\")||null,o[i]||(r.style.display=\"\")),\"\"===r.style.display&&Be(r)&&(o[i]=g(r))):\"none\"!==n&&(o[i]=\"none\",Fe.set(r,\"display\",n)));for(i=0;i<s;i++)null!=o[i]&&(e[i].style.display=o[i]);return e}function v(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&de.nodeName(e,t)?de.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],\"globalEval\",!t||Fe.get(t[n],\"globalEval\"))}function x(e,t,n,r,o){for(var i,s,a,u,c,l,f=t.createDocumentFragment(),p=[],h=0,d=e.length;h<d;h++)if(i=e[h],i||0===i)if(\"object\"===de.type(i))de.merge(p,i.nodeType?[i]:i);else if(Ye.test(i)){for(s=s||f.appendChild(t.createElement(\"div\")),a=(Xe.exec(i)||[\"\",\"\"])[1].toLowerCase(),u=Ge[a]||Ge._default,s.innerHTML=u[1]+de.htmlPrefilter(i)+u[2],l=u[0];l--;)s=s.lastChild;de.merge(p,s.childNodes),s=f.firstChild,s.textContent=\"\"}else p.push(t.createTextNode(i));for(f.textContent=\"\",h=0;i=p[h++];)if(r&&de.inArray(i,r)>-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),\"script\"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||\"\")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&(\"string\"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,\"table\")&&de.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n<r;n++)de.event.add(t,o,c[o][n])}Re.hasData(e)&&(a=Re.access(e),u=de.extend({},a),Re.set(t,u))}}function N(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ze.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function A(e,t,r,o){t=oe.apply([],t);var i,s,a,u,c,l,f=0,p=e.length,h=p-1,d=t[0],g=de.isFunction(d);if(g||p>1&&\"string\"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,\"script\"),k),u=a.length;f<p;f++)c=i,f!==h&&(c=de.clone(c,!0,!0),u&&de.merge(a,v(c,\"script\"))),r.call(e[f],c,f);if(u)for(l=a[a.length-1].ownerDocument,de.map(a,E),f=0;f<u;f++)c=a[f],Ve.test(c.type||\"\")&&!Fe.access(c,\"globalEval\")&&de.contains(l,c)&&(c.src?de._evalUrl&&de._evalUrl(c.src):n(c.textContent.replace(ot,\"\"),l))}return e}function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)n||1!==r.nodeType||de.cleanData(v(r)),r.parentNode&&(n&&de.contains(r.ownerDocument,r)&&y(v(r,\"script\")),r.parentNode.removeChild(r));return e}function D(e,t,n){var r,o,i,s,a=e.style;return n=n||at(e),n&&(s=n.getPropertyValue(t)||n[t],\"\"!==s||de.contains(e.ownerDocument,e)||(s=de.style(e,t)),!pe.pixelMarginRight()&&st.test(s)&&it.test(t)&&(r=a.width,o=a.minWidth,i=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=o,a.maxWidth=i)),void 0!==s?s+\"\":s}function O(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ft.length;n--;)if(e=ft[n]+t,e in pt)return e}function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function F(e,t,n,r,o){var i,s=0;for(i=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0;i<4;i+=2)\"margin\"===n&&(s+=de.css(e,n+We[i],!0,o)),r?(\"content\"===n&&(s-=de.css(e,\"padding\"+We[i],!0,o)),\"margin\"!==n&&(s-=de.css(e,\"border\"+We[i]+\"Width\",!0,o))):(s+=de.css(e,\"padding\"+We[i],!0,o),\"padding\"!==n&&(s+=de.css(e,\"border\"+We[i]+\"Width\",!0,o)));return s}function R(e,t,n){var r,o=!0,i=at(e),s=\"border-box\"===de.css(e,\"boxSizing\",!1,i);if(e.getClientRects().length&&(r=e.getBoundingClientRect()[t]),r<=0||null==r){if(r=D(e,t,i),(r<0||null==r)&&(r=e.style[t]),st.test(r))return r;o=s&&(pe.boxSizingReliable()||r===e.style[t]),r=parseFloat(r)||0}return r+F(e,t,n||(s?\"border\":\"content\"),o,i)+\"px\"}function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}function P(){dt&&(e.requestAnimationFrame(P),de.fx.tick())}function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=We[r],o[\"margin\"+n]=o[\"padding\"+n]=e;return t&&(o.opacity=o.width=e),o}function W(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners[\"*\"]),i=0,s=o.length;i<s;i++)if(r=o[i].call(n,t,e))return r}function B(e,t,n){var r,o,i,s,a,u,c,l,f=\"width\"in t||\"height\"in t,p=this,h={},d=e.style,g=e.nodeType&&Be(e),v=Fe.get(e,\"fxshow\");n.queue||(s=de._queueHooks(e,\"fx\"),null==s.unqueued&&(s.unqueued=0,a=s.empty.fire,s.empty.fire=function(){s.unqueued||a()}),s.unqueued++,p.always(function(){p.always(function(){s.unqueued--,de.queue(e,\"fx\").length||s.empty.fire()})}));for(r in t)if(o=t[r],gt.test(o)){if(delete t[r],i=i||\"toggle\"===o,o===(g?\"hide\":\"show\")){if(\"show\"!==o||!v||void 0===v[r])continue;g=!0}h[r]=v&&v[r]||de.style(e,r)}if(u=!de.isEmptyObject(t),u||!de.isEmptyObject(h)){f&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],c=v&&v.display,null==c&&(c=Fe.get(e,\"display\")),l=de.css(e,\"display\"),\"none\"===l&&(c?l=c:(m([e],!0),c=e.style.display||c,l=de.css(e,\"display\"),m([e]))),(\"inline\"===l||\"inline-block\"===l&&null!=c)&&\"none\"===de.css(e,\"float\")&&(u||(p.done(function(){d.display=c}),null==c&&(l=d.display,c=\"none\"===l?\"\":l)),d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",p.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1;for(r in h)u||(v?\"hidden\"in v&&(g=v.hidden):v=Fe.access(e,\"fxshow\",{display:c}),i&&(v.hidden=!g),g&&m([e],!0),p.done(function(){g||m([e]),Fe.remove(e,\"fxshow\");for(r in h)de.style(e,r,h[r])})),u=W(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}}function _(e,t){var n,r,o,i,s;for(n in e)if(r=de.camelCase(n),o=t[r],i=e[n],de.isArray(i)&&(o=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),s=de.cssHooks[r],s&&\"expand\"in s){i=s.expand(i),delete e[r];for(n in i)n in e||(e[n]=i[n],t[n]=o)}else t[r]=o}function U(e,t,n){var r,o,i=0,s=U.prefilters.length,a=de.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var t=ht||M(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,i=1-r,s=0,u=c.tweens.length;s<u;s++)c.tweens[s].run(i);return a.notifyWith(e,[c,i,n]),i<1&&u?n:(a.resolveWith(e,[c]),!1)},c=a.promise({elem:e,props:de.extend({},t),opts:de.extend(!0,{specialEasing:{},easing:de.easing._default},n),originalProperties:t,originalOptions:n,startTime:ht||M(),duration:n.duration,tweens:[],createTween:function(t,n){var r=de.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(o)return this;for(o=!0;n<r;n++)c.tweens[n].run(1);return t?(a.notifyWith(e,[c,1,0]),a.resolveWith(e,[c,t])):a.rejectWith(e,[c,t]),this}}),l=c.props;for(_(l,c.opts.specialEasing);i<s;i++)if(r=U.prefilters[i].call(c,e,l,c.opts))return de.isFunction(r.stop)&&(de._queueHooks(c.elem,c.opts.queue).stop=de.proxy(r.stop,r)),r;return de.map(l,W,c),de.isFunction(c.opts.start)&&c.opts.start.call(e,c),de.fx.timer(de.extend(u,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){var t=e.match(qe)||[];return t.join(\" \")}function X(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function V(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et.test(e)?r(e,o):V(e+\"[\"+(\"object\"==typeof o&&null!=o?t:\"\")+\"]\",o,n,r)});else if(n||\"object\"!==de.type(t))r(e,t);else for(o in t)V(e+\"[\"+o+\"]\",t[o],n,r)}function G(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,o=0,i=t.toLowerCase().match(qe)||[];if(de.isFunction(n))for(;r=i[o++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Y(e,t,n,r){function o(a){var u;return i[a]=!0,de.each(e[a]||[],function(e,a){var c=a(t,n,r);return\"string\"!=typeof c||s||i[c]?s?!(u=c):void 0:(t.dataTypes.unshift(c),o(c),!1)}),u}var i={},s=e===Pt;return o(t.dataTypes[0])||!i[\"*\"]&&o(\"*\")}function Q(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&de.extend(!0,e,r),e}function J(e,t,n){for(var r,o,i,s,a=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(o in a)if(a[o]&&a[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+\" \"+u[0]]){i=o;break}s||(s=o)}i=i||s}if(i)return i!==u[0]&&u.unshift(i),n[i]}function K(e,t,n,r){var o,i,s,a,u,c={},l=e.dataTypes.slice();if(l[1])for(s in e.converters)c[s.toLowerCase()]=e.converters[s];for(i=l.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=l.shift())if(\"*\"===i)i=u;else if(\"*\"!==u&&u!==i){if(s=c[u+\" \"+i]||c[\"* \"+i],!s)for(o in c)if(a=o.split(\" \"),a[1]===i&&(s=c[u+\" \"+a[0]]||c[\"* \"+a[0]])){s===!0?s=c[o]:c[o]!==!0&&(i=a[0],l.unshift(a[1]));break}if(s!==!0)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:\"parsererror\",error:s?e:\"No conversion from \"+u+\" to \"+i}}}return{state:\"success\",data:t}}function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}var ee=[],te=e.document,ne=Object.getPrototypeOf,re=ee.slice,oe=ee.concat,ie=ee.push,se=ee.indexOf,ae={},ue=ae.toString,ce=ae.hasOwnProperty,le=ce.toString,fe=le.call(Object),pe={},he=\"3.1.1\",de=function(e,t){return new de.fn.init(e,t)},ge=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,me=/^-ms-/,ve=/-([a-z])/g,ye=function(e,t){return t.toUpperCase()};de.fn=de.prototype={jquery:he,constructor:de,length:0,toArray:function(){return re.call(this)},get:function(e){return null==e?re.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=de.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return de.each(this,e)},map:function(e){return this.pushStack(de.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(re.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ie,sort:ee.sort,splice:ee.splice},de.extend=de.fn.extend=function(){var e,t,n,r,o,i,s=arguments[0]||{},a=1,u=arguments.length,c=!1;for(\"boolean\"==typeof s&&(c=s,s=arguments[a]||{},a++),\"object\"==typeof s||de.isFunction(s)||(s={}),a===u&&(s=this,a--);a<u;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(c&&r&&(de.isPlainObject(r)||(o=de.isArray(r)))?(o?(o=!1,i=n&&de.isArray(n)?n:[]):i=n&&de.isPlainObject(n)?n:{},s[t]=de.extend(c,i,r)):void 0!==r&&(s[t]=r));return s},de.extend({expando:\"jQuery\"+(he+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===de.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=de.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==ue.call(e))&&(!(t=ne(e))||(n=ce.call(t,\"constructor\")&&t.constructor,\"function\"==typeof n&&le.call(n)===fe))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?ae[ue.call(e)]||\"object\":typeof e},globalEval:function(e){n(e)},camelCase:function(e){return e.replace(me,\"ms-\").replace(ve,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,o=0;if(r(e))for(n=e.length;o<n&&t.call(e[o],o,e[o])!==!1;o++);else for(o in e)if(t.call(e[o],o,e[o])===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ge,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(r(Object(e))?de.merge(n,\"string\"==typeof e?[e]:e):ie.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},grep:function(e,t,n){for(var r,o=[],i=0,s=e.length,a=!n;i<s;i++)r=!t(e[i],i),r!==a&&o.push(e[i]);return o},map:function(e,t,n){var o,i,s=0,a=[];if(r(e))for(o=e.length;s<o;s++)i=t(e[s],s,n),null!=i&&a.push(i);else for(s in e)i=t(e[s],s,n),null!=i&&a.push(i);return oe.apply([],a)},guid:1,proxy:function(e,t){var n,r,o;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),de.isFunction(e))return r=re.call(arguments,2),o=function(){return e.apply(t||this,r.concat(re.call(arguments)))},o.guid=e.guid=e.guid||de.guid++,o},now:Date.now,support:pe}),\"function\"==typeof Symbol&&(de.fn[Symbol.iterator]=ee[Symbol.iterator]),de.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){ae[\"[object \"+t+\"]\"]=t.toLowerCase()});var xe=function(e){function t(e,t,n,r){var o,i,s,a,u,c,l,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],\"string\"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:W)!==L&&O(t),t=t||L,F)){if(11!==d&&(u=ve.exec(e)))if(o=u[1]){if(9===d){if(!(s=t.getElementById(o)))return n;if(s.id===o)return n.push(s),n}else if(p&&(s=p.getElementById(o))&&M(t,s)&&s.id===o)return n.push(s),n}else{if(u[2])return K.apply(n,t.getElementsByTagName(e)),n;if((o=u[3])&&T.getElementsByClassName&&t.getElementsByClassName)return K.apply(n,t.getElementsByClassName(o)),n}if(T.qsa&&!X[e+\" \"]&&(!R||!R.test(e))){if(1!==d)p=t,l=e;else if(\"object\"!==t.nodeName.toLowerCase()){for((a=t.getAttribute(\"id\"))?a=a.replace(we,Te):t.setAttribute(\"id\",a=$),c=E(e),i=c.length;i--;)c[i]=\"#\"+a+\" \"+h(c[i]);l=c.join(\",\"),p=ye.test(e)&&f(t.parentNode)||t}if(l)try{return K.apply(n,p.querySelectorAll(l)),n}catch(e){}finally{a===$&&t.removeAttribute(\"id\")}}}return N(e.replace(ae,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>C.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split(\"|\"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function c(e){return function(t){return\"form\"in t?t.parentNode&&t.disabled===!1?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,o=t.next,i=o||r,s=n&&\"parentNode\"===i,a=_++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||s)return e(t,n,o);return!1}:function(t,n,u){var c,l,f,p=[B,a];if(u){for(;t=t[r];)if((1===t.nodeType||s)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||s)if(f=t[$]||(t[$]={}),l=f[t.uniqueID]||(f[t.uniqueID]={}),o&&o===t.nodeName.toLowerCase())t=t[r]||t;else{if((c=l[i])&&c[0]===B&&c[1]===a)return p[2]=c[2];if(l[i]=p,p[2]=e(t,n,u))return!0}return!1}}function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}function v(e,t,n,r,o){for(var i,s=[],a=0,u=e.length,c=null!=t;a<u;a++)(i=e[a])&&(n&&!n(i,r,o)||(s.push(i),c&&t.push(a)));return s}function y(e,t,n,o,i,s){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,s)),r(function(r,s,a,u){var c,l,f,p=[],h=[],d=s.length,g=r||m(t||\"*\",a.nodeType?[a]:a,[]),y=!e||!r&&t?g:v(g,p,e,a,u),x=n?i||(r?e:d||o)?[]:s:y;if(n&&n(y,x,a,u),o)for(c=v(x,h),o(c,[],a,u),l=c.length;l--;)(f=c[l])&&(x[h[l]]=!(y[h[l]]=f));if(r){if(i||e){if(i){for(c=[],l=x.length;l--;)(f=x[l])&&c.push(y[l]=f);i(null,x=[],c,u)}for(l=x.length;l--;)(f=x[l])&&(c=i?ee(r,f):p[l])>-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[\" \"],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a<o;a++)if(n=C.relative[e[a].type])l=[d(g(l),n)];else{if(n=C.filter[e[a].type].apply(null,e[a].matches),n[$]){for(r=++a;r<o&&!C.relative[e[r].type];r++);return y(a>1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:\" \"===e[a-2].type?\"*\":\"\"})).replace(ae,\"$1\"),n,a<r&&x(e.slice(a,r)),r<o&&x(e=e.slice(r)),r<o&&h(e))}l.push(n)}return g(l)}function b(e,n){var o=n.length>0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d=\"0\",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG(\"*\",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$=\"sizzle\"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+re+\"))|)\"+ne+\"*\\\\]\",ie=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",se=new RegExp(ne+\"+\",\"g\"),ae=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),ue=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),ce=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),le=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),fe=new RegExp(ie),pe=new RegExp(\"^\"+re+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re+\"|[*])\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+ie),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\\d$/i,me=/^[^{]+\\{\\s*\\[native \\w/,ve=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ye=/[+~]/,xe=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),be=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,Te=function(e,t){return t?\"\\0\"===e?\"�\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",Ce,!1):n.attachEvent&&n.attachEvent(\"onunload\",Ce)),T.attributes=o(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute(\"id\")===t}},C.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},C.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if(\"*\"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML=\"<a id='\"+$+\"'></a><select id='\"+$+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&R.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||R.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+$+\"-]\").length||R.push(\"~=\"),e.querySelectorAll(\":checked\").length||R.push(\":checked\"),e.querySelectorAll(\"a#\"+$+\"+*\").length||R.push(\".#.+[+~]\")}),o(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=L.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&R.push(\"name\"+ne+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&R.push(\":enabled\",\":disabled\"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&R.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),R.push(\",.*:\")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,\"*\"),P.call(e,\"[s!='']:x\"),I.push(\"!=\",ie)}),R=R.length&&new RegExp(R.join(\"|\")),I=I.length&&new RegExp(I.join(\"|\")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,\"='$1']\"),T.matchesSelector&&F&&!X[n+\" \"]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+\"\").replace(we,Te)},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||\"\").replace(xe,be),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&U(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?\"!=\"===n:!n||(i+=\"\",\"=\"===n?i===r:\"!=\"===n?i!==r:\"^=\"===n?r&&0===i.indexOf(r):\"*=\"===n?r&&i.indexOf(r)>-1:\"$=\"===n?r&&i.slice(-r.length)===r:\"~=\"===n?(\" \"+i.replace(se,\" \")+\" \").indexOf(r)>-1:\"|=\"===n&&(i===r||i.slice(0,r.length+1)===r+\"-\"))}},CHILD:function(e,t,n,r,o){var i=\"nth\"!==e.slice(0,3),s=\"last\"!==e.slice(-4),a=\"of-type\"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return i[$]?i(n):i.length>1?(o=[e,e,\"\",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,\"$1\"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){\nreturn t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},C.pseudos.nth=C.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[w]=a(w);for(w in{submit:!0,reset:!0})C.pseudos[w]=u(w);return p.prototype=C.filters=C.pseudos,C.setFilters=new p,E=t.tokenize=function(e,n){var r,o,i,s,a,u,c,l=z[e+\" \"];if(l)return n?0:l.slice(0);for(a=e,u=[],c=C.preFilter;a;){r&&!(o=ue.exec(a))||(o&&(a=a.slice(o[0].length)||a),u.push(i=[])),r=!1,(o=ce.exec(a))&&(r=o.shift(),i.push({value:r,type:o[0].replace(ae,\" \")}),a=a.slice(r.length));for(s in C.filter)!(o=he[s].exec(a))||c[s]&&!(o=c[s](o))||(r=o.shift(),i.push({value:r,type:s,matches:o}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):z(e,u).slice(0)},S=t.compile=function(e,t){var n,r=[],o=[],i=X[e+\" \"];if(!i){for(t||(t=E(e)),n=t.length;n--;)i=x(t[n]),i[$]?r.push(i):o.push(i);i=X(e,b(o,r)),i.selector=e}return i},N=t.select=function(e,t,n,r){var o,i,s,a,u,c=\"function\"==typeof e&&e,l=!r&&E(e=c.selector||e);if(n=n||[],1===l.length){if(i=l[0]=l[0].slice(0),i.length>2&&\"ID\"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split(\"\").sort(V).join(\"\")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement(\"fieldset\"))}),o(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||i(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||i(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute(\"disabled\")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[\":\"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,je=/^.[^:#\\[\\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if(\"string\"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t<r;t++)if(de.contains(o[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)de.find(e,o[t],n);return r>1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,\"string\"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,\"string\"==typeof e){if(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(de.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,o=this.length,i=[],s=\"string\"!=typeof e&&de(e);if(!Te.test(e))for(;r<o;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?\"string\"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,\"parentNode\")},parentsUntil:function(e,t,n){return be(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return be(e,\"nextSibling\")},prevAll:function(e){return be(e,\"previousSibling\")},nextUntil:function(e,t,n){return be(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return be(e,\"previousSibling\",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\\x20\\t\\r\\n\\f]+/g;de.Callbacks=function(e){e=\"string\"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u<i.length;)i[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=i.length,n=!1);e.memory||(n=!1),t=!1,o&&(i=n?[]:\"\")},l={add:function(){return i&&(n&&!t&&(u=i.length-1,a.push(n)),function t(n){de.each(n,function(n,r){de.isFunction(r)?e.unique&&l.has(r)||i.push(r):r&&r.length&&\"string\"!==de.type(r)&&t(r)})}(arguments),n&&!t&&c()),this},remove:function(){return de.each(arguments,function(e,t){for(var n;(n=de.inArray(t,i,n))>-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n=\"\",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=\"\"),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",de.Callbacks(\"memory\"),de.Callbacks(\"memory\"),2],[\"resolve\",\"done\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t<s)){if(e=r.apply(c,l),e===n.promise())throw new TypeError(\"Thenable self-resolution\");f=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,de.isFunction(f)?o?f.call(e,i(s,n,a,o),i(s,n,u,o)):(s++,f.call(e,i(s,n,a,o),i(s,n,u,o),i(s,n,a,n.notifyWith))):(r!==a&&(c=void 0,l=[e]),(o||n.resolveWith)(c,l))}},p=o?f:function(){try{f()}catch(e){de.Deferred.exceptionHook&&de.Deferred.exceptionHook(e,p.stackTrace),t+1>=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+\"With\"](this===i?void 0:this,arguments),this},i[t[0]+\"With\"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),\"pending\"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,\"complete\"===te.readyState||\"loading\"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener(\"DOMContentLoaded\",l),e.addEventListener(\"load\",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if(\"object\"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a<u;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return o?e:c?t.call(e):u?t(e[0],n):i},He=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};f.uid=1,f.prototype={cache:function(e){var t=e[this.expando];return t||(t={},He(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,o=this.cache(e);if(\"string\"==typeof t)o[de.camelCase(t)]=n;else for(r in t)o[de.camelCase(r)]=t[r];return o},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][de.camelCase(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){de.isArray(t)?t=t.map(de.camelCase):(t=de.camelCase(t),t=t in r?[t]:t.match(qe)||[]),n=t.length;for(;n--;)delete r[t[n]]}(void 0===t||de.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!de.isEmptyObject(t)}};var Fe=new f,Re=new f,Ie=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,Pe=/[A-Z]/g;de.extend({hasData:function(e){return Re.hasData(e)||Fe.hasData(e)},data:function(e,t,n){return Re.access(e,t,n)},removeData:function(e,t){Re.remove(e,t)},_data:function(e,t,n){return Fe.access(e,t,n)},_removeData:function(e,t){Fe.remove(e,t)}}),de.fn.extend({data:function(e,t){var n,r,o,i=this[0],s=i&&i.attributes;if(void 0===e){if(this.length&&(o=Re.get(i),1===i.nodeType&&!Fe.get(i,\"hasDataAttrs\"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf(\"data-\")&&(r=de.camelCase(r.slice(5)),h(i,r,o[r])));Fe.set(i,\"hasDataAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){Re.set(this,e)}):Le(this,function(t){var n;if(i&&void 0===t){if(n=Re.get(i,e),void 0!==n)return n;if(n=h(i,e),void 0!==n)return n}else this.each(function(){Re.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};\"inprogress\"===o&&(o=n.shift(),r--),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks(\"once memory\").add(function(){Fe.remove(e,[t+\"queue\",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?de.queue(this[0],e):void 0===t?this:this.each(function(){var n=de.queue(this,e,t);de._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&de.dequeue(this,e)})},dequeue:function(e){return this.each(function(){de.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,o=de.Deferred(),i=this,s=this.length,a=function(){--r||o.resolveWith(i,[i])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";s--;)n=Fe.get(i[s],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(a));return a(),o.promise(t)}});var Me=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,$e=new RegExp(\"^(?:([+-])=|)(\"+Me+\")([a-z%]*)$\",\"i\"),We=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Be=function(e,t){return e=t||e,\"none\"===e.style.display||\"\"===e.style.display&&de.contains(e.ownerDocument,e)&&\"none\"===de.css(e,\"display\")},_e=function(e,t,n,r){var o,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=s[i];return o},Ue={};de.fn.extend({show:function(){return m(this,!0)},hide:function(){return m(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){Be(this)?de(this).show():de(this).hide()})}});var ze=/^(?:checkbox|radio)$/i,Xe=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Ve=/^$|\\/(?:java|ecma)script/i,Ge={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement(\"div\")),n=te.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return\"undefined\"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(qe)||[\"\"],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(\".\")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(qe)||[\"\"],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&(\"**\"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,\"events\")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t<arguments.length;t++)u[t]=arguments[t];if(a.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,a)!==!1){for(s=de.event.handlers.call(this,a,c),t=0;(o=s[t++])&&!a.isPropagationStopped();)for(a.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!a.rnamespace.test(i.namespace)||(a.handleObj=i,a.data=i.data,r=((de.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),void 0!==r&&(a.result=r)===!1&&(a.preventDefault(),a.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,a),a.result}},handlers:function(e,t){var n,r,o,i,s,a=[],u=t.delegateCount,c=e.target;if(u&&c.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&(\"click\"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n<u;n++)r=t[n],o=r.selector+\" \",void 0===s[o]&&(s[o]=r.needsContext?de(o,this).index(c)>-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u<t.length&&a.push({elem:c,handlers:t.slice(u)}),a},addProp:function(e,t){Object.defineProperty(de.Event.prototype,e,{enumerable:!0,configurable:!0,get:de.isFunction(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[de.expando]?e:new de.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==T()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===T()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&de.nodeName(this,\"input\"))return this.click(),!1},_default:function(e){return de.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},de.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},de.Event=function(e,t){return this instanceof de.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?b:w,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&de.extend(this,t),this.timeStamp=e&&e.timeStamp||de.now(),void(this[de.expando]=!0)):new de.Event(e,t)},de.Event.prototype={constructor:de.Event,isDefaultPrevented:w,isPropagationStopped:w,isImmediatePropagationStopped:w,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=b,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=b,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=b,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},de.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Je.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ke.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},de.event.addProp),de.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){de.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,o=e.relatedTarget,i=e.handleObj;return o&&(o===r||de.contains(r,o))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),de.fn.extend({on:function(e,t,n,r){return C(this,e,t,n,r)},one:function(e,t,n,r){return C(this,e,t,n,r,1)},off:function(e,t,n){var r,o;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,de(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,t,e[o]);return this}return t!==!1&&\"function\"!=typeof t||(n=t,t=void 0),n===!1&&(n=w),this.each(function(){de.event.remove(this,e,n,t)})}});var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,tt=/<script|<style|<link/i,nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,rt=/^true\\/(.*)/,ot=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,\"<$1></$2>\")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r<o;r++)N(i[r],s[r]);if(t)if(n)for(i=i||v(e),s=s||v(a),r=0,o=i.length;r<o;r++)S(i[r],s[r]);else S(e,a);return s=v(a,\"script\"),s.length>0&&y(s,!u&&v(e,\"script\")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(de.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return A(this,arguments,function(t){var n=this.parentNode;de.inArray(this,e)<0&&(de.cleanData(v(this)),n&&n.replaceChild(t,this))},e)}}),de.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){de.fn[e]=function(e){for(var n,r=[],o=de(e),i=o.length-1,s=0;s<=i;s++)n=s===i?this:this.clone(!0),de(o[s])[t](n),ie.apply(r,n.get());return this.pushStack(r)}});var it=/^margin/,st=new RegExp(\"^(\"+Me+\")(?!px)[a-z%]+$\",\"i\"),at=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)};!function(){function t(){if(a){a.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",a.innerHTML=\"\",Qe.appendChild(s);var t=e.getComputedStyle(a);n=\"1%\"!==t.top,i=\"2px\"===t.marginLeft,r=\"4px\"===t.width,a.style.marginRight=\"50%\",o=\"4px\"===t.marginRight,Qe.removeChild(s),a=null}}var n,r,o,i,s=te.createElement(\"div\"),a=te.createElement(\"div\");a.style&&(a.style.backgroundClip=\"content-box\",a.cloneNode(!0).style.backgroundClip=\"\",pe.clearCloneStyle=\"content-box\"===a.style.backgroundClip,s.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",s.appendChild(a),de.extend(pe,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return t(),r},pixelMarginRight:function(){return t(),o},reliableMarginLeft:function(){return t(),i}}))}();var ut=/^(none|table(?!-c[ea]).+)/,ct={position:\"absolute\",visibility:\"hidden\",display:\"block\"},lt={letterSpacing:\"0\",fontWeight:\"400\"},ft=[\"Webkit\",\"Moz\",\"ms\"],pt=te.createElement(\"div\").style;de.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=D(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,s,a=de.camelCase(t),u=e.style;return t=de.cssProps[a]||(de.cssProps[a]=L(a)||a),s=de.cssHooks[t]||de.cssHooks[a],void 0===n?s&&\"get\"in s&&void 0!==(o=s.get(e,!1,r))?o:u[t]:(i=typeof n,\"string\"===i&&(o=$e.exec(n))&&o[1]&&(n=d(e,t,o),i=\"number\"),null!=n&&n===n&&(\"number\"===i&&(n+=o&&o[3]||(de.cssNumber[a]?\"\":\"px\")),pe.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),s&&\"set\"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,s,a=de.camelCase(t);return t=de.cssProps[a]||(de.cssProps[a]=L(a)||a),s=de.cssHooks[t]||de.cssHooks[a],s&&\"get\"in s&&(o=s.get(e,!0,n)),void 0===o&&(o=D(e,t,r)),\"normal\"===o&&t in lt&&(o=lt[t]),\"\"===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),de.each([\"height\",\"width\"],function(e,t){de.cssHooks[t]={get:function(e,n,r){if(n)return!ut.test(de.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?R(e,t,r):_e(e,ct,function(){return R(e,t,r)})},set:function(e,n,r){var o,i=r&&at(e),s=r&&F(e,t,r,\"border-box\"===de.css(e,\"boxSizing\",!1,i),i);return s&&(o=$e.exec(n))&&\"px\"!==(o[3]||\"px\")&&(e.style[t]=n,n=de.css(e,t)),H(e,n,s)}}}),de.cssHooks.marginLeft=O(pe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(D(e,\"marginLeft\"))||e.getBoundingClientRect().left-_e(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),de.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){de.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)o[e+We[r]+t]=i[r]||i[r-2]||i[0];return o}},it.test(e)||(de.cssHooks[e+t].set=H)}),de.fn.extend({css:function(e,t){return Le(this,function(e,t,n){var r,o,i={},s=0;if(de.isArray(t)){for(r=at(e),o=t.length;s<o;s++)i[t[s]]=de.css(e,t[s],!1,r);return i}return void 0!==n?de.style(e,t,n):de.css(e,t)},e,t,arguments.length>1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?\"\":\"px\")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=[\"*\"]):e=e.match(qe);for(var n,r=0,o=e.length;r<o;r++)n=e[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(t)},prefilters:[B],prefilter:function(e,t){t?U.prefilters.unshift(e):U.prefilters.push(e)}}),de.speed=function(e,t,n){var r=e&&\"object\"==typeof e?de.extend({},e):{complete:n||!n&&t||de.isFunction(e)&&e,duration:e,easing:n&&t||t&&!de.isFunction(t)&&t};return de.fx.off||te.hidden?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in de.fx.speeds?r.duration=de.fx.speeds[r.duration]:r.duration=de.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){de.isFunction(r.old)&&r.old.call(this),r.queue&&de.dequeue(this,r.queue)},r},de.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Be).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){\nvar o=de.isEmptyObject(e),i=de.speed(t,n,r),s=function(){var t=U(this,de.extend({},e),i);(o||Fe.get(this,\"finish\"))&&t.stop(!0)};return s.finish=s,o||i.queue===!1?this.each(s):this.queue(i.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,o=null!=e&&e+\"queueHooks\",i=de.timers,s=Fe.get(this);if(o)s[o]&&s[o].stop&&r(s[o]);else for(o in s)s[o]&&s[o].stop&&mt.test(o)&&r(s[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));!t&&n||de.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=Fe.get(this),r=n[e+\"queue\"],o=n[e+\"queueHooks\"],i=de.timers,s=r?r.length:0;for(n.finish=!0,de.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;t<s;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),de.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=de.fn[t];de.fn[t]=function(e,r,o){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate($(t,!0),e,r,o)}}),de.each({slideDown:$(\"show\"),slideUp:$(\"hide\"),slideToggle:$(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){de.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),de.timers=[],de.fx.tick=function(){var e,t=0,n=de.timers;for(ht=de.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||de.fx.stop(),ht=void 0},de.fx.timer=function(e){de.timers.push(e),e()?de.fx.start():de.timers.pop()},de.fx.interval=13,de.fx.start=function(){dt||(dt=e.requestAnimationFrame?e.requestAnimationFrame(P):e.setInterval(de.fx.tick,de.fx.interval))},de.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(dt):e.clearInterval(dt),dt=null},de.fx.speeds={slow:600,fast:200,_default:400},de.fn.delay=function(t,n){return t=de.fx?de.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var o=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(o)}})},function(){var e=te.createElement(\"input\"),t=te.createElement(\"select\"),n=t.appendChild(te.createElement(\"option\"));e.type=\"checkbox\",pe.checkOn=\"\"!==e.value,pe.optSelected=n.selected,e=te.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",pe.radioValue=\"t\"===e.value}();var vt,yt=de.expr.attrHandle;de.fn.extend({attr:function(e,t){return Le(this,de.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return\"undefined\"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):o&&\"get\"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&\"radio\"===t&&de.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&\"get\"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,\"tabindex\");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(s=0;i=t[s++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");a=z(r),o!==a&&n.setAttribute(\"class\",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(s=0;i=t[s++];)for(;r.indexOf(\" \"+i+\" \")>-1;)r=r.replace(\" \"+i+\" \",\" \");a=z(r),o!==a&&n.setAttribute(\"class\",a)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if(\"string\"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||(t=X(this),t&&Fe.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||e===!1?\"\":Fe.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+z(X(n))+\" \").indexOf(t)>-1)return!0;return!1}});var wt=/\\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":de.isArray(o)&&(o=de.map(o,function(e){return null==e?\"\":e+\"\"})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,o,\"value\")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(o,\"value\"))?n:(n=o.value,\"string\"==typeof n?n.replace(wt,\"\"):null==n?\"\":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,\"value\");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s=\"select-one\"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r<u;r++)if(n=o[r],(n.selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!de.nodeName(n.parentNode,\"optgroup\"))){if(t=de(n).val(),s)return t;a.push(t)}return a},set:function(e,t){for(var n,r,o=e.options,i=de.makeArray(t),s=o.length;s--;)r=o[s],(r.selected=de.inArray(de.valHooks.option.get(r),i)>-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each([\"radio\",\"checkbox\"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,\"type\")?t.type:t,d=ce.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(\".\")>-1&&(d=h.split(\".\"),h=d.shift(),d.sort()),c=h.indexOf(\":\")<0&&\"on\"+h,t=t[de.expando]?t:new de.Event(h,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,\"events\")||{})[t.type]&&Fe.get(s,\"handle\"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin=\"onfocusin\"in e,pe.focusin||de.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\\?/;de.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||de.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,St=/\\r?\\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join(\"&\")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,\"elements\");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(\":disabled\")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,\"\\r\\n\")}}):{name:t.name,value:n.replace(St,\"\\r\\n\")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\\/\\//,It={},Pt={},Mt=\"*/\".concat(\"*\"),$t=te.createElement(\"a\");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:\"GET\",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||\"\",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader(\"Last-Modified\"),w&&(de.lastModified[i]=w),w=C.getResponseHeader(\"etag\"),w&&(de.etag[i]=w)),204===t||\"HEAD\"===d.type?T=\"nocontent\":304===t?T=\"notmodified\":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T=\"error\",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+\"\",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?\"ajaxSuccess\":\"ajaxError\",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger(\"ajaxComplete\",[C,d]),--de.active||de.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks(\"once memory\"),x=d.statusCode||{},b={},w={},T=\"canceled\",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+\"\").replace(Rt,Ct.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(qe)||[\"\"],null==d.crossDomain){c=te.createElement(\"a\");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+\"//\"+$t.host!=c.protocol+\"//\"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(qt,\"+\")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?\"&\":\"?\")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,\"$1\"),h=(kt.test(i)?\"&\":\"?\")+\"_=\"+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader(\"If-Modified-Since\",de.lastModified[i]),de.etag[i]&&C.setRequestHeader(\"If-None-Match\",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader(\"Content-Type\",d.contentType),C.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T=\"abort\",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger(\"ajaxSend\",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort(\"timeout\")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,\"No Transport\");return C},getJSON:function(e,t,n){return de.get(e,t,n,\"json\")},getScript:function(e,t){return de.get(e,void 0,t,\"script\")}}),de.each([\"get\",\"post\"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&\"withCredentials\"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o[\"X-Requested-With\"]||(o[\"X-Requested-With\"]=\"XMLHttpRequest\");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,\"abort\"===e?a.abort():\"error\"===e?\"number\"!=typeof a.status?i(0,\"error\"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,\"text\"!==(a.responseType||\"text\")||\"string\"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n(\"error\"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),de.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),te.head.appendChild(t[0])},abort:function(){n&&n()}}}});var _t=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;de.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=_t.pop()||de.expando+\"_\"+jt++;return this[e]=!0,e}}),de.ajaxPrefilter(\"json jsonp\",function(t,n,r){var o,i,s,a=t.jsonp!==!1&&(Ut.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(t.data)&&\"data\");if(a||\"jsonp\"===t.dataTypes[0])return o=t.jsonpCallback=de.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,\"$1\"+o):t.jsonp!==!1&&(t.url+=(kt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+o),t.converters[\"script json\"]=function(){return s||de.error(o+\" was not called\"),s[0]},t.dataTypes[0]=\"json\",i=e[o],e[o]=function(){s=arguments},r.always(function(){void 0===i?de(e).removeProp(o):e[o]=i,t[o]&&(t.jsonpCallback=n.jsonpCallback,_t.push(o)),s&&de.isFunction(i)&&i(s[0]),s=i=void 0}),\"script\"}),pe.createHTMLDocument=function(){var e=te.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),de.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var r,o,i;return t||(pe.createHTMLDocument?(t=te.implementation.createHTMLDocument(\"\"),r=t.createElement(\"base\"),r.href=te.location.href,t.head.appendChild(r)):t=te),o=Ce.exec(e),i=!n&&[],o?[t.createElement(o[1])]:(o=x([e],t,i),i&&i.length&&de(i).remove(),de.merge([],o.childNodes))},de.fn.load=function(e,t,n){var r,o,i,s=this,a=e.indexOf(\" \");return a>-1&&(r=z(e.slice(a)),e=e.slice(0,a)),de.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(o=\"POST\"),s.length>0&&de.ajax({url:e,type:o||\"GET\",dataType:\"html\",data:t}).done(function(e){i=arguments,s.html(r?de(\"<div>\").append(de.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},de.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){de.fn[t]=function(e){return this.on(t,e)}}),de.expr.pseudos.animated=function(e){return de.grep(de.timers,function(t){return e===t.elem}).length},de.offset={setOffset:function(e,t,n){var r,o,i,s,a,u,c,l=de.css(e,\"position\"),f=de(e),p={};\"static\"===l&&(e.style.position=\"relative\"),a=f.offset(),i=de.css(e,\"top\"),u=de.css(e,\"left\"),c=(\"absolute\"===l||\"fixed\"===l)&&(i+u).indexOf(\"auto\")>-1,c?(r=f.position(),s=r.top,o=r.left):(s=parseFloat(i)||0,o=parseFloat(u)||0),de.isFunction(t)&&(t=t.call(e,n,de.extend({},a))),null!=t.top&&(p.top=t.top-a.top+s),null!=t.left&&(p.left=t.left-a.left+o),\"using\"in t?t.using.call(e,p):f.css(p)}},de.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){de.offset.setOffset(this,e,t)});var t,n,r,o,i=this[0];if(i)return i.getClientRects().length?(r=i.getBoundingClientRect(),r.width||r.height?(o=i.ownerDocument,n=Z(o),t=o.documentElement,{top:r.top+n.pageYOffset-t.clientTop,left:r.left+n.pageXOffset-t.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===de.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),de.nodeName(e[0],\"html\")||(r=e.offset()),r={top:r.top+de.css(e[0],\"borderTopWidth\",!0),left:r.left+de.css(e[0],\"borderLeftWidth\",!0)}),{top:t.top-r.top-de.css(n,\"marginTop\",!0),left:t.left-r.left-de.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&\"static\"===de.css(e,\"position\");)e=e.offsetParent;return e||Qe})}}),de.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;de.fn[e]=function(r){return Le(this,function(e,r,o){var i=Z(e);return void 0===o?i?i[t]:e[r]:void(i?i.scrollTo(n?i.pageXOffset:o,n?o:i.pageYOffset):e[r]=o)},e,r,arguments.length)}}),de.each([\"top\",\"left\"],function(e,t){de.cssHooks[t]=O(pe.pixelPosition,function(e,n){if(n)return n=D(e,t),st.test(n)?de(e).position()[t]+\"px\":n})}),de.each({Height:\"height\",Width:\"width\"},function(e,t){de.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){de.fn[r]=function(o,i){var s=arguments.length&&(n||\"boolean\"!=typeof o),a=n||(o===!0||i===!0?\"margin\":\"border\");return Le(this,function(t,n,o){var i;return de.isWindow(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===o?de.css(t,n,a):de.style(t,n,o,a)},t,s?o:void 0,s)}})}),de.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),de.parseJSON=JSON.parse,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return de});var zt=e.jQuery,Xt=e.$;return de.noConflict=function(t){return e.$===de&&(e.$=Xt),t&&e.jQuery===de&&(e.jQuery=zt),de},t||(e.jQuery=e.$=de),de})},{}],2:[function(e,t,n){(function(e){function t(e,t){for(var n=0,r=e.length-1;r>=0;r--){var o=e[r];\".\"===o?e.splice(r,1):\"..\"===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift(\"..\");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.length;r++)t(e[r],r,e)&&n.push(e[r]);return n}var o=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/,i=function(e){return o.exec(e).slice(1)};n.resolve=function(){for(var n=\"\",o=!1,i=arguments.length-1;i>=-1&&!o;i--){var s=i>=0?arguments[i]:e.cwd();if(\"string\"!=typeof s)throw new TypeError(\"Arguments to path.resolve must be strings\");s&&(n=s+\"/\"+n,o=\"/\"===s.charAt(0))}return n=t(r(n.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),(o?\"/\":\"\")+n||\".\"},n.normalize=function(e){var o=n.isAbsolute(e),i=\"/\"===s(e,-1);return e=t(r(e.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),e||o||(e=\".\"),e&&i&&(e+=\"/\"),(o?\"/\":\"\")+e},n.isAbsolute=function(e){return\"/\"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(r(e,function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"Arguments to path.join must be strings\");return e}).join(\"/\"))},n.relative=function(e,t){function r(e){for(var t=0;t<e.length&&\"\"===e[t];t++);for(var n=e.length-1;n>=0&&\"\"===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var o=r(e.split(\"/\")),i=r(t.split(\"/\")),s=Math.min(o.length,i.length),a=s,u=0;u<s;u++)if(o[u]!==i[u]){a=u;break}for(var c=[],u=a;u<o.length;u++)c.push(\"..\");return c=c.concat(i.slice(a)),c.join(\"/\")},n.sep=\"/\",n.delimiter=\":\",n.dirname=function(e){var t=i(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):\".\"},n.basename=function(e,t){var n=i(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return i(e)[3]};var s=\"b\"===\"ab\".substr(-1)?function(e,t,n){return e.substr(t,n)}:function(e,t,n){return t<0&&(t=e.length+t),e.substr(t,n)}}).call(this,e(\"_process\"))},{_process:3}],3:[function(e,t,n){function r(){throw new Error(\"setTimeout has not been defined\")}function o(){throw new Error(\"clearTimeout has not been defined\")}function i(e){if(f===setTimeout)return setTimeout(e,0);if((f===r||!f)&&setTimeout)return f=setTimeout,setTimeout(e,0);try{return f(e,0)}catch(t){try{return f.call(null,e,0)}catch(t){return f.call(this,e,0)}}}function s(e){if(p===clearTimeout)return clearTimeout(e);if((p===o||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?g=d.concat(g):v=-1,g.length&&u())}function u(){if(!m){var e=i(a);m=!0;for(var t=g.length;t;){for(d=g,g=[];++v<t;)d&&d[v].run();v=-1,t=g.length}d=null,m=!1,s(e)}}function c(e,t){this.fun=e,this.array=t}function l(){}var f,p,h=t.exports={};!function(){try{f=\"function\"==typeof setTimeout?setTimeout:r}catch(e){f=r}try{p=\"function\"==typeof clearTimeout?clearTimeout:o}catch(e){p=o}}();var d,g=[],m=!1,v=-1;h.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];g.push(new c(e,t)),1!==g.length||m||i(u)},c.prototype.run=function(){this.fun.apply(null,this.array)},h.title=\"browser\",h.browser=!0,h.env={},h.argv=[],h.version=\"\",h.versions={},h.on=l,h.addListener=l,h.once=l,h.off=l,h.removeListener=l,h.removeAllListeners=l,h.emit=l,h.binding=function(e){throw new Error(\"process.binding is not supported\")},h.cwd=function(){return\"/\"},h.chdir=function(e){throw new Error(\"process.chdir is not supported\")},h.umask=function(){return 0}},{}],4:[function(e,t,n){(function(e){!function(r){function o(e){throw new RangeError(L[e])}function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function s(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var o=e.split(\".\"),s=i(o,t).join(\".\");return r+s}function a(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t>=55296&&t<=56319&&o<i?(n=e.charCodeAt(o++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--)):r.push(t);return r}function u(e){return i(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=R(e>>>10&1023|55296),e=56320|1023&e),t+=R(e)}).join(\"\")}function c(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:T}function l(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*j>>1;r+=T)e=F(e/H);return F(r+(H+1)*e/(e+k))}function p(e){var t,n,r,i,s,a,l,p,h,d,g=[],m=e.length,v=0,y=N,x=S;for(n=e.lastIndexOf(A),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&o(\"not-basic\"),g.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<m;){for(s=v,a=1,l=T;i>=m&&o(\"invalid-input\"),p=c(e.charCodeAt(i++)),(p>=T||p>F((w-v)/a))&&o(\"overflow\"),v+=p*a,h=l<=x?C:l>=x+j?j:l-x,!(p<h);l+=T)d=T-h,a>F(w/d)&&o(\"overflow\"),a*=d;t=g.length+1,x=f(v-s,t,0==s),F(v/t)>w-y&&o(\"overflow\"),y+=F(v/t),v%=t,g.splice(v++,0,y)}return u(g)}function h(e){var t,n,r,i,s,u,c,p,h,d,g,m,v,y,x,b=[];for(e=a(e),m=e.length,t=N,n=0,s=S,u=0;u<m;++u)g=e[u],g<128&&b.push(R(g));for(r=i=b.length,i&&b.push(A);r<m;){for(c=w,u=0;u<m;++u)g=e[u],g>=t&&g<c&&(c=g);for(v=r+1,c-t>F((w-n)/v)&&o(\"overflow\"),n+=(c-t)*v,t=c,u=0;u<m;++u)if(g=e[u],g<t&&++n>w&&o(\"overflow\"),g==t){for(p=n,h=T;d=h<=s?C:h>=s+j?j:h-s,!(p<d);h+=T)x=p-d,y=T-d,b.push(R(l(d+x%y,0))),p=F(x/y);b.push(R(l(p,0))),s=f(n,v,r==i),n=0,++r}++n,++t}return b.join(\"\")}function d(e){return s(e,function(e){return q.test(e)?p(e.slice(4).toLowerCase()):e})}function g(e){return s(e,function(e){return D.test(e)?\"xn--\"+h(e):e})}var m=\"object\"==typeof n&&n&&!n.nodeType&&n,v=\"object\"==typeof t&&t&&!t.nodeType&&t,y=\"object\"==typeof e&&e;y.global!==y&&y.window!==y&&y.self!==y||(r=y);var x,b,w=2147483647,T=36,C=1,j=26,k=38,E=700,S=72,N=128,A=\"-\",q=/^xn--/,D=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,L={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},H=T-C,F=Math.floor,R=String.fromCharCode;if(x={version:\"1.4.1\",ucs2:{decode:a,encode:u},decode:p,encode:h,toASCII:g,toUnicode:d},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd)define(\"punycode\",function(){return x});else if(m&&v)if(t.exports==m)v.exports=x;else for(b in x)x.hasOwnProperty(b)&&(m[b]=x[b]);else r.punycode=x}(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],5:[function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.exports=function(e,t,n,i){t=t||\"&\",n=n||\"=\";var s={};if(\"string\"!=typeof e||0===e.length)return s;var a=/\\+/g;e=e.split(t);var u=1e3;i&&\"number\"==typeof i.maxKeys&&(u=i.maxKeys);var c=e.length;u>0&&c>u&&(c=u);for(var l=0;l<c;++l){var f,p,h,d,g=e[l].replace(a,\"%20\"),m=g.indexOf(n);m>=0?(f=g.substr(0,m),p=g.substr(m+1)):(f=g,p=\"\"),h=decodeURIComponent(f),d=decodeURIComponent(p),r(s,h)?o(s[h])?s[h].push(d):s[h]=[s[h],d]:s[h]=d}return s};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],6:[function(e,t,n){\"use strict\";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var o=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};t.exports=function(e,t,n,a){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?r(s(e),function(s){var a=encodeURIComponent(o(s))+n;return i(e[s])?r(e[s],function(e){return a+encodeURIComponent(o(e))}).join(t):a+encodeURIComponent(o(e[s]))}).join(t):a?encodeURIComponent(o(a))+n+encodeURIComponent(o(e)):\"\"};var i=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},s=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},{}],7:[function(e,t,n){\"use strict\";n.decode=n.parse=e(\"./decode\"),n.encode=n.stringify=e(\"./encode\")},{\"./decode\":5,\"./encode\":6}],8:[function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function o(e,t,n){if(e&&c.isObject(e)&&e instanceof r)return e;var o=new r;return o.parse(e,t,n),\no}function i(e){return c.isString(e)&&(e=o(e)),e instanceof r?e.format():r.prototype.format.call(e)}function s(e,t){return o(e,!1,!0).resolve(t)}function a(e,t){return e?o(e,!1,!0).resolveObject(t):t}var u=e(\"punycode\"),c=e(\"./util\");n.parse=o,n.resolve=s,n.resolveObject=a,n.format=i,n.Url=r;var l=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,p=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),g=[\"'\"].concat(d),m=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(g),v=[\"/\",\"?\",\"#\"],y=255,x=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,w={javascript:!0,\"javascript:\":!0},T={javascript:!0,\"javascript:\":!0},C={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},j=e(\"querystring\");r.prototype.parse=function(e,t,n){if(!c.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),o=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",i=e.split(o),s=/\\\\/g;i[0]=i[0].replace(s,\"/\"),e=i.join(o);var a=e;if(a=a.trim(),!n&&1===e.split(\"#\").length){var f=p.exec(a);if(f)return this.path=a,this.href=a,this.pathname=f[1],f[2]?(this.search=f[2],t?this.query=j.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=l.exec(a);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,a=a.substr(h.length)}if(n||h||a.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var k=\"//\"===a.substr(0,2);!k||h&&T[h]||(a=a.substr(2),this.slashes=!0)}if(!T[h]&&(k||h&&!C[h])){for(var E=-1,S=0;S<v.length;S++){var N=a.indexOf(v[S]);N!==-1&&(E===-1||N<E)&&(E=N)}var A,q;q=E===-1?a.lastIndexOf(\"@\"):a.lastIndexOf(\"@\",E),q!==-1&&(A=a.slice(0,q),a=a.slice(q+1),this.auth=decodeURIComponent(A)),E=-1;for(var S=0;S<m.length;S++){var N=a.indexOf(m[S]);N!==-1&&(E===-1||N<E)&&(E=N)}E===-1&&(E=a.length),this.host=a.slice(0,E),a=a.slice(E),this.parseHost(),this.hostname=this.hostname||\"\";var D=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!D)for(var O=this.hostname.split(/\\./),S=0,L=O.length;S<L;S++){var H=O[S];if(H&&!H.match(x)){for(var F=\"\",R=0,I=H.length;R<I;R++)F+=H.charCodeAt(R)>127?\"x\":H[R];if(!F.match(x)){var P=O.slice(0,S),M=O.slice(S+1),$=H.match(b);$&&(P.push($[1]),M.unshift($[2])),M.length&&(a=\"/\"+M.join(\".\")+a),this.hostname=P.join(\".\");break}}}this.hostname.length>y?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),D||(this.hostname=u.toASCII(this.hostname));var W=this.port?\":\"+this.port:\"\",B=this.hostname||\"\";this.host=B+W,this.href+=this.host,D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==a[0]&&(a=\"/\"+a))}if(!w[d])for(var S=0,L=g.length;S<L;S++){var _=g[S];if(a.indexOf(_)!==-1){var U=encodeURIComponent(_);U===_&&(U=escape(_)),a=a.split(_).join(U)}}var z=a.indexOf(\"#\");z!==-1&&(this.hash=a.substr(z),a=a.slice(0,z));var X=a.indexOf(\"?\");if(X!==-1?(this.search=a.substr(X),this.query=a.substr(X+1),t&&(this.query=j.parse(this.query)),a=a.slice(0,X)):t&&(this.search=\"\",this.query={}),a&&(this.pathname=a),C[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var W=this.pathname||\"\",V=this.search||\"\";this.path=W+V}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",o=!1,i=\"\";this.host?o=e+this.host:this.hostname&&(o=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(o+=\":\"+this.port)),this.query&&c.isObject(this.query)&&Object.keys(this.query).length&&(i=j.stringify(this.query));var s=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||C[t])&&o!==!1?(o=\"//\"+(o||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):o||(o=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),s&&\"?\"!==s.charAt(0)&&(s=\"?\"+s),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),s=s.replace(\"#\",\"%23\"),t+o+n+s+r},r.prototype.resolve=function(e){return this.resolveObject(o(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(c.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,o=Object.keys(this),i=0;i<o.length;i++){var s=o[i];n[s]=this[s]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var a=Object.keys(e),u=0;u<a.length;u++){var l=a[u];\"protocol\"!==l&&(n[l]=e[l])}return C[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!C[e.protocol]){for(var f=Object.keys(e),p=0;p<f.length;p++){var h=f[p];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||T[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var g=n.pathname||\"\",m=n.search||\"\";n.path=g+m}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var v=n.pathname&&\"/\"===n.pathname.charAt(0),y=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),x=y||v||n.host&&e.pathname,b=x,w=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],j=n.protocol&&!C[n.protocol];if(j&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===w[0]?w[0]=n.host:w.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),x=x&&(\"\"===d[0]||\"\"===w[0])),y)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,w=d;else if(d.length)w||(w=[]),w.pop(),w=w.concat(d),n.search=e.search,n.query=e.query;else if(!c.isNullOrUndefined(e.search)){if(j){n.hostname=n.host=w.shift();var k=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");k&&(n.auth=k.shift(),n.host=n.hostname=k.shift())}return n.search=e.search,n.query=e.query,c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!w.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var E=w.slice(-1)[0],S=(n.host||e.host||w.length>1)&&(\".\"===E||\"..\"===E)||\"\"===E,N=0,A=w.length;A>=0;A--)E=w[A],\".\"===E?w.splice(A,1):\"..\"===E?(w.splice(A,1),N++):N&&(w.splice(A,1),N--);if(!x&&!b)for(;N--;N)w.unshift(\"..\");!x||\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0)||w.unshift(\"\"),S&&\"/\"!==w.join(\"/\").substr(-1)&&w.push(\"\");var q=\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0);if(j){n.hostname=n.host=q?\"\":w.length?w.shift():\"\";var k=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");k&&(n.auth=k.shift(),n.host=n.hostname=k.shift())}return x=x||n.host&&w.length,x&&!q&&w.unshift(\"\"),w.length?n.pathname=w.join(\"/\"):(n.pathname=null,n.path=null),c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=f.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},{\"./util\":9,punycode:4,querystring:7}],9:[function(e,t,n){\"use strict\";t.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],10:[function(e,t,n){var r=e(\"jquery\");t.exports=r({})},{jquery:1}],11:[function(e,t,n){var r=e(\"jquery\"),o=e(\"./events\"),i=e(\"./storage\"),s=e(\"./page\"),a=!1,u=window.gitbook||[],c={events:o,page:s,state:s.getState(),storage:i,push:function(e){a?e():u.push(e)}},l={gitbook:c,jquery:r};window.gitbook=c,window.$=r,window.jQuery=r,window.require=function(e,t){e=e.map(function(e){if(e=e.toLowerCase(),!l[e])throw new Error(\"GitBook module \"+e+\" doesn't exist\");return l[e]}),t.apply(null,e)},r(document).ready(function(){a=!0,r.each(u,function(e,t){t()})})},{\"./events\":10,\"./page\":12,\"./storage\":13,jquery:1}],12:[function(e,t,n){function r(e){console.log(\"page has changed\",e),o(e),l||(l=!0,c.trigger(\"start\",e.config.pluginsConfig)),c.trigger(\"page.change\")}function o(e){f.page=e.page,f.file=e.file,f.gitbook=e.gitbook,f.config=e.config,f.basePath=e.basePath,f.book=e.book,f.$book=s(\".book\"),f.revision=f.gitbook.time,f.level=f.page.level,f.filepath=f.file.path,f.chapterTitle=f.page.title,f.innerLanguage=f.book.language||\"\",f.root=a.resolve(location.protocol+\"//\"+location.host,u.dirname(u.resolve(location.pathname.replace(/\\/$/,\"/index.html\"),f.basePath))).replace(/\\/?$/,\"/\"),f.bookRoot=f.innerLanguage?a.resolve(f.root,\"..\"):f.root}function i(){return f}var s=e(\"jquery\"),a=e(\"url\"),u=e(\"path\"),c=e(\"./events\"),l=!1,f={};t.exports={hasChanged:r,setState:o,getState:i}},{\"./events\":10,jquery:1,path:2,url:8}],13:[function(e,t,n){var r=\"\";t.exports={setBaseKey:function(e){r=e},set:function(e,t){e=r+\":\"+e;try{localStorage[e]=JSON.stringify(t)}catch(e){}},get:function(e,t){var n;e=r+\":\"+e;try{n=localStorage[e]}catch(e){}if(void 0===n)return t;try{var o=JSON.parse(n);return null==o?t:o}catch(e){return n||t}},remove:function(e){e=r+\":\"+e;try{localStorage.removeItem(e)}catch(e){}}}},{}]},{},[11]);\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/style.css",
    "content": "/*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:\"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}.link-inherit{color:inherit}.link-inherit:focus,.link-inherit:hover{color:inherit}.hidden{display:none}.alert{padding:15px;margin-bottom:20px;color:#444;background:#eee;border-bottom:5px solid #ddd}.alert-success{background:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-info{background:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-danger{background:#f2dede;border-color:#ebccd1;color:#a94442}.alert-warning{background:#fcf8e3;border-color:#faebcc;color:#8a6d3b}/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome/fontawesome-webfont.eot?v=4.6.3);src:url(fonts/fontawesome/fontawesome-webfont.eot?#iefix&v=4.6.3) format('embedded-opentype'),url(fonts/fontawesome/fontawesome-webfont.woff2?v=4.6.3) format('woff2'),url(fonts/fontawesome/fontawesome-webfont.woff?v=4.6.3) format('woff'),url(fonts/fontawesome/fontawesome-webfont.ttf?v=4.6.3) format('truetype'),url(fonts/fontawesome/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-float-left{float:left}.fa-float-right{float:right}.fa.fa-float-left{margin-right:.3em}.fa.fa-float-right{margin-left:.3em}.float-right{float:right}.float-left{float:left}.fa.float-left{margin-right:.3em}.fa.float-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-close:before,.fa-remove:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-cog:before,.fa-gear:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-repeat:before,.fa-rotate-right:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-exclamation-triangle:before,.fa-warning:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-cogs:before,.fa-gears:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook-f:before,.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-feed:before,.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-floppy-o:before,.fa-save:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-sort:before,.fa-unsorted:before{content:\"\\f0dc\"}.fa-sort-desc:before,.fa-sort-down:before{content:\"\\f0dd\"}.fa-sort-asc:before,.fa-sort-up:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-gavel:before,.fa-legal:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-bolt:before,.fa-flash:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-clipboard:before,.fa-paste:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-chain-broken:before,.fa-unlink:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:\"\\f150\"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:\"\\f151\"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:\"\\f152\"}.fa-eur:before,.fa-euro:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-inr:before,.fa-rupee:before{content:\"\\f156\"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:\"\\f157\"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:\"\\f158\"}.fa-krw:before,.fa-won:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before,.fa-gratipay:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-try:before,.fa-turkish-lira:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:\"\\f19c\"}.fa-graduation-cap:before,.fa-mortar-board:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper-pp:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:\"\\f1c5\"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:\"\\f1c6\"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:\"\\f1d0\"}.fa-empire:before,.fa-ge:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-paper-plane:before,.fa-send:before{content:\"\\f1d8\"}.fa-paper-plane-o:before,.fa-send-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}.fa-buysellads:before{content:\"\\f20d\"}.fa-connectdevelop:before{content:\"\\f20e\"}.fa-dashcube:before{content:\"\\f210\"}.fa-forumbee:before{content:\"\\f211\"}.fa-leanpub:before{content:\"\\f212\"}.fa-sellsy:before{content:\"\\f213\"}.fa-shirtsinbulk:before{content:\"\\f214\"}.fa-simplybuilt:before{content:\"\\f215\"}.fa-skyatlas:before{content:\"\\f216\"}.fa-cart-plus:before{content:\"\\f217\"}.fa-cart-arrow-down:before{content:\"\\f218\"}.fa-diamond:before{content:\"\\f219\"}.fa-ship:before{content:\"\\f21a\"}.fa-user-secret:before{content:\"\\f21b\"}.fa-motorcycle:before{content:\"\\f21c\"}.fa-street-view:before{content:\"\\f21d\"}.fa-heartbeat:before{content:\"\\f21e\"}.fa-venus:before{content:\"\\f221\"}.fa-mars:before{content:\"\\f222\"}.fa-mercury:before{content:\"\\f223\"}.fa-intersex:before,.fa-transgender:before{content:\"\\f224\"}.fa-transgender-alt:before{content:\"\\f225\"}.fa-venus-double:before{content:\"\\f226\"}.fa-mars-double:before{content:\"\\f227\"}.fa-venus-mars:before{content:\"\\f228\"}.fa-mars-stroke:before{content:\"\\f229\"}.fa-mars-stroke-v:before{content:\"\\f22a\"}.fa-mars-stroke-h:before{content:\"\\f22b\"}.fa-neuter:before{content:\"\\f22c\"}.fa-genderless:before{content:\"\\f22d\"}.fa-facebook-official:before{content:\"\\f230\"}.fa-pinterest-p:before{content:\"\\f231\"}.fa-whatsapp:before{content:\"\\f232\"}.fa-server:before{content:\"\\f233\"}.fa-user-plus:before{content:\"\\f234\"}.fa-user-times:before{content:\"\\f235\"}.fa-bed:before,.fa-hotel:before{content:\"\\f236\"}.fa-viacoin:before{content:\"\\f237\"}.fa-train:before{content:\"\\f238\"}.fa-subway:before{content:\"\\f239\"}.fa-medium:before{content:\"\\f23a\"}.fa-y-combinator:before,.fa-yc:before{content:\"\\f23b\"}.fa-optin-monster:before{content:\"\\f23c\"}.fa-opencart:before{content:\"\\f23d\"}.fa-expeditedssl:before{content:\"\\f23e\"}.fa-battery-4:before,.fa-battery-full:before{content:\"\\f240\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\"\\f241\"}.fa-battery-2:before,.fa-battery-half:before{content:\"\\f242\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\"\\f243\"}.fa-battery-0:before,.fa-battery-empty:before{content:\"\\f244\"}.fa-mouse-pointer:before{content:\"\\f245\"}.fa-i-cursor:before{content:\"\\f246\"}.fa-object-group:before{content:\"\\f247\"}.fa-object-ungroup:before{content:\"\\f248\"}.fa-sticky-note:before{content:\"\\f249\"}.fa-sticky-note-o:before{content:\"\\f24a\"}.fa-cc-jcb:before{content:\"\\f24b\"}.fa-cc-diners-club:before{content:\"\\f24c\"}.fa-clone:before{content:\"\\f24d\"}.fa-balance-scale:before{content:\"\\f24e\"}.fa-hourglass-o:before{content:\"\\f250\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\"\\f251\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\"\\f252\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\"\\f253\"}.fa-hourglass:before{content:\"\\f254\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\"\\f255\"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:\"\\f256\"}.fa-hand-scissors-o:before{content:\"\\f257\"}.fa-hand-lizard-o:before{content:\"\\f258\"}.fa-hand-spock-o:before{content:\"\\f259\"}.fa-hand-pointer-o:before{content:\"\\f25a\"}.fa-hand-peace-o:before{content:\"\\f25b\"}.fa-trademark:before{content:\"\\f25c\"}.fa-registered:before{content:\"\\f25d\"}.fa-creative-commons:before{content:\"\\f25e\"}.fa-gg:before{content:\"\\f260\"}.fa-gg-circle:before{content:\"\\f261\"}.fa-tripadvisor:before{content:\"\\f262\"}.fa-odnoklassniki:before{content:\"\\f263\"}.fa-odnoklassniki-square:before{content:\"\\f264\"}.fa-get-pocket:before{content:\"\\f265\"}.fa-wikipedia-w:before{content:\"\\f266\"}.fa-safari:before{content:\"\\f267\"}.fa-chrome:before{content:\"\\f268\"}.fa-firefox:before{content:\"\\f269\"}.fa-opera:before{content:\"\\f26a\"}.fa-internet-explorer:before{content:\"\\f26b\"}.fa-television:before,.fa-tv:before{content:\"\\f26c\"}.fa-contao:before{content:\"\\f26d\"}.fa-500px:before{content:\"\\f26e\"}.fa-amazon:before{content:\"\\f270\"}.fa-calendar-plus-o:before{content:\"\\f271\"}.fa-calendar-minus-o:before{content:\"\\f272\"}.fa-calendar-times-o:before{content:\"\\f273\"}.fa-calendar-check-o:before{content:\"\\f274\"}.fa-industry:before{content:\"\\f275\"}.fa-map-pin:before{content:\"\\f276\"}.fa-map-signs:before{content:\"\\f277\"}.fa-map-o:before{content:\"\\f278\"}.fa-map:before{content:\"\\f279\"}.fa-commenting:before{content:\"\\f27a\"}.fa-commenting-o:before{content:\"\\f27b\"}.fa-houzz:before{content:\"\\f27c\"}.fa-vimeo:before{content:\"\\f27d\"}.fa-black-tie:before{content:\"\\f27e\"}.fa-fonticons:before{content:\"\\f280\"}.fa-reddit-alien:before{content:\"\\f281\"}.fa-edge:before{content:\"\\f282\"}.fa-credit-card-alt:before{content:\"\\f283\"}.fa-codiepie:before{content:\"\\f284\"}.fa-modx:before{content:\"\\f285\"}.fa-fort-awesome:before{content:\"\\f286\"}.fa-usb:before{content:\"\\f287\"}.fa-product-hunt:before{content:\"\\f288\"}.fa-mixcloud:before{content:\"\\f289\"}.fa-scribd:before{content:\"\\f28a\"}.fa-pause-circle:before{content:\"\\f28b\"}.fa-pause-circle-o:before{content:\"\\f28c\"}.fa-stop-circle:before{content:\"\\f28d\"}.fa-stop-circle-o:before{content:\"\\f28e\"}.fa-shopping-bag:before{content:\"\\f290\"}.fa-shopping-basket:before{content:\"\\f291\"}.fa-hashtag:before{content:\"\\f292\"}.fa-bluetooth:before{content:\"\\f293\"}.fa-bluetooth-b:before{content:\"\\f294\"}.fa-percent:before{content:\"\\f295\"}.fa-gitlab:before{content:\"\\f296\"}.fa-wpbeginner:before{content:\"\\f297\"}.fa-wpforms:before{content:\"\\f298\"}.fa-envira:before{content:\"\\f299\"}.fa-universal-access:before{content:\"\\f29a\"}.fa-wheelchair-alt:before{content:\"\\f29b\"}.fa-question-circle-o:before{content:\"\\f29c\"}.fa-blind:before{content:\"\\f29d\"}.fa-audio-description:before{content:\"\\f29e\"}.fa-volume-control-phone:before{content:\"\\f2a0\"}.fa-braille:before{content:\"\\f2a1\"}.fa-assistive-listening-systems:before{content:\"\\f2a2\"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:\"\\f2a3\"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:\"\\f2a4\"}.fa-glide:before{content:\"\\f2a5\"}.fa-glide-g:before{content:\"\\f2a6\"}.fa-sign-language:before,.fa-signing:before{content:\"\\f2a7\"}.fa-low-vision:before{content:\"\\f2a8\"}.fa-viadeo:before{content:\"\\f2a9\"}.fa-viadeo-square:before{content:\"\\f2aa\"}.fa-snapchat:before{content:\"\\f2ab\"}.fa-snapchat-ghost:before{content:\"\\f2ac\"}.fa-snapchat-square:before{content:\"\\f2ad\"}.fa-pied-piper:before{content:\"\\f2ae\"}.fa-first-order:before{content:\"\\f2b0\"}.fa-yoast:before{content:\"\\f2b1\"}.fa-themeisle:before{content:\"\\f2b2\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\"\\f2b3\"}.fa-fa:before,.fa-font-awesome:before{content:\"\\f2b4\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}/*!\n * Preboot v2\n *\n * Open sourced under MIT license by @mdo.\n * Some variables and mixins from Bootstrap (Apache 2 license).\n */.book-langs-index{width:100%;height:100%;padding:40px 0;margin:0;overflow:auto}@media (max-width:600px){.book-langs-index{padding:0}}.book-langs-index .inner{max-width:600px;width:100%;margin:0 auto;padding:30px;background:#fff;border-radius:3px}.book-langs-index .inner h3{margin:0}.book-langs-index .inner .languages{list-style:none;padding:20px 30px;margin-top:20px;border-top:1px solid #eee}.book-langs-index .inner .languages:after,.book-langs-index .inner .languages:before{content:\" \";display:table;line-height:0}.book-langs-index .inner .languages:after{clear:both}.book-langs-index .inner .languages li{width:50%;float:left;padding:10px 5px;font-size:16px}@media (max-width:600px){.book-langs-index .inner .languages li{width:100%;max-width:100%}}.book-header{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;overflow:visible;height:50px;padding:0 8px;z-index:2;font-size:.85em;color:#7e888b;background:0 0}.book-header .btn{display:block;height:50px;padding:0 15px;border-bottom:none;color:#ccc;text-transform:uppercase;line-height:50px;-webkit-box-shadow:none!important;box-shadow:none!important;position:relative;font-size:14px}.book-header .btn:hover{position:relative;text-decoration:none;color:#444;background:0 0}.book-header .btn:focus{outline:0}.book-header h1{margin:0;font-size:20px;font-weight:200;text-align:center;line-height:50px;opacity:0;-webkit-transition:opacity ease .4s;-moz-transition:opacity ease .4s;-o-transition:opacity ease .4s;transition:opacity ease .4s;padding-left:200px;padding-right:200px;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.book-header h1 a,.book-header h1 a:hover{color:inherit;text-decoration:none}@media (max-width:1000px){.book-header h1{display:none}}.book-header h1 i{display:none}.book-header:hover h1{opacity:1}.book.is-loading .book-header h1 i{display:inline-block}.book.is-loading .book-header h1 a{display:none}.dropdown{position:relative}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;display:none;float:left;min-width:160px;padding:0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fafafa;border:1px solid rgba(0,0,0,.07);border-radius:1px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.open{display:block}.dropdown-menu.dropdown-left{left:auto;right:4%}.dropdown-menu.dropdown-left .dropdown-caret{right:14px;left:auto}.dropdown-menu .dropdown-caret{position:absolute;top:-8px;left:14px;width:18px;height:10px;float:left;overflow:hidden}.dropdown-menu .dropdown-caret .caret-outer{position:absolute;border-left:9px solid transparent;border-right:9px solid transparent;border-bottom:9px solid rgba(0,0,0,.1);height:auto;left:0;top:0;width:auto;display:inline-block;margin-left:-1px}.dropdown-menu .dropdown-caret .caret-inner{position:absolute;display:inline-block;margin-top:-1px;top:0;top:1px;border-left:9px solid transparent;border-right:9px solid transparent;border-bottom:9px solid #fafafa}.dropdown-menu .buttons{border-bottom:1px solid rgba(0,0,0,.07)}.dropdown-menu .buttons:after,.dropdown-menu .buttons:before{content:\" \";display:table;line-height:0}.dropdown-menu .buttons:after{clear:both}.dropdown-menu .buttons:last-child{border-bottom:none}.dropdown-menu .buttons .button{border:0;background-color:transparent;color:#a6a6a6;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.dropdown-menu .buttons .button:hover{color:#444}.dropdown-menu .buttons .button:focus,.dropdown-menu .buttons .button:hover{outline:0}.dropdown-menu .buttons .button.size-2{width:50%}.dropdown-menu .buttons .button.size-3{width:33%}.book-summary{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;position:absolute;top:0;left:-300px;bottom:0;z-index:1;overflow-y:auto;width:300px;color:#364149;background:#fafafa;border-right:1px solid rgba(0,0,0,.07);-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book-summary ul.summary{list-style:none;margin:0;padding:0;-webkit-transition:top .5s ease;-moz-transition:top .5s ease;-o-transition:top .5s ease;transition:top .5s ease}.book-summary ul.summary li{list-style:none}.book-summary ul.summary li.header{padding:10px 15px;padding-top:20px;text-transform:uppercase;color:#939da3}.book-summary ul.summary li.divider{height:1px;margin:7px 0;overflow:hidden;background:rgba(0,0,0,.07)}.book-summary ul.summary li i.fa-check{display:none;position:absolute;right:9px;top:16px;font-size:9px;color:#3c3}.book-summary ul.summary li.done>a{color:#364149;font-weight:400}.book-summary ul.summary li.done>a i{display:inline}.book-summary ul.summary li a,.book-summary ul.summary li span{display:block;padding:10px 15px;border-bottom:none;color:#364149;background:0 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.book-summary ul.summary li a:hover{text-decoration:underline}.book-summary ul.summary li a:focus{outline:0}.book-summary ul.summary li.active>a{color:#008cff;background:0 0;text-decoration:none}.book-summary ul.summary li ul{padding-left:20px}@media (max-width:600px){.book-summary{width:calc(100% - 60px);bottom:0;left:-100%}}.book.with-summary .book-summary{left:0}.book.without-animation .book-summary{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book{position:relative;width:100%;height:100%}@media (min-width:600px){.book.with-summary .book-body{left:300px}}@media (max-width:600px){.book.with-summary{overflow:hidden}.book.with-summary .book-body{-webkit-transform:translate(calc(100% - 60px),0);-moz-transform:translate(calc(100% - 60px),0);-ms-transform:translate(calc(100% - 60px),0);-o-transform:translate(calc(100% - 60px),0);transform:translate(calc(100% - 60px),0)}}.book.without-animation .book-body{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.book-body{position:absolute;top:0;right:0;left:0;bottom:0;overflow-y:auto;color:#000;background:#fff;-webkit-transition:left 250ms ease;-moz-transition:left 250ms ease;-o-transition:left 250ms ease;transition:left 250ms ease}.book-body .body-inner{position:absolute;top:0;right:0;left:0;bottom:0;overflow-y:auto}@media (max-width:1240px){.book-body{-webkit-transition:-webkit-transform 250ms ease;-moz-transition:-moz-transform 250ms ease;-o-transition:-o-transform 250ms ease;transition:transform 250ms ease;padding-bottom:20px}.book-body .body-inner{position:static;min-height:calc(100% - 50px)}}.page-wrapper{position:relative;outline:0}.page-inner{position:relative;max-width:800px;margin:0 auto;padding:20px 15px 40px 15px}.page-inner .btn-group .btn{border-radius:0;background:#eee;border:0}.buttons:after,.buttons:before{content:\" \";display:table;line-height:0}.buttons:after{clear:both}.button{border:0;background-color:transparent;background:#eee;color:#666;width:100%;text-align:center;float:left;line-height:1.42857143;padding:8px 4px}.button:hover{color:#444}.button:focus,.button:hover{outline:0}.button.size-2{width:50%}.button.size-3{width:33%}.markdown-section{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}.markdown-section *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section>:last-child{margin-bottom:0!important}.markdown-section blockquote,.markdown-section code,.markdown-section figure,.markdown-section img,.markdown-section pre,.markdown-section table,.markdown-section tr{page-break-inside:avoid}.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5,.markdown-section p{orphans:3;widows:3}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5{page-break-after:avoid}.markdown-section b,.markdown-section strong{font-weight:700}.markdown-section em{font-style:italic}.markdown-section blockquote,.markdown-section dl,.markdown-section ol,.markdown-section p,.markdown-section table,.markdown-section ul{margin-top:0;margin-bottom:.85em}.markdown-section a{color:#4183c4;text-decoration:none;background:0 0}.markdown-section a:active,.markdown-section a:focus,.markdown-section a:hover{outline:0;text-decoration:underline}.markdown-section img{border:0;max-width:100%}.markdown-section hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}.markdown-section hr:after,.markdown-section hr:before{display:table;content:\" \"}.markdown-section hr:after{clear:both}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section h5,.markdown-section h6{margin-top:1.275em;margin-bottom:.85em;font-weight:700}.markdown-section h1{font-size:2em}.markdown-section h2{font-size:1.75em}.markdown-section h3{font-size:1.5em}.markdown-section h4{font-size:1.25em}.markdown-section h5{font-size:1em}.markdown-section h6{font-size:1em;color:#777}.markdown-section code,.markdown-section pre{font-family:Consolas,\"Liberation Mono\",Menlo,Courier,monospace;direction:ltr;margin:0;padding:0;border:none;color:inherit}.markdown-section pre{overflow:auto;word-wrap:normal;margin:0;padding:.85em 1em;margin-bottom:1.275em;background:#f7f7f7}.markdown-section pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}.markdown-section pre>code:after,.markdown-section pre>code:before{content:normal}.markdown-section code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}.markdown-section code:after,.markdown-section code:before{letter-spacing:-.2em;content:\"\\00a0\"}.markdown-section table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}.markdown-section table td,.markdown-section table th{padding:6px 13px;border:1px solid #ddd}.markdown-section table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-section table tr:nth-child(2n){background-color:#f8f8f8}.markdown-section table th{font-weight:700}.markdown-section ol,.markdown-section ul{padding:0;margin:0;margin-bottom:.85em;padding-left:2em}.markdown-section ol ol,.markdown-section ol ul,.markdown-section ul ol,.markdown-section ul ul{margin-top:0;margin-bottom:0}.markdown-section ol ol{list-style-type:lower-roman}.markdown-section blockquote{margin:0;margin-bottom:.85em;padding:0 15px;color:#858585;border-left:4px solid #e5e5e5}.markdown-section blockquote:first-child{margin-top:0}.markdown-section blockquote:last-child{margin-bottom:0}.markdown-section dl{padding:0}.markdown-section dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}.markdown-section dl dd{padding:0 .85em;margin-bottom:.85em}.markdown-section dd{margin-left:0}.markdown-section .glossary-term{cursor:help;text-decoration:underline}.navigation{position:absolute;top:50px;bottom:0;margin:0;max-width:150px;min-width:90px;display:flex;justify-content:center;align-content:center;flex-direction:column;font-size:40px;color:#ccc;text-align:center;-webkit-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;transition:all 350ms ease}.navigation:hover{text-decoration:none;color:#444}.navigation.navigation-next{right:0}.navigation.navigation-prev{left:0}@media (max-width:1240px){.navigation{position:static;top:auto;max-width:50%;width:50%;display:inline-block;float:left}.navigation.navigation-unique{max-width:100%;width:100%}}#book-search-input{padding:6px;background:0 0;transition:top .5s ease;background:#fff;border-bottom:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);margin-bottom:10px;margin-top:-1px}#book-search-input input,#book-search-input input:focus,#book-search-input input:hover{width:100%;background:0 0;border:1px solid transparent;box-shadow:none;outline:0;line-height:22px;padding:7px 7px;color:inherit}#book-search-results{opacity:1}#book-search-results .search-results .search-results-title{text-transform:uppercase;text-align:center;font-weight:200;margin-bottom:35px;opacity:.6}#book-search-results .search-results .has-results .search-results-item{display:block;word-wrap:break-word;overflow:hidden;color:#333;line-height:1.7;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%}#book-search-results .search-results .has-results .search-results-item *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}#book-search-results .search-results .has-results .search-results-item>:first-child{margin-top:0!important}#book-search-results .search-results .has-results .search-results-item>:last-child{margin-bottom:0!important}#book-search-results .search-results .has-results .search-results-item blockquote,#book-search-results .search-results .has-results .search-results-item code,#book-search-results .search-results .has-results .search-results-item figure,#book-search-results .search-results .has-results .search-results-item img,#book-search-results .search-results .has-results .search-results-item pre,#book-search-results .search-results .has-results .search-results-item table,#book-search-results .search-results .has-results .search-results-item tr{page-break-inside:avoid}#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5,#book-search-results .search-results .has-results .search-results-item p{orphans:3;widows:3}#book-search-results .search-results .has-results .search-results-item h1,#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5{page-break-after:avoid}#book-search-results .search-results .has-results .search-results-item b,#book-search-results .search-results .has-results .search-results-item strong{font-weight:700}#book-search-results .search-results .has-results .search-results-item em{font-style:italic}#book-search-results .search-results .has-results .search-results-item blockquote,#book-search-results .search-results .has-results .search-results-item dl,#book-search-results .search-results .has-results .search-results-item ol,#book-search-results .search-results .has-results .search-results-item p,#book-search-results .search-results .has-results .search-results-item table,#book-search-results .search-results .has-results .search-results-item ul{margin-top:0;margin-bottom:.85em}#book-search-results .search-results .has-results .search-results-item a{color:#4183c4;text-decoration:none;background:0 0}#book-search-results .search-results .has-results .search-results-item a:active,#book-search-results .search-results .has-results .search-results-item a:focus,#book-search-results .search-results .has-results .search-results-item a:hover{outline:0;text-decoration:underline}#book-search-results .search-results .has-results .search-results-item img{border:0;max-width:100%}#book-search-results .search-results .has-results .search-results-item hr{height:4px;padding:0;margin:1.7em 0;overflow:hidden;background-color:#e7e7e7;border:none}#book-search-results .search-results .has-results .search-results-item hr:after,#book-search-results .search-results .has-results .search-results-item hr:before{display:table;content:\" \"}#book-search-results .search-results .has-results .search-results-item hr:after{clear:both}#book-search-results .search-results .has-results .search-results-item h1,#book-search-results .search-results .has-results .search-results-item h2,#book-search-results .search-results .has-results .search-results-item h3,#book-search-results .search-results .has-results .search-results-item h4,#book-search-results .search-results .has-results .search-results-item h5,#book-search-results .search-results .has-results .search-results-item h6{margin-top:1.275em;margin-bottom:.85em;font-weight:700}#book-search-results .search-results .has-results .search-results-item h1{font-size:2em}#book-search-results .search-results .has-results .search-results-item h2{font-size:1.75em}#book-search-results .search-results .has-results .search-results-item h3{font-size:1.5em}#book-search-results .search-results .has-results .search-results-item h4{font-size:1.25em}#book-search-results .search-results .has-results .search-results-item h5{font-size:1em}#book-search-results .search-results .has-results .search-results-item h6{font-size:1em;color:#777}#book-search-results .search-results .has-results .search-results-item code,#book-search-results .search-results .has-results .search-results-item pre{font-family:Consolas,\"Liberation Mono\",Menlo,Courier,monospace;direction:ltr;margin:0;padding:0;border:none;color:inherit}#book-search-results .search-results .has-results .search-results-item pre{overflow:auto;word-wrap:normal;margin:0;padding:.85em 1em;margin-bottom:1.275em;background:#f7f7f7}#book-search-results .search-results .has-results .search-results-item pre>code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;font-size:.85em;white-space:pre;background:0 0}#book-search-results .search-results .has-results .search-results-item pre>code:after,#book-search-results .search-results .has-results .search-results-item pre>code:before{content:normal}#book-search-results .search-results .has-results .search-results-item code{padding:.2em;margin:0;font-size:.85em;background-color:#f7f7f7}#book-search-results .search-results .has-results .search-results-item code:after,#book-search-results .search-results .has-results .search-results-item code:before{letter-spacing:-.2em;content:\"\\00a0\"}#book-search-results .search-results .has-results .search-results-item table{display:table;width:100%;border-collapse:collapse;border-spacing:0;overflow:auto}#book-search-results .search-results .has-results .search-results-item table td,#book-search-results .search-results .has-results .search-results-item table th{padding:6px 13px;border:1px solid #ddd}#book-search-results .search-results .has-results .search-results-item table tr{background-color:#fff;border-top:1px solid #ccc}#book-search-results .search-results .has-results .search-results-item table tr:nth-child(2n){background-color:#f8f8f8}#book-search-results .search-results .has-results .search-results-item table th{font-weight:700}#book-search-results .search-results .has-results .search-results-item ol,#book-search-results .search-results .has-results .search-results-item ul{padding:0;margin:0;margin-bottom:.85em;padding-left:2em}#book-search-results .search-results .has-results .search-results-item ol ol,#book-search-results .search-results .has-results .search-results-item ol ul,#book-search-results .search-results .has-results .search-results-item ul ol,#book-search-results .search-results .has-results .search-results-item ul ul{margin-top:0;margin-bottom:0}#book-search-results .search-results .has-results .search-results-item ol ol{list-style-type:lower-roman}#book-search-results .search-results .has-results .search-results-item blockquote{margin:0;margin-bottom:.85em;padding:0 15px;color:#858585;border-left:4px solid #e5e5e5}#book-search-results .search-results .has-results .search-results-item blockquote:first-child{margin-top:0}#book-search-results .search-results .has-results .search-results-item blockquote:last-child{margin-bottom:0}#book-search-results .search-results .has-results .search-results-item dl{padding:0}#book-search-results .search-results .has-results .search-results-item dl dt{padding:0;margin-top:.85em;font-style:italic;font-weight:700}#book-search-results .search-results .has-results .search-results-item dl dd{padding:0 .85em;margin-bottom:.85em}#book-search-results .search-results .has-results .search-results-item dd{margin-left:0}#book-search-results .search-results .has-results .search-results-item h3{margin-top:0;margin-bottom:0}#book-search-results .search-results .no-results{padding:40px 0}body.search-loading #book-search-results{opacity:.3}body.with-search .navigation{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-font-smoothing:antialiased}a{text-decoration:none}body,html{height:100%}html{font-size:62.5%}body{text-rendering:optimizeLegibility;font-smoothing:antialiased;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:.2px;text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/gitbook/theme.js",
    "content": "!function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u=\"function\"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var l=new Error(\"Cannot find module '\"+a+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i=\"function\"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){!function(e,n){\"use strict\";\"object\"==typeof t&&\"object\"==typeof t.exports?t.exports=e.document?n(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return n(e)}:n(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";function n(e,t){t=t||te;var n=t.createElement(\"script\");n.text=e,t.head.appendChild(n).parentNode.removeChild(n)}function r(e){var t=!!e&&\"length\"in e&&e.length,n=de.type(e);return\"function\"!==n&&!de.isWindow(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?de.grep(e,function(e){return ae.call(t,e)>-1!==n}):ke.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return ae.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function a(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function s(e){return e}function u(e){throw e}function l(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function c(){te.removeEventListener(\"DOMContentLoaded\",c),e.removeEventListener(\"load\",c),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(Re,\"-$&\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=p(n)}catch(e){}Pe.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,a=20,s=r?function(){return r.cur()}:function(){return de.css(e,t,\"\")},u=s(),l=n&&n[3]||(de.cssNumber[t]?\"\":\"px\"),c=(de.cssNumber[t]||\"px\"!==l&&+u)&&$e.exec(de.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do i=i||\".5\",c/=i,de.style(e,t,c+l);while(i!==(i=s()/u)&&1!==i&&--a)}return n&&(c=+c||+u||0,o=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===o&&(o=\"block\"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,a=e.length;i<a;i++)r=e[i],r.style&&(n=r.style.display,t?(\"none\"===n&&(o[i]=Fe.get(r,\"display\")||null,o[i]||(r.style.display=\"\")),\"\"===r.style.display&&We(r)&&(o[i]=g(r))):\"none\"!==n&&(o[i]=\"none\",Fe.set(r,\"display\",n)));for(i=0;i<a;i++)null!=o[i]&&(e[i].style.display=o[i]);return e}function v(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&de.nodeName(e,t)?de.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],\"globalEval\",!t||Fe.get(t[n],\"globalEval\"))}function b(e,t,n,r,o){for(var i,a,s,u,l,c,f=t.createDocumentFragment(),p=[],h=0,d=e.length;h<d;h++)if(i=e[h],i||0===i)if(\"object\"===de.type(i))de.merge(p,i.nodeType?[i]:i);else if(Ge.test(i)){for(a=a||f.appendChild(t.createElement(\"div\")),s=(Xe.exec(i)||[\"\",\"\"])[1].toLowerCase(),u=Ve[s]||Ve._default,a.innerHTML=u[1]+de.htmlPrefilter(i)+u[2],c=u[0];c--;)a=a.lastChild;de.merge(p,a.childNodes),a=f.firstChild,a.textContent=\"\"}else p.push(t.createTextNode(i));for(f.textContent=\"\",h=0;i=p[h++];)if(r&&de.inArray(i,r)>-1)o&&o.push(i);else if(l=de.contains(i.ownerDocument,i),a=v(f.appendChild(i),\"script\"),l&&y(a),n)for(c=0;i=a[c++];)Ke.test(i.type||\"\")&&n.push(i);return f}function x(){return!0}function w(){return!1}function C(){try{return te.activeElement}catch(e){}}function T(e,t,n,r,o,i){var a,s;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(s in t)T(e,s,n,r,t[s],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&(\"string\"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(a=o,o=function(e){return de().off(e),a.apply(this,arguments)},o.guid=a.guid||(a.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function k(e,t){return de.nodeName(e,\"table\")&&de.nodeName(11!==t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e:e}function j(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function N(e,t){var n,r,o,i,a,s,u,l;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),a=Fe.set(t,i),l=i.events)){delete a.handle,a.events={};for(o in l)for(n=0,r=l[o].length;n<r;n++)de.event.add(t,o,l[o][n])}Pe.hasData(e)&&(s=Pe.access(e),u=de.extend({},s),Pe.set(t,u))}}function S(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ze.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function A(e,t,r,o){t=oe.apply([],t);var i,a,s,u,l,c,f=0,p=e.length,h=p-1,d=t[0],g=de.isFunction(d);if(g||p>1&&\"string\"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=b(t,e[0].ownerDocument,!1,e,o),a=i.firstChild,1===i.childNodes.length&&(i=a),a||o)){for(s=de.map(v(i,\"script\"),j),u=s.length;f<p;f++)l=i,f!==h&&(l=de.clone(l,!0,!0),u&&de.merge(s,v(l,\"script\"))),r.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,de.map(s,E),f=0;f<u;f++)l=s[f],Ke.test(l.type||\"\")&&!Fe.access(l,\"globalEval\")&&de.contains(c,l)&&(l.src?de._evalUrl&&de._evalUrl(l.src):n(l.textContent.replace(ot,\"\"),c))}return e}function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)n||1!==r.nodeType||de.cleanData(v(r)),r.parentNode&&(n&&de.contains(r.ownerDocument,r)&&y(v(r,\"script\")),r.parentNode.removeChild(r));return e}function D(e,t,n){var r,o,i,a,s=e.style;return n=n||st(e),n&&(a=n.getPropertyValue(t)||n[t],\"\"!==a||de.contains(e.ownerDocument,e)||(a=de.style(e,t)),!pe.pixelMarginRight()&&at.test(a)&&it.test(t)&&(r=s.width,o=s.minWidth,i=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=o,s.maxWidth=i)),void 0!==a?a+\"\":a}function O(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ft.length;n--;)if(e=ft[n]+t,e in pt)return e}function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function F(e,t,n,r,o){var i,a=0;for(i=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0;i<4;i+=2)\"margin\"===n&&(a+=de.css(e,n+_e[i],!0,o)),r?(\"content\"===n&&(a-=de.css(e,\"padding\"+_e[i],!0,o)),\"margin\"!==n&&(a-=de.css(e,\"border\"+_e[i]+\"Width\",!0,o))):(a+=de.css(e,\"padding\"+_e[i],!0,o),\"padding\"!==n&&(a+=de.css(e,\"border\"+_e[i]+\"Width\",!0,o)));return a}function P(e,t,n){var r,o=!0,i=st(e),a=\"border-box\"===de.css(e,\"boxSizing\",!1,i);if(e.getClientRects().length&&(r=e.getBoundingClientRect()[t]),r<=0||null==r){if(r=D(e,t,i),(r<0||null==r)&&(r=e.style[t]),at.test(r))return r;o=a&&(pe.boxSizingReliable()||r===e.style[t]),r=parseFloat(r)||0}return r+F(e,t,n||(a?\"border\":\"content\"),o,i)+\"px\"}function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}function R(){dt&&(e.requestAnimationFrame(R),de.fx.tick())}function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=_e[r],o[\"margin\"+n]=o[\"padding\"+n]=e;return t&&(o.opacity=o.width=e),o}function _(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners[\"*\"]),i=0,a=o.length;i<a;i++)if(r=o[i].call(n,t,e))return r}function W(e,t,n){var r,o,i,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,h={},d=e.style,g=e.nodeType&&We(e),v=Fe.get(e,\"fxshow\");n.queue||(a=de._queueHooks(e,\"fx\"),null==a.unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,de.queue(e,\"fx\").length||a.empty.fire()})}));for(r in t)if(o=t[r],gt.test(o)){if(delete t[r],i=i||\"toggle\"===o,o===(g?\"hide\":\"show\")){if(\"show\"!==o||!v||void 0===v[r])continue;g=!0}h[r]=v&&v[r]||de.style(e,r)}if(u=!de.isEmptyObject(t),u||!de.isEmptyObject(h)){f&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],l=v&&v.display,null==l&&(l=Fe.get(e,\"display\")),c=de.css(e,\"display\"),\"none\"===c&&(l?c=l:(m([e],!0),l=e.style.display||l,c=de.css(e,\"display\"),m([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===de.css(e,\"float\")&&(u||(p.done(function(){d.display=l}),null==l&&(c=d.display,l=\"none\"===c?\"\":c)),d.display=\"inline-block\")),n.overflow&&(d.overflow=\"hidden\",p.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1;for(r in h)u||(v?\"hidden\"in v&&(g=v.hidden):v=Fe.access(e,\"fxshow\",{display:l}),i&&(v.hidden=!g),g&&m([e],!0),p.done(function(){g||m([e]),Fe.remove(e,\"fxshow\");for(r in h)de.style(e,r,h[r])})),u=_(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}}function B(e,t){var n,r,o,i,a;for(n in e)if(r=de.camelCase(n),o=t[r],i=e[n],de.isArray(i)&&(o=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),a=de.cssHooks[r],a&&\"expand\"in a){i=a.expand(i),delete e[r];for(n in i)n in e||(e[n]=i[n],t[n]=o)}else t[r]=o}function U(e,t,n){var r,o,i=0,a=U.prefilters.length,s=de.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var t=ht||M(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,i=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(i);return s.notifyWith(e,[l,i,n]),i<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:de.extend({},t),opts:de.extend(!0,{specialEasing:{},easing:de.easing._default},n),originalProperties:t,originalOptions:n,startTime:ht||M(),duration:n.duration,tweens:[],createTween:function(t,n){var r=de.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(o)return this;for(o=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(B(c,l.opts.specialEasing);i<a;i++)if(r=U.prefilters[i].call(l,e,c,l.opts))return de.isFunction(r.stop)&&(de._queueHooks(l.elem,l.opts.queue).stop=de.proxy(r.stop,r)),r;return de.map(c,_,l),de.isFunction(l.opts.start)&&l.opts.start.call(e,l),de.fx.timer(de.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){var t=e.match(qe)||[];return t.join(\" \")}function X(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function K(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et.test(e)?r(e,o):K(e+\"[\"+(\"object\"==typeof o&&null!=o?t:\"\")+\"]\",o,n,r)});else if(n||\"object\"!==de.type(t))r(e,t);else for(o in t)K(e+\"[\"+o+\"]\",t[o],n,r)}function V(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,o=0,i=t.toLowerCase().match(qe)||[];if(de.isFunction(n))for(;r=i[o++];)\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function G(e,t,n,r){function o(s){var u;return i[s]=!0,de.each(e[s]||[],function(e,s){var l=s(t,n,r);return\"string\"!=typeof l||a||i[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),o(l),!1)}),u}var i={},a=e===Rt;return o(t.dataTypes[0])||!i[\"*\"]&&o(\"*\")}function Y(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:r||(r={}))[n]=t[n]);return r&&de.extend(!0,e,r),e}function Q(e,t,n){for(var r,o,i,a,s=e.contents,u=e.dataTypes;\"*\"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(o in s)if(s[o]&&s[o].test(r)){u.unshift(o);break}if(u[0]in n)i=u[0];else{for(o in n){if(!u[0]||e.converters[o+\" \"+u[0]]){i=o;break}a||(a=o)}i=i||a}if(i)return i!==u[0]&&u.unshift(i),n[i]}function J(e,t,n,r){var o,i,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(i=c.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=i,i=c.shift())if(\"*\"===i)i=u;else if(\"*\"!==u&&u!==i){if(a=l[u+\" \"+i]||l[\"* \"+i],!a)for(o in l)if(s=o.split(\" \"),s[1]===i&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){a===!0?a=l[o]:l[o]!==!0&&(i=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+i}}}return{state:\"success\",data:t}}function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}var ee=[],te=e.document,ne=Object.getPrototypeOf,re=ee.slice,oe=ee.concat,ie=ee.push,ae=ee.indexOf,se={},ue=se.toString,le=se.hasOwnProperty,ce=le.toString,fe=ce.call(Object),pe={},he=\"3.1.1\",de=function(e,t){return new de.fn.init(e,t)},ge=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,me=/^-ms-/,ve=/-([a-z])/g,ye=function(e,t){return t.toUpperCase()};de.fn=de.prototype={jquery:he,constructor:de,length:0,toArray:function(){return re.call(this)},get:function(e){return null==e?re.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=de.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return de.each(this,e)},map:function(e){return this.pushStack(de.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(re.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ie,sort:ee.sort,splice:ee.splice},de.extend=de.fn.extend=function(){var e,t,n,r,o,i,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||de.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],r=e[t],a!==r&&(l&&r&&(de.isPlainObject(r)||(o=de.isArray(r)))?(o?(o=!1,i=n&&de.isArray(n)?n:[]):i=n&&de.isPlainObject(n)?n:{},a[t]=de.extend(l,i,r)):void 0!==r&&(a[t]=r));return a},de.extend({expando:\"jQuery\"+(he+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return\"function\"===de.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=de.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==ue.call(e))&&(!(t=ne(e))||(n=le.call(t,\"constructor\")&&t.constructor,\"function\"==typeof n&&ce.call(n)===fe))},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?se[ue.call(e)]||\"object\":typeof e},globalEval:function(e){n(e)},camelCase:function(e){return e.replace(me,\"ms-\").replace(ve,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,o=0;if(r(e))for(n=e.length;o<n&&t.call(e[o],o,e[o])!==!1;o++);else for(o in e)if(t.call(e[o],o,e[o])===!1)break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(ge,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(r(Object(e))?de.merge(n,\"string\"==typeof e?[e]:e):ie.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:ae.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},grep:function(e,t,n){for(var r,o=[],i=0,a=e.length,s=!n;i<a;i++)r=!t(e[i],i),r!==s&&o.push(e[i]);return o},map:function(e,t,n){var o,i,a=0,s=[];if(r(e))for(o=e.length;a<o;a++)i=t(e[a],a,n),null!=i&&s.push(i);else for(a in e)i=t(e[a],a,n),null!=i&&s.push(i);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,o;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),de.isFunction(e))return r=re.call(arguments,2),o=function(){return e.apply(t||this,r.concat(re.call(arguments)))},o.guid=e.guid=e.guid||de.guid++,o},now:Date.now,support:pe}),\"function\"==typeof Symbol&&(de.fn[Symbol.iterator]=ee[Symbol.iterator]),de.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){se[\"[object \"+t+\"]\"]=t.toLowerCase()});var be=function(e){function t(e,t,n,r){var o,i,a,s,u,l,c,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],\"string\"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:_)!==L&&O(t),t=t||L,F)){if(11!==d&&(u=ve.exec(e)))if(o=u[1]){if(9===d){if(!(a=t.getElementById(o)))return n;if(a.id===o)return n.push(a),n}else if(p&&(a=p.getElementById(o))&&M(t,a)&&a.id===o)return n.push(a),n}else{if(u[2])return J.apply(n,t.getElementsByTagName(e)),n;if((o=u[3])&&C.getElementsByClassName&&t.getElementsByClassName)return J.apply(n,t.getElementsByClassName(o)),n}if(C.qsa&&!X[e+\" \"]&&(!P||!P.test(e))){if(1!==d)p=t,c=e;else if(\"object\"!==t.nodeName.toLowerCase()){for((s=t.getAttribute(\"id\"))?s=s.replace(we,Ce):t.setAttribute(\"id\",s=$),l=E(e),i=l.length;i--;)l[i]=\"#\"+s+\" \"+h(l[i]);c=l.join(\",\"),p=ye.test(e)&&f(t.parentNode)||t}if(c)try{return J.apply(n,p.querySelectorAll(c)),n}catch(e){}finally{s===$&&t.removeAttribute(\"id\")}}}return S(e.replace(se,\"$1\"),t,n,r)}function n(){function e(n,r){return t.push(n+\" \")>T.cacheLength&&delete e[t.shift()],e[n+\" \"]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split(\"|\"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function l(e){return function(t){return\"form\"in t?t.parentNode&&t.disabled===!1?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ke(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),a=i.length;a--;)n[o=i[a]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,o=t.next,i=o||r,a=n&&\"parentNode\"===i,s=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||a)return e(t,n,o);return!1}:function(t,n,u){var l,c,f,p=[W,s];if(u){for(;t=t[r];)if((1===t.nodeType||a)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||a)if(f=t[$]||(t[$]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),o&&o===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[i])&&l[0]===W&&l[1]===s)return p[2]=l[2];if(c[i]=p,p[2]=e(t,n,u))return!0}return!1}}function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}function v(e,t,n,r,o){for(var i,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(i=e[s])&&(n&&!n(i,r,o)||(a.push(i),l&&t.push(s)));return a}function y(e,t,n,o,i,a){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,a)),r(function(r,a,s,u){var l,c,f,p=[],h=[],d=a.length,g=r||m(t||\"*\",s.nodeType?[s]:s,[]),y=!e||!r&&t?g:v(g,p,e,s,u),b=n?i||(r?e:d||o)?[]:a:y;if(n&&n(y,b,s,u),o)for(l=v(b,h),o(l,[],s,u),c=l.length;c--;)(f=l[c])&&(b[h[c]]=!(y[h[c]]=f));if(r){if(i||e){if(i){for(l=[],c=b.length;c--;)(f=b[c])&&l.push(y[c]=f);i(null,b=[],l,u)}for(c=b.length;c--;)(f=b[c])&&(l=i?ee(r,f):p[c])>-1&&(r[l]=!(a[l]=f))}}else b=v(b===a?b.splice(d,b.length):b),i?i(null,a,b,u):J.apply(a,b)})}function b(e){for(var t,n,r,o=e.length,i=T.relative[e[0].type],a=i||T.relative[\" \"],s=i?1:0,u=d(function(e){return e===t},a,!0),l=d(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,o}];s<o;s++)if(n=T.relative[e[s].type])c=[d(g(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[$]){for(r=++s;r<o&&!T.relative[e[r].type];r++);return y(s>1&&g(c),s>1&&h(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace(se,\"$1\"),n,s<r&&b(e.slice(s,r)),r<o&&b(e=e.slice(r)),r<o&&h(e))}c.push(n)}return g(c)}function x(e,n){var o=n.length>0,i=e.length>0,a=function(r,a,s,u,l){var c,f,p,h=0,d=\"0\",g=r&&[],m=[],y=A,b=r||i&&T.find.TAG(\"*\",l),x=W+=null==y?1:Math.random()||.1,w=b.length;for(l&&(A=a===L||a||l);d!==w&&null!=(c=b[d]);d++){if(i&&c){for(f=0,a||c.ownerDocument===L||(O(c),s=!F);p=e[f++];)if(p(c,a||L,s)){u.push(c);break}l&&(W=x)}o&&((c=!p&&c)&&h--,r&&g.push(c))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,a,s);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Y.call(u));m=v(m)}J.apply(u,m),l&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return l&&(W=x,A=y),g};return o?r(a):a}var w,C,T,k,j,E,N,S,A,q,D,O,L,H,F,P,I,R,M,$=\"sizzle\"+1*new Date,_=e.document,W=0,B=0,U=n(),z=n(),X=n(),K=function(e,t){return e===t&&(D=!0),0},V={}.hasOwnProperty,G=[],Y=G.pop,Q=G.push,J=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",ne=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",re=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",oe=\"\\\\[\"+ne+\"*(\"+re+\")(?:\"+ne+\"*([*^$|!~]?=)\"+ne+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+re+\"))|)\"+ne+\"*\\\\]\",ie=\":(\"+re+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+oe+\")*)|.*)\\\\)|)\",ae=new RegExp(ne+\"+\",\"g\"),se=new RegExp(\"^\"+ne+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ne+\"+$\",\"g\"),ue=new RegExp(\"^\"+ne+\"*,\"+ne+\"*\"),le=new RegExp(\"^\"+ne+\"*([>+~]|\"+ne+\")\"+ne+\"*\"),ce=new RegExp(\"=\"+ne+\"*([^\\\\]'\\\"]*?)\"+ne+\"*\\\\]\",\"g\"),fe=new RegExp(ie),pe=new RegExp(\"^\"+re+\"$\"),he={ID:new RegExp(\"^#(\"+re+\")\"),CLASS:new RegExp(\"^\\\\.(\"+re+\")\"),TAG:new RegExp(\"^(\"+re+\"|[*])\"),ATTR:new RegExp(\"^\"+oe),PSEUDO:new RegExp(\"^\"+ie),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ne+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ne+\"*(?:([+-]|)\"+ne+\"*(\\\\d+)|))\"+ne+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+te+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ne+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ne+\"*((?:-\\\\d)?\\\\d*)\"+ne+\"*\\\\)|)(?=[^-]|$)\",\"i\")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\\d$/i,me=/^[^{]+\\{\\s*\\[native \\w/,ve=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ye=/[+~]/,be=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+ne+\"?|(\"+ne+\")|.)\",\"ig\"),xe=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,Ce=function(e,t){return t?\"\\0\"===e?\"�\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},Te=function(){O()},ke=d(function(e){return e.disabled===!0&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{J.apply(G=Z.call(_.childNodes),_.childNodes),G[_.childNodes.length].nodeType}catch(e){J={apply:G.length?function(e,t){Q.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}C=t.support={},j=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:_;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!j(L),_!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",Te,!1):n.attachEvent&&n.attachEvent(\"onunload\",Te)),C.attributes=o(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),C.getElementsByTagName=o(function(e){return e.appendChild(L.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),C.getElementsByClassName=me.test(L.getElementsByClassName),C.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),C.getById?(T.filter.ID=function(e){var t=e.replace(be,xe);return function(e){return e.getAttribute(\"id\")===t}},T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(T.filter.ID=function(e){var t=e.replace(be,xe);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},T.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode(\"id\"),n&&n.value===e)return[i]}return[]}}),T.find.TAG=C.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):C.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if(\"*\"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},T.find.CLASS=C.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],P=[],(C.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML=\"<a id='\"+$+\"'></a><select id='\"+$+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&P.push(\"[*^$]=\"+ne+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||P.push(\"\\\\[\"+ne+\"*(?:value|\"+te+\")\"),e.querySelectorAll(\"[id~=\"+$+\"-]\").length||P.push(\"~=\"),e.querySelectorAll(\":checked\").length||P.push(\":checked\"),e.querySelectorAll(\"a#\"+$+\"+*\").length||P.push(\".#.+[+~]\")}),o(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=L.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&P.push(\"name\"+ne+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&P.push(\":enabled\",\":disabled\"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&P.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),P.push(\",.*:\")})),(C.matchesSelector=me.test(R=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){C.disconnectedMatch=R.call(e,\"*\"),R.call(e,\"[s!='']:x\"),I.push(\"!=\",ie)}),P=P.length&&new RegExp(P.join(\"|\")),I=I.length&&new RegExp(I.join(\"|\")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},K=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!C.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===_&&M(_,e)?-1:t===L||t.ownerDocument===_&&M(_,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,s=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===_?-1:u[r]===_?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(ce,\"='$1']\"),C.matchesSelector&&F&&!X[n+\" \"]&&(!I||!I.test(n))&&(!P||!P.test(n)))try{var r=R.call(e,n);if(r||C.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=T.attrHandle[t.toLowerCase()],r=n&&V.call(T.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:C.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+\"\").replace(we,Ce)},t.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!C.detectDuplicates,q=!C.sortStable&&e.slice(0),e.sort(K),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},k=t.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=k(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=k(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,xe),e[3]=(e[3]||e[4]||e[5]||\"\").replace(be,xe),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,xe).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+\" \"];return t||(t=new RegExp(\"(^|\"+ne+\")\"+e+\"(\"+ne+\"|$)\"))&&U(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?\"!=\"===n:!n||(i+=\"\",\"=\"===n?i===r:\"!=\"===n?i!==r:\"^=\"===n?r&&0===i.indexOf(r):\"*=\"===n?r&&i.indexOf(r)>-1:\"$=\"===n?r&&i.slice(-r.length)===r:\"~=\"===n?(\" \"+i.replace(ae,\" \")+\" \").indexOf(r)>-1:\"|=\"===n&&(i===r||i.slice(0,r.length+1)===r+\"-\"))}},CHILD:function(e,t,n,r,o){var i=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,h,d,g=i!==a?\"nextSibling\":\"previousSibling\",m=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s,b=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[a?m.firstChild:m.lastChild],a&&y){for(p=m,f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],h=l[0]===W&&l[1],b=h&&l[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(b=h=0)||d.pop();)if(1===p.nodeType&&++b&&p===t){c[e]=[W,h,b];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],h=l[0]===W&&l[1],b=h),b===!1)for(;(p=++h&&p&&p[g]||(b=h=0)||d.pop())&&((s?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++b||(y&&(f=p[$]||(p[$]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),c[e]=[W,b]),p!==t)););return b-=o,b===r||b%r===0&&b/r>=0}}},PSEUDO:function(e,n){var o,i=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error(\"unsupported pseudo: \"+e);return i[$]?i(n):i.length>1?(o=[e,e,\"\",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),a=o.length;a--;)r=ee(e,o[a]),e[r]=!(t[r]=o[a])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=N(e.replace(se,\"$1\"));return o[$]?r(function(e,t,n,r){for(var i,a=o(e,null,r,[]),s=e.length;s--;)(i=a[s])&&(e[s]=!(t[s]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){\nreturn t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,xe),function(t){return(t.textContent||t.innerText||k(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||\"\")||t.error(\"unsupported lang: \"+e),e=e.replace(be,xe).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:l(!1),disabled:l(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[n<0?n+t:n]}),even:c(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[w]=s(w);for(w in{submit:!0,reset:!0})T.pseudos[w]=u(w);return p.prototype=T.filters=T.pseudos,T.setFilters=new p,E=t.tokenize=function(e,n){var r,o,i,a,s,u,l,c=z[e+\" \"];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(o=ue.exec(s))||(o&&(s=s.slice(o[0].length)||s),u.push(i=[])),r=!1,(o=le.exec(s))&&(r=o.shift(),i.push({value:r,type:o[0].replace(se,\" \")}),s=s.slice(r.length));for(a in T.filter)!(o=he[a].exec(s))||l[a]&&!(o=l[a](o))||(r=o.shift(),i.push({value:r,type:a,matches:o}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},N=t.compile=function(e,t){var n,r=[],o=[],i=X[e+\" \"];if(!i){for(t||(t=E(e)),n=t.length;n--;)i=b(t[n]),i[$]?r.push(i):o.push(i);i=X(e,x(o,r)),i.selector=e}return i},S=t.select=function(e,t,n,r){var o,i,a,s,u,l=\"function\"==typeof e&&e,c=!r&&E(e=l.selector||e);if(n=n||[],1===c.length){if(i=c[0]=c[0].slice(0),i.length>2&&\"ID\"===(a=i[0]).type&&9===t.nodeType&&F&&T.relative[i[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,xe),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(a=i[o],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,xe),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return J.apply(n,r),n;break}}return(l||N(e,c))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},C.sortStable=$.split(\"\").sort(K).join(\"\")===$,C.detectDuplicates=!!D,O(),C.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement(\"fieldset\"))}),o(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||i(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),C.attributes&&o(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||i(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute(\"disabled\")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=be,de.expr=be.selectors,de.expr[\":\"]=de.expr.pseudos,de.uniqueSort=de.unique=be.uniqueSort,de.text=be.getText,de.isXMLDoc=be.isXML,de.contains=be.contains,de.escapeSelector=be.escape;var xe=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Ce=de.expr.match.needsContext,Te=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i,ke=/^.[^:#\\[\\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if(\"string\"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t<r;t++)if(de.contains(o[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)de.find(e,o[t],n);return r>1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,\"string\"==typeof e&&Ce.test(e)?de(e):e||[],!1).length}});var je,Ee=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,Ne=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||je,\"string\"==typeof e){if(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Te.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Ne.prototype=de.fn,je=de(te);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(de.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,o=this.length,i=[],a=\"string\"!=typeof e&&de(e);if(!Ce.test(e))for(;r<o;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?\"string\"==typeof e?ae.call(de(e),this[0]):ae.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,\"parentNode\")},parentsUntil:function(e,t,n){return xe(e,\"parentNode\",n)},next:function(e){return i(e,\"nextSibling\")},prev:function(e){return i(e,\"previousSibling\")},nextAll:function(e){return xe(e,\"nextSibling\")},prevAll:function(e){return xe(e,\"previousSibling\")},nextUntil:function(e,t,n){return xe(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return xe(e,\"previousSibling\",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Se.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\\x20\\t\\r\\n\\f]+/g;de.Callbacks=function(e){e=\"string\"==typeof e?a(e):de.extend({},e);var t,n,r,o,i=[],s=[],u=-1,l=function(){for(o=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<i.length;)i[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=i.length,n=!1);e.memory||(n=!1),t=!1,o&&(i=n?[]:\"\")},c={add:function(){return i&&(n&&!t&&(u=i.length-1,s.push(n)),function t(n){de.each(n,function(n,r){de.isFunction(r)?e.unique&&c.has(r)||i.push(r):r&&r.length&&\"string\"!==de.type(r)&&t(r)})}(arguments),n&&!t&&l()),this},remove:function(){return de.each(arguments,function(e,t){for(var n;(n=de.inArray(t,i,n))>-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=s=[],i=n=\"\",this},disabled:function(){return!i},lock:function(){return o=s=[],n||t||(i=n=\"\"),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},de.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",de.Callbacks(\"memory\"),de.Callbacks(\"memory\"),2],[\"resolve\",\"done\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",de.Callbacks(\"once memory\"),de.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var l=this,c=arguments,f=function(){var e,f;if(!(t<a)){if(e=r.apply(l,c),e===n.promise())throw new TypeError(\"Thenable self-resolution\");f=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,de.isFunction(f)?o?f.call(e,i(a,n,s,o),i(a,n,u,o)):(a++,f.call(e,i(a,n,s,o),i(a,n,u,o),i(a,n,s,n.notifyWith))):(r!==s&&(l=void 0,c=[e]),(o||n.resolveWith)(l,c))}},p=o?f:function(){try{f()}catch(e){de.Deferred.exceptionHook&&de.Deferred.exceptionHook(e,p.stackTrace),t+1>=a&&(r!==u&&(l=void 0,c=[e]),n.rejectWith(l,c))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var a=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:s,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:s)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var a=t[2],s=t[5];o[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[0][2].lock),a.add(t[3].fire),i[t[0]]=function(){return i[t[0]+\"With\"](this===i?void 0:this,arguments),this},i[t[0]+\"With\"]=a.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),a=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(l(e,i.done(a(n)).resolve,i.reject),\"pending\"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)l(o[n],a(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,\"complete\"===te.readyState||\"loading\"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener(\"DOMContentLoaded\",c),e.addEventListener(\"load\",c));var Le=function(e,t,n,r,o,i,a){var s=0,u=e.length,l=null==n;if(\"object\"===de.type(n)){o=!0;for(s in n)Le(e,t,s,n[s],!0,i,a)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(de(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return o?e:l?t.call(e):u?t(e[0],n):i},He=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};f.uid=1,f.prototype={cache:function(e){var t=e[this.expando];return t||(t={},He(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,o=this.cache(e);if(\"string\"==typeof t)o[de.camelCase(t)]=n;else for(r in t)o[de.camelCase(r)]=t[r];return o},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][de.camelCase(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){de.isArray(t)?t=t.map(de.camelCase):(t=de.camelCase(t),t=t in r?[t]:t.match(qe)||[]),n=t.length;for(;n--;)delete r[t[n]]}(void 0===t||de.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!de.isEmptyObject(t)}};var Fe=new f,Pe=new f,Ie=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,Re=/[A-Z]/g;de.extend({hasData:function(e){return Pe.hasData(e)||Fe.hasData(e)},data:function(e,t,n){return Pe.access(e,t,n)},removeData:function(e,t){Pe.remove(e,t)},_data:function(e,t,n){return Fe.access(e,t,n)},_removeData:function(e,t){Fe.remove(e,t)}}),de.fn.extend({data:function(e,t){var n,r,o,i=this[0],a=i&&i.attributes;if(void 0===e){if(this.length&&(o=Pe.get(i),1===i.nodeType&&!Fe.get(i,\"hasDataAttrs\"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf(\"data-\")&&(r=de.camelCase(r.slice(5)),h(i,r,o[r])));Fe.set(i,\"hasDataAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){Pe.set(this,e)}):Le(this,function(t){var n;if(i&&void 0===t){if(n=Pe.get(i,e),void 0!==n)return n;if(n=h(i,e),void 0!==n)return n}else this.each(function(){Pe.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Pe.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),a=function(){de.dequeue(e,t)};\"inprogress\"===o&&(o=n.shift(),r--),o&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete i.stop,o.call(e,a,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks(\"once memory\").add(function(){Fe.remove(e,[t+\"queue\",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?de.queue(this[0],e):void 0===t?this:this.each(function(){var n=de.queue(this,e,t);de._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&de.dequeue(this,e)})},dequeue:function(e){return this.each(function(){de.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,o=de.Deferred(),i=this,a=this.length,s=function(){--r||o.resolveWith(i,[i])};for(\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";a--;)n=Fe.get(i[a],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(s));return s(),o.promise(t)}});var Me=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,$e=new RegExp(\"^(?:([+-])=|)(\"+Me+\")([a-z%]*)$\",\"i\"),_e=[\"Top\",\"Right\",\"Bottom\",\"Left\"],We=function(e,t){return e=t||e,\"none\"===e.style.display||\"\"===e.style.display&&de.contains(e.ownerDocument,e)&&\"none\"===de.css(e,\"display\")},Be=function(e,t,n,r){var o,i,a={};for(i in t)a[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=a[i];return o},Ue={};de.fn.extend({show:function(){return m(this,!0)},hide:function(){return m(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){We(this)?de(this).show():de(this).hide()})}});var ze=/^(?:checkbox|radio)$/i,Xe=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,Ke=/^$|\\/(?:java|ecma)script/i,Ve={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};Ve.optgroup=Ve.option,Ve.tbody=Ve.tfoot=Ve.colgroup=Ve.caption=Ve.thead,Ve.th=Ve.td;var Ge=/<|&#?\\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement(\"div\")),n=te.createElement(\"input\");n.setAttribute(\"type\",\"radio\"),n.setAttribute(\"checked\",\"checked\"),n.setAttribute(\"name\",\"t\"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML=\"<textarea>x</textarea>\",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Ye=te.documentElement,Qe=/^key/,Je=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Ye,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(a=m.handle)||(a=m.handle=function(t){return\"undefined\"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||\"\").match(qe)||[\"\"],l=t.length;l--;)s=Ze.exec(t[l])||[],h=g=s[1],d=(s[2]||\"\").split(\".\").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},c=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(\".\")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,a)!==!1||e.addEventListener&&e.addEventListener(h,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,c):p.push(c),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,a,s,u,l,c,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||\"\").match(qe)||[\"\"],l=t.length;l--;)if(s=Ze.exec(t[l])||[],h=g=s[1],d=(s[2]||\"\").split(\".\").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=i=p.length;i--;)c=p[i],!o&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(i,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[l],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,o,i,a,s=de.event.fix(e),u=new Array(arguments.length),l=(Fe.get(this,\"events\")||{})[s.type]||[],c=de.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,s)!==!1){for(a=de.event.handlers.call(this,s,l),t=0;(o=a[t++])&&!s.isPropagationStopped();)for(s.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!s.rnamespace.test(i.namespace)||(s.handleObj=i,s.data=i.data,r=((de.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),void 0!==r&&(s.result=r)===!1&&(s.preventDefault(),s.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,o,i,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||l.disabled!==!0)){for(i=[],a={},n=0;n<u;n++)r=t[n],o=r.selector+\" \",void 0===a[o]&&(a[o]=r.needsContext?de(o,this).index(l)>-1:de.find(o,this,null,[l]).length),a[o]&&i.push(r);i.length&&s.push({elem:l,handlers:i})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(de.Event.prototype,e,{enumerable:!0,configurable:!0,get:de.isFunction(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[de.expando]?e:new de.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==C()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===C()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&de.nodeName(this,\"input\"))return this.click(),!1},_default:function(e){return de.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},de.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},de.Event=function(e,t){return this instanceof de.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?x:w,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&de.extend(this,t),this.timeStamp=e&&e.timeStamp||de.now(),void(this[de.expando]=!0)):new de.Event(e,t)},de.Event.prototype={constructor:de.Event,isDefaultPrevented:w,isPropagationStopped:w,isImmediatePropagationStopped:w,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=x,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=x,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=x,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},de.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Qe.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Je.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},de.event.addProp),de.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){de.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,o=e.relatedTarget,i=e.handleObj;return o&&(o===r||de.contains(r,o))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),de.fn.extend({on:function(e,t,n,r){return T(this,e,t,n,r)},one:function(e,t,n,r){return T(this,e,t,n,r,1)},off:function(e,t,n){var r,o;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,de(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,t,e[o]);return this}return t!==!1&&\"function\"!=typeof t||(n=t,t=void 0),n===!1&&(n=w),this.each(function(){de.event.remove(this,e,n,t)})}});var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,tt=/<script|<style|<link/i,nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,rt=/^true\\/(.*)/,ot=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,\"<$1></$2>\")},clone:function(e,t,n){var r,o,i,a,s=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(a=v(s),i=v(e),r=0,o=i.length;r<o;r++)S(i[r],a[r]);if(t)if(n)for(i=i||v(e),a=a||v(s),r=0,o=i.length;r<o;r++)N(i[r],a[r]);else N(e,s);return a=v(s,\"script\"),a.length>0&&y(a,!u&&v(e,\"script\")),s},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Pe.expando]&&(n[Pe.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=k(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=k(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!tt.test(e)&&!Ve[(Xe.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(de.cleanData(v(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return A(this,arguments,function(t){var n=this.parentNode;de.inArray(this,e)<0&&(de.cleanData(v(this)),n&&n.replaceChild(t,this))},e)}}),de.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){de.fn[e]=function(e){for(var n,r=[],o=de(e),i=o.length-1,a=0;a<=i;a++)n=a===i?this:this.clone(!0),de(o[a])[t](n),ie.apply(r,n.get());return this.pushStack(r)}});var it=/^margin/,at=new RegExp(\"^(\"+Me+\")(?!px)[a-z%]+$\",\"i\"),st=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)};!function(){function t(){if(s){s.style.cssText=\"box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%\",s.innerHTML=\"\",Ye.appendChild(a);var t=e.getComputedStyle(s);n=\"1%\"!==t.top,i=\"2px\"===t.marginLeft,r=\"4px\"===t.width,s.style.marginRight=\"50%\",o=\"4px\"===t.marginRight,Ye.removeChild(a),s=null}}var n,r,o,i,a=te.createElement(\"div\"),s=te.createElement(\"div\");s.style&&(s.style.backgroundClip=\"content-box\",s.cloneNode(!0).style.backgroundClip=\"\",pe.clearCloneStyle=\"content-box\"===s.style.backgroundClip,a.style.cssText=\"border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute\",a.appendChild(s),de.extend(pe,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return t(),r},pixelMarginRight:function(){return t(),o},reliableMarginLeft:function(){return t(),i}}))}();var ut=/^(none|table(?!-c[ea]).+)/,lt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},ct={letterSpacing:\"0\",fontWeight:\"400\"},ft=[\"Webkit\",\"Moz\",\"ms\"],pt=te.createElement(\"div\").style;de.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=D(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,a,s=de.camelCase(t),u=e.style;return t=de.cssProps[s]||(de.cssProps[s]=L(s)||s),a=de.cssHooks[t]||de.cssHooks[s],void 0===n?a&&\"get\"in a&&void 0!==(o=a.get(e,!1,r))?o:u[t]:(i=typeof n,\"string\"===i&&(o=$e.exec(n))&&o[1]&&(n=d(e,t,o),i=\"number\"),null!=n&&n===n&&(\"number\"===i&&(n+=o&&o[3]||(de.cssNumber[s]?\"\":\"px\")),pe.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,a,s=de.camelCase(t);return t=de.cssProps[s]||(de.cssProps[s]=L(s)||s),a=de.cssHooks[t]||de.cssHooks[s],a&&\"get\"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=D(e,t,r)),\"normal\"===o&&t in ct&&(o=ct[t]),\"\"===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),de.each([\"height\",\"width\"],function(e,t){de.cssHooks[t]={get:function(e,n,r){if(n)return!ut.test(de.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?P(e,t,r):Be(e,lt,function(){return P(e,t,r)})},set:function(e,n,r){var o,i=r&&st(e),a=r&&F(e,t,r,\"border-box\"===de.css(e,\"boxSizing\",!1,i),i);return a&&(o=$e.exec(n))&&\"px\"!==(o[3]||\"px\")&&(e.style[t]=n,n=de.css(e,t)),H(e,n,a)}}}),de.cssHooks.marginLeft=O(pe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(D(e,\"marginLeft\"))||e.getBoundingClientRect().left-Be(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),de.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){de.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)o[e+_e[r]+t]=i[r]||i[r-2]||i[0];return o}},it.test(e)||(de.cssHooks[e+t].set=H)}),de.fn.extend({css:function(e,t){return Le(this,function(e,t,n){var r,o,i={},a=0;if(de.isArray(t)){for(r=st(e),o=t.length;a<o;a++)i[t[a]]=de.css(e,t[a],!1,r);return i}return void 0!==n?de.style(e,t,n):de.css(e,t)},e,t,arguments.length>1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?\"\":\"px\")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=[\"*\"]):e=e.match(qe);for(var n,r=0,o=e.length;r<o;r++)n=e[r],U.tweeners[n]=U.tweeners[n]||[],U.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?U.prefilters.unshift(e):U.prefilters.push(e)}}),de.speed=function(e,t,n){var r=e&&\"object\"==typeof e?de.extend({},e):{complete:n||!n&&t||de.isFunction(e)&&e,duration:e,easing:n&&t||t&&!de.isFunction(t)&&t};return de.fx.off||te.hidden?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in de.fx.speeds?r.duration=de.fx.speeds[r.duration]:r.duration=de.fx.speeds._default),null!=r.queue&&r.queue!==!0||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){de.isFunction(r.old)&&r.old.call(this),r.queue&&de.dequeue(this,r.queue)},r},de.fn.extend({fadeTo:function(e,t,n,r){return this.filter(We).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){\nvar o=de.isEmptyObject(e),i=de.speed(t,n,r),a=function(){var t=U(this,de.extend({},e),i);(o||Fe.get(this,\"finish\"))&&t.stop(!0)};return a.finish=a,o||i.queue===!1?this.each(a):this.queue(i.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,o=null!=e&&e+\"queueHooks\",i=de.timers,a=Fe.get(this);if(o)a[o]&&a[o].stop&&r(a[o]);else for(o in a)a[o]&&a[o].stop&&mt.test(o)&&r(a[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));!t&&n||de.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=Fe.get(this),r=n[e+\"queue\"],o=n[e+\"queueHooks\"],i=de.timers,a=r?r.length:0;for(n.finish=!0,de.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),de.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=de.fn[t];de.fn[t]=function(e,r,o){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate($(t,!0),e,r,o)}}),de.each({slideDown:$(\"show\"),slideUp:$(\"hide\"),slideToggle:$(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){de.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),de.timers=[],de.fx.tick=function(){var e,t=0,n=de.timers;for(ht=de.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||de.fx.stop(),ht=void 0},de.fx.timer=function(e){de.timers.push(e),e()?de.fx.start():de.timers.pop()},de.fx.interval=13,de.fx.start=function(){dt||(dt=e.requestAnimationFrame?e.requestAnimationFrame(R):e.setInterval(de.fx.tick,de.fx.interval))},de.fx.stop=function(){e.cancelAnimationFrame?e.cancelAnimationFrame(dt):e.clearInterval(dt),dt=null},de.fx.speeds={slow:600,fast:200,_default:400},de.fn.delay=function(t,n){return t=de.fx?de.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var o=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(o)}})},function(){var e=te.createElement(\"input\"),t=te.createElement(\"select\"),n=t.appendChild(te.createElement(\"option\"));e.type=\"checkbox\",pe.checkOn=\"\"!==e.value,pe.optSelected=n.selected,e=te.createElement(\"input\"),e.value=\"t\",e.type=\"radio\",pe.radioValue=\"t\"===e.value}();var vt,yt=de.expr.attrHandle;de.fn.extend({attr:function(e,t){return Le(this,de.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return\"undefined\"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):o&&\"get\"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&\"radio\"===t&&de.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,a=t.toLowerCase();return r||(i=yt[a],yt[a]=o,o=null!=n(e,t,r)?a:null,yt[a]=i),o}});var bt=/^(?:input|select|textarea|button)$/i,xt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&\"set\"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&\"get\"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,\"tabindex\");return t?parseInt(t,10):bt.test(e.nodeName)||xt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:\"htmlFor\",class:\"className\"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,a,s,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(a=0;i=t[a++];)r.indexOf(\" \"+i+\" \")<0&&(r+=i+\" \");s=z(r),o!==s&&n.setAttribute(\"class\",s)}return this},removeClass:function(e){var t,n,r,o,i,a,s,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if(\"string\"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&\" \"+z(o)+\" \"){for(a=0;i=t[a++];)for(;r.indexOf(\" \"+i+\" \")>-1;)r=r.replace(\" \"+i+\" \",\" \");s=z(r),o!==s&&n.setAttribute(\"class\",s)}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if(\"string\"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&\"boolean\"!==n||(t=X(this),t&&Fe.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||e===!1?\"\":Fe.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;for(t=\" \"+e+\" \";n=this[r++];)if(1===n.nodeType&&(\" \"+z(X(n))+\" \").indexOf(t)>-1)return!0;return!1}});var wt=/\\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":de.isArray(o)&&(o=de.map(o,function(e){return null==e?\"\":e+\"\"})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&void 0!==t.set(this,o,\"value\")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&\"get\"in t&&void 0!==(n=t.get(o,\"value\"))?n:(n=o.value,\"string\"==typeof n?n.replace(wt,\"\"):null==n?\"\":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,\"value\");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?i+1:o.length;for(r=i<0?u:a?i:0;r<u;r++)if(n=o[r],(n.selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!de.nodeName(n.parentNode,\"optgroup\"))){if(t=de(n).val(),a)return t;s.push(t)}return s},set:function(e,t){for(var n,r,o=e.options,i=de.makeArray(t),a=o.length;a--;)r=o[a],(r.selected=de.inArray(de.valHooks.option.get(r),i)>-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each([\"radio\",\"checkbox\"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Ct=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,a,s,u,l,c,f,p=[r||te],h=le.call(t,\"type\")?t.type:t,d=le.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(a=s=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Ct.test(h+de.event.triggered)&&(h.indexOf(\".\")>-1&&(d=h.split(\".\"),h=d.shift(),d.sort()),l=h.indexOf(\":\")<0&&\"on\"+h,t=t[de.expando]?t:new de.Event(h,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Ct.test(u+h)||(a=a.parentNode);a;a=a.parentNode)p.push(a),s=a;s===(r.ownerDocument||te)&&p.push(s.defaultView||s.parentWindow||e)}for(i=0;(a=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,c=(Fe.get(a,\"events\")||{})[t.type]&&Fe.get(a,\"handle\"),c&&c.apply(a,n),c=l&&a[l],c&&c.apply&&He(a)&&(t.result=c.apply(a,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||l&&de.isFunction(r[h])&&!de.isWindow(r)&&(s=r[l],s&&(r[l]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,s&&(r[l]=s)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin=\"onfocusin\"in e,pe.focusin||de.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Tt=e.location,kt=de.now(),jt=/\\?/;de.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||de.error(\"Invalid XML: \"+t),n};var Et=/\\[\\]$/,Nt=/\\r?\\n/g,St=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)K(n,e[n],t,o);return r.join(\"&\")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,\"elements\");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(\":disabled\")&&At.test(this.nodeName)&&!St.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(Nt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Nt,\"\\r\\n\")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Pt=/^\\/\\//,It={},Rt={},Mt=\"*/\".concat(\"*\"),$t=te.createElement(\"a\");$t.href=Tt.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:\"GET\",isLocal:Ht.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Mt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Y(Y(e,de.ajaxSettings),t):Y(de.ajaxSettings,e)},ajaxPrefilter:V(It),ajaxTransport:V(Rt),ajax:function(t,n){function r(t,n,r,s){var l,p,h,x,w,C=n;c||(c=!0,u&&e.clearTimeout(u),o=void 0,a=s||\"\",T.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(x=Q(d,T,r)),x=J(d,x,T,l),l?(d.ifModified&&(w=T.getResponseHeader(\"Last-Modified\"),w&&(de.lastModified[i]=w),w=T.getResponseHeader(\"etag\"),w&&(de.etag[i]=w)),204===t||\"HEAD\"===d.type?C=\"nocontent\":304===t?C=\"notmodified\":(C=x.state,p=x.data,h=x.error,l=!h)):(h=C,!t&&C||(C=\"error\",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+\"\",l?v.resolveWith(g,[p,C,T]):v.rejectWith(g,[T,C,h]),T.statusCode(b),b=void 0,f&&m.trigger(l?\"ajaxSuccess\":\"ajaxError\",[T,d,l?p:h]),y.fireWith(g,[T,C]),f&&(m.trigger(\"ajaxComplete\",[T,d]),--de.active||de.event.trigger(\"ajaxStop\")))}\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,a,s,u,l,c,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks(\"once memory\"),b=d.statusCode||{},x={},w={},C=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=Lt.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,x[e]=t),this},overrideMimeType:function(e){return null==c&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)T.always(e[T.status]);else for(t in e)b[t]=[b[t],e[t]];return this},abort:function(e){var t=e||C;return o&&o.abort(t),r(0,t),this}};if(v.promise(T),d.url=((t||d.url||Tt.href)+\"\").replace(Pt,Tt.protocol+\"//\"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||\"*\").toLowerCase().match(qe)||[\"\"],null==d.crossDomain){l=te.createElement(\"a\");try{l.href=d.url,l.href=l.href,d.crossDomain=$t.protocol+\"//\"+$t.host!=l.protocol+\"//\"+l.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&\"string\"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),G(It,d,n,T),c)return T;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger(\"ajaxStart\"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,\"\"),d.hasContent?d.data&&d.processData&&0===(d.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(d.data=d.data.replace(qt,\"+\")):(h=d.url.slice(i.length),d.data&&(i+=(jt.test(i)?\"&\":\"?\")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,\"$1\"),h=(jt.test(i)?\"&\":\"?\")+\"_=\"+kt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&T.setRequestHeader(\"If-Modified-Since\",de.lastModified[i]),de.etag[i]&&T.setRequestHeader(\"If-None-Match\",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader(\"Content-Type\",d.contentType),T.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(\"*\"!==d.dataTypes[0]?\", \"+Mt+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(p in d.headers)T.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,T,d)===!1||c))return T.abort();if(C=\"abort\",y.add(d.complete),T.done(d.success),T.fail(d.error),o=G(Rt,d,n,T)){if(T.readyState=1,f&&m.trigger(\"ajaxSend\",[T,d]),c)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort(\"timeout\")},d.timeout));try{c=!1,o.send(x,r)}catch(e){if(c)throw e;r(-1,e)}}else r(-1,\"No Transport\");return T},getJSON:function(e,t,n){return de.get(e,t,n,\"json\")},getScript:function(e,t){return de.get(e,void 0,t,\"script\")}}),de.each([\"get\",\"post\"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},Wt=de.ajaxSettings.xhr();pe.cors=!!Wt&&\"withCredentials\"in Wt,pe.ajax=Wt=!!Wt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Wt&&!t.crossDomain)return{send:function(o,i){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||o[\"X-Requested-With\"]||(o[\"X-Requested-With\"]=\"XMLHttpRequest\");for(a in o)s.setRequestHeader(a,o[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.onreadystatechange=null,\"abort\"===e?s.abort():\"error\"===e?\"number\"!=typeof s.status?i(0,\"error\"):i(s.status,s.statusText):i(_t[s.status]||s.status,s.statusText,\"text\"!==(s.responseType||\"text\")||\"string\"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=n(\"error\"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),de.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),te.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Bt=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;de.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Bt.pop()||de.expando+\"_\"+kt++;return this[e]=!0,e}}),de.ajaxPrefilter(\"json jsonp\",function(t,n,r){var o,i,a,s=t.jsonp!==!1&&(Ut.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(t.data)&&\"data\");if(s||\"jsonp\"===t.dataTypes[0])return o=t.jsonpCallback=de.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Ut,\"$1\"+o):t.jsonp!==!1&&(t.url+=(jt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+o),t.converters[\"script json\"]=function(){return a||de.error(o+\" was not called\"),a[0]},t.dataTypes[0]=\"json\",i=e[o],e[o]=function(){a=arguments},r.always(function(){void 0===i?de(e).removeProp(o):e[o]=i,t[o]&&(t.jsonpCallback=n.jsonpCallback,Bt.push(o)),a&&de.isFunction(i)&&i(a[0]),a=i=void 0}),\"script\"}),pe.createHTMLDocument=function(){var e=te.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),de.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var r,o,i;return t||(pe.createHTMLDocument?(t=te.implementation.createHTMLDocument(\"\"),r=t.createElement(\"base\"),r.href=te.location.href,t.head.appendChild(r)):t=te),o=Te.exec(e),i=!n&&[],o?[t.createElement(o[1])]:(o=b([e],t,i),i&&i.length&&de(i).remove(),de.merge([],o.childNodes))},de.fn.load=function(e,t,n){var r,o,i,a=this,s=e.indexOf(\" \");return s>-1&&(r=z(e.slice(s)),e=e.slice(0,s)),de.isFunction(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(o=\"POST\"),a.length>0&&de.ajax({url:e,type:o||\"GET\",dataType:\"html\",data:t}).done(function(e){i=arguments,a.html(r?de(\"<div>\").append(de.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},de.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){de.fn[t]=function(e){return this.on(t,e)}}),de.expr.pseudos.animated=function(e){return de.grep(de.timers,function(t){return e===t.elem}).length},de.offset={setOffset:function(e,t,n){var r,o,i,a,s,u,l,c=de.css(e,\"position\"),f=de(e),p={};\"static\"===c&&(e.style.position=\"relative\"),s=f.offset(),i=de.css(e,\"top\"),u=de.css(e,\"left\"),l=(\"absolute\"===c||\"fixed\"===c)&&(i+u).indexOf(\"auto\")>-1,l?(r=f.position(),a=r.top,o=r.left):(a=parseFloat(i)||0,o=parseFloat(u)||0),de.isFunction(t)&&(t=t.call(e,n,de.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+o),\"using\"in t?t.using.call(e,p):f.css(p)}},de.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){de.offset.setOffset(this,e,t)});var t,n,r,o,i=this[0];if(i)return i.getClientRects().length?(r=i.getBoundingClientRect(),r.width||r.height?(o=i.ownerDocument,n=Z(o),t=o.documentElement,{top:r.top+n.pageYOffset-t.clientTop,left:r.left+n.pageXOffset-t.clientLeft}):r):{top:0,left:0}},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===de.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),de.nodeName(e[0],\"html\")||(r=e.offset()),r={top:r.top+de.css(e[0],\"borderTopWidth\",!0),left:r.left+de.css(e[0],\"borderLeftWidth\",!0)}),{top:t.top-r.top-de.css(n,\"marginTop\",!0),left:t.left-r.left-de.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&\"static\"===de.css(e,\"position\");)e=e.offsetParent;return e||Ye})}}),de.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;de.fn[e]=function(r){return Le(this,function(e,r,o){var i=Z(e);return void 0===o?i?i[t]:e[r]:void(i?i.scrollTo(n?i.pageXOffset:o,n?o:i.pageYOffset):e[r]=o)},e,r,arguments.length)}}),de.each([\"top\",\"left\"],function(e,t){de.cssHooks[t]=O(pe.pixelPosition,function(e,n){if(n)return n=D(e,t),at.test(n)?de(e).position()[t]+\"px\":n})}),de.each({Height:\"height\",Width:\"width\"},function(e,t){de.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){de.fn[r]=function(o,i){var a=arguments.length&&(n||\"boolean\"!=typeof o),s=n||(o===!0||i===!0?\"margin\":\"border\");return Le(this,function(t,n,o){var i;return de.isWindow(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):void 0===o?de.css(t,n,s):de.style(t,n,o,s)},t,a?o:void 0,a)}})}),de.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),de.parseJSON=JSON.parse,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return de});var zt=e.jQuery,Xt=e.$;return de.noConflict=function(t){return e.$===de&&(e.$=Xt),t&&e.jQuery===de&&(e.jQuery=zt),de},t||(e.jQuery=e.$=de),de})},{}],2:[function(e,t,n){!function(e,n,r){function o(e,t,n){return e.addEventListener?void e.addEventListener(t,n,!1):void e.attachEvent(\"on\"+t,n)}function i(e){if(\"keypress\"==e.type){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return y[e.which]?y[e.which]:b[e.which]?b[e.which]:String.fromCharCode(e.which).toLowerCase()}function a(e,t){return e.sort().join(\",\")===t.sort().join(\",\")}function s(e){var t=[];return e.shiftKey&&t.push(\"shift\"),e.altKey&&t.push(\"alt\"),e.ctrlKey&&t.push(\"ctrl\"),e.metaKey&&t.push(\"meta\"),t}function u(e){return e.preventDefault?void e.preventDefault():void(e.returnValue=!1)}function l(e){return e.stopPropagation?void e.stopPropagation():void(e.cancelBubble=!0)}function c(e){return\"shift\"==e||\"ctrl\"==e||\"alt\"==e||\"meta\"==e}function f(){if(!v){v={};for(var e in y)e>95&&e<112||y.hasOwnProperty(e)&&(v[y[e]]=e)}return v}function p(e,t,n){return n||(n=f()[e]?\"keydown\":\"keypress\"),\"keypress\"==n&&t.length&&(n=\"keydown\"),n}function h(e){return\"+\"===e?[\"+\"]:(e=e.replace(/\\+{2}/g,\"+plus\"),e.split(\"+\"))}function d(e,t){var n,r,o,i=[];for(n=h(e),o=0;o<n.length;++o)r=n[o],w[r]&&(r=w[r]),t&&\"keypress\"!=t&&x[r]&&(r=x[r],i.push(\"shift\")),c(r)&&i.push(r);return t=p(r,i,t),{key:r,modifiers:i,action:t}}function g(e,t){return null!==e&&e!==n&&(e===t||g(e.parentNode,t))}function m(e){function t(e){e=e||{};var t,n=!1;for(t in x)e[t]?n=!0:x[t]=0;n||(T=!1)}function r(e,t,n,r,o,i){var s,u,l=[],f=n.type;if(!y._callbacks[e])return[];for(\"keyup\"==f&&c(e)&&(t=[e]),s=0;s<y._callbacks[e].length;++s)if(u=y._callbacks[e][s],(r||!u.seq||x[u.seq]==u.level)&&f==u.action&&(\"keypress\"==f&&!n.metaKey&&!n.ctrlKey||a(t,u.modifiers))){var p=!r&&u.combo==o,h=r&&u.seq==r&&u.level==i;(p||h)&&y._callbacks[e].splice(s,1),l.push(u)}return l}function f(e,t,n,r){y.stopCallback(t,t.target||t.srcElement,n,r)||e(t,n)===!1&&(u(t),l(t))}function p(e){\"number\"!=typeof e.which&&(e.which=e.keyCode);var t=i(e);if(t)return\"keyup\"==e.type&&w===t?void(w=!1):void y.handleKey(t,s(e),e)}function h(){clearTimeout(b),b=setTimeout(t,1e3)}function g(e,n,r,o){function a(t){return function(){T=t,++x[e],h()}}function s(n){f(r,n,e),\"keyup\"!==o&&(w=i(n)),setTimeout(t,10)}x[e]=0;for(var u=0;u<n.length;++u){var l=u+1===n.length,c=l?s:a(o||d(n[u+1]).action);v(n[u],c,o,e,u)}}function v(e,t,n,o,i){y._directMap[e+\":\"+n]=t,e=e.replace(/\\s+/g,\" \");var a,s=e.split(\" \");return s.length>1?void g(e,s,t,n):(a=d(e,n),y._callbacks[a.key]=y._callbacks[a.key]||[],r(a.key,a.modifiers,{type:a.action},o,e,i),void y._callbacks[a.key][o?\"unshift\":\"push\"]({callback:t,modifiers:a.modifiers,action:a.action,seq:o,level:i,combo:e}))}var y=this;if(e=e||n,!(y instanceof m))return new m(e);y.target=e,y._callbacks={},y._directMap={};var b,x={},w=!1,C=!1,T=!1;y._handleKey=function(e,n,o){var i,a=r(e,n,o),s={},u=0,l=!1;for(i=0;i<a.length;++i)a[i].seq&&(u=Math.max(u,a[i].level));for(i=0;i<a.length;++i)if(a[i].seq){if(a[i].level!=u)continue;l=!0,s[a[i].seq]=1,f(a[i].callback,o,a[i].combo,a[i].seq)}else l||f(a[i].callback,o,a[i].combo);var p=\"keypress\"==o.type&&C;o.type!=T||c(e)||p||t(s),C=l&&\"keydown\"==o.type},y._bindMultiple=function(e,t,n){for(var r=0;r<e.length;++r)v(e[r],t,n)},o(e,\"keypress\",p),o(e,\"keydown\",p),o(e,\"keyup\",p)}if(e){for(var v,y={8:\"backspace\",9:\"tab\",13:\"enter\",16:\"shift\",17:\"ctrl\",18:\"alt\",20:\"capslock\",27:\"esc\",32:\"space\",33:\"pageup\",34:\"pagedown\",35:\"end\",36:\"home\",37:\"left\",38:\"up\",39:\"right\",40:\"down\",45:\"ins\",46:\"del\",91:\"meta\",93:\"meta\",224:\"meta\"},b={106:\"*\",107:\"+\",109:\"-\",110:\".\",111:\"/\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"},x={\"~\":\"`\",\"!\":\"1\",\"@\":\"2\",\"#\":\"3\",$:\"4\",\"%\":\"5\",\"^\":\"6\",\"&\":\"7\",\"*\":\"8\",\"(\":\"9\",\")\":\"0\",_:\"-\",\"+\":\"=\",\":\":\";\",'\"':\"'\",\"<\":\",\",\">\":\".\",\"?\":\"/\",\"|\":\"\\\\\"},w={option:\"alt\",command:\"meta\",return:\"enter\",escape:\"esc\",plus:\"+\",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?\"meta\":\"ctrl\"},C=1;C<20;++C)y[111+C]=\"f\"+C;for(C=0;C<=9;++C)y[C+96]=C;m.prototype.bind=function(e,t,n){var r=this;return e=e instanceof Array?e:[e],r._bindMultiple.call(r,e,t,n),r},m.prototype.unbind=function(e,t){var n=this;return n.bind.call(n,e,function(){},t)},m.prototype.trigger=function(e,t){var n=this;return n._directMap[e+\":\"+t]&&n._directMap[e+\":\"+t]({},e),n},m.prototype.reset=function(){var e=this;return e._callbacks={},e._directMap={},e},m.prototype.stopCallback=function(e,t){var n=this;return!((\" \"+t.className+\" \").indexOf(\" mousetrap \")>-1)&&(!g(t,n.target)&&(\"INPUT\"==t.tagName||\"SELECT\"==t.tagName||\"TEXTAREA\"==t.tagName||t.isContentEditable))},m.prototype.handleKey=function(){var e=this;return e._handleKey.apply(e,arguments)},m.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(y[t]=e[t]);v=null},m.init=function(){var e=m(n);for(var t in e)\"_\"!==t.charAt(0)&&(m[t]=function(t){return function(){return e[t].apply(e,arguments)}}(t))},m.init(),e.Mousetrap=m,\"undefined\"!=typeof t&&t.exports&&(t.exports=m),\"function\"==typeof define&&define.amd&&define(function(){return m})}}(\"undefined\"!=typeof window?window:null,\"undefined\"!=typeof window?document:null)},{}],3:[function(e,t,n){(function(e){!function(r){function o(e){throw new RangeError(L[e])}function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function a(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var o=e.split(\".\"),a=i(o,t).join(\".\");return r+a}function s(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t>=55296&&t<=56319&&o<i?(n=e.charCodeAt(o++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),o--)):r.push(t);return r}function u(e){return i(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=P(e>>>10&1023|55296),e=56320|1023&e),t+=P(e)}).join(\"\")}function l(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:C}function c(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*k>>1;r+=C)e=F(e/H);return F(r+(H+1)*e/(e+j))}function p(e){var t,n,r,i,a,s,c,p,h,d,g=[],m=e.length,v=0,y=S,b=N;for(n=e.lastIndexOf(A),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&o(\"not-basic\"),g.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<m;){for(a=v,s=1,c=C;i>=m&&o(\"invalid-input\"),p=l(e.charCodeAt(i++)),(p>=C||p>F((w-v)/s))&&o(\"overflow\"),v+=p*s,h=c<=b?T:c>=b+k?k:c-b,!(p<h);c+=C)d=C-h,s>F(w/d)&&o(\"overflow\"),s*=d;t=g.length+1,b=f(v-a,t,0==a),F(v/t)>w-y&&o(\"overflow\"),y+=F(v/t),v%=t,g.splice(v++,0,y)}return u(g)}function h(e){var t,n,r,i,a,u,l,p,h,d,g,m,v,y,b,x=[];for(e=s(e),m=e.length,t=S,n=0,a=N,u=0;u<m;++u)g=e[u],g<128&&x.push(P(g));for(r=i=x.length,i&&x.push(A);r<m;){for(l=w,u=0;u<m;++u)g=e[u],g>=t&&g<l&&(l=g);for(v=r+1,l-t>F((w-n)/v)&&o(\"overflow\"),n+=(l-t)*v,t=l,u=0;u<m;++u)if(g=e[u],g<t&&++n>w&&o(\"overflow\"),g==t){for(p=n,h=C;d=h<=a?T:h>=a+k?k:h-a,!(p<d);h+=C)b=p-d,y=C-d,x.push(P(c(d+b%y,0))),p=F(b/y);x.push(P(c(p,0))),a=f(n,v,r==i),n=0,++r}++n,++t}return x.join(\"\")}function d(e){return a(e,function(e){return q.test(e)?p(e.slice(4).toLowerCase()):e})}function g(e){return a(e,function(e){return D.test(e)?\"xn--\"+h(e):e})}var m=\"object\"==typeof n&&n&&!n.nodeType&&n,v=\"object\"==typeof t&&t&&!t.nodeType&&t,y=\"object\"==typeof e&&e;y.global!==y&&y.window!==y&&y.self!==y||(r=y);var b,x,w=2147483647,C=36,T=1,k=26,j=38,E=700,N=72,S=128,A=\"-\",q=/^xn--/,D=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,L={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},H=C-T,F=Math.floor,P=String.fromCharCode;if(b={version:\"1.4.1\",ucs2:{decode:s,encode:u},decode:p,encode:h,toASCII:g,toUnicode:d},\"function\"==typeof define&&\"object\"==typeof define.amd&&define.amd)define(\"punycode\",function(){return b});else if(m&&v)if(t.exports==m)v.exports=b;else for(x in b)b.hasOwnProperty(x)&&(m[x]=b[x]);else r.punycode=b}(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],4:[function(e,t,n){\"use strict\";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.exports=function(e,t,n,i){t=t||\"&\",n=n||\"=\";var a={};if(\"string\"!=typeof e||0===e.length)return a;var s=/\\+/g;e=e.split(t);var u=1e3;i&&\"number\"==typeof i.maxKeys&&(u=i.maxKeys);var l=e.length;u>0&&l>u&&(l=u);for(var c=0;c<l;++c){var f,p,h,d,g=e[c].replace(s,\"%20\"),m=g.indexOf(n);m>=0?(f=g.substr(0,m),p=g.substr(m+1)):(f=g,p=\"\"),h=decodeURIComponent(f),d=decodeURIComponent(p),\nr(a,h)?o(a[h])?a[h].push(d):a[h]=[a[h],d]:a[h]=d}return a};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],5:[function(e,t,n){\"use strict\";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r));return n}var o=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};t.exports=function(e,t,n,s){return t=t||\"&\",n=n||\"=\",null===e&&(e=void 0),\"object\"==typeof e?r(a(e),function(a){var s=encodeURIComponent(o(a))+n;return i(e[a])?r(e[a],function(e){return s+encodeURIComponent(o(e))}).join(t):s+encodeURIComponent(o(e[a]))}).join(t):s?encodeURIComponent(o(s))+n+encodeURIComponent(o(e)):\"\"};var i=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},a=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}},{}],6:[function(e,t,n){\"use strict\";n.decode=n.parse=e(\"./decode\"),n.encode=n.stringify=e(\"./encode\")},{\"./decode\":4,\"./encode\":5}],7:[function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function o(e,t,n){if(e&&l.isObject(e)&&e instanceof r)return e;var o=new r;return o.parse(e,t,n),o}function i(e){return l.isString(e)&&(e=o(e)),e instanceof r?e.format():r.prototype.format.call(e)}function a(e,t){return o(e,!1,!0).resolve(t)}function s(e,t){return e?o(e,!1,!0).resolveObject(t):t}var u=e(\"punycode\"),l=e(\"./util\");n.parse=o,n.resolve=a,n.resolveObject=s,n.format=i,n.Url=r;var c=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,p=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),g=[\"'\"].concat(d),m=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(g),v=[\"/\",\"?\",\"#\"],y=255,b=/^[+a-z0-9A-Z_-]{0,63}$/,x=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,w={javascript:!0,\"javascript:\":!0},C={javascript:!0,\"javascript:\":!0},T={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},k=e(\"querystring\");r.prototype.parse=function(e,t,n){if(!l.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),o=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",i=e.split(o),a=/\\\\/g;i[0]=i[0].replace(a,\"/\"),e=i.join(o);var s=e;if(s=s.trim(),!n&&1===e.split(\"#\").length){var f=p.exec(s);if(f)return this.path=s,this.href=s,this.pathname=f[1],f[2]?(this.search=f[2],t?this.query=k.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=c.exec(s);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,s=s.substr(h.length)}if(n||h||s.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var j=\"//\"===s.substr(0,2);!j||h&&C[h]||(s=s.substr(2),this.slashes=!0)}if(!C[h]&&(j||h&&!T[h])){for(var E=-1,N=0;N<v.length;N++){var S=s.indexOf(v[N]);S!==-1&&(E===-1||S<E)&&(E=S)}var A,q;q=E===-1?s.lastIndexOf(\"@\"):s.lastIndexOf(\"@\",E),q!==-1&&(A=s.slice(0,q),s=s.slice(q+1),this.auth=decodeURIComponent(A)),E=-1;for(var N=0;N<m.length;N++){var S=s.indexOf(m[N]);S!==-1&&(E===-1||S<E)&&(E=S)}E===-1&&(E=s.length),this.host=s.slice(0,E),s=s.slice(E),this.parseHost(),this.hostname=this.hostname||\"\";var D=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!D)for(var O=this.hostname.split(/\\./),N=0,L=O.length;N<L;N++){var H=O[N];if(H&&!H.match(b)){for(var F=\"\",P=0,I=H.length;P<I;P++)F+=H.charCodeAt(P)>127?\"x\":H[P];if(!F.match(b)){var R=O.slice(0,N),M=O.slice(N+1),$=H.match(x);$&&(R.push($[1]),M.unshift($[2])),M.length&&(s=\"/\"+M.join(\".\")+s),this.hostname=R.join(\".\");break}}}this.hostname.length>y?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),D||(this.hostname=u.toASCII(this.hostname));var _=this.port?\":\"+this.port:\"\",W=this.hostname||\"\";this.host=W+_,this.href+=this.host,D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==s[0]&&(s=\"/\"+s))}if(!w[d])for(var N=0,L=g.length;N<L;N++){var B=g[N];if(s.indexOf(B)!==-1){var U=encodeURIComponent(B);U===B&&(U=escape(B)),s=s.split(B).join(U)}}var z=s.indexOf(\"#\");z!==-1&&(this.hash=s.substr(z),s=s.slice(0,z));var X=s.indexOf(\"?\");if(X!==-1?(this.search=s.substr(X),this.query=s.substr(X+1),t&&(this.query=k.parse(this.query)),s=s.slice(0,X)):t&&(this.search=\"\",this.query={}),s&&(this.pathname=s),T[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var _=this.pathname||\"\",K=this.search||\"\";this.path=_+K}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",o=!1,i=\"\";this.host?o=e+this.host:this.hostname&&(o=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(o+=\":\"+this.port)),this.query&&l.isObject(this.query)&&Object.keys(this.query).length&&(i=k.stringify(this.query));var a=this.search||i&&\"?\"+i||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||T[t])&&o!==!1?(o=\"//\"+(o||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):o||(o=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),a&&\"?\"!==a.charAt(0)&&(a=\"?\"+a),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),a=a.replace(\"#\",\"%23\"),t+o+n+a+r},r.prototype.resolve=function(e){return this.resolveObject(o(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(l.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,o=Object.keys(this),i=0;i<o.length;i++){var a=o[i];n[a]=this[a]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var s=Object.keys(e),u=0;u<s.length;u++){var c=s[u];\"protocol\"!==c&&(n[c]=e[c])}return T[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!T[e.protocol]){for(var f=Object.keys(e),p=0;p<f.length;p++){var h=f[p];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||C[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var g=n.pathname||\"\",m=n.search||\"\";n.path=g+m}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var v=n.pathname&&\"/\"===n.pathname.charAt(0),y=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),b=y||v||n.host&&e.pathname,x=b,w=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],k=n.protocol&&!T[n.protocol];if(k&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===w[0]?w[0]=n.host:w.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),b=b&&(\"\"===d[0]||\"\"===w[0])),y)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,w=d;else if(d.length)w||(w=[]),w.pop(),w=w.concat(d),n.search=e.search,n.query=e.query;else if(!l.isNullOrUndefined(e.search)){if(k){n.hostname=n.host=w.shift();var j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");j&&(n.auth=j.shift(),n.host=n.hostname=j.shift())}return n.search=e.search,n.query=e.query,l.isNull(n.pathname)&&l.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!w.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var E=w.slice(-1)[0],N=(n.host||e.host||w.length>1)&&(\".\"===E||\"..\"===E)||\"\"===E,S=0,A=w.length;A>=0;A--)E=w[A],\".\"===E?w.splice(A,1):\"..\"===E?(w.splice(A,1),S++):S&&(w.splice(A,1),S--);if(!b&&!x)for(;S--;S)w.unshift(\"..\");!b||\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0)||w.unshift(\"\"),N&&\"/\"!==w.join(\"/\").substr(-1)&&w.push(\"\");var q=\"\"===w[0]||w[0]&&\"/\"===w[0].charAt(0);if(k){n.hostname=n.host=q?\"\":w.length?w.shift():\"\";var j=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");j&&(n.auth=j.shift(),n.host=n.hostname=j.shift())}return b=b||n.host&&w.length,b&&!q&&w.unshift(\"\"),w.length?n.pathname=w.join(\"/\"):(n.pathname=null,n.path=null),l.isNull(n.pathname)&&l.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=f.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},{\"./util\":8,punycode:3,querystring:6}],8:[function(e,t,n){\"use strict\";t.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],9:[function(e,t,n){function r(e){var t=a(e.currentTarget).parent().find(\".dropdown-menu\");t.toggleClass(\"open\"),e.stopPropagation(),e.preventDefault()}function o(e){a(\".dropdown-menu\").removeClass(\"open\")}function i(){a(document).on(\"click\",\".toggle-dropdown\",r),a(document).on(\"click\",\".dropdown-menu\",function(e){e.stopPropagation()}),a(document).on(\"click\",o)}var a=e(\"jquery\");t.exports={init:i}},{jquery:1}],10:[function(e,t,n){function r(){s.init(),i.init(),o.init(),a.init(),u.createButton({index:0,icon:\"fa fa-align-justify\",onClick:function(e){e.preventDefault(),s.toggle()}})}var o=e(\"./dropdown\"),i=e(\"./keyboard\"),a=e(\"./navigation\"),s=e(\"./sidebar\"),u=e(\"./toolbar\"),l=window.gitbook;l.events.on(\"start\",r),l.keyboard=i,l.navigation=a,l.sidebar=s,l.toolbar=u},{\"./dropdown\":9,\"./keyboard\":11,\"./navigation\":13,\"./sidebar\":15,\"./toolbar\":16}],11:[function(e,t,n){function r(e,t){i.bind(e,function(e){return t(),!1})}function o(){r([\"right\"],function(e){a.goNext()}),r([\"left\"],function(e){a.goPrev()}),r([\"s\"],function(e){s.toggle()})}var i=e(\"mousetrap\"),a=e(\"./navigation\"),s=e(\"./sidebar\");t.exports={init:o,bind:r}},{\"./navigation\":13,\"./sidebar\":15,mousetrap:2}],12:[function(e,t,n){function r(e){return o.state.$book.addClass(\"is-loading\"),e.always(function(){o.state.$book.removeClass(\"is-loading\")}),e}var o=window.gitbook;t.exports={show:r}},{}],13:[function(e,t,n){function r(){return w(k.isSmallScreen()?\".book-body\":\".body-inner\")}function o(e){var t=r(),n=0;i(e)&&(e&&(n=a(e)),t.unbind(\"scroll\"),t.animate({scrollTop:n},800,\"swing\",function(){t.scroll(l)}),s(null,e))}function i(e){var t=r(),n=t.find(e);return!!n.length}function a(e){var t=r(),n=t.find(\".page-inner\"),o=t.find(e),i=o.offsetParent(),a=0;for(a=o.position().top;!i.is(n);)o=i,a+=o.position().top,i=o.offsetParent();return Math.floor(a)}function s(e,t){if(e||t||(e=b.first()),t&&(e=b.length>1?b.filter(function(){var e=u(w(this));return e==t}).first():b.first()),!e.is(x)){x=e,b.removeClass(\"active\"),e.addClass(\"active\"),t=u(e);var n=window.location.pathname+window.location.hash,r=window.location.pathname+t;r!=n&&history.replaceState({path:r},null,r)}}function u(e){var t=e.children(\"a\"),n=t.attr(\"href\").split(\"#\")[1];return n&&(n=\"#\"+n),n?n:\"\"}function l(){var e=r(),t=e.scrollTop(),n=e.prop(\"scrollHeight\"),o=e.prop(\"clientHeight\"),i=b.length,l=null;w(b.get().reverse()).each(function(e){var n,r=u(w(this));r&&!l&&(n=a(r),t>=n&&(l=w(this))),e!=i-1||l||(l=w(this))}),l||t||(l=b.first()),t&&n-t==o&&(l=b.last()),s(l)}function c(e,t){var n=C.parse(N),r=C.resolve(window.location.pathname,e),i=C.parse(r),a=i.hash,s=i.pathname!==n.pathname,u=Boolean(i.hostname);if(!E||u)return void(location.href=e);if(!s)return t&&history.pushState({path:r},null,r),o(a);N=r;var l=w.Deferred(function(e){w.ajax({type:\"GET\",url:r,cache:!0,headers:{\"Access-Control-Expose-Headers\":\"X-Current-Location\"},success:function(n,i,s){var u=s.getResponseHeader(\"X-Current-Location\")||r;n=n.replace(/<(\\/?)(html|head|body)([^>]*)>/gi,function(e,t,n,r){return\"<\"+t+\"div\"+(t?\"\":' data-element=\"'+n+'\"')+r+\">\"});var l,c=w(n),f=c.find(\".book\");if(0===f.length){var h=new Error(\"Invalid gitbook page, redirecting...\");return e.reject(h)}t&&history.pushState({path:u},null,u),c=w(n),l=c.find(\"[data-element=head]\"),f=c.find(\".book\"),document.title=l.find(\"title\").text();var d=w(\"head\");d.find(\"link[rel=prev]\").remove(),d.find(\"link[rel=next]\").remove(),d.append(l.find(\"link[rel=prev]\")),d.append(l.find(\"link[rel=next]\"));var g=w(\".book\").attr(\"class\"),m=w(\".book-summary\").scrollTop();f.toggleClass(\"with-summary\",w(\".book\").hasClass(\"with-summary\")),w(\".book\").replaceWith(f),w(\".book\").attr(\"class\",g),w(\".book-summary\").scrollTop(m),j.state.$book=w(\".book\"),p(!a),a&&o(a),e.resolve()}})}).promise();return T.show(l.fail(function(e){console.log(e)}))}function f(){var e,t;e=parseInt(w(\".body-inner\").css(\"width\"),10),t=parseInt(w(\".page-wrapper\").css(\"width\"),10),w(\".navigation-next\").css(\"margin-right\",e-t+\"px\");var n=r();n.unbind(\"scroll\"),n.scroll(l)}function p(e){var t=w(\".book-body\"),n=t.find(\".body-inner\"),o=n.find(\".page-wrapper\");f(),o.focus();var i=r();e!==!1&&i.scrollTop(0),b=w(\".book-summary .summary .chapter\").filter(function(){var e=w(this).children(\"a\"),t=null;if(!e.length)return!1;t=e.attr(\"href\").split(\"#\")[0];var n=C.resolve(window.location.pathname,t);return window.location.pathname==n}),b.length>1?i.scroll(l):x=b.first()}function h(e){return 0===e.button}function d(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function g(e){var t=w(this),n=t.attr(\"target\");if(!d(e)&&h(e)&&!n){e.stopPropagation(),e.preventDefault();var r=t.attr(\"href\");r&&c(r,!0)}}function m(){var e=w(\".navigation-next\").attr(\"href\");e&&c(e,!0)}function v(){var e=w(\".navigation-prev\").attr(\"href\");e&&c(e,!0)}function y(){w.ajaxSetup({cache:!1}),history.replaceState({path:window.location.href},\"\"),window.onpopstate=function(e){if(null!==e.state)return c(e.state.path,!1)},w(document).on(\"click\",\".navigation-prev\",g),w(document).on(\"click\",\".navigation-next\",g),w(document).on(\"click\",\".summary [data-path] a\",g),w(document).on(\"click\",\".page-inner a\",g),w(window).resize(f),p(!1)}var b,x,w=e(\"jquery\"),C=e(\"url\"),T=e(\"./loading\"),k=e(\"./platform\"),j=window.gitbook,E=\"undefined\"!=typeof history.pushState,N=location.href;t.exports={init:y,goNext:m,goPrev:v}},{\"./loading\":12,\"./platform\":14,jquery:1,url:7}],14:[function(e,t,n){var r=e(\"jquery\");t.exports={isMobile:function(){return r(document).width()<=600},isSmallScreen:function(){return r(document).width()<=1240}}},{jquery:1}],15:[function(e,t,n){function r(e,t){null!=l.state&&o()==e||(null==t&&(t=!0),l.state.$book.toggleClass(\"without-animation\",!t),l.state.$book.toggleClass(\"with-summary\",e),l.storage.set(\"sidebar\",o()))}function o(){return l.state.$book.hasClass(\"with-summary\")}function i(){u.isMobile()||r(l.storage.get(\"sidebar\",!0),!1),s(document).on(\"click\",\".book-summary li.chapter a\",function(e){u.isMobile()&&r(!1,!1)})}function a(e){var t=s(\".book-summary\");t.find(\"li\").each(function(){var t=s(this).data(\"path\"),n=null==e||e.indexOf(t)!==-1;s(this).toggle(n),n&&s(this).parents(\"li\").show()})}var s=e(\"jquery\"),u=e(\"./platform\"),l=window.gitbook;t.exports={init:i,isOpen:o,toggle:r,filter:a}},{\"./platform\":14,jquery:1}],16:[function(e,t,n){function r(){return\"btn-\"+g++}function o(e,t,n,r){var o=e.children(t).length;n<0&&(n=Math.max(0,o+1+n)),e.append(r),n<o&&e.children(t).eq(n).before(e.children(t).last())}function i(e){e.preventDefault()}function a(e){var t=p(\"<div>\",{class:\"dropdown-menu\",html:'<div class=\"dropdown-caret\"><span class=\"caret-outer\"></span><span class=\"caret-inner\"></span></div>'});if(\"string\"==typeof e)t.append(e);else{var n=e.map(function(e){return p.isArray(e)?e:[e]});n.forEach(function(e){var n=p(\"<div>\",{class:\"buttons\"}),r=\"size-\"+e.length;e.forEach(function(e){e=p.extend({text:\"\",className:\"\",onClick:i},e||{});var t=p(\"<button>\",{class:\"button \"+r+\" \"+e.className,text:e.text});t.click(e.onClick),n.append(t)}),t.append(n)})}return t}function s(e){return e=p.extend({label:\"\",icon:\"\",text:\"\",position:\"left\",className:\"\",onClick:i,dropdown:null,index:null,id:r()},e||{}),d.push(e),u(e),e.id}function u(e){var t,n=p(\".book-header\"),r=n.find(\"h1\"),i=\"pull-\"+e.position,s=p(\"<a>\",{class:\"btn\",text:e.text?\" \"+e.text:\"\",\"aria-label\":e.label,href:\"#\"});if(s.click(e.onClick),e.icon&&p(\"<i>\",{class:e.icon}).prependTo(s),e.dropdown){var u=p(\"<div>\",{class:\"dropdown \"+i+\" \"+e.className});s.addClass(\"toggle-dropdown\"),u.append(s);var l=a(e.dropdown);l.addClass(\"dropdown-\"+(\"right\"==e.position?\"left\":\"right\")),u.append(l),t=u}else s.addClass(i),s.addClass(e.className),t=s;t.addClass(\"js-toolbar-action\"),p.isNumeric(e.index)&&e.index>=0?o(n,\".btn, .dropdown, h1\",e.index,t):t.insertBefore(r)}function l(){p(\".js-toolbar-action\").remove(),d.forEach(u)}function c(e){d=p.grep(d,function(t){return t.id!=e}),l()}function f(e){d=p.grep(d,function(t){return e.indexOf(t.id)==-1}),l()}var p=e(\"jquery\"),h=window.gitbook,d=[],g=0;h.events.on(\"page.change\",function(){l()}),t.exports={createButton:s,removeButton:c,removeButtons:f}},{jquery:1}]},{},[10]);\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Chart.js · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"getting-started/\" />\n\n\n\n    <link rel=\"stylesheet\" href=\"gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter active\" data-level=\"1.1\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"getting-started/\">\n\n                <a href=\"getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"getting-started/installation.html\">\n\n                <a href=\"getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"getting-started/integration.html\">\n\n                <a href=\"getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"getting-started/usage.html\">\n\n                <a href=\"getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"general/\">\n\n                <a href=\"general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"general/responsive.html\">\n\n                <a href=\"general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"general/interactions/\">\n\n                <a href=\"general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"general/interactions/events.html\">\n\n                <a href=\"general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"general/interactions/modes.html\">\n\n                <a href=\"general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"general/options.html\">\n\n                <a href=\"general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"general/colors.html\">\n\n                <a href=\"general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"general/fonts.html\">\n\n                <a href=\"general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"configuration/\">\n\n                <a href=\"configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"configuration/animations.html\">\n\n                <a href=\"configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"configuration/layout.html\">\n\n                <a href=\"configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"configuration/legend.html\">\n\n                <a href=\"configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"configuration/title.html\">\n\n                <a href=\"configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"configuration/tooltip.html\">\n\n                <a href=\"configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"configuration/elements.html\">\n\n                <a href=\"configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"charts/\">\n\n                <a href=\"charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"charts/line.html\">\n\n                <a href=\"charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"charts/bar.html\">\n\n                <a href=\"charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"charts/radar.html\">\n\n                <a href=\"charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"charts/doughnut.html\">\n\n                <a href=\"charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"charts/polar.html\">\n\n                <a href=\"charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"charts/bubble.html\">\n\n                <a href=\"charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"charts/scatter.html\">\n\n                <a href=\"charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"charts/area.html\">\n\n                <a href=\"charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"charts/mixed.html\">\n\n                <a href=\"charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"axes/\">\n\n                <a href=\"axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"axes/cartesian/\">\n\n                <a href=\"axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"axes/cartesian/category.html\">\n\n                <a href=\"axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"axes/cartesian/linear.html\">\n\n                <a href=\"axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"axes/cartesian/logarithmic.html\">\n\n                <a href=\"axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"axes/cartesian/time.html\">\n\n                <a href=\"axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"axes/radial/\">\n\n                <a href=\"axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"axes/radial/linear.html\">\n\n                <a href=\"axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"axes/labelling.html\">\n\n                <a href=\"axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"axes/styling.html\">\n\n                <a href=\"axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"developers/\">\n\n                <a href=\"developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"developers/api.html\">\n\n                <a href=\"developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"developers/updates.html\">\n\n                <a href=\"developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"developers/plugins.html\">\n\n                <a href=\"developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"developers/charts.html\">\n\n                <a href=\"developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"developers/axes.html\">\n\n                <a href=\"developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"developers/contributing.html\">\n\n                <a href=\"developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"notes/\">\n\n                <a href=\"notes/\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"notes/comparison.html\">\n\n                <a href=\"notes/comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"notes/extensions.html\">\n\n                <a href=\"notes/extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"notes/license.html\">\n\n                <a href=\"notes/license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\".\" >Chart.js</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"chartjs\">Chart.js</h1>\n<p><a href=\"https://chart-js-automation.herokuapp.com/\" target=\"_blank\"><img src=\"https://img.shields.io/badge/slack-Chart.js-blue.svg?style=flat-square&amp;maxAge=600\" alt=\"slack\"></a></p>\n<h2 id=\"installation\">Installation</h2>\n<p>You can download the latest version of Chart.js from the <a href=\"https://github.com/chartjs/Chart.js/releases/latest\" target=\"_blank\">GitHub releases</a> or use a <a href=\"https://cdnjs.com/libraries/Chart.js\" target=\"_blank\">Chart.js CDN</a>. Detailed installation instructions can be found on the <a href=\"getting-started/installation.html\">installation</a> page.</p>\n<h2 id=\"creating-a-chart\">Creating a Chart</h2>\n<p>It&apos;s easy to get started with Chart.js. All that&apos;s required is the script included in your page along with a single <code>&lt;canvas&gt;</code> node to render the chart.</p>\n<p>In this example, we create a bar chart for a single dataset and render that in our page. You can see all the ways to use Chart.js in the <a href=\"getting-started/usage.html\">usage documentation</a></p>\n<pre><code class=\"lang-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">canvas</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;myChart&quot;</span> <span class=\"hljs-attr\">width</span>=<span class=\"hljs-string\">&quot;400&quot;</span> <span class=\"hljs-attr\">height</span>=<span class=\"hljs-string\">&quot;400&quot;</span>&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">canvas</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span>&gt;</span><span class=\"javascript\">\n<span class=\"hljs-keyword\">var</span> ctx = <span class=\"hljs-built_in\">document</span>.getElementById(<span class=\"hljs-string\">&quot;myChart&quot;</span>).getContext(<span class=\"hljs-string\">&apos;2d&apos;</span>);\n<span class=\"hljs-keyword\">var</span> myChart = <span class=\"hljs-keyword\">new</span> Chart(ctx, {\n    type: <span class=\"hljs-string\">&apos;bar&apos;</span>,\n    data: {\n        labels: [<span class=\"hljs-string\">&quot;Red&quot;</span>, <span class=\"hljs-string\">&quot;Blue&quot;</span>, <span class=\"hljs-string\">&quot;Yellow&quot;</span>, <span class=\"hljs-string\">&quot;Green&quot;</span>, <span class=\"hljs-string\">&quot;Purple&quot;</span>, <span class=\"hljs-string\">&quot;Orange&quot;</span>],\n        datasets: [{\n            label: <span class=\"hljs-string\">&apos;# of Votes&apos;</span>,\n            data: [<span class=\"hljs-number\">12</span>, <span class=\"hljs-number\">19</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>],\n            backgroundColor: [\n                <span class=\"hljs-string\">&apos;rgba(255, 99, 132, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(54, 162, 235, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 206, 86, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(75, 192, 192, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(153, 102, 255, 0.2)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 159, 64, 0.2)&apos;</span>\n            ],\n            borderColor: [\n                <span class=\"hljs-string\">&apos;rgba(255,99,132,1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(54, 162, 235, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 206, 86, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(75, 192, 192, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(153, 102, 255, 1)&apos;</span>,\n                <span class=\"hljs-string\">&apos;rgba(255, 159, 64, 1)&apos;</span>\n            ],\n            borderWidth: <span class=\"hljs-number\">1</span>\n        }]\n    },\n    options: {\n        scales: {\n            yAxes: [{\n                ticks: {\n                    beginAtZero:<span class=\"hljs-literal\">true</span>\n                }\n            }]\n        }\n    }\n});\n</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n<h2 id=\"contributing\">Contributing</h2>\n<p>Before submitting an issue or a pull request to the project, please take a moment to look over the <a href=\"https://github.com/chartjs/Chart.js/blob/master/docs/developers/contributing.md\" target=\"_blank\">contributing guidelines</a> first.</p>\n<p>For support using Chart.js, please post questions with the <a href=\"http://stackoverflow.com/questions/tagged/chartjs\" target=\"_blank\"><code>chartjs</code> tag on Stack Overflow</a>.</p>\n<h2 id=\"license\">License</h2>\n<p>Chart.js is available under the <a href=\"http://opensource.org/licenses/MIT\" target=\"_blank\">MIT license</a>.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n\n                <a href=\"getting-started/\" class=\"navigation navigation-next navigation-unique\" aria-label=\"Next page: Getting Started\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Chart.js\",\"level\":\"1.1\",\"depth\":1,\"next\":{\"title\":\"Getting Started\",\"level\":\"1.2\",\"depth\":1,\"path\":\"getting-started/README.md\",\"ref\":\"getting-started/README.md\",\"articles\":[{\"title\":\"Installation\",\"level\":\"1.2.1\",\"depth\":2,\"path\":\"getting-started/installation.md\",\"ref\":\"getting-started/installation.md\",\"articles\":[]},{\"title\":\"Integration\",\"level\":\"1.2.2\",\"depth\":2,\"path\":\"getting-started/integration.md\",\"ref\":\"getting-started/integration.md\",\"articles\":[]},{\"title\":\"Usage\",\"level\":\"1.2.3\",\"depth\":2,\"path\":\"getting-started/usage.md\",\"ref\":\"getting-started/usage.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"README.md\",\"mtime\":\"2017-10-28T15:03:49.262Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\".\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"gitbook/gitbook.js\"></script>\n    <script src=\"gitbook/theme.js\"></script>\n\n\n        <script src=\"gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/notes/comparison.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Comparison Table · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"extensions.html\" />\n\n\n    <link rel=\"prev\" href=\"./\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter active\" data-level=\"1.8.1\" data-path=\"comparison.html\">\n\n                <a href=\"comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"extensions.html\">\n\n                <a href=\"extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"license.html\">\n\n                <a href=\"license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Comparison Table</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"comparison-with-other-charting-libraries\">Comparison with Other Charting Libraries</h1>\n<p>Library Features</p>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Chart.js</th>\n<th>D3</th>\n<th>HighCharts</th>\n<th>Chartist</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Completely Free</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td></td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Canvas</td>\n<td>&#x2713;</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>SVG</td>\n<td></td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Built-in Charts</td>\n<td>&#x2713;</td>\n<td></td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>8+ Chart Types</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td></td>\n</tr>\n<tr>\n<td>Extendable to Custom Charts</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Supports Modern Browsers</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Extensive Documentation</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Open Source</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td></td>\n<td>&#x2713;</td>\n</tr>\n</tbody>\n</table>\n<p>Built in Chart Types</p>\n<table>\n<thead>\n<tr>\n<th>Type</th>\n<th>Chart.js</th>\n<th>HighCharts</th>\n<th>Chartist</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Combined Types</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td></td>\n</tr>\n<tr>\n<td>Line</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Bar</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Horizontal Bar</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Pie/Doughnut</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Polar Area</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td></td>\n</tr>\n<tr>\n<td>Radar</td>\n<td>&#x2713;</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Scatter</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n<td>&#x2713;</td>\n</tr>\n<tr>\n<td>Bubble</td>\n<td>&#x2713;</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Gauges</td>\n<td></td>\n<td>&#x2713;</td>\n<td></td>\n</tr>\n<tr>\n<td>Maps (Heat/Tree/etc.)</td>\n<td></td>\n<td>&#x2713;</td>\n</tr>\n</tbody>\n</table>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"./\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Additional Notes\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"extensions.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Popular Extensions\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Comparison Table\",\"level\":\"1.8.1\",\"depth\":2,\"next\":{\"title\":\"Popular Extensions\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"notes/extensions.md\",\"ref\":\"notes/extensions.md\",\"articles\":[]},\"previous\":{\"title\":\"Additional Notes\",\"level\":\"1.8\",\"depth\":1,\"path\":\"notes/README.md\",\"ref\":\"notes/README.md\",\"articles\":[{\"title\":\"Comparison Table\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"notes/comparison.md\",\"ref\":\"notes/comparison.md\",\"articles\":[]},{\"title\":\"Popular Extensions\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"notes/extensions.md\",\"ref\":\"notes/extensions.md\",\"articles\":[]},{\"title\":\"License\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"notes/license.md\",\"ref\":\"notes/license.md\",\"articles\":[]}]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"notes/comparison.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/notes/extensions.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Popular Extensions · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"license.html\" />\n\n\n    <link rel=\"prev\" href=\"comparison.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"comparison.html\">\n\n                <a href=\"comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.8.2\" data-path=\"extensions.html\">\n\n                <a href=\"extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"license.html\">\n\n                <a href=\"license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Popular Extensions</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"popular-extensions\">Popular Extensions</h1>\n<p>Many extensions can be found on the <a href=\"https://github.com/chartjs\" target=\"_blank\">Chart.js GitHub organization</a> or on the <a href=\"https://www.npmjs.com/search?q=chartjs-\" target=\"_blank\">npm registry</a>.</p>\n<h2 id=\"charts\">Charts</h2>\n<ul>\n<li><a href=\"https://github.com/chartjs/chartjs-chart-financial\" target=\"_blank\">chartjs-chart-financial</a> - Adds financial chart types such as a candlestick.</li>\n<li><a href=\"https://github.com/chartjs/Chart.BarFunnel.js\" target=\"_blank\">Chart.BarFunnel.js</a> - Adds a bar funnel chart type.</li>\n<li><a href=\"https://github.com/chartjs/Chart.LinearGauge.js\" target=\"_blank\">Chart.LinearGauge.js</a> - Adds a linear gauge chart type.</li>\n<li><a href=\"https://github.com/chartjs/Chart.smith.js\" target=\"_blank\">Chart.Smith.js</a> - Adds a smith chart type.</li>\n</ul>\n<p>In addition, many charts can be found on the <a href=\"https://www.npmjs.com/search?q=chartjs-chart-\" target=\"_blank\">npm registry</a>.</p>\n<h2 id=\"plugins\">Plugins</h2>\n<ul>\n<li><a href=\"https://github.com/chartjs/chartjs-plugin-annotation\" target=\"_blank\">chartjs-plugin-annotation</a> - Draws lines and boxes on chart area.</li>\n<li><a href=\"https://github.com/chartjs/chartjs-plugin-datalabels\" target=\"_blank\">chartjs-plugin-datalabels</a> - Displays labels on data for any type of charts.</li>\n<li><a href=\"https://github.com/chartjs/chartjs-plugin-deferred\" target=\"_blank\">chartjs-plugin-deferred</a> - Defers initial chart update until chart scrolls into viewport.</li>\n<li><a href=\"https://github.com/compwright/chartjs-plugin-draggable\" target=\"_blank\">chartjs-plugin-draggable</a> - Makes select chart elements draggable with the mouse.</li>\n<li><a href=\"https://github.com/y-takey/chartjs-plugin-stacked100\" target=\"_blank\">chartjs-plugin-stacked100</a> - Draws 100% stacked bar chart.</li>\n<li><a href=\"https://github.com/chartjs/chartjs-plugin-zoom\" target=\"_blank\">chartjs-plugin-zoom</a> - Enables zooming and panning on charts.</li>\n</ul>\n<p>In addition, many plugins can be found on the <a href=\"https://www.npmjs.com/search?q=chartjs-plugin-\" target=\"_blank\">npm registry</a>.</p>\n<h2 id=\"integrations\">Integrations</h2>\n<h3 id=\"angular\">Angular</h3>\n<ul>\n<li><a href=\"https://github.com/jtblin/angular-chart.js\" target=\"_blank\">angular-chart.js</a></li>\n<li><a href=\"https://github.com/carlcraig/tc-angular-chartjs\" target=\"_blank\">tc-angular-chartjs</a></li>\n<li><a href=\"https://github.com/petermelias/angular-chartjs\" target=\"_blank\">angular-chartjs</a></li>\n<li><a href=\"https://github.com/earlonrails/angular-chartjs-directive\" target=\"_blank\">Angular Chart-js Directive</a></li>\n</ul>\n<h3 id=\"react\">React</h3>\n<ul>\n<li><a href=\"https://github.com/topdmc/react-chartjs2\" target=\"_blank\">react-chartjs2</a></li>\n<li><a href=\"https://github.com/gor181/react-chartjs-2\" target=\"_blank\">react-chartjs-2</a></li>\n</ul>\n<h3 id=\"django\">Django</h3>\n<ul>\n<li><a href=\"https://github.com/matthisk/django-jchart\" target=\"_blank\">Django JChart</a></li>\n<li><a href=\"https://github.com/novafloss/django-chartjs\" target=\"_blank\">Django Chartjs</a></li>\n</ul>\n<h3 id=\"ruby-on-rails\">Ruby on Rails</h3>\n<ul>\n<li><a href=\"https://github.com/airblade/chartjs-ror\" target=\"_blank\">chartjs-ror</a></li>\n</ul>\n<h3 id=\"laravel\">Laravel</h3>\n<ul>\n<li><a href=\"https://github.com/fxcosta/laravel-chartjs\" target=\"_blank\">laravel-chartjs</a></li>\n</ul>\n<h3 id=\"vuejs\">Vue.js</h3>\n<ul>\n<li><a href=\"https://github.com/apertureless/vue-chartjs/\" target=\"_blank\">vue-chartjs</a></li>\n</ul>\n<h3 id=\"java\">Java</h3>\n<ul>\n<li><a href=\"https://github.com/mdewilde/chart/\" target=\"_blank\">Chart.java</a></li>\n</ul>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"comparison.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Comparison Table\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"license.html\" class=\"navigation navigation-next \" aria-label=\"Next page: License\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Popular Extensions\",\"level\":\"1.8.2\",\"depth\":2,\"next\":{\"title\":\"License\",\"level\":\"1.8.3\",\"depth\":2,\"path\":\"notes/license.md\",\"ref\":\"notes/license.md\",\"articles\":[]},\"previous\":{\"title\":\"Comparison Table\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"notes/comparison.md\",\"ref\":\"notes/comparison.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"notes/extensions.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/notes/index.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>Additional Notes · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n    <link rel=\"next\" href=\"comparison.html\" />\n\n\n    <link rel=\"prev\" href=\"../developers/contributing.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.8\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"comparison.html\">\n\n                <a href=\"comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"extensions.html\">\n\n                <a href=\"extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.3\" data-path=\"license.html\">\n\n                <a href=\"license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >Additional Notes</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"additional-notes\">Additional Notes</h1>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"../developers/contributing.html\" class=\"navigation navigation-prev \" aria-label=\"Previous page: Contributing\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n                <a href=\"comparison.html\" class=\"navigation navigation-next \" aria-label=\"Next page: Comparison Table\">\n                    <i class=\"fa fa-angle-right\"></i>\n                </a>\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"Additional Notes\",\"level\":\"1.8\",\"depth\":1,\"next\":{\"title\":\"Comparison Table\",\"level\":\"1.8.1\",\"depth\":2,\"path\":\"notes/comparison.md\",\"ref\":\"notes/comparison.md\",\"articles\":[]},\"previous\":{\"title\":\"Contributing\",\"level\":\"1.7.6\",\"depth\":2,\"path\":\"developers/contributing.md\",\"ref\":\"developers/contributing.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"notes/README.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/notes/license.html",
    "content": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n        <title>License · GitBook</title>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"GitBook 3.2.2\">\n        <meta name=\"author\" content=\"chartjs\">\n\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/style.css\">\n\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-search-plus/search.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-highlight/website.css\">\n\n\n\n                <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-fontsettings/website.css\">\n\n\n\n\n\n\n\n\n        <link rel=\"stylesheet\" href=\"../style.css\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <meta name=\"HandheldFriendly\" content=\"true\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n    <link rel=\"apple-touch-icon-precomposed\" sizes=\"152x152\" href=\"../gitbook/images/apple-touch-icon-precomposed-152.png\">\n    <link rel=\"shortcut icon\" href=\"../gitbook/images/favicon.ico\" type=\"image/x-icon\">\n\n\n\n    <link rel=\"prev\" href=\"extensions.html\" />\n\n\n    <link rel=\"stylesheet\" href=\"../gitbook/gitbook-plugin-chartjs/style.css\">\n    <script src=\"../gitbook/gitbook-plugin-chartjs/Chart.bundle.js\"></script>\n    <script src=\"../gitbook/gitbook-plugin-chartjs/chartjs-plugin-deferred.js\"></script>\n\n\n    </head>\n    <body>\n\n<div class=\"book\">\n    <div class=\"book-summary\">\n\n\n<div id=\"book-search-input\" role=\"search\">\n    <input type=\"text\" placeholder=\"Type to search\" />\n</div>\n\n\n                <nav role=\"navigation\">\n\n\n\n<ul class=\"summary\">\n\n\n\n\n\n\n\n\n\n        <li class=\"chapter \" data-level=\"1.1\" data-path=\"../\">\n\n                <a href=\"../\">\n\n\n                    Chart.js\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2\" data-path=\"../getting-started/\">\n\n                <a href=\"../getting-started/\">\n\n\n                    Getting Started\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.2.1\" data-path=\"../getting-started/installation.html\">\n\n                <a href=\"../getting-started/installation.html\">\n\n\n                    Installation\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.2\" data-path=\"../getting-started/integration.html\">\n\n                <a href=\"../getting-started/integration.html\">\n\n\n                    Integration\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.2.3\" data-path=\"../getting-started/usage.html\">\n\n                <a href=\"../getting-started/usage.html\">\n\n\n                    Usage\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3\" data-path=\"../general/\">\n\n                <a href=\"../general/\">\n\n\n                    General\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.1\" data-path=\"../general/responsive.html\">\n\n                <a href=\"../general/responsive.html\">\n\n\n                    Responsive\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2\" data-path=\"../general/interactions/\">\n\n                <a href=\"../general/interactions/\">\n\n\n                    Interactions\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.3.2.1\" data-path=\"../general/interactions/events.html\">\n\n                <a href=\"../general/interactions/events.html\">\n\n\n                    Events\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.2.2\" data-path=\"../general/interactions/modes.html\">\n\n                <a href=\"../general/interactions/modes.html\">\n\n\n                    Modes\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.3\" data-path=\"../general/options.html\">\n\n                <a href=\"../general/options.html\">\n\n\n                    Options\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.4\" data-path=\"../general/colors.html\">\n\n                <a href=\"../general/colors.html\">\n\n\n                    Colors\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.3.5\" data-path=\"../general/fonts.html\">\n\n                <a href=\"../general/fonts.html\">\n\n\n                    Fonts\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4\" data-path=\"../configuration/\">\n\n                <a href=\"../configuration/\">\n\n\n                    Configuration\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.4.1\" data-path=\"../configuration/animations.html\">\n\n                <a href=\"../configuration/animations.html\">\n\n\n                    Animations\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.2\" data-path=\"../configuration/layout.html\">\n\n                <a href=\"../configuration/layout.html\">\n\n\n                    Layout\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.3\" data-path=\"../configuration/legend.html\">\n\n                <a href=\"../configuration/legend.html\">\n\n\n                    Legend\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.4\" data-path=\"../configuration/title.html\">\n\n                <a href=\"../configuration/title.html\">\n\n\n                    Title\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.5\" data-path=\"../configuration/tooltip.html\">\n\n                <a href=\"../configuration/tooltip.html\">\n\n\n                    Tooltip\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.4.6\" data-path=\"../configuration/elements.html\">\n\n                <a href=\"../configuration/elements.html\">\n\n\n                    Elements\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5\" data-path=\"../charts/\">\n\n                <a href=\"../charts/\">\n\n\n                    Charts\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.5.1\" data-path=\"../charts/line.html\">\n\n                <a href=\"../charts/line.html\">\n\n\n                    Line\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.2\" data-path=\"../charts/bar.html\">\n\n                <a href=\"../charts/bar.html\">\n\n\n                    Bar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.3\" data-path=\"../charts/radar.html\">\n\n                <a href=\"../charts/radar.html\">\n\n\n                    Radar\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.4\" data-path=\"../charts/doughnut.html\">\n\n                <a href=\"../charts/doughnut.html\">\n\n\n                    Doughnut & Pie\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.5\" data-path=\"../charts/polar.html\">\n\n                <a href=\"../charts/polar.html\">\n\n\n                    Polar Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.6\" data-path=\"../charts/bubble.html\">\n\n                <a href=\"../charts/bubble.html\">\n\n\n                    Bubble\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.7\" data-path=\"../charts/scatter.html\">\n\n                <a href=\"../charts/scatter.html\">\n\n\n                    Scatter\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.8\" data-path=\"../charts/area.html\">\n\n                <a href=\"../charts/area.html\">\n\n\n                    Area\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.5.9\" data-path=\"../charts/mixed.html\">\n\n                <a href=\"../charts/mixed.html\">\n\n\n                    Mixed\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6\" data-path=\"../axes/\">\n\n                <a href=\"../axes/\">\n\n\n                    Axes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1\" data-path=\"../axes/cartesian/\">\n\n                <a href=\"../axes/cartesian/\">\n\n\n                    Cartesian\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.1.1\" data-path=\"../axes/cartesian/category.html\">\n\n                <a href=\"../axes/cartesian/category.html\">\n\n\n                    Category\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.2\" data-path=\"../axes/cartesian/linear.html\">\n\n                <a href=\"../axes/cartesian/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.3\" data-path=\"../axes/cartesian/logarithmic.html\">\n\n                <a href=\"../axes/cartesian/logarithmic.html\">\n\n\n                    Logarithmic\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.1.4\" data-path=\"../axes/cartesian/time.html\">\n\n                <a href=\"../axes/cartesian/time.html\">\n\n\n                    Time\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.2\" data-path=\"../axes/radial/\">\n\n                <a href=\"../axes/radial/\">\n\n\n                    Radial\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.6.2.1\" data-path=\"../axes/radial/linear.html\">\n\n                <a href=\"../axes/radial/linear.html\">\n\n\n                    Linear\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.3\" data-path=\"../axes/labelling.html\">\n\n                <a href=\"../axes/labelling.html\">\n\n\n                    Labelling\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.6.4\" data-path=\"../axes/styling.html\">\n\n                <a href=\"../axes/styling.html\">\n\n\n                    Styling\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7\" data-path=\"../developers/\">\n\n                <a href=\"../developers/\">\n\n\n                    Developers\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.7.1\" data-path=\"../developers/api.html\">\n\n                <a href=\"../developers/api.html\">\n\n\n                    Chart.js API\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.2\" data-path=\"../developers/updates.html\">\n\n                <a href=\"../developers/updates.html\">\n\n\n                    Updating Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.3\" data-path=\"../developers/plugins.html\">\n\n                <a href=\"../developers/plugins.html\">\n\n\n                    Plugins\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.4\" data-path=\"../developers/charts.html\">\n\n                <a href=\"../developers/charts.html\">\n\n\n                    New Charts\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.5\" data-path=\"../developers/axes.html\">\n\n                <a href=\"../developers/axes.html\">\n\n\n                    New Axes\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.7.6\" data-path=\"../developers/contributing.html\">\n\n                <a href=\"../developers/contributing.html\">\n\n\n                    Contributing\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8\" data-path=\"./\">\n\n                <a href=\"./\">\n\n\n                    Additional Notes\n\n                </a>\n\n\n\n            <ul class=\"articles\">\n\n\n        <li class=\"chapter \" data-level=\"1.8.1\" data-path=\"comparison.html\">\n\n                <a href=\"comparison.html\">\n\n\n                    Comparison Table\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter \" data-level=\"1.8.2\" data-path=\"extensions.html\">\n\n                <a href=\"extensions.html\">\n\n\n                    Popular Extensions\n\n                </a>\n\n\n\n        </li>\n\n        <li class=\"chapter active\" data-level=\"1.8.3\" data-path=\"license.html\">\n\n                <a href=\"license.html\">\n\n\n                    License\n\n                </a>\n\n\n\n        </li>\n\n\n            </ul>\n\n        </li>\n\n\n\n\n    <li class=\"divider\"></li>\n\n    <li>\n        <a href=\"https://www.gitbook.com\" target=\"blank\" class=\"gitbook-link\">\n            Published with GitBook\n        </a>\n    </li>\n</ul>\n\n\n                </nav>\n\n\n    </div>\n\n    <div class=\"book-body\">\n\n            <div class=\"body-inner\">\n\n\n\n<div class=\"book-header\" role=\"navigation\">\n\n\n    <!-- Title -->\n    <h1>\n        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n        <a href=\"..\" >License</a>\n    </h1>\n</div>\n\n\n\n\n                    <div class=\"page-wrapper\" tabindex=\"-1\" role=\"main\">\n                        <div class=\"page-inner\">\n\n<div class=\"search-plus\" id=\"book-search-results\">\n    <div class=\"search-noresults\">\n\n                                <section class=\"normal markdown-section\">\n\n                                <h1 id=\"license\">License</h1>\n<p>Chart.js is <a href=\"https://github.com/chartjs/Chart.js\" target=\"_blank\">open source</a> and available under the <a href=\"http://opensource.org/licenses/MIT\" target=\"_blank\">MIT license</a>.</p>\n\n\n                                </section>\n\n    </div>\n    <div class=\"search-results\">\n        <div class=\"has-results\">\n\n            <h1 class=\"search-results-title\"><span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"</h1>\n            <ul class=\"search-results-list\"></ul>\n\n        </div>\n        <div class=\"no-results\">\n\n            <h1 class=\"search-results-title\">No results matching \"<span class='search-query'></span>\"</h1>\n\n        </div>\n    </div>\n</div>\n\n                        </div>\n                    </div>\n\n            </div>\n\n\n\n                <a href=\"extensions.html\" class=\"navigation navigation-prev navigation-unique\" aria-label=\"Previous page: Popular Extensions\">\n                    <i class=\"fa fa-angle-left\"></i>\n                </a>\n\n\n\n\n    </div>\n\n    <script>\n        var gitbook = gitbook || [];\n        gitbook.push(function() {\n            gitbook.page.hasChanged({\"page\":{\"title\":\"License\",\"level\":\"1.8.3\",\"depth\":2,\"previous\":{\"title\":\"Popular Extensions\",\"level\":\"1.8.2\",\"depth\":2,\"path\":\"notes/extensions.md\",\"ref\":\"notes/extensions.md\",\"articles\":[]},\"dir\":\"ltr\"},\"config\":{\"plugins\":[\"-lunr\",\"-search\",\"search-plus\",\"anchorjs\",\"chartjs\",\"ga\"],\"root\":\"./docs\",\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"pluginsConfig\":{\"anchorjs\":{\"icon\":\"#\",\"placement\":\"left\",\"visible\":\"always\"},\"ga\":{\"configuration\":\"auto\",\"token\":\"UA-28909194-3\"},\"theme-default\":{\"styles\":{\"website\":\"style.css\",\"pdf\":\"styles/pdf.css\",\"epub\":\"styles/epub.css\",\"mobi\":\"styles/mobi.css\",\"ebook\":\"styles/ebook.css\",\"print\":\"styles/print.css\"},\"showLevel\":false},\"search-plus\":{},\"chartjs\":{\"defaults\":null},\"highlight\":{},\"sharing\":{\"facebook\":true,\"twitter\":true,\"google\":false,\"weibo\":false,\"instapaper\":false,\"vk\":false,\"all\":[\"facebook\",\"google\",\"twitter\",\"weibo\",\"instapaper\"]},\"fontsettings\":{\"theme\":\"white\",\"family\":\"sans\",\"size\":2}},\"theme\":\"default\",\"author\":\"chartjs\",\"pdf\":{\"pageNumbers\":true,\"fontSize\":12,\"fontFamily\":\"Arial\",\"paperSize\":\"a4\",\"chapterMark\":\"pagebreak\",\"pageBreaksBefore\":\"/\",\"margin\":{\"right\":62,\"left\":62,\"top\":56,\"bottom\":56}},\"structure\":{\"langs\":\"LANGS.md\",\"readme\":\"README.md\",\"glossary\":\"GLOSSARY.md\",\"summary\":\"SUMMARY.md\"},\"variables\":{},\"gitbook\":\"3.2.2\"},\"file\":{\"path\":\"notes/license.md\",\"mtime\":\"2017-10-28T15:03:49.270Z\",\"type\":\"markdown\"},\"gitbook\":{\"version\":\"3.2.2\",\"time\":\"2017-10-28T15:09:53.587Z\"},\"basePath\":\"..\",\"book\":{\"language\":\"\"}});\n        });\n    </script>\n</div>\n\n\n    <script src=\"../gitbook/gitbook.js\"></script>\n    <script src=\"../gitbook/theme.js\"></script>\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-search-plus/search.js\"></script>\n\n\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.1.1/anchor.min.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-anchorjs/anchor-style.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-ga/plugin.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-sharing/buttons.js\"></script>\n\n\n\n        <script src=\"../gitbook/gitbook-plugin-fontsettings/fontsettings.js\"></script>\n\n\n\n    </body>\n</html>\n\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/search_plus_index.json",
    "content": "{\"./\":{\"url\":\"./\",\"title\":\"Chart.js\",\"keywords\":\"\",\"body\":\"Chart.js Installation You can download the latest version of Chart.js from the GitHub releases or use a Chart.js CDN. Detailed installation instructions can be found on the installation page. Creating a Chart It's easy to get started with Chart.js. All that's required is the script included in your page along with a single node to render the chart. In this example, we create a bar chart for a single dataset and render that in our page. You can see all the ways to use Chart.js in the usage documentation var ctx = document.getElementById(\\\"myChart\\\").getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', data: { labels: [\\\"Red\\\", \\\"Blue\\\", \\\"Yellow\\\", \\\"Green\\\", \\\"Purple\\\", \\\"Orange\\\"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: [ 'rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', 'rgba(255, 159, 64, 0.2)' ], borderColor: [ 'rgba(255,99,132,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)' ], borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero:true } }] } } }); Contributing Before submitting an issue or a pull request to the project, please take a moment to look over the contributing guidelines first. For support using Chart.js, please post questions with the chartjs tag on Stack Overflow. License Chart.js is available under the MIT license. \"},\"getting-started/\":{\"url\":\"getting-started/\",\"title\":\"Getting Started\",\"keywords\":\"\",\"body\":\"Getting Started Let's get started using Chart.js! First, we need to have a canvas in our page. Now that we have a canvas we can use, we need to include Chart.js in our page. Now, we can create a chart. We add a script to our page: var ctx = document.getElementById('myChart').getContext('2d'); var chart = new Chart(ctx, { // The type of chart we want to create type: 'line', // The data for our dataset data: { labels: [\\\"January\\\", \\\"February\\\", \\\"March\\\", \\\"April\\\", \\\"May\\\", \\\"June\\\", \\\"July\\\"], datasets: [{ label: \\\"My First dataset\\\", backgroundColor: 'rgb(255, 99, 132)', borderColor: 'rgb(255, 99, 132)', data: [0, 10, 5, 2, 20, 30, 45], }] }, // Configuration options go here options: {} }); It's that easy to get started using Chart.js! From here you can explore the many options that can help you customise your charts with scales, tooltips, labels, colors, custom actions, and much more. There are many examples of Chart.js that are available in the /samples folder of Chart.js.zip that is attatched to every release. \"},\"getting-started/installation.html\":{\"url\":\"getting-started/installation.html\",\"title\":\"Installation\",\"keywords\":\"\",\"body\":\"Installation Chart.js can be installed via npm or bower. It is recommended to get Chart.js this way. npm npm install chart.js --save Bower bower install chart.js --save CDN CDNJS Chart.js built files are available on CDNJS: https://cdnjs.com/libraries/Chart.js jsDelivr Chart.js built files are also available through jsDelivr: https://www.jsdelivr.com/package/npm/chart.js?path=dist Github You can download the latest version of Chart.js on GitHub. If you download or clone the repository, you must build Chart.js to generate the dist files. Chart.js no longer comes with prebuilt release versions, so an alternative option to downloading the repo is strongly advised. Selecting the Correct Build Chart.js provides two different builds that are available for your use. Stand-Alone Build Files: dist/Chart.js dist/Chart.min.js This version only includes Chart.js. If this version is used and you require the use of the time axis, Moment.js will need to be included before Chart.js. Bundled Build Files: dist/Chart.bundle.js dist/Chart.bundle.min.js The bundled version includes Moment.js built into the same file. This version should be used if you wish to use time axes and want a single file to include. Do not use this build if your application already includes Moment.js. If you do, Moment.js will be included twice, increasing the page load time and potentially introducing version issues. \"},\"getting-started/integration.html\":{\"url\":\"getting-started/integration.html\",\"title\":\"Integration\",\"keywords\":\"\",\"body\":\"Integration Chart.js can be integrated with plain JavaScript or with different module loaders. The examples below show how to load Chart.js in different systems. ES6 Modules import Chart from 'chart.js'; var myChart = new Chart(ctx, {...}); Script Tag var myChart = new Chart(ctx, {...}); Common JS var Chart = require('chart.js'); var myChart = new Chart(ctx, {...}); Require JS require(['path/to/chartjs/dist/Chart.js'], function(Chart){ var myChart = new Chart(ctx, {...}); }); Important: RequireJS can not load CommonJS module as is, so be sure to require one of the built UMD files instead (i.e. dist/Chart.js, dist/Chart.min.js, etc.). \"},\"getting-started/usage.html\":{\"url\":\"getting-started/usage.html\",\"title\":\"Usage\",\"keywords\":\"\",\"body\":\"Usage Chart.js can be used with ES6 modules, plain JavaScript and module loaders. Creating a Chart To create a chart, we need to instantiate the Chart class. To do this, we need to pass in the node, jQuery instance, or 2d context of the canvas of where we want to draw the chart. Here's an example. // Any of the following formats may be used var ctx = document.getElementById(\\\"myChart\\\"); var ctx = document.getElementById(\\\"myChart\\\").getContext(\\\"2d\\\"); var ctx = $(\\\"#myChart\\\"); var ctx = \\\"myChart\\\"; Once you have the element or context, you're ready to instantiate a pre-defined chart-type or create your own! The following example instantiates a bar chart showing the number of votes for different colors and the y-axis starting at 0. var ctx = document.getElementById(\\\"myChart\\\"); var myChart = new Chart(ctx, { type: 'bar', data: { labels: [\\\"Red\\\", \\\"Blue\\\", \\\"Yellow\\\", \\\"Green\\\", \\\"Purple\\\", \\\"Orange\\\"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: [ 'rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', 'rgba(255, 159, 64, 0.2)' ], borderColor: [ 'rgba(255,99,132,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)' ], borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero:true } }] } } }); \"},\"general/\":{\"url\":\"general/\",\"title\":\"General\",\"keywords\":\"\",\"body\":\"General Configuration These sections describe general configuration options that can apply elsewhere in the documentation. Responsive defines responsive chart options that apply to all charts. Device Pixel Ratio defines the ratio between display pixels and rendered pixels. Interactions defines options that reflect how hovering chart elements works. Options scriptable and indexable options syntax. Colors defines acceptable color values. Font defines various font options. \"},\"general/responsive.html\":{\"url\":\"general/responsive.html\",\"title\":\"Responsive\",\"keywords\":\"\",\"body\":\"Responsive Charts When it comes to change the chart size based on the window size, a major limitation is that the canvas render size (canvas.width and .height) can not be expressed with relative values, contrary to the display size (canvas.style.width and .height). Furthermore, these sizes are independent from each other and thus the canvas render size does not adjust automatically based on the display size, making the rendering inaccurate. The following examples do not work: : invalid values, the canvas doesn't resize (example) : invalid behavior, the canvas is resized but becomes blurry (example) Chart.js provides a few options to enable responsiveness and control the resize behavior of charts by detecting when the canvas display size changes and update the render size accordingly. Configuration Options Name Type Default Description responsive Boolean true Resizes the chart canvas when its container does (important note...). responsiveAnimationDuration Number 0 Duration in milliseconds it takes to animate to new size after a resize event. maintainAspectRatio Boolean true Maintain the original canvas aspect ratio (width / height) when resizing. onResize Function null Called when a resize occurs. Gets passed two arguments: the chart instance and the new size. Important Note Detecting when the canvas size changes can not be done directly from the CANVAS element. Chart.js uses its parent container to update the canvas render and display sizes. However, this method requires the container to be relatively positioned and dedicated to the chart canvas only. Responsiveness can then be achieved by setting relative values for the container size (example): The chart can also be programmatically resized by modifying the container size: chart.canvas.parentNode.style.height = '128px'; \"},\"general/interactions/\":{\"url\":\"general/interactions/\",\"title\":\"Interactions\",\"keywords\":\"\",\"body\":\"Interactions The hover configuration is passed into the options.hover namespace. The global hover configuration is at Chart.defaults.global.hover. To configure which events trigger chart interactions, see events. Name Type Default Description mode String 'nearest' Sets which elements appear in the tooltip. See Interaction Modes for details. intersect Boolean true if true, the hover mode only applies when the mouse position intersects an item on the chart. axis String 'x' Can be set to 'x', 'y', or 'xy' to define which directions are used in calculating distances. Defaults to 'x' for index mode and 'xy' in dataset and nearest modes. animationDuration Number 400 Duration in milliseconds it takes to animate hover style changes. \"},\"general/interactions/events.html\":{\"url\":\"general/interactions/events.html\",\"title\":\"Events\",\"keywords\":\"\",\"body\":\"Events The following properties define how the chart interacts with events. Name Type Default Description events String[] [\\\"mousemove\\\", \\\"mouseout\\\", \\\"click\\\", \\\"touchstart\\\", \\\"touchmove\\\", \\\"touchend\\\"] The events option defines the browser events that the chart should listen to for tooltips and hovering. more... onHover Function null Called when any of the events fire. Called in the context of the chart and passed the event and an array of active elements (bars, points, etc). onClick Function null Called if the event is of type 'mouseup' or 'click'. Called in the context of the chart and passed the event and an array of active elements Event Option For example, to have the chart only respond to click events, you could do var chart = new Chart(ctx, { type: 'line', data: data, options: { // This chart will not respond to mousemove, etc events: ['click'] } }); \"},\"general/interactions/modes.html\":{\"url\":\"general/interactions/modes.html\",\"title\":\"Modes\",\"keywords\":\"\",\"body\":\"Interaction Modes When configuring interaction with the graph via hover or tooltips, a number of different modes are available. The modes are detailed below and how they behave in conjunction with the intersect setting. point Finds all of the items that intersect the point. var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { mode: 'point' } } }) nearest Gets the item that is nearest to the point. The nearest item is determined based on the distance to the center of the chart item (point, bar). If 2 or more items are at the same distance, the one with the smallest area is used. If intersect is true, this is only triggered when the mouse position intersects an item in the graph. This is very useful for combo charts where points are hidden behind bars. var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { mode: 'nearest' } } }) single (deprecated) Finds the first item that intersects the point and returns it. Behaves like 'nearest' mode with intersect = true. label (deprecated) See 'index' mode index Finds item at the same index. If the intersect setting is true, the first intersecting item is used to determine the index in the data. If intersect false the nearest item, in the x direction, is used to determine the index. var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { mode: 'index' } } }) To use index mode in a chart like the horizontal bar chart, where we search along the y direction, you can use the axis setting introduced in v2.7.0. By setting this value to 'y' on the y direction is used. var chart = new Chart(ctx, { type: 'horizontalBar', data: data, options: { tooltips: { mode: 'index', axis: 'y' } } }) x-axis (deprecated) Behaves like 'index' mode with intersect = false. dataset Finds items in the same dataset. If the intersect setting is true, the first intersecting item is used to determine the index in the data. If intersect false the nearest item is used to determine the index. var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { mode: 'dataset' } } }) x Returns all items that would intersect based on the X coordinate of the position only. Would be useful for a vertical cursor implementation. Note that this only applies to cartesian charts var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { mode: 'x' } } }) y Returns all items that would intersect based on the Y coordinate of the position. This would be useful for a horizontal cursor implementation. Note that this only applies to cartesian charts. var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { mode: 'y' } } }) \"},\"general/options.html\":{\"url\":\"general/options.html\",\"title\":\"Options\",\"keywords\":\"\",\"body\":\"Options Scriptable Options Scriptable options also accept a function which is called for each data and that takes the unique argument context representing contextual information (see option context). Example: color: function(context) { var index = context.dataIndex; var value = context.dataset.data[index]; return value Note: scriptable options are only supported by a few bubble chart options. Indexable Options Indexable options also accept an array in which each item corresponds to the element at the same index. Note that this method requires to provide as many items as data, so, in most cases, using a function is more appropriated if supported. Example: color: [ 'red', // color for data at index 0 'blue', // color for data at index 1 'green', // color for data at index 2 'black', // color for data at index 3 //... ] Option Context The option context is used to give contextual information when resolving options and currently only applies to scriptable options. The context object contains the following properties: chart: the associated chart dataIndex: index of the current data dataset: dataset at index datasetIndex datasetIndex: index of the current dataset Important: since the context can represent different types of entities (dataset, data, etc.), some properties may be undefined so be sure to test any context property before using it. \"},\"general/colors.html\":{\"url\":\"general/colors.html\",\"title\":\"Colors\",\"keywords\":\"\",\"body\":\"Colors When supplying colors to Chart options, you can use a number of formats. You can specify the color as a string in hexadecimal, RGB, or HSL notations. If a color is needed, but not specified, Chart.js will use the global default color. This color is stored at Chart.defaults.global.defaultColor. It is initially set to 'rgba(0, 0, 0, 0.1)' You can also pass a CanvasGradient object. You will need to create this before passing to the chart, but using it you can achieve some interesting effects. Patterns and Gradients An alternative option is to pass a CanvasPattern or CanvasGradient object instead of a string colour. For example, if you wanted to fill a dataset with a pattern from an image you could do the following. var img = new Image(); img.src = 'https://example.com/my_image.png'; img.onload = function() { var ctx = document.getElementById('canvas').getContext('2d'); var fillPattern = ctx.createPattern(img, 'repeat'); var chart = new Chart(ctx, { data: { labels: ['Item 1', 'Item 2', 'Item 3'], datasets: [{ data: [10, 20, 30], backgroundColor: fillPattern }] } }) } Using pattern fills for data graphics can help viewers with vision deficiencies (e.g. color-blindness or partial sight) to more easily understand your data. Using the Patternomaly library you can generate patterns to fill datasets. var chartData = { datasets: [{ data: [45, 25, 20, 10], backgroundColor: [ pattern.draw('square', '#ff6384'), pattern.draw('circle', '#36a2eb'), pattern.draw('diamond', '#cc65fe'), pattern.draw('triangle', '#ffce56'), ] }], labels: ['Red', 'Blue', 'Purple', 'Yellow'] }; \"},\"general/fonts.html\":{\"url\":\"general/fonts.html\",\"title\":\"Fonts\",\"keywords\":\"\",\"body\":\"Fonts There are 4 special global settings that can change all of the fonts on the chart. These options are in Chart.defaults.global. The global font settings only apply when more specific options are not included in the config. For example, in this chart the text will all be red except for the labels in the legend. Chart.defaults.global.defaultFontColor = 'red'; let chart = new Chart(ctx, { type: 'line', data: data, options: { legend: { labels: { // This more specific font property overrides the global property fontColor: 'black' } } } }); Name Type Default Description defaultFontColor Color '#666' Default font color for all text. defaultFontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Default font family for all text. defaultFontSize Number 12 Default font size (in px) for text. Does not apply to radialLinear scale point labels. defaultFontStyle String 'normal' Default font style. Does not apply to tooltip title or footer. Does not apply to chart title. Non-Existant Fonts If a font is specified for a chart that does exist on the system, the browser will not apply the font when it is set. If you notice odd fonts appearing in your charts, check that the font you are applying exists on your system. See issue 3318 for more details. \"},\"configuration/\":{\"url\":\"configuration/\",\"title\":\"Configuration\",\"keywords\":\"\",\"body\":\"Configuration The configuration is used to change how the chart behaves. There are properties to control styling, fonts, the legend, etc. Global Configuration This concept was introduced in Chart.js 1.0 to keep configuration DRY, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type. Chart.js merges the options object passed to the chart with the global configuration using chart type defaults and scales defaults appropriately. This way you can be as specific as you would like in your individual chart configuration, while still changing the defaults for all chart types where applicable. The global general options are defined in Chart.defaults.global. The defaults for each chart type are discussed in the documentation for that chart type. The following example would set the hover mode to 'nearest' for all charts where this was not overridden by the chart type defaults or the options passed to the constructor on creation. Chart.defaults.global.hover.mode = 'nearest'; // Hover mode is set to nearest because it was not overridden here var chartHoverModeNearest = new Chart(ctx, { type: 'line', data: data, }); // This chart would have the hover mode that was passed in var chartDifferentHoverMode = new Chart(ctx, { type: 'line', data: data, options: { hover: { // Overrides the global setting mode: 'index' } } }) \"},\"configuration/animations.html\":{\"url\":\"configuration/animations.html\",\"title\":\"Animations\",\"keywords\":\"\",\"body\":\"Animations Chart.js animates charts out of the box. A number of options are provided to configure how the animation looks and how long it takes Animation Configuration The following animation options are available. The global options for are defined in Chart.defaults.global.animation. Name Type Default Description duration Number 1000 The number of milliseconds an animation takes. easing String 'easeOutQuart' Easing function to use. more... onProgress Function null Callback called on each step of an animation. more... onComplete Function null Callback called at the end of an animation. more... Easing Available options are: 'linear' 'easeInQuad' 'easeOutQuad' 'easeInOutQuad' 'easeInCubic' 'easeOutCubic' 'easeInOutCubic' 'easeInQuart' 'easeOutQuart' 'easeInOutQuart' 'easeInQuint' 'easeOutQuint' 'easeInOutQuint' 'easeInSine' 'easeOutSine' 'easeInOutSine' 'easeInExpo' 'easeOutExpo' 'easeInOutExpo' 'easeInCirc' 'easeOutCirc' 'easeInOutCirc' 'easeInElastic' 'easeOutElastic' 'easeInOutElastic' 'easeInBack' 'easeOutBack' 'easeInOutBack' 'easeInBounce' 'easeOutBounce' 'easeInOutBounce' See Robert Penner's easing equations. Animation Callbacks The onProgress and onComplete callbacks are useful for synchronizing an external draw to the chart animation. The callback is passed a Chart.Animation instance: { // Chart object chart: Chart, // Current Animation frame number currentStep: Number, // Number of animation frames numSteps: Number, // Animation easing to use easing: String, // Function that renders the chart render: Function, // User callback onAnimationProgress: Function, // User callback onAnimationComplete: Function } The following example fills a progress bar during the chart animation. var chart = new Chart(ctx, { type: 'line', data: data, options: { animation: { onProgress: function(animation) { progress.value = animation.animationObject.currentStep / animation.animationObject.numSteps; } } } }); Another example usage of these callbacks can be found on Github: this sample displays a progress bar showing how far along the animation is. \"},\"configuration/layout.html\":{\"url\":\"configuration/layout.html\",\"title\":\"Layout\",\"keywords\":\"\",\"body\":\"Layout Configuration The layout configuration is passed into the options.layout namespace. The global options for the chart layout is defined in Chart.defaults.global.layout. Name Type Default Description padding Number or Object 0 The padding to add inside the chart. more... Padding If this value is a number, it is applied to all sides of the chart (left, top, right, bottom). If this value is an object, the left property defines the left padding. Similarly the right, top, and bottom properties can also be specified. Lets say you wanted to add 50px of padding to the left side of the chart canvas, you would do: let chart = new Chart(ctx, { type: 'line', data: data, options: { layout: { padding: { left: 50, right: 0, top: 0, bottom: 0 } } } }); \"},\"configuration/legend.html\":{\"url\":\"configuration/legend.html\",\"title\":\"Legend\",\"keywords\":\"\",\"body\":\"Legend Configuration The chart legend displays data about the datasets that area appearing on the chart. Configuration options The legend configuration is passed into the options.legend namespace. The global options for the chart legend is defined in Chart.defaults.global.legend. Name Type Default Description display Boolean true is the legend shown position String 'top' Position of the legend. more... fullWidth Boolean true Marks that this box should take the full width of the canvas (pushing down other boxes). This is unlikely to need to be changed in day-to-day use. onClick Function A callback that is called when a click event is registered on a label item onHover Function A callback that is called when a 'mousemove' event is registered on top of a label item reverse Boolean false Legend will show datasets in reverse order. labels Object See the Legend Label Configuration section below. Position Position of the legend. Options are: 'top' 'left' 'bottom' 'right' Legend Label Configuration The legend label configuration is nested below the legend configuration using the labels key. Name Type Default Description boxWidth Number 40 width of coloured box fontSize Number 12 font size of text fontStyle String 'normal' font style of text fontColor Color '#666' Color of text fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family of legend text. padding Number 10 Padding between rows of colored boxes. generateLabels Function Generates legend items for each thing in the legend. Default implementation returns the text + styling for the color box. See Legend Item for details. filter Function null Filters legend items out of the legend. Receives 2 parameters, a Legend Item and the chart data. usePointStyle Boolean false Label style will match corresponding point style (size is based on fontSize, boxWidth is not used in this case). Legend Item Interface Items passed to the legend onClick function are the ones returned from labels.generateLabels. These items must implement the following interface. { // Label that will be displayed text: String, // Fill style of the legend box fillStyle: Color, // If true, this item represents a hidden dataset. Label will be rendered with a strike-through effect hidden: Boolean, // For box border. See https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap lineCap: String, // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash lineDash: Array[Number], // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset lineDashOffset: Number, // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin lineJoin: String, // Width of box border lineWidth: Number, // Stroke style of the legend box strokeStyle: Color // Point style of the legend box (only used if usePointStyle is true) pointStyle: String } Example The following example will create a chart with the legend enabled and turn all of the text red in color. var chart = new Chart(ctx, { type: 'bar', data: data, options: { legend: { display: true, labels: { fontColor: 'rgb(255, 99, 132)' } } } }); Custom On Click Actions It can be common to want to trigger different behaviour when clicking an item in the legend. This can be easily achieved using a callback in the config object. The default legend click handler is: function(e, legendItem) { var index = legendItem.datasetIndex; var ci = this.chart; var meta = ci.getDatasetMeta(index); // See controller.isDatasetVisible comment meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null; // We hid a dataset ... rerender the chart ci.update(); } Lets say we wanted instead to link the display of the first two datasets. We could change the click handler accordingly. var defaultLegendClickHandler = Chart.defaults.global.legend.onClick; var newLegendClickHandler = function (e, legendItem) { var index = legendItem.datasetIndex; if (index > 1) { // Do the original logic defaultLegendClickHandler(e, legendItem); } else { let ci = this.chart; [ci.getDatasetMeta(0), ci.getDatasetMeta(1)].forEach(function(meta) { meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null; }); ci.update(); } }; var chart = new Chart(ctx, { type: 'line', data: data, options: { legend: { } } }); Now when you click the legend in this chart, the visibility of the first two datasets will be linked together. HTML Legends Sometimes you need a very complex legend. In these cases, it makes sense to generate an HTML legend. Charts provide a generateLegend() method on their prototype that returns an HTML string for the legend. To configure how this legend is generated, you can change the legendCallback config property. var chart = new Chart(ctx, { type: 'line', data: data, options: { legendCallback: function(chart) { // Return the HTML string here. } } }); \"},\"configuration/title.html\":{\"url\":\"configuration/title.html\",\"title\":\"Title\",\"keywords\":\"\",\"body\":\"Title The chart title defines text to draw at the top of the chart. Title Configuration The title configuration is passed into the options.title namespace. The global options for the chart title is defined in Chart.defaults.global.title. Name Type Default Description display Boolean false is the title shown position String 'top' Position of title. more... fontSize Number 12 Font size fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family for the title text. fontColor Color '#666' Font color fontStyle String 'bold' Font style padding Number 10 Number of pixels to add above and below the title text. lineHeight Number/String 1.2 Height of an individual line of text (see MDN) text String/String[] '' Title text to display. If specified as an array, text is rendered on multiple lines. Position Possible title position values are: 'top' 'left' 'bottom' 'right' Example Usage The example below would enable a title of 'Custom Chart Title' on the chart that is created. var chart = new Chart(ctx, { type: 'line', data: data, options: { title: { display: true, text: 'Custom Chart Title' } } }) \"},\"configuration/tooltip.html\":{\"url\":\"configuration/tooltip.html\",\"title\":\"Tooltip\",\"keywords\":\"\",\"body\":\"Tooltips Tooltip Configuration The tooltip configuration is passed into the options.tooltips namespace. The global options for the chart tooltips is defined in Chart.defaults.global.tooltips. Name Type Default Description enabled Boolean true Are tooltips enabled custom Function null See custom tooltip section. mode String 'nearest' Sets which elements appear in the tooltip. more.... intersect Boolean true if true, the tooltip mode applies only when the mouse position intersects with an element. If false, the mode will be applied at all times. position String 'average' The mode for positioning the tooltip. more... callbacks Object See the callbacks section itemSort Function Sort tooltip items. more... filter Function Filter tooltip items. more... backgroundColor Color 'rgba(0,0,0,0.8)' Background color of the tooltip. titleFontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" title font titleFontSize Number 12 Title font size titleFontStyle String 'bold' Title font style titleFontColor Color '#fff' Title font color titleSpacing Number 2 Spacing to add to top and bottom of each title line. titleMarginBottom Number 6 Margin to add on bottom of title section. bodyFontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" body line font bodyFontSize Number 12 Body font size bodyFontStyle String 'normal' Body font style bodyFontColor Color '#fff' Body font color bodySpacing Number 2 Spacing to add to top and bottom of each tooltip item. footerFontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" footer font footerFontSize Number 12 Footer font size footerFontStyle String 'bold' Footer font style footerFontColor Color '#fff' Footer font color footerSpacing Number 2 Spacing to add to top and bottom of each fotter line. footerMarginTop Number 6 Margin to add before drawing the footer. xPadding Number 6 Padding to add on left and right of tooltip. yPadding Number 6 Padding to add on top and bottom of tooltip. caretPadding Number 2 Extra distance to move the end of the tooltip arrow away from the tooltip point. caretSize Number 5 Size, in px, of the tooltip arrow. cornerRadius Number 6 Radius of tooltip corner curves. multiKeyBackground Color '#fff' Color to draw behind the colored boxes when multiple items are in the tooltip displayColors Boolean true if true, color boxes are shown in the tooltip borderColor Color 'rgba(0,0,0,0)' Color of the border borderWidth Number 0 Size of the border Position Modes Possible modes are: 'average' 'nearest' 'average' mode will place the tooltip at the average position of the items displayed in the tooltip. 'nearest' will place the tooltip at the position of the element closest to the event position. New modes can be defined by adding functions to the Chart.Tooltip.positioners map. Example: /** * Custom positioner * @function Chart.Tooltip.positioners.custom * @param elements {Chart.Element[]} the tooltip elements * @param eventPosition {Point} the position of the event in canvas coordinates * @returns {Point} the tooltip position */ Chart.Tooltip.positioners.custom = function(elements, eventPosition) { /** @type {Chart.Tooltip} */ var tooltip = this; /* ... */ return { x: 0, y: 0 }; } Sort Callback Allows sorting of tooltip items. Must implement at minimum a function that can be passed to Array.prototype.sort. This function can also accept a third parameter that is the data object passed to the chart. Filter Callback Allows filtering of tooltip items. Must implement at minimum a function that can be passed to Array.prototype.filter. This function can also accept a second parameter that is the data object passed to the chart. Tooltip Callbacks The tooltip label configuration is nested below the tooltip configuration using the callbacks key. The tooltip has the following callbacks for providing text. For all functions, 'this' will be the tooltip object created from the Chart.Tooltip constructor. All functions are called with the same arguments: a tooltip item and the data object passed to the chart. All functions must return either a string or an array of strings. Arrays of strings are treated as multiple lines of text. Name Arguments Description beforeTitle Array[tooltipItem], data Returns the text to render before the title. title Array[tooltipItem], data Returns text to render as the title of the tooltip. afterTitle Array[tooltipItem], data Returns text to render after the title. beforeBody Array[tooltipItem], data Returns text to render before the body section. beforeLabel tooltipItem, data Returns text to render before an individual label. This will be called for each item in the tooltip. label tooltipItem, data Returns text to render for an individual item in the tooltip. labelColor tooltipItem, chart Returns the colors to render for the tooltip item. more... labelTextColor tooltipItem, chart Returns the colors for the text of the label for the tooltip item. afterLabel tooltipItem, data Returns text to render after an individual label. afterBody Array[tooltipItem], data Returns text to render after the body section beforeFooter Array[tooltipItem], data Returns text to render before the footer section. footer Array[tooltipItem], data Returns text to render as the footer of the tooltip. afterFooter Array[tooltipItem], data Text to render after the footer section Label Color Callback For example, to return a red box for each item in the tooltip you could do: var chart = new Chart(ctx, { type: 'line', data: data, options: { tooltips: { callbacks: { labelColor: function(tooltipItem, chart) { return { borderColor: 'rgb(255, 0, 0)', backgroundColor: 'rgb(255, 0, 0)' } }, labelTextColor:function(tooltipItem, chart){ return '#543453'; } } } } }); Tooltip Item Interface The tooltip items passed to the tooltip callbacks implement the following interface. { // X Value of the tooltip as a string xLabel: String, // Y value of the tooltip as a string yLabel: String, // Index of the dataset the item comes from datasetIndex: Number, // Index of this data item in the dataset index: Number, // X position of matching point x: Number, // Y position of matching point y: Number, } External (Custom) Tooltips Custom tooltips allow you to hook into the tooltip rendering process so that you can render the tooltip in your own custom way. Generally this is used to create an HTML tooltip instead of an oncanvas one. You can enable custom tooltips in the global or chart configuration like so: var myPieChart = new Chart(ctx, { type: 'pie', data: data, options: { tooltips: { custom: function(tooltipModel) { // Tooltip Element var tooltipEl = document.getElementById('chartjs-tooltip'); // Create element on first render if (!tooltipEl) { tooltipEl = document.createElement('div'); tooltipEl.id = 'chartjs-tooltip'; tooltipEl.innerHTML = \\\"\\\" document.body.appendChild(tooltipEl); } // Hide if no tooltip if (tooltipModel.opacity === 0) { tooltipEl.style.opacity = 0; return; } // Set caret Position tooltipEl.classList.remove('above', 'below', 'no-transform'); if (tooltipModel.yAlign) { tooltipEl.classList.add(tooltipModel.yAlign); } else { tooltipEl.classList.add('no-transform'); } function getBody(bodyItem) { return bodyItem.lines; } // Set Text if (tooltipModel.body) { var titleLines = tooltipModel.title || []; var bodyLines = tooltipModel.body.map(getBody); var innerHtml = ''; titleLines.forEach(function(title) { innerHtml += '' + title + ''; }); innerHtml += ''; bodyLines.forEach(function(body, i) { var colors = tooltipModel.labelColors[i]; var style = 'background:' + colors.backgroundColor; style += '; border-color:' + colors.borderColor; style += '; border-width: 2px'; var span = ''; innerHtml += '' + span + body + ''; }); innerHtml += ''; var tableRoot = tooltipEl.querySelector('table'); tableRoot.innerHTML = innerHtml; } // `this` will be the overall tooltip var position = this._chart.canvas.getBoundingClientRect(); // Display, position, and set styles for font tooltipEl.style.opacity = 1; tooltipEl.style.left = position.left + tooltipModel.caretX + 'px'; tooltipEl.style.top = position.top + tooltipModel.caretY + 'px'; tooltipEl.style.fontFamily = tooltipModel._fontFamily; tooltipEl.style.fontSize = tooltipModel.fontSize; tooltipEl.style.fontStyle = tooltipModel._fontStyle; tooltipEl.style.padding = tooltipModel.yPadding + 'px ' + tooltipModel.xPadding + 'px'; } } } }); See samples/tooltips/line-customTooltips.html for examples on how to get started. Tooltip Model The tooltip model contains parameters that can be used to render the tooltip. { // The items that we are rendering in the tooltip. See Tooltip Item Interface section dataPoints: TooltipItem[], // Positioning xPadding: Number, yPadding: Number, xAlign: String, yAlign: String, // X and Y properties are the top left of the tooltip x: Number, y: Number, width: Number, height: Number, // Where the tooltip points to caretX: Number, caretY: Number, // Body // The body lines that need to be rendered // Each object contains 3 parameters // before: String[] // lines of text before the line with the color square // lines: String[], // lines of text to render as the main item with color square // after: String[], // lines of text to render after the main lines body: Object[], // lines of text that appear after the title but before the body beforeBody: String[], // line of text that appear after the body and before the footer afterBody: String[], bodyFontColor: Color, _bodyFontFamily: String, _bodyFontStyle: String, _bodyAlign: String, bodyFontSize: Number, bodySpacing: Number, // Title // lines of text that form the title title: String[], titleFontColor: Color, _titleFontFamily: String, _titleFontStyle: String, titleFontSize: Number, _titleAlign: String, titleSpacing: Number, titleMarginBottom: Number, // Footer // lines of text that form the footer footer: String[], footerFontColor: Color, _footerFontFamily: String, _footerFontStyle: String, footerFontSize: Number, _footerAlign: String, footerSpacing: Number, footerMarginTop: Number, // Appearance caretSize: Number, cornerRadius: Number, backgroundColor: Color, // colors to render for each item in body[]. This is the color of the squares in the tooltip labelColors: Color[], // 0 opacity is a hidden tooltip opacity: Number, legendColorBackground: Color, displayColors: Boolean, } \"},\"configuration/elements.html\":{\"url\":\"configuration/elements.html\",\"title\":\"Elements\",\"keywords\":\"\",\"body\":\"Elements While chart types provide settings to configure the styling of each dataset, you sometimes want to style all datasets the same way. A common example would be to stroke all of the bars in a bar chart with the same colour but change the fill per dataset. Options can be configured for four different types of elements: arc, lines, points, and rectangles. When set, these options apply to all objects of that type unless specifically overridden by the configuration attached to a dataset. Global Configuration The element options can be specified per chart or globally. The global options for elements are defined in Chart.defaults.global.elements. For example, to set the border width of all bar charts globally you would do: Chart.defaults.global.elements.rectangle.borderWidth = 2; Point Configuration Point elements are used to represent the points in a line chart or a bubble chart. Global point options: Chart.defaults.global.elements.point Name Type Default Description radius Number 3 Point radius. pointStyle String circle Point style. backgroundColor Color 'rgba(0,0,0,0.1)' Point fill color. borderWidth Number 1 Point stroke width. borderColor Color 'rgba(0,0,0,0.1)' Point stroke color. hitRadius Number 1 Extra radius added to point radius for hit detection. hoverRadius Number 4 Point radius when hovered. hoverBorderWidth Number 1 Stroke width when hovered. Point Styles The following values are supported: 'circle' 'cross' 'crossRot' 'dash' 'line' 'rect' 'rectRounded' 'rectRot' 'star' 'triangle' If the value is an image, that image is drawn on the canvas using drawImage. Line Configuration Line elements are used to represent the line in a line chart. Global line options: Chart.defaults.global.elements.line Name Type Default Description tension Number 0.4 Bézier curve tension (0 for no Bézier curves). backgroundColor Color 'rgba(0,0,0,0.1)' Line fill color. borderWidth Number 3 Line stroke width. borderColor Color 'rgba(0,0,0,0.1)' Line stroke color. borderCapStyle String 'butt' Line cap style (see MDN). borderDash Array [] Line dash (see MDN). borderDashOffset Number 0 Line dash offset (see MDN). borderJoinStyle String 'miter Line join style (see MDN). capBezierPoints Boolean true true to keep Bézier control inside the chart, false for no restriction. fill Boolean/String true Fill location: 'zero', 'top', 'bottom', true (eq. 'zero') or false (no fill). stepped Boolean false true to show the line as a stepped line (tension will be ignored). Rectangle Configuration Rectangle elements are used to represent the bars in a bar chart. Global rectangle options: Chart.defaults.global.elements.rectangle Name Type Default Description backgroundColor Color 'rgba(0,0,0,0.1)' Bar fill color. borderWidth Number 0 Bar stroke width. borderColor Color 'rgba(0,0,0,0.1)' Bar stroke color. borderSkipped String 'bottom' Skipped (excluded) border: 'bottom', 'left', 'top' or 'right'. Arc Configuration Arcs are used in the polar area, doughnut and pie charts. Global arc options: Chart.defaults.global.elements.arc. Name Type Default Description backgroundColor Color 'rgba(0,0,0,0.1)' Arc fill color. borderColor Color '#fff' Arc stroke color. borderWidth Number 2 Arc stroke width. \"},\"charts/\":{\"url\":\"charts/\",\"title\":\"Charts\",\"keywords\":\"\",\"body\":\"Charts Chart.js comes with built-in chart types: line bar radar polar area doughnut and pie bubble Area charts can be built from a line or radar chart using the dataset fill option. To create a new chart type, see the developer notes \"},\"charts/line.html\":{\"url\":\"charts/line.html\",\"title\":\"Line\",\"keywords\":\"\",\"body\":\"Line A line chart is a way of plotting data points on a line. Often, it is used to show trend data, or the comparison of two data sets. new Chart(document.getElementById(\\\"chartjs-0\\\"),{\\\"type\\\":\\\"line\\\",\\\"data\\\":{\\\"labels\\\":[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\",\\\"May\\\",\\\"June\\\",\\\"July\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"My First Dataset\\\",\\\"data\\\":[65,59,80,81,56,55,40],\\\"fill\\\":false,\\\"borderColor\\\":\\\"rgb(75, 192, 192)\\\",\\\"lineTension\\\":0.1}]},\\\"options\\\":{}}); Example Usage var myLineChart = new Chart(ctx, { type: 'line', data: data, options: options }); Dataset Properties The line chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of a line is generally set this way. All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on. Name Type Description label String The label for the dataset which appears in the legend and tooltips. xAxisID String The ID of the x axis to plot this dataset on. If not specified, this defaults to the ID of the first found x axis yAxisID String The ID of the y axis to plot this dataset on. If not specified, this defaults to the ID of the first found y axis. backgroundColor Color The fill color under the line. See Colors borderColor Color The color of the line. See Colors borderWidth Number The width of the line in pixels. borderDash Number[] Length and spacing of dashes. See MDN borderDashOffset Number Offset for line dashes. See MDN borderCapStyle String Cap style of the line. See MDN borderJoinStyle String Line joint style. See MDN cubicInterpolationMode String Algorithm used to interpolate a smooth curve from the discrete data points. more... fill Boolean/String How to fill the area under the line. See area charts lineTension Number Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used. pointBackgroundColor Color/Color[] The fill color for points. pointBorderColor Color/Color[] The border color for points. pointBorderWidth Number/Number[] The width of the point border in pixels. pointRadius Number/Number[] The radius of the point shape. If set to 0, the point is not rendered. pointStyle String/String[]/Image/Image[] Style of the point. more... pointHitRadius Number/Number[] The pixel size of the non-displayed point that reacts to mouse events. pointHoverBackgroundColor Color/Color[] Point background color when hovered. pointHoverBorderColor Color/Color[] Point border color when hovered. pointHoverBorderWidth Number/Number[] Border width of point when hovered. pointHoverRadius Number/Number[] The radius of the point when hovered. showLine Boolean If false, the line is not drawn for this dataset. spanGaps Boolean If true, lines will be drawn between points with no or null data. If false, points with NaN data will create a break in the line steppedLine Boolean/String If the line is shown as a stepped line. more... cubicInterpolationMode The following interpolation modes are supported: 'default' 'monotone'. The 'default' algorithm uses a custom weighted cubic interpolation, which produces pleasant curves for all types of datasets. The 'monotone' algorithm is more suited to y = f(x) datasets : it preserves monotonicity (or piecewise monotonicity) of the dataset being interpolated, and ensures local extremums (if any) stay at input data points. If left untouched (undefined), the global options.elements.line.cubicInterpolationMode property is used. Stepped Line The following values are supported for steppedLine: false: No Step Interpolation (default) true: Step-before Interpolation (eq. 'before') 'before': Step-before Interpolation 'after': Step-after Interpolation If the steppedLine value is set to anything other than false, lineTension will be ignored. Configuration Options The line chart defines the following configuration options. These options are merged with the global chart configuration options, Chart.defaults.global, to form the options passed to the chart. Name Type Default Description showLines Boolean true If false, the lines between points are not drawn. spanGaps Boolean false If false, NaN data causes a break in the line. Default Options It is common to want to apply a configuration setting to all created line charts. The global line chart settings are stored in Chart.defaults.line. Changing the global options only affects charts created after the change. Existing charts are not changed. For example, to configure all line charts with spanGaps = true you would do: Chart.defaults.line.spanGaps = true; Data Structure The data property of a dataset for a line chart can be passed in two formats. Number[] data: [20, 10] When the data array is an array of numbers, the x axis is generally a category. The points are placed onto the axis using their position in the array. When a line chart is created with a category axis, the labels property of the data object must be specified. Point[] data: [{ x: 10, y: 20 }, { x: 15, y: 10 }] This alternate is used for sparse datasets, such as those in scatter charts. Each data point is specified using an object containing x and y properties. Stacked Area Chart Line charts can be configured into stacked area charts by changing the settings on the y axis to enable stacking. Stacked area charts can be used to show how one data trend is made up of a number of smaller pieces. var stackedLine = new Chart(ctx, { type: 'line', data: data, options: { scales: { yAxes: [{ stacked: true }] } } }); High Performance Line Charts When charting a lot of data, the chart render time may start to get quite large. In that case, the following strategies can be used to improve performance. Data Decimation Decimating your data will achieve the best results. When there is a lot of data to display on the graph, it doesn't make sense to show tens of thousands of data points on a graph that is only a few hundred pixels wide. There are many approaches to data decimation and selection of an algorithm will depend on your data and the results you want to achieve. For instance, min/max decimation will preserve peaks in your data but could require up to 4 points for each pixel. This type of decimation would work well for a very noisy signal where you need to see data peaks. Disable Bezier Curves If you are drawing lines on your chart, disabling bezier curves will improve render times since drawing a straight line is more performant than a bezier curve. To disable bezier curves for an entire chart: new Chart(ctx, { type: 'line', data: data, options: { elements: { line: { tension: 0, // disables bezier curves } } } }); Disable Line Drawing If you have a lot of data points, it can be more performant to disable rendering of the line for a dataset and only draw points. Doing this means that there is less to draw on the canvas which will improve render performance. To disable lines: new Chart(ctx, { type: 'line', data: { datasets: [{ showLine: false, // disable for a single dataset }] }, options: { showLines: false, // disable for all datasets } }); Disable Animations If your charts have long render times, it is a good idea to disable animations. Doing so will mean that the chart needs to only be rendered once during an update instead of multiple times. This will have the effect of reducing CPU usage and improving general page performance. To disable animations new Chart(ctx, { type: 'line', data: data, options: { animation: { duration: 0, // general animation time }, hover: { animationDuration: 0, // duration of animations when hovering an item }, responsiveAnimationDuration: 0, // animation duration after a resize } }); \"},\"charts/bar.html\":{\"url\":\"charts/bar.html\",\"title\":\"Bar\",\"keywords\":\"\",\"body\":\"Bar A bar chart provides a way of showing data values represented as vertical bars. It is sometimes used to show trend data, and the comparison of multiple data sets side by side. new Chart(document.getElementById(\\\"chartjs-1\\\"),{\\\"type\\\":\\\"bar\\\",\\\"data\\\":{\\\"labels\\\":[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\",\\\"May\\\",\\\"June\\\",\\\"July\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"My First Dataset\\\",\\\"data\\\":[65,59,80,81,56,55,40],\\\"fill\\\":false,\\\"backgroundColor\\\":[\\\"rgba(255, 99, 132, 0.2)\\\",\\\"rgba(255, 159, 64, 0.2)\\\",\\\"rgba(255, 205, 86, 0.2)\\\",\\\"rgba(75, 192, 192, 0.2)\\\",\\\"rgba(54, 162, 235, 0.2)\\\",\\\"rgba(153, 102, 255, 0.2)\\\",\\\"rgba(201, 203, 207, 0.2)\\\"],\\\"borderColor\\\":[\\\"rgb(255, 99, 132)\\\",\\\"rgb(255, 159, 64)\\\",\\\"rgb(255, 205, 86)\\\",\\\"rgb(75, 192, 192)\\\",\\\"rgb(54, 162, 235)\\\",\\\"rgb(153, 102, 255)\\\",\\\"rgb(201, 203, 207)\\\"],\\\"borderWidth\\\":1}]},\\\"options\\\":{\\\"scales\\\":{\\\"yAxes\\\":[{\\\"ticks\\\":{\\\"beginAtZero\\\":true}}]}}}); Example Usage var myBarChart = new Chart(ctx, { type: 'bar', data: data, options: options }); Dataset Properties The bar chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of the bars is generally set this way. Some properties can be specified as an array. If these are set to an array value, the first value applies to the first bar, the second value to the second bar, and so on. Name Type Description label String The label for the dataset which appears in the legend and tooltips. xAxisID String The ID of the x axis to plot this dataset on. If not specified, this defaults to the ID of the first found x axis yAxisID String The ID of the y axis to plot this dataset on. If not specified, this defaults to the ID of the first found y axis. backgroundColor Color/Color[] The fill color of the bar. See Colors borderColor Color/Color[] The color of the bar border. See Colors borderWidth Number/Number[] The stroke width of the bar in pixels. borderSkipped String Which edge to skip drawing the border for. more... hoverBackgroundColor Color/Color[] The fill colour of the bars when hovered. hoverBorderColor Color/Color[] The stroke colour of the bars when hovered. hoverBorderWidth Number/Number[] The stroke width of the bars when hovered. borderSkipped This setting is used to avoid drawing the bar stroke at the base of the fill. In general, this does not need to be changed except when creating chart types that derive from a bar chart. Options are: 'bottom' 'left' 'top' 'right' Configuration Options The bar chart defines the following configuration options. These options are merged with the global chart configuration options, Chart.defaults.global, to form the options passed to the chart. Name Type Default Description barPercentage Number 0.9 Percent (0-1) of the available width each bar should be within the category width. 1.0 will take the whole category width and put the bars right next to each other. more... categoryPercentage Number 0.8 Percent (0-1) of the available width each category should be within the sample width. more... barThickness Number Manually set width of each bar in pixels. If not set, the base sample widths are calculated automatically so that they take the full available widths without overlap. Then, the bars are sized using barPercentage and categoryPercentage. maxBarThickness Number Set this to ensure that bars are not sized thicker than this. gridLines.offsetGridLines Boolean true If true, the bars for a particular data point fall between the grid lines. The grid line will move to the left by one half of the tick interval. If false, the grid line will go right down the middle of the bars. more... offsetGridLines If true, the bars for a particular data point fall between the grid lines. The grid line will move to the left by one half of the tick interval, which is the space between the grid lines. If false, the grid line will go right down the middle of the bars. This is set to true for a bar chart while false for other charts by default. This setting applies to the axis configuration. If axes are added to the chart, this setting will need to be set for each new axis. options = { scales: { xAxes: [{ gridLines: { offsetGridLines: true } }] } } Default Options It is common to want to apply a configuration setting to all created bar charts. The global bar chart settings are stored in Chart.defaults.bar. Changing the global options only affects charts created after the change. Existing charts are not changed. barPercentage vs categoryPercentage The following shows the relationship between the bar percentage option and the category percentage option. // categoryPercentage: 1.0 // barPercentage: 1.0 Bar: | 1.0 | 1.0 | Category: | 1.0 | Sample: |===========| // categoryPercentage: 1.0 // barPercentage: 0.5 Bar: |.5| |.5| Category: | 1.0 | Sample: |==============| // categoryPercentage: 0.5 // barPercentage: 1.0 Bar: |1.||1.| Category: | .5 | Sample: |==============| Data Structure The data property of a dataset for a bar chart is specified as a an array of numbers. Each point in the data array corresponds to the label at the same index on the x axis. data: [20, 10] You can also specify the dataset as x/y coordinates when using the time scale. data: [{x:'2016-12-25', y:20}, {x:'2016-12-26', y:10}] Stacked Bar Chart Bar charts can be configured into stacked bar charts by changing the settings on the X and Y axes to enable stacking. Stacked bar charts can be used to show how one data series is made up of a number of smaller pieces. var stackedBar = new Chart(ctx, { type: 'bar', data: data, options: { scales: { xAxes: [{ stacked: true }], yAxes: [{ stacked: true }] } } }); Dataset Properties The following dataset properties are specific to stacked bar charts. Name Type Description stack String The ID of the group to which this dataset belongs to (when stacked, each group will be a separate stack) Horizontal Bar Chart A horizontal bar chart is a variation on a vertical bar chart. It is sometimes used to show trend data, and the comparison of multiple data sets side by side. new Chart(document.getElementById(\\\"chartjs-2\\\"),{\\\"type\\\":\\\"horizontalBar\\\",\\\"data\\\":{\\\"labels\\\":[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\",\\\"May\\\",\\\"June\\\",\\\"July\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"My First Dataset\\\",\\\"data\\\":[65,59,80,81,56,55,40],\\\"fill\\\":false,\\\"backgroundColor\\\":[\\\"rgba(255, 99, 132, 0.2)\\\",\\\"rgba(255, 159, 64, 0.2)\\\",\\\"rgba(255, 205, 86, 0.2)\\\",\\\"rgba(75, 192, 192, 0.2)\\\",\\\"rgba(54, 162, 235, 0.2)\\\",\\\"rgba(153, 102, 255, 0.2)\\\",\\\"rgba(201, 203, 207, 0.2)\\\"],\\\"borderColor\\\":[\\\"rgb(255, 99, 132)\\\",\\\"rgb(255, 159, 64)\\\",\\\"rgb(255, 205, 86)\\\",\\\"rgb(75, 192, 192)\\\",\\\"rgb(54, 162, 235)\\\",\\\"rgb(153, 102, 255)\\\",\\\"rgb(201, 203, 207)\\\"],\\\"borderWidth\\\":1}]},\\\"options\\\":{\\\"scales\\\":{\\\"xAxes\\\":[{\\\"ticks\\\":{\\\"beginAtZero\\\":true}}]}}}); Example var myBarChart = new Chart(ctx, { type: 'horizontalBar', data: data, options: options }); Config Options The configuration options for the horizontal bar chart are the same as for the bar chart. However, any options specified on the x axis in a bar chart, are applied to the y axis in a horizontal bar chart. The default horizontal bar configuration is specified in Chart.defaults.horizontalBar. \"},\"charts/radar.html\":{\"url\":\"charts/radar.html\",\"title\":\"Radar\",\"keywords\":\"\",\"body\":\"Radar A radar chart is a way of showing multiple data points and the variation between them. They are often useful for comparing the points of two or more different data sets. new Chart(document.getElementById(\\\"chartjs-3\\\"),{\\\"type\\\":\\\"radar\\\",\\\"data\\\":{\\\"labels\\\":[\\\"Eating\\\",\\\"Drinking\\\",\\\"Sleeping\\\",\\\"Designing\\\",\\\"Coding\\\",\\\"Cycling\\\",\\\"Running\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"My First Dataset\\\",\\\"data\\\":[65,59,90,81,56,55,40],\\\"fill\\\":true,\\\"backgroundColor\\\":\\\"rgba(255, 99, 132, 0.2)\\\",\\\"borderColor\\\":\\\"rgb(255, 99, 132)\\\",\\\"pointBackgroundColor\\\":\\\"rgb(255, 99, 132)\\\",\\\"pointBorderColor\\\":\\\"#fff\\\",\\\"pointHoverBackgroundColor\\\":\\\"#fff\\\",\\\"pointHoverBorderColor\\\":\\\"rgb(255, 99, 132)\\\"},{\\\"label\\\":\\\"My Second Dataset\\\",\\\"data\\\":[28,48,40,19,96,27,100],\\\"fill\\\":true,\\\"backgroundColor\\\":\\\"rgba(54, 162, 235, 0.2)\\\",\\\"borderColor\\\":\\\"rgb(54, 162, 235)\\\",\\\"pointBackgroundColor\\\":\\\"rgb(54, 162, 235)\\\",\\\"pointBorderColor\\\":\\\"#fff\\\",\\\"pointHoverBackgroundColor\\\":\\\"#fff\\\",\\\"pointHoverBorderColor\\\":\\\"rgb(54, 162, 235)\\\"}]},\\\"options\\\":{\\\"elements\\\":{\\\"line\\\":{\\\"tension\\\":0,\\\"borderWidth\\\":3}}}}); Example Usage var myRadarChart = new Chart(ctx, { type: 'radar', data: data, options: options }); Dataset Properties The radar chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of a line is generally set this way. All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on. Name Type Description label String The label for the dataset which appears in the legend and tooltips. backgroundColor Color The fill color under the line. See Colors borderColor Color The color of the line. See Colors borderWidth Number The width of the line in pixels. borderDash Number[] Length and spacing of dashes. See MDN borderDashOffset Number Offset for line dashes. See MDN borderCapStyle String Cap style of the line. See MDN borderJoinStyle String Line joint style. See MDN fill Boolean/String How to fill the area under the line. See area charts lineTension Number Bezier curve tension of the line. Set to 0 to draw straightlines. pointBackgroundColor Color/Color[] The fill color for points. pointBorderColor Color/Color[] The border color for points. pointBorderWidth Number/Number[] The width of the point border in pixels. pointRadius Number/Number[] The radius of the point shape. If set to 0, the point is not rendered. pointStyle String/String[]/Image/Image[] Style of the point. more... pointHitRadius Number/Number[] The pixel size of the non-displayed point that reacts to mouse events. pointHoverBackgroundColor Color/Color[] Point background color when hovered. pointHoverBorderColor Color/Color[] Point border color when hovered. pointHoverBorderWidth Number/Number[] Border width of point when hovered. pointHoverRadius Number/Number[] The radius of the point when hovered. pointStyle The style of point. Options are: 'circle' 'cross' 'crossRot' 'dash'. 'line' 'rect' 'rectRounded' 'rectRot' 'star' 'triangle' If the option is an image, that image is drawn on the canvas using drawImage. Configuration Options Unlike other charts, the radar chart has no chart specific options. Scale Options The radar chart supports only a single scale. The options for this scale are defined in the scale property. options = { scale: { // Hides the scale display: false } }; Default Options It is common to want to apply a configuration setting to all created radar charts. The global radar chart settings are stored in Chart.defaults.radar. Changing the global options only affects charts created after the change. Existing charts are not changed. Data Structure The data property of a dataset for a radar chart is specified as a an array of numbers. Each point in the data array corresponds to the label at the same index on the x axis. data: [20, 10] For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart. data: { labels: ['Running', 'Swimming', 'Eating', 'Cycling'], datasets: [{ data: [20, 10, 4, 2] }] } \"},\"charts/doughnut.html\":{\"url\":\"charts/doughnut.html\",\"title\":\"Doughnut & Pie\",\"keywords\":\"\",\"body\":\"Doughnut and Pie Pie and doughnut charts are probably the most commonly used charts. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. They are excellent at showing the relational proportions between data. Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their cutoutPercentage. This equates what percentage of the inner should be cut out. This defaults to 0 for pie charts, and 50 for doughnuts. They are also registered under two aliases in the Chart core. Other than their different default value, and different alias, they are exactly the same. new Chart(document.getElementById(\\\"chartjs-4\\\"),{\\\"type\\\":\\\"doughnut\\\",\\\"data\\\":{\\\"labels\\\":[\\\"Red\\\",\\\"Blue\\\",\\\"Yellow\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"My First Dataset\\\",\\\"data\\\":[300,50,100],\\\"backgroundColor\\\":[\\\"rgb(255, 99, 132)\\\",\\\"rgb(54, 162, 235)\\\",\\\"rgb(255, 205, 86)\\\"]}]}}); Example Usage // For a pie chart var myPieChart = new Chart(ctx,{ type: 'pie', data: data, options: options }); // And for a doughnut chart var myDoughnutChart = new Chart(ctx, { type: 'doughnut', data: data, options: options }); Dataset Properties The doughnut/pie chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of a the dataset's arc are generally set this way. Name Type Description label String The label for the dataset which appears in the legend and tooltips. backgroundColor Color[] The fill color of the arcs in the dataset. See Colors borderColor Color[] The border color of the arcs in the dataset. See Colors borderWidth Number[] The border width of the arcs in the dataset. hoverBackgroundColor Color[] The fill colour of the arcs when hovered. hoverBorderColor Color[] The stroke colour of the arcs when hovered. hoverBorderWidth Number[] The stroke width of the arcs when hovered. Config Options These are the customisation options specific to Pie & Doughnut charts. These options are merged with the global chart configuration options, and form the options of the chart. Name Type Default Description cutoutPercentage Number 50 - for doughnut, 0 - for pie The percentage of the chart that is cut out of the middle. rotation Number -0.5 * Math.PI Starting angle to draw arcs from. circumference Number 2 * Math.PI Sweep to allow arcs to cover animation.animateRotate Boolean true If true, the chart will animate in with a rotation animation. This property is in the options.animation object. animation.animateScale Boolean false If true, will animate scaling the chart from the center outwards. Default Options We can also change these default values for each Doughnut type that is created, this object is available at Chart.defaults.doughnut. Pie charts also have a clone of these defaults available to change at Chart.defaults.pie, with the only difference being cutoutPercentage being set to 0. Data Structure For a pie chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. You also need to specify an array of labels so that tooltips appear correctly data = { datasets: [{ data: [10, 20, 30] }], // These labels appear in the legend and in the tooltips when hovering different arcs labels: [ 'Red', 'Yellow', 'Blue' ] }; \"},\"charts/polar.html\":{\"url\":\"charts/polar.html\",\"title\":\"Polar Area\",\"keywords\":\"\",\"body\":\"Polar Area Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context. new Chart(document.getElementById(\\\"chartjs-5\\\"),{\\\"type\\\":\\\"polarArea\\\",\\\"data\\\":{\\\"labels\\\":[\\\"Red\\\",\\\"Green\\\",\\\"Yellow\\\",\\\"Grey\\\",\\\"Blue\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"My First Dataset\\\",\\\"data\\\":[11,16,7,3,14],\\\"backgroundColor\\\":[\\\"rgb(255, 99, 132)\\\",\\\"rgb(75, 192, 192)\\\",\\\"rgb(255, 205, 86)\\\",\\\"rgb(201, 203, 207)\\\",\\\"rgb(54, 162, 235)\\\"]}]}}); Example Usage new Chart(ctx, { data: data, type: 'polarArea', options: options }); Dataset Properties The following options can be included in a polar area chart dataset to configure options for that specific dataset. Name Type Description label String The label for the dataset which appears in the legend and tooltips. backgroundColor Color[] The fill color of the arcs in the dataset. See Colors borderColor Color[] The border color of the arcs in the dataset. See Colors borderWidth Number[] The border width of the arcs in the dataset. hoverBackgroundColor Color[] The fill colour of the arcs when hovered. hoverBorderColor Color[] The stroke colour of the arcs when hovered. hoverBorderWidth Number[] The stroke width of the arcs when hovered. Config Options These are the customisation options specific to Polar Area charts. These options are merged with the global chart default options, and form the options of the chart. Name Type Default Description startAngle Number -0.5 * Math.PI Starting angle to draw arcs for the first item in a dataset. animation.animateRotate Boolean true If true, the chart will animate in with a rotation animation. This property is in the options.animation object. animation.animateScale Boolean true If true, will animate scaling the chart from the center outwards. Default Options We can also change these defaults values for each PolarArea type that is created, this object is available at Chart.defaults.polarArea. Changing the global options only affects charts created after the change. Existing charts are not changed. For example, to configure all new polar area charts with animateScale = false you would do: Chart.defaults.polarArea.animation.animateScale = false; Data Structure For a polar area chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. You also need to specify an array of labels so that tooltips appear correctly for each slice. data = { datasets: [{ data: [10, 20, 30] }], // These labels appear in the legend and in the tooltips when hovering different arcs labels: [ 'Red', 'Yellow', 'Blue' ] }; \"},\"charts/bubble.html\":{\"url\":\"charts/bubble.html\",\"title\":\"Bubble\",\"keywords\":\"\",\"body\":\"Bubble Chart A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles. new Chart(document.getElementById(\\\"chartjs-6\\\"),{\\\"type\\\":\\\"bubble\\\",\\\"data\\\":{\\\"datasets\\\":[{\\\"label\\\":\\\"First Dataset\\\",\\\"data\\\":[{\\\"x\\\":20,\\\"y\\\":30,\\\"r\\\":15},{\\\"x\\\":40,\\\"y\\\":10,\\\"r\\\":10}],\\\"backgroundColor\\\":\\\"rgb(255, 99, 132)\\\"}]}}); Example Usage // For a bubble chart var myBubbleChart = new Chart(ctx,{ type: 'bubble', data: data, options: options }); Dataset Properties The bubble chart allows a number of properties to be specified for each dataset. These are used to set display properties for a specific dataset. For example, the colour of the bubbles is generally set this way. Name Type Scriptable Indexable Default backgroundColor Color Yes Yes 'rgba(0,0,0,0.1)' borderColor Color Yes Yes 'rgba(0,0,0,0.1)' borderWidth Number Yes Yes 3 data Object[] - - required hoverBackgroundColor Color Yes Yes undefined hoverBorderColor Color Yes Yes undefined hoverBorderWidth Number Yes Yes 1 hoverRadius Number Yes Yes 4 hitRadius Number Yes Yes 1 label String - - undefined pointStyle String Yes Yes circle radius Number Yes Yes 3 Labeling label defines the text associated to the dataset and which appears in the legend and tooltips. Styling The style of each bubble can be controlled with the following properties: Name Description backgroundColor bubble background color borderColor bubble border color borderWidth bubble border width (in pixels) pointStyle bubble shape style radius bubble radius (in pixels) All these values, if undefined, fallback to the associated elements.point.* options. Interactions The interaction with each bubble can be controlled with the following properties: Name Description hoverBackgroundColor bubble background color when hovered hoverBorderColor bubble border color hovered hoverBorderWidth bubble border width when hovered (in pixels) hoverRadius bubble additional radius when hovered (in pixels) hitRadius bubble additional radius for hit detection (in pixels) All these values, if undefined, fallback to the associated elements.point.* options. Default Options We can also change the default values for the Bubble chart type. Doing so will give all bubble charts created after this point the new defaults. The default configuration for the bubble chart can be accessed at Chart.defaults.bubble. Data Structure Bubble chart datasets need to contain a data array of points, each points represented by an object containing the following properties: { // X Value x: , // Y Value y: , // Bubble radius in pixels (not scaled). r: } Important: the radius property, r is not scaled by the chart, it is the raw radius in pixels of the bubble that is drawn on the canvas. \"},\"charts/scatter.html\":{\"url\":\"charts/scatter.html\",\"title\":\"Scatter\",\"keywords\":\"\",\"body\":\"Scatter Chart Scatter charts are based on basic line charts with the x axis changed to a linear axis. To use a scatter chart, data must be passed as objects containing X and Y properties. The example below creates a scatter chart with 3 points. var scatterChart = new Chart(ctx, { type: 'scatter', data: { datasets: [{ label: 'Scatter Dataset', data: [{ x: -10, y: 0 }, { x: 0, y: 10 }, { x: 10, y: 5 }] }] }, options: { scales: { xAxes: [{ type: 'linear', position: 'bottom' }] } } }); Dataset Properties The scatter chart supports all of the same properties as the line chart. Data Structure Unlike the line chart where data can be supplied in two different formats, the scatter chart only accepts data in a point format. data: [{ x: 10, y: 20 }, { x: 15, y: 10 }] \"},\"charts/area.html\":{\"url\":\"charts/area.html\",\"title\":\"Area\",\"keywords\":\"\",\"body\":\"Area Charts Both line and radar charts support a fill option on the dataset object which can be used to create area between two datasets or a dataset and a boundary, i.e. the scale origin, start or end (see filling modes). Note: this feature is implemented by the filler plugin. Filling modes Mode Type Values Absolute dataset index 1 Number 1, 2, 3, ... Relative dataset index 1 String '-1', '-2', '+1', ... Boundary 2 String 'start', 'end', 'origin' Disabled 3 Boolean false 1 dataset filling modes have been introduced in version 2.6.0 2 prior version 2.6.0, boundary values was 'zero', 'top', 'bottom' (deprecated) 3 for backward compatibility, fill: true (default) is equivalent to fill: 'origin' Example new Chart(ctx, { data: { datasets: [ {fill: 'origin'}, // 0: fill to 'origin' {fill: '+2'}, // 1: fill to dataset 3 {fill: 1}, // 2: fill to dataset 1 {fill: false}, // 3: no fill {fill: '-2'} // 4: fill to dataset 2 ] } }) Configuration Option Type Default Description plugins.filler.propagate Boolean true Fill propagation when target is hidden propagate Boolean (default: true) If true, the fill area will be recursively extended to the visible target defined by the fill value of hidden dataset targets: Example new Chart(ctx, { data: { datasets: [ {fill: 'origin'}, // 0: fill to 'origin' {fill: '-1'}, // 1: fill to dataset 0 {fill: 1}, // 2: fill to dataset 1 {fill: false}, // 3: no fill {fill: '-2'} // 4: fill to dataset 2 ] }, options: { plugins: { filler: { propagate: true } } } }) propagate: true: if dataset 2 is hidden, dataset 4 will fill to dataset 1 if dataset 2 and 1 are hidden, dataset 4 will fill to 'origin' propagate: false: if dataset 2 and/or 4 are hidden, dataset 4 will not be filled \"},\"charts/mixed.html\":{\"url\":\"charts/mixed.html\",\"title\":\"Mixed\",\"keywords\":\"\",\"body\":\"Mixed Chart Types With Chart.js, it is possible to create mixed charts that are a combination of two or more different chart types. A common example is a bar chart that also includes a line dataset. Creating a mixed chart starts with the initialization of a basic chart. var myChart = new Chart(ctx, { type: 'bar', data: data, options: options }); At this point we have a standard bar chart. Now we need to convert one of the datasets to a line dataset. var mixedChart = new Chart(ctx, { type: 'bar', data: { datasets: [{ label: 'Bar Dataset', data: [10, 20, 30, 40] }, { label: 'Line Dataset', data: [50, 50, 50, 50], // Changes this dataset to become a line type: 'line' }], labels: ['January', 'February', 'March', 'April'] }, options: options }); At this point we have a chart rendering how we'd like. It's important to note that the default options for a line chart are not merged in this case. Only the options for the default type are merged in. In this case, that means that the default options for a bar chart are merged because that is the type specified by the type field. new Chart(document.getElementById(\\\"chartjs-7\\\"),{\\\"type\\\":\\\"bar\\\",\\\"data\\\":{\\\"labels\\\":[\\\"January\\\",\\\"February\\\",\\\"March\\\",\\\"April\\\"],\\\"datasets\\\":[{\\\"label\\\":\\\"Bar Dataset\\\",\\\"data\\\":[10,20,30,40],\\\"borderColor\\\":\\\"rgb(255, 99, 132)\\\",\\\"backgroundColor\\\":\\\"rgba(255, 99, 132, 0.2)\\\"},{\\\"label\\\":\\\"Line Dataset\\\",\\\"data\\\":[50,50,50,50],\\\"type\\\":\\\"line\\\",\\\"fill\\\":false,\\\"borderColor\\\":\\\"rgb(54, 162, 235)\\\"}]},\\\"options\\\":{\\\"scales\\\":{\\\"yAxes\\\":[{\\\"ticks\\\":{\\\"beginAtZero\\\":true}}]}}}); \"},\"axes/\":{\"url\":\"axes/\",\"title\":\"Axes\",\"keywords\":\"\",\"body\":\"Axes Axes are an integral part of a chart. They are used to determine how data maps to a pixel value on the chart. In a cartesian chart, there is 1 or more X axis and 1 or more Y axis to map points onto the 2 dimensional canvas. These axes are know as 'cartesian axes'. In a radial chart, such as a radar chart or a polar area chart, there is a single axis that maps points in the angular and radial directions. These are known as 'radial axes'. Scales in Chart.js >V2.0 are significantly more powerful, but also different than those of v1.0. Multiple X & Y axes are supported. A built-in label auto-skip feature detects would-be overlapping ticks and labels and removes every nth label to keep things displaying normally. Scale titles are supported New scale types can be extended without writing an entirely new chart type Common Configuration The following properties are common to all axes provided by Chart.js Name Type Default Description display Boolean true If set to false the axis is hidden from view. Overrides gridLines.display, scaleLabel.display, and ticks.display. callbacks Object Callback functions to hook into the axis lifecycle. more... weight Number 0 The weight used to sort the axis. Higher weights are further away from the chart area. Callbacks There are a number of config callbacks that can be used to change parameters in the scale at different points in the update process. Name Arguments Description beforeUpdate axis Callback called before the update process starts. beforeSetDimensions axis Callback that runs before dimensions are set. afterSetDimensions axis Callback that runs after dimensions are set. beforeDataLimits axis Callback that runs before data limits are determined. afterDataLimits axis Callback that runs after data limits are determined. beforeBuildTicks axis Callback that runs before ticks are created. afterBuildTicks axis Callback that runs after ticks are created. Useful for filtering ticks. beforeTickToLabelConversion axis Callback that runs before ticks are converted into strings. afterTickToLabelConversion axis Callback that runs after ticks are converted into strings. beforeCalculateTickRotation axis Callback that runs before tick rotation is determined. afterCalculateTickRotation axis Callback that runs after tick rotation is determined. beforeFit axis Callback that runs before the scale fits to the canvas. afterFit axis Callback that runs after the scale fits to the canvas. afterUpdate axis Callback that runs at the end of the update process. Updating Axis Defaults The default configuration for a scale can be easily changed using the scale service. All you need to do is to pass in a partial configuration that will be merged with the current scale default configuration to form the new default. For example, to set the minimum value of 0 for all linear scales, you would do the following. Any linear scales created after this time would now have a minimum of 0. Chart.scaleService.updateScaleDefaults('linear', { ticks: { min: 0 } }); Creating New Axes To create a new axis, see the developer docs. \"},\"axes/cartesian/\":{\"url\":\"axes/cartesian/\",\"title\":\"Cartesian\",\"keywords\":\"\",\"body\":\"Cartesian Axes Axes that follow a cartesian grid are known as 'Cartesian Axes'. Cartesian axes are used for line, bar, and bubble charts. Four cartesian axes are included in Chart.js by default. linear logarithmic category time Common Configuration All of the included cartesian axes support a number of common options. Name Type Default Description type String Type of scale being employed. Custom scales can be created and registered with a string key. This allows changing the type of an axis for a chart. position String Position of the axis in the chart. Possible values are: 'top', 'left', 'bottom', 'right' offset Boolean false If true, extra space is added to the both edges and the axis is scaled to fit into the chart area. This is set to true in the bar chart by default. id String The ID is used to link datasets and scale axes together. more... gridLines Object Grid line configuration. more... scaleLabel Object Scale title configuration. more... ticks Object Tick configuration. more... Tick Configuration The following options are common to all cartesian axes but do not apply to other axes. Name Type Default Description autoSkip Boolean true If true, automatically calculates how many labels that can be shown and hides labels accordingly. Turn it off to show all labels no matter what autoSkipPadding Number 0 Padding between the ticks on the horizontal axis when autoSkip is enabled. Note: Only applicable to horizontal scales. labelOffset Number 0 Distance in pixels to offset the label from the centre point of the tick (in the y direction for the x axis, and the x direction for the y axis). Note: this can cause labels at the edges to be cropped by the edge of the canvas maxRotation Number 90 Maximum rotation for tick labels when rotating to condense labels. Note: Rotation doesn't occur until necessary. Note: Only applicable to horizontal scales. minRotation Number 0 Minimum rotation for tick labels. Note: Only applicable to horizontal scales. mirror Boolean false Flips tick labels around axis, displaying the labels inside the chart instead of outside. Note: Only applicable to vertical scales. padding Number 10 Padding between the tick label and the axis. When set on a vertical axis, this applies in the horizontal (X) direction. When set on a horizontal axis, this applies in the vertical (Y) direction. Axis ID The properties dataset.xAxisID or dataset.yAxisID have to match the scale properties scales.xAxes.id or scales.yAxes.id. This is especially needed if multi-axes charts are used. var myChart = new Chart(ctx, { type: 'line', data: { datasets: [{ // This dataset appears on the first axis yAxisID: 'first-y-axis' }, { // This dataset appears on the second axis yAxisID: 'second-y-axis' }] }, options: { scales: { yAxes: [{ id: 'first-y-axis', type: 'linear' }, { id: 'second-y-axis', type: 'linear' }] } } }); Creating Multiple Axes With cartesian axes, it is possible to create multiple X and Y axes. To do so, you can add multiple configuration objects to the xAxes and yAxes properties. When adding new axes, it is important to ensure that you specify the type of the new axes as default types are not used in this case. In the example below, we are creating two Y axes. We then use the yAxisID property to map the datasets to their correct axes. var myChart = new Chart(ctx, { type: 'line', data: { datasets: [{ data: [20, 50, 100, 75, 25, 0], label: 'Left dataset' // This binds the dataset to the left y axis yAxisID: 'left-y-axis' }, { data: [0.1, 0.5, 1.0, 2.0, 1.5, 0] label: 'Right dataset' // This binds the dataset to the right y axis yAxisID: 'right-y-axis', }], labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'] }, options: { scales: { yAxes: [{ id: 'left-y-axis', type: 'linear', position: 'left' }, { id: 'right-y-axis', type: 'linear', position: 'right' }] } } }); \"},\"axes/cartesian/category.html\":{\"url\":\"axes/cartesian/category.html\",\"title\":\"Category\",\"keywords\":\"\",\"body\":\"Category Cartesian Axis If global configuration is used, labels are drawn from one of the label arrays included in the chart data. If only data.labels is defined, this will be used. If data.xLabels is defined and the axis is horizontal, this will be used. Similarly, if data.yLabels is defined and the axis is vertical, this property will be used. Using both xLabels and yLabels together can create a chart that uses strings for both the X and Y axes. Specifying any of the settings above defines the x axis as type: category if not defined otherwise. For more fine-grained control of category labels it is also possible to add labels as part of the category axis definition. Doing so does not apply the global defaults. Category Axis Definition Globally: let chart = new Chart(ctx, { type: ... data: { labels: ['January', 'February', 'March', 'April', 'May', 'June'], datasets: ... }, }); As part of axis definition: let chart = new Chart(ctx, { type: ... data: ... options: { scales: { xAxes: [{ type: 'category', labels: ['January', 'February', 'March', 'April', 'May', 'June'], }] } } }); Tick Configuration Options The category scale provides the following options for configuring tick marks. They are nested in the ticks sub object. These options extend the common tick configuration. Name Type Default Description labels Array[String] - An array of labels to display. min String The minimum item to display. more... max String The maximum item to display. more... Min Max Configuration For both the min and max properties, the value must be in the labels array. In the example below, the x axis would only display \\\"March\\\" through \\\"June\\\". let chart = new Chart(ctx, { type: 'line', data: { datasets: [{ data: [10, 20, 30, 40, 50, 60] }], labels: ['January', 'February', 'March', 'April', 'May', 'June'], }, options: { scales: { xAxes: [{ ticks: { min: 'March' } }] } } }); \"},\"axes/cartesian/linear.html\":{\"url\":\"axes/cartesian/linear.html\",\"title\":\"Linear\",\"keywords\":\"\",\"body\":\"Linear Cartesian Axis The linear scale is use to chart numerical data. It can be placed on either the x or y axis. The scatter chart type automatically configures a line chart to use one of these scales for the x axis. As the name suggests, linear interpolation is used to determine where a value lies on the axis. Tick Configuration Options The following options are provided by the linear scale. They are all located in the ticks sub options. These options extend the common tick configuration. Name Type Default Description beginAtZero Boolean if true, scale will include 0 if it is not already included. min Number User defined minimum number for the scale, overrides minimum value from data. more... max Number User defined maximum number for the scale, overrides maximum value from data. more... maxTicksLimit Number 11 Maximum number of ticks and gridlines to show. stepSize Number User defined fixed step size for the scale. more... suggestedMax Number Adjustment used when calculating the maximum data value. more... suggestedMin Number Adjustment used when calculating the minimum data value. more... Axis Range Settings Given the number of axis range settings, it is important to understand how they all interact with each other. The suggestedMax and suggestedMin settings only change the data values that are used to scale the axis. These are useful for extending the range of the axis while maintaing the auto fit behaviour. let minDataValue = Math.min(mostNegativeValue, options.ticks.suggestedMin); let maxDataValue = Math.max(mostPositiveValue, options.ticks.suggestedMax); In this example, the largest positive value is 50, but the data maximum is expanded out to 100. However, because the lowest data value is below the suggestedMin setting, it is ignored. let chart = new Chart(ctx, { type: 'line', data: { datasets: [{ label: 'First dataset', data: [0, 20, 40, 50] }], labels: ['January', 'February', 'March', 'April'] }, options: { scales: { yAxes: [{ ticks: { suggestedMin: 50 suggestedMax: 100 } }] } } }); In contrast to the suggested* settings, the min and max settings set explicit ends to the axes. When these are set, some data points may not be visible. Step Size If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm. This example sets up a chart with a y axis that creates ticks at 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5. let options = { scales: { yAxes: [{ ticks: { max: 5, min: 0, stepSize: 0.5 } }] } }; \"},\"axes/cartesian/logarithmic.html\":{\"url\":\"axes/cartesian/logarithmic.html\",\"title\":\"Logarithmic\",\"keywords\":\"\",\"body\":\"Logarithmic Cartesian Axis The logarithmic scale is use to chart numerical data. It can be placed on either the x or y axis. As the name suggests, logarithmic interpolation is used to determine where a value lies on the axis. Tick Configuration Options The following options are provided by the logarithmic scale. They are all located in the ticks sub options. These options extend the common tick configuration. Name Type Default Description min Number User defined minimum number for the scale, overrides minimum value from data. max Number User defined maximum number for the scale, overrides maximum value from data. \"},\"axes/cartesian/time.html\":{\"url\":\"axes/cartesian/time.html\",\"title\":\"Time\",\"keywords\":\"\",\"body\":\"Time Cartesian Axis The time scale is used to display times and dates. When building its ticks, it will automatically calculate the most comfortable unit base on the size of the scale. Data Sets Input Data The x-axis data points may additionally be specified via the t attribute when using the time scale. data: [{ x: new Date(), y: 1 }, { t: new Date(), y: 10 }] Date Formats When providing data for the time scale, Chart.js supports all of the formats that Moment.js accepts. See Moment.js docs for details. Configuration Options The following options are provided by the time scale. You may also set options provided by the common tick configuration. Name Type Default Description distribution String linear How data is plotted. more... bounds String data Determines the scale bounds. more... ticks.source String auto How ticks are generated. more... time.displayFormats Object Sets how different time units are displayed. more... time.isoWeekday Boolean false If true and the unit is set to 'week', then the first day of the week will be Monday. Otherwise, it will be Sunday. time.max Time If defined, this will override the data maximum time.min Time If defined, this will override the data minimum time.parser String/Function Custom parser for dates. more... time.round String false If defined, dates will be rounded to the start of this unit. See Time Units below for the allowed units. time.tooltipFormat String The moment js format string to use for the tooltip. time.unit String false If defined, will force the unit to be a certain type. See Time Units section below for details. time.stepSize Number 1 The number of units between grid lines. time.minUnit String 'millisecond' The minimum display format to be used for a time unit. Time Units The following time measurements are supported. The names can be passed as strings to the time.unit config option to force a certain unit. millisecond second minute hour day week month quarter year For example, to create a chart with a time scale that always displayed units per month, the following config could be used. var chart = new Chart(ctx, { type: 'line', data: data, options: { scales: { xAxes: [{ time: { unit: 'month' } }] } } }) Display Formats The following display formats are used to configure how different time units are formed into strings for the axis tick marks. See moment.js for the allowable format strings. Name Default Example millisecond 'h:mm:ss.SSS a' 11:20:01.123 AM second 'h:mm:ss a' 11:20:01 AM minute 'h:mm a' 11:20 AM hour 'hA' 11AM day 'MMM D' Sep 4 week 'll' Sep 4 2015 month 'MMM YYYY' Sep 2015 quarter '[Q]Q - YYYY' Q3 - 2015 year 'YYYY' 2015 For example, to set the display format for the 'quarter' unit to show the month and year, the following config would be passed to the chart constructor. var chart = new Chart(ctx, { type: 'line', data: data, options: { scales: { xAxes: [{ type: 'time', time: { displayFormats: { quarter: 'MMM YYYY' } } }] } } }) Scale Distribution The distribution property controls the data distribution along the scale: 'linear': data are spread according to their time (distances can vary) 'series': data are spread at the same distance from each other var chart = new Chart(ctx, { type: 'line', data: data, options: { scales: { xAxes: [{ type: 'time', distribution: 'series' }] } } }) Scale Bounds The bounds property controls the scale boundary strategy (bypassed by min/max time options) 'data': make sure data are fully visible, labels outside are removed 'ticks': make sure ticks are fully visible, data outside are truncated Ticks Source The ticks.source property controls the ticks generation 'auto': generates \\\"optimal\\\" ticks based on scale size and time options. 'data': generates ticks from data (including labels from data {t|x|y} objects) 'labels': generates ticks from user given data.labels values ONLY Parser If this property is defined as a string, it is interpreted as a custom format to be used by moment to parse the date. If this is a function, it must return a moment.js object given the appropriate data value. \"},\"axes/radial/\":{\"url\":\"axes/radial/\",\"title\":\"Radial\",\"keywords\":\"\",\"body\":\"Radial Axes Radial axes are used specifically for the radar and polar area chart types. These axes overlay the chart area, rather than being positioned on one of the edges. One radial axis is included by default in Chart.js. linear \"},\"axes/radial/linear.html\":{\"url\":\"axes/radial/linear.html\",\"title\":\"Linear\",\"keywords\":\"\",\"body\":\"Linear Radial Axis The linear scale is use to chart numerical data. As the name suggests, linear interpolation is used to determine where a value lies in relation the center of the axis. The following additional configuration options are provided by the radial linear scale. Configuration Options The axis has configuration properties for ticks, angle lines (line that appear in a radar chart outward from the center), pointLabels (labels around the edge in a radar chart). The following sections define each of the properties in those sections. Name Type Description angleLines Object Angle line configuration. more... gridLines Object Grid line configuration. more... pointLabels Object Point label configuration. more... ticks Object Tick configuration. more... Tick Options The following options are provided by the linear scale. They are all located in the ticks sub options. The common tick configuration options are supported by this axis. Name Type Default Description backdropColor Color 'rgba(255, 255, 255, 0.75)' Color of label backdrops backdropPaddingX Number 2 Horizontal padding of label backdrop. backdropPaddingY Number 2 Vertical padding of label backdrop. beginAtZero Boolean false if true, scale will include 0 if it is not already included. min Number User defined minimum number for the scale, overrides minimum value from data. more... max Number User defined maximum number for the scale, overrides maximum value from data. more... maxTicksLimit Number 11 Maximum number of ticks and gridlines to show. stepSize Number User defined fixed step size for the scale. more... suggestedMax Number Adjustment used when calculating the maximum data value. more... suggestedMin Number Adjustment used when calculating the minimum data value. more... showLabelBackdrop Boolean true If true, draw a background behind the tick labels Axis Range Settings Given the number of axis range settings, it is important to understand how they all interact with each other. The suggestedMax and suggestedMin settings only change the data values that are used to scale the axis. These are useful for extending the range of the axis while maintaing the auto fit behaviour. let minDataValue = Math.min(mostNegativeValue, options.ticks.suggestedMin); let maxDataValue = Math.max(mostPositiveValue, options.ticks.suggestedMax); In this example, the largest positive value is 50, but the data maximum is expanded out to 100. However, because the lowest data value is below the suggestedMin setting, it is ignored. let chart = new Chart(ctx, { type: 'radar', data: { datasets: [{ label: 'First dataset', data: [0, 20, 40, 50] }], labels: ['January', 'February', 'March', 'April'] }, options: { scale: { ticks: { suggestedMin: 50 suggestedMax: 100 } } } }); In contrast to the suggested* settings, the min and max settings set explicit ends to the axes. When these are set, some data points may not be visible. Step Size If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm. This example sets up a chart with a y axis that creates ticks at 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5. let options = { scales: { yAxes: [{ ticks: { max: 5, min: 0, stepSize: 0.5 } }] } }; Angle Line Options The following options are used to configure angled lines that radiate from the center of the chart to the point labels. They can be found in the angleLines sub options. Note that these options only apply if angleLines.display is true. Name Type Default Description display Boolean true if true, angle lines are shown color Color rgba(0, 0, 0, 0.1) Color of angled lines lineWidth Number 1 Width of angled lines Point Label Options The following options are used to configure the point labels that are shown on the perimeter of the scale. They can be found in the pointLabels sub options. Note that these options only apply if pointLabels.display is true. Name Type Default Description callback Function Callback function to transform data labels to point labels. The default implementation simply returns the current string. fontColor Color '#666' Font color for point labels. fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family to use when rendering labels. fontSize Number 10 font size in pixels fontStyle String 'normal' Font style to use when rendering point labels. \"},\"axes/labelling.html\":{\"url\":\"axes/labelling.html\",\"title\":\"Labelling\",\"keywords\":\"\",\"body\":\"Labeling Axes When creating a chart, you want to tell the viewer what data they are viewing. To do this, you need to label the axis. Scale Title Configuration The scale label configuration is nested under the scale configuration in the scaleLabel key. It defines options for the scale title. Note that this only applies to cartesian axes. Name Type Default Description display Boolean false If true, display the axis title. labelString String '' The text for the title. (i.e. \\\"# of People\\\" or \\\"Response Choices\\\"). lineHeight Number/String 1.2 Height of an individual line of text (see MDN) fontColor Color '#666' Font color for scale title. fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family for the scale title, follows CSS font-family options. fontSize Number 12 Font size for scale title. fontStyle String 'normal' Font style for the scale title, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit). padding Number/Object 4 Padding to apply around scale labels. Only top and bottom are implemented. Creating Custom Tick Formats It is also common to want to change the tick marks to include information about the data type. For example, adding a dollar sign ('$'). To do this, you need to override the ticks.callback method in the axis configuration. In the following example, every label of the Y axis would be displayed with a dollar sign at the front.. If the callback returns null or undefined the associated grid line will be hidden. var chart = new Chart(ctx, { type: 'line', data: data, options: { scales: { yAxes: [{ ticks: { // Include a dollar sign in the ticks callback: function(value, index, values) { return '$' + value; } } }] } } }); \"},\"axes/styling.html\":{\"url\":\"axes/styling.html\",\"title\":\"Styling\",\"keywords\":\"\",\"body\":\"Styling There are a number of options to allow styling an axis. There are settings to control grid lines and ticks. Grid Line Configuration The grid line configuration is nested under the scale configuration in the gridLines key. It defines options for the grid lines that run perpendicular to the axis. Name Type Default Description display Boolean true If false, do not display grid lines for this axis. color Color/Color[] 'rgba(0, 0, 0, 0.1)' The color of the grid lines. If specified as an array, the first color applies to the first grid line, the second to the second grid line and so on. borderDash Number[] [] Length and spacing of dashes on grid lines. See MDN borderDashOffset Number 0 Offset for line dashes. See MDN lineWidth Number/Number[] 1 Stroke width of grid lines. drawBorder Boolean true If true, draw border at the edge between the axis and the chart area. drawOnChartArea Boolean true If true, draw lines on the chart area inside the axis lines. This is useful when there are multiple axes and you need to control which grid lines are drawn. drawTicks Boolean true If true, draw lines beside the ticks in the axis area beside the chart. tickMarkLength Number 10 Length in pixels that the grid lines will draw into the axis area. zeroLineWidth Number 1 Stroke width of the grid line for the first index (index 0). zeroLineColor Color 'rgba(0, 0, 0, 0.25)' Stroke color of the grid line for the first index (index 0). zeroLineBorderDash Number[] [] Length and spacing of dashes of the grid line for the first index (index 0). See MDN zeroLineBorderDashOffset Number 0 Offset for line dashes of the grid line for the first index (index 0). See MDN offsetGridLines Boolean false If true, grid lines will be shifted to be between labels. This is set to true in the bar chart by default. Tick Configuration The tick configuration is nested under the scale configuration in the ticks key. It defines options for the tick marks that are generated by the axis. Name Type Default Description callback Function Returns the string representation of the tick value as it should be displayed on the chart. See callback. display Boolean true If true, show tick marks fontColor Color '#666' Font color for tick labels. fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family for the tick labels, follows CSS font-family options. fontSize Number 12 Font size for the tick labels. fontStyle String 'normal' Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit). reverse Boolean false Reverses order of tick labels. minor object {} Minor ticks configuration. Ommited options are inherited from options above. major object {} Major ticks configuration. Ommited options are inherited from options above. Minor Tick Configuration The minorTick configuration is nested under the ticks configuration in the minor key. It defines options for the minor tick marks that are generated by the axis. Omitted options are inherited from ticks configuration. Name Type Default Description callback Function Returns the string representation of the tick value as it should be displayed on the chart. See callback. fontColor Color '#666' Font color for tick labels. fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family for the tick labels, follows CSS font-family options. fontSize Number 12 Font size for the tick labels. fontStyle String 'normal' Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit). Major Tick Configuration The majorTick configuration is nested under the ticks configuration in the major key. It defines options for the major tick marks that are generated by the axis. Omitted options are inherited from ticks configuration. Name Type Default Description callback Function Returns the string representation of the tick value as it should be displayed on the chart. See callback. fontColor Color '#666' Font color for tick labels. fontFamily String \\\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\\\" Font family for the tick labels, follows CSS font-family options. fontSize Number 12 Font size for the tick labels. fontStyle String 'normal' Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit). \"},\"developers/\":{\"url\":\"developers/\",\"title\":\"Developers\",\"keywords\":\"\",\"body\":\"Developers Developer features allow extending and enhancing Chart.js in many different ways. Latest resources Latest documentation and samples, including unreleased features, are available at: http://www.chartjs.org/docs/master/ http://www.chartjs.org/samples/master/ Development releases Latest builds are available for testing at: http://www.chartjs.org/dist/master/Chart.min.js http://www.chartjs.org/dist/master/Chart.bundle.min.js Note: Development builds are currently only available via HTTP, so in order to include them in JSFiddle or CodePen, you need to access these tools via HTTP as well. WARNING: Development builds MUST not be used for production purposes or as replacement for CDN. Browser support Chart.js offers support for the following browsers: Chrome 50+ Firefox 45+ Internet Explorer 11 Edge 14+ Safari 9+ Browser support for the canvas element is available in all modern & major mobile browsers. CanIUse Thanks to BrowserStack for allowing our team to test on thousands of browsers. Previous versions Version 2 has a completely different API than earlier versions. Most earlier version options have current equivalents or are the same. Please use the documentation that is available on chartjs.org for the current version of Chart.js. Please note - documentation for previous versions are available on the GitHub repo. 1.x Documentation \"},\"developers/api.html\":{\"url\":\"developers/api.html\",\"title\":\"Chart.js API\",\"keywords\":\"\",\"body\":\"Chart Prototype Methods For each chart, there are a set of global prototype methods on the shared ChartType which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made. // For example: var myLineChart = new Chart(ctx, config); .destroy() Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js. This must be called before the canvas is reused for a new chart. // Destroys a specific chart instance myLineChart.destroy(); .update(config) Triggers an update of the chart. This can be safely called after updating the data object. This will update all scales, legends, and then re-render the chart. // duration is the time for the animation of the redraw in milliseconds // lazy is a boolean. if true, the animation can be interrupted by other animations myLineChart.data.datasets[0].data[2] = 50; // Would update the first dataset's value of 'March' to be 50 myLineChart.update(); // Calling update now animates the position of March from 90 to 50. Note: replacing the data reference (e.g. myLineChart.data = {datasets: [...]} only works starting version 2.6. Prior that, replacing the entire data object could be achieved with the following workaround: myLineChart.config.data = {datasets: [...]}. A config object can be provided with additional configuration for the update process. This is useful when update is manually called inside an event handler and some different animation is desired. The following properties are supported: duration (number): Time for the animation of the redraw in milliseconds lazy (boolean): If true, the animation can be interrupted by other animations easing (string): The animation easing function. See Animation Easing for possible values. Example: myChart.update({ duration: 800, easing: 'easeOutBounce' }) See Updating Charts for more details. .reset() Reset the chart to it's state before the initial animation. A new animation can then be triggered using update. myLineChart.reset(); .render(config) Triggers a redraw of all chart elements. Note, this does not update elements for new data. Use .update() in that case. See .update(config) for more details on the config object. // duration is the time for the animation of the redraw in milliseconds // lazy is a boolean. if true, the animation can be interrupted by other animations myLineChart.render({ duration: 800, lazy: false, easing: 'easeOutBounce' }); .stop() Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call .render() to re-animate. // Stops the charts animation loop at its current frame myLineChart.stop(); // => returns 'this' for chainability .resize() Use this to manually resize the canvas element. This is run each time the canvas container is resized, but you can call this method manually if you change the size of the canvas nodes container element. // Resizes & redraws to fill its container element myLineChart.resize(); // => returns 'this' for chainability .clear() Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful. // Will clear the canvas that myLineChart is drawn on myLineChart.clear(); // => returns 'this' for chainability .toBase64Image() This returns a base 64 encoded string of the chart in it's current state. myLineChart.toBase64Image(); // => returns png data url of the image on the canvas .generateLegend() Returns an HTML string of a legend for that chart. The legend is generated from the legendCallback in the options. myLineChart.generateLegend(); // => returns HTML string of a legend for this chart .getElementAtEvent(e) Calling getElementAtEvent(event) on your Chart instance passing an argument of an event, or jQuery event, will return the single element at the event position. If there are multiple items within range, only the first is returned. The value returned from this method is an array with a single parameter. An array is used to keep a consistent API between the get*AtEvent methods. myLineChart.getElementAtEvent(e); // => returns the first element at the event point. To get an item that was clicked on, getElementAtEvent can be used. function clickHandler(evt) { var item = myChart.getElementAtEvent(evt)[0]; if (item) { var label = myChart.data.labels[firstPoint._index]; var value = myChart.data.datasets[firstPoint._datasetIndex].data[firstPoint._index]; } } .getElementsAtEvent(e) Looks for the element under the event point, then returns all elements at the same data index. This is used internally for 'label' mode highlighting. Calling getElementsAtEvent(event) on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event. canvas.onclick = function(evt){ var activePoints = myLineChart.getElementsAtEvent(evt); // => activePoints is an array of points on the canvas that are at the same position as the click event. }; This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. .getDatasetAtEvent(e) Looks for the element under the event point, then returns all elements from that dataset. This is used internally for 'dataset' mode highlighting myLineChart.getDatasetAtEvent(e); // => returns an array of elements .getDatasetMeta(index) Looks for the dataset that matches the current index and returns that metadata. This returned data has all of the metadata that is used to construct the chart. The data property of the metadata will contain information about each point, rectangle, etc. depending on the chart type. Extensive examples of usage are available in the Chart.js tests. var meta = myChart.getDatasetMeta(0); var x = meta.data[0]._model.x \"},\"developers/updates.html\":{\"url\":\"developers/updates.html\",\"title\":\"Updating Charts\",\"keywords\":\"\",\"body\":\"Updating Charts It's pretty common to want to update charts after they've been created. When the chart data is changed, Chart.js will animate to the new data values. Adding or Removing Data Adding and removing data is supported by changing the data array. To add data, just add data into the data array as seen in this example. function addData(chart, label, data) { chart.data.labels.push(label); chart.data.datasets.forEach((dataset) => { dataset.data.push(data); }); chart.update(); } function removeData(chart) { chart.data.labels.pop(); chart.data.datasets.forEach((dataset) => { dataset.data.pop(); }); chart.update(); } Preventing Animations Sometimes when a chart updates, you may not want an animation. To achieve this you can call update with a duration of 0. This will render the chart synchronously and without an animation. \"},\"developers/plugins.html\":{\"url\":\"developers/plugins.html\",\"title\":\"Plugins\",\"keywords\":\"\",\"body\":\"Plugins Plugins are the most efficient way to customize or change the default behavior of a chart. They have been introduced at version 2.1.0 (global plugins only) and extended at version 2.5.0 (per chart plugins and options). Using plugins Plugins can be shared between chart instances: var plugin = { /* plugin implementation */ }; // chart1 and chart2 use \\\"plugin\\\" var chart1 = new Chart(ctx, { plugins: [plugin] }); var chart2 = new Chart(ctx, { plugins: [plugin] }); // chart3 doesn't use \\\"plugin\\\" var chart3 = new Chart(ctx, {}); Plugins can also be defined directly in the chart plugins config (a.k.a. inline plugins): var chart = new Chart(ctx, { plugins: [{ beforeInit: function(chart, options) { //.. } }] }); However, this approach is not ideal when the customization needs to apply to many charts. Global plugins Plugins can be registered globally to be applied on all charts (a.k.a. global plugins): Chart.plugins.register({ // plugin implementation }); Note: inline plugins can't be registered globally. Configuration Plugin ID Plugins must define a unique id in order to be configurable. This id should follow the npm package name convention: can't start with a dot or an underscore can't contain any non-URL-safe characters can't contain uppercase letters should be something short, but also reasonably descriptive If a plugin is intended to be released publicly, you may want to check the registry to see if there's something by that name already. Note that in this case, the package name should be prefixed by chartjs-plugin- to appear in Chart.js plugin registry. Plugin options Plugin options are located under the options.plugins config and are scoped by the plugin ID: options.plugins.{plugin-id}. var chart = new Chart(ctx, { config: { foo: { ... }, // chart 'foo' option plugins: { p1: { foo: { ... }, // p1 plugin 'foo' option bar: { ... } }, p2: { foo: { ... }, // p2 plugin 'foo' option bla: { ... } } } } }); Disable plugins To disable a global plugin for a specific chart instance, the plugin options must be set to false: Chart.plugins.register({ id: 'p1', // ... }); var chart = new Chart(ctx, { config: { plugins: { p1: false // disable plugin 'p1' for this instance } } }); Plugin Core API Available hooks (as of version 2.6): beforeInit afterInit beforeUpdate (cancellable) afterUpdate beforeLayout (cancellable) afterLayout beforeDatasetsUpdate (cancellable) afterDatasetsUpdate beforeDatasetUpdate (cancellable) afterDatasetUpdate beforeRender (cancellable) afterRender beforeDraw (cancellable) afterDraw beforeDatasetsDraw (cancellable) afterDatasetsDraw beforeDatasetDraw (cancellable) afterDatasetDraw beforeEvent (cancellable) afterEvent resize destroy \"},\"developers/charts.html\":{\"url\":\"developers/charts.html\",\"title\":\"New Charts\",\"keywords\":\"\",\"body\":\"New Charts Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed. Chart.controllers.MyType = Chart.DatasetController.extend({ }); // Now we can create a new instance of our chart, using the Chart.js API new Chart(ctx, { // this is the string the constructor was registered at, ie Chart.controllers.MyType type: 'MyType', data: data, options: options }); Dataset Controller Interface Dataset controllers must implement the following interface. { // Create elements for each piece of data in the dataset. Store elements in an array on the dataset as dataset.metaData addElements: function() {}, // Create a single element for the data at the given index and reset its state addElementAndReset: function(index) {}, // Draw the representation of the dataset // @param ease : if specified, this number represents how far to transition elements. See the implementation of draw() in any of the provided controllers to see how this should be used draw: function(ease) {}, // Remove hover styling from the given element removeHoverStyle: function(element) {}, // Add hover styling to the given element setHoverStyle: function(element) {}, // Update the elements in response to new data // @param reset : if true, put the elements into a reset state so they can animate to their final values update: function(reset) {}, } The following methods may optionally be overridden by derived dataset controllers { // Initializes the controller initialize: function(chart, datasetIndex) {}, // Ensures that the dataset represented by this controller is linked to a scale. Overridden to helpers.noop in the polar area and doughnut controllers as these // chart types using a single scale linkScales: function() {}, // Called by the main chart controller when an update is triggered. The default implementation handles the number of data points changing and creating elements appropriately. buildOrUpdateElements: function() {} } Extending Existing Chart Types Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own. The built in controller types are: Chart.controllers.line Chart.controllers.bar Chart.controllers.radar Chart.controllers.doughnut Chart.controllers.polarArea Chart.controllers.bubble For example, to derive a new chart type that extends from a bubble chart, you would do the following. // Sets the default config for 'derivedBubble' to be the same as the bubble defaults. // We look for the defaults by doing Chart.defaults[chartType] // It looks like a bug exists when the defaults don't exist Chart.defaults.derivedBubble = Chart.defaults.bubble; // I think the recommend using Chart.controllers.bubble.extend({ extensions here }); var custom = Chart.controllers.bubble.extend({ draw: function(ease) { // Call super method first Chart.controllers.bubble.prototype.draw.call(this, ease); // Now we can do some custom drawing for this dataset. Here we'll draw a red box around the first point in each dataset var meta = this.getMeta(); var pt0 = meta.data[0]; var radius = pt0._view.radius; var ctx = this.chart.chart.ctx; ctx.save(); ctx.strokeStyle = 'red'; ctx.lineWidth = 1; ctx.strokeRect(pt0._view.x - radius, pt0._view.y - radius, 2 * radius, 2 * radius); ctx.restore(); } }); // Stores the controller so that the chart initialization routine can look it up with // Chart.controllers[type] Chart.controllers.derivedBubble = custom; // Now we can create and use our new chart type new Chart(ctx, { type: 'derivedBubble', data: data, options: options, }); Bar Controller The bar controller has a special property that you should be aware of. To correctly calculate the width of a bar, the controller must determine the number of datasets that map to bars. To do this, the bar controller attaches a property bar to the dataset during initialization. If you are creating a replacement or updated bar controller, you should do the same. This will ensure that charts with regular bars and your new derived bars will work seamlessly. \"},\"developers/axes.html\":{\"url\":\"developers/axes.html\",\"title\":\"New Axes\",\"keywords\":\"\",\"body\":\"New Axes Axes in Chart.js can be individually extended. Axes should always derive from Chart.Scale but this is not a mandatory requirement. let MyScale = Chart.Scale.extend({ /* extensions ... */ }); // MyScale is now derived from Chart.Scale Once you have created your scale class, you need to register it with the global chart object so that it can be used. A default config for the scale may be provided when registering the constructor. The first parameter to the register function is a string key that is used later to identify which scale type to use for a chart. Chart.scaleService.registerScaleType('myScale', MyScale, defaultConfigObject); To use the new scale, simply pass in the string key to the config when creating a chart. var lineChart = new Chart(ctx, { data: data, type: 'line', options: { scales: { yAxes: [{ type: 'myScale' // this is the same key that was passed to the registerScaleType function }] } } }) Scale Properties Scale instances are given the following properties during the fitting process. { left: Number, // left edge of the scale bounding box right: Number, // right edge of the bounding box' top: Number, bottom: Number, width: Number, // the same as right - left height: Number, // the same as bottom - top // Margin on each side. Like css, this is outside the bounding box. margins: { left: Number, right: Number, top: Number, bottom: Number, }, // Amount of padding on the inside of the bounding box (like CSS) paddingLeft: Number, paddingRight: Number, paddingTop: Number, paddingBottom: Number, } Scale Interface To work with Chart.js, custom scale types must implement the following interface. { // Determines the data limits. Should set this.min and this.max to be the data max/min determineDataLimits: function() {}, // Generate tick marks. this.chart is the chart instance. The data object can be accessed as this.chart.data // buildTicks() should create a ticks array on the axis instance, if you intend to use any of the implementations from the base class buildTicks: function() {}, // Get the value to show for the data at the given index of the the given dataset, ie this.chart.data.datasets[datasetIndex].data[index] getLabelForIndex: function(index, datasetIndex) {}, // Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value // @param index: index into the ticks array // @param includeOffset: if true, get the pixel halway between the given tick and the next getPixelForTick: function(index, includeOffset) {}, // Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value // @param value : the value to get the pixel for // @param index : index into the data array of the value // @param datasetIndex : index of the dataset the value comes from // @param includeOffset : if true, get the pixel halway between the given tick and the next getPixelForValue: function(value, index, datasetIndex, includeOffset) {} // Get the value for a given pixel (x coordinate for horizontal axis, y coordinate for vertical axis) // @param pixel : pixel value getValueForPixel: function(pixel) {} } Optionally, the following methods may also be overwritten, but an implementation is already provided by the Chart.Scale base class. // Transform the ticks array of the scale instance into strings. The default implementation simply calls this.options.ticks.callback(numericalTick, index, ticks); convertTicksToLabels: function() {}, // Determine how much the labels will rotate by. The default implementation will only rotate labels if the scale is horizontal. calculateTickRotation: function() {}, // Fits the scale into the canvas. // this.maxWidth and this.maxHeight will tell you the maximum dimensions the scale instance can be. Scales should endeavour to be as efficient as possible with canvas space. // this.margins is the amount of space you have on either side of your scale that you may expand in to. This is used already for calculating the best label rotation // You must set this.minSize to be the size of your scale. It must be an object containing 2 properties: width and height. // You must set this.width to be the width and this.height to be the height of the scale fit: function() {}, // Draws the scale onto the canvas. this.(left|right|top|bottom) will have been populated to tell you the area on the canvas to draw in // @param chartArea : an object containing four properties: left, right, top, bottom. This is the rectangle that lines, bars, etc will be drawn in. It may be used, for example, to draw grid lines. draw: function(chartArea) {}, The Core.Scale base class also has some utility functions that you may find useful. { // Returns true if the scale instance is horizontal isHorizontal: function() {}, // Get the correct value from the value from this.chart.data.datasets[x].data[] // If dataValue is an object, returns .x or .y depending on the return of isHorizontal() // If the value is undefined, returns NaN // Otherwise returns the value. // Note that in all cases, the returned value is not guaranteed to be a Number getRightValue: function(dataValue) {}, } \"},\"developers/contributing.html\":{\"url\":\"developers/contributing.html\",\"title\":\"Contributing\",\"keywords\":\"\",\"body\":\"Contributing New contributions to the library are welcome, but we ask that you please follow these guidelines: Use tabs for indentation, not spaces. Only change the individual files in /src. Check that your code will pass eslint code standards, gulp lint will run this for you. Check that your code will pass tests, gulp test will run tests for you. Keep pull requests concise, and document new functionality in the relevant .md file. Consider whether your changes are useful for all users, or if creating a Chart.js plugin would be more appropriate. Avoid breaking changes unless there is an upcoming major release, which are infrequent. We encourage people to write plugins for most new advanced features, so care a lot about backwards compatibility. Joining the project Active committers and contributors are invited to introduce yourself and request commit access to this project. We have a very active Slack community that you can join here. If you think you can help, we'd love to have you! Building and Testing Chart.js uses gulp to build the library into a single JavaScript file. Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following: > npm install > npm install -g gulp This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner gulp. The following commands are now available from the repository root: > gulp build // build Chart.js in ./dist > gulp unittest // run tests from ./test/specs > gulp unittest --watch // run tests and watch for source changes > gulp unittest --coverage // run tests and generate coverage reports in ./coverage > gulp lint // perform code linting (ESLint) > gulp test // perform code linting and run unit tests > gulp docs // build the documentation in ./dist/docs More information can be found in gulpfile.js. Bugs and Issues Please report these on the GitHub page - at github.com/chartjs/Chart.js. Please do not use issues for support requests. For help using Chart.js, please take a look at the chartjs tag on Stack Overflow. Well structured, detailed bug reports are hugely valuable for the project. Guidelines for reporting bugs: Check the issue search to see if it has already been reported Isolate the problem to a simple test case Please include a demonstration of the bug on a website such as JS Bin, JS Fiddle, or Codepen. (Template) Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data. \"},\"notes/\":{\"url\":\"notes/\",\"title\":\"Additional Notes\",\"keywords\":\"\",\"body\":\"Additional Notes \"},\"notes/comparison.html\":{\"url\":\"notes/comparison.html\",\"title\":\"Comparison Table\",\"keywords\":\"\",\"body\":\"Comparison with Other Charting Libraries Library Features Feature Chart.js D3 HighCharts Chartist Completely Free ✓ ✓ ✓ Canvas ✓ SVG ✓ ✓ ✓ Built-in Charts ✓ ✓ ✓ 8+ Chart Types ✓ ✓ ✓ Extendable to Custom Charts ✓ ✓ Supports Modern Browsers ✓ ✓ ✓ ✓ Extensive Documentation ✓ ✓ ✓ ✓ Open Source ✓ ✓ ✓ Built in Chart Types Type Chart.js HighCharts Chartist Combined Types ✓ ✓ Line ✓ ✓ ✓ Bar ✓ ✓ ✓ Horizontal Bar ✓ ✓ ✓ Pie/Doughnut ✓ ✓ ✓ Polar Area ✓ ✓ Radar ✓ Scatter ✓ ✓ ✓ Bubble ✓ Gauges ✓ Maps (Heat/Tree/etc.) ✓ \"},\"notes/extensions.html\":{\"url\":\"notes/extensions.html\",\"title\":\"Popular Extensions\",\"keywords\":\"\",\"body\":\"Popular Extensions Many extensions can be found on the Chart.js GitHub organization or on the npm registry. Charts chartjs-chart-financial - Adds financial chart types such as a candlestick. Chart.BarFunnel.js - Adds a bar funnel chart type. Chart.LinearGauge.js - Adds a linear gauge chart type. Chart.Smith.js - Adds a smith chart type. In addition, many charts can be found on the npm registry. Plugins chartjs-plugin-annotation - Draws lines and boxes on chart area. chartjs-plugin-datalabels - Displays labels on data for any type of charts. chartjs-plugin-deferred - Defers initial chart update until chart scrolls into viewport. chartjs-plugin-draggable - Makes select chart elements draggable with the mouse. chartjs-plugin-stacked100 - Draws 100% stacked bar chart. chartjs-plugin-zoom - Enables zooming and panning on charts. In addition, many plugins can be found on the npm registry. Integrations Angular angular-chart.js tc-angular-chartjs angular-chartjs Angular Chart-js Directive React react-chartjs2 react-chartjs-2 Django Django JChart Django Chartjs Ruby on Rails chartjs-ror Laravel laravel-chartjs Vue.js vue-chartjs Java Chart.java \"},\"notes/license.html\":{\"url\":\"notes/license.html\",\"title\":\"License\",\"keywords\":\"\",\"body\":\"License Chart.js is open source and available under the MIT license. \"}}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/chartjs2/docs/style.css",
    "content": "a.anchorjs-link {\n    color: rgba(65, 131, 196, 0.1);\n    font-weight: 400;\n    text-decoration: none;\n    transition: color 100ms ease-out;\n    z-index: 999;\n}\n\na.anchorjs-link:hover {\n    color: rgba(65, 131, 196, 1);\n}\n\nsup {\n    font-size: 0.75em !important;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/font-awesome/css/font-awesome.css",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/font-awesome/fonts/FontAwesome.otf",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/jquery/core.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/jquery/jquery.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/jquery/jquery.slim.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/login-bg-particles.js",
    "content": "/* -----------------------------------------------\n/* How to use? : Check the GitHub README\n/* ----------------------------------------------- */\n\n/* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */\n/*\nparticlesJS.load('particles-js', 'particles.json', function() {\n  console.log('particles.js loaded - callback');\n});\n*/\n\n/* Otherwise just put the config content (json): */\nparticlesJS('particles',\n\n    {\n        \"particles\": {\n            \"number\": {\n                \"value\": 30,\n                \"density\": {\n                    \"enable\": true,\n                    \"value_area\": 800\n                }\n            },\n            \"color\": {\n                \"value\": \"#e5e5e5\"\n            },\n            \"shape\": {\n                \"type\": \"circle\",\n                \"stroke\": {\n                    \"width\": 0,\n                    \"color\": \"#000\"\n                },\n                \"polygon\": {\n                    \"nb_sides\": 5\n                }\n            },\n            \"opacity\": {\n                \"value\": 0.6,\n                \"random\": true,\n                \"anim\": {\n                    \"enable\": true,\n                    \"speed\": 1,\n                    \"opacity_min\": 0.1,\n                    \"sync\": false\n                }\n            },\n            \"size\": {\n                \"value\": 20,\n                \"random\": true,\n                \"anim\": {\n                    \"enable\": false,\n                    \"speed\": 5,\n                    \"size_min\": 0.1,\n                    \"sync\": false\n                }\n            },\n            \"line_linked\": {\n                \"enable\": true,\n                \"distance\": 150,\n                \"color\": \"#ddd\",\n                \"opacity\": 0.5,\n                \"width\": 1\n            },\n            \"move\": {\n                \"enable\": true,\n                \"speed\": 1,\n                \"direction\": \"none\",\n                \"random\": false,\n                \"straight\": false,\n                \"out_mode\": \"out\",\n                \"attract\": {\n                    \"enable\": false,\n                    \"rotateX\": 600,\n                    \"rotateY\": 1200\n                }\n            }\n        },\n        \"interactivity\": {\n            \"detect_on\": \"canvas\",\n            \"events\": {\n                \"onhover\": {\n                    \"enable\": false,\n                    \"mode\": \"repulse\"\n                },\n                \"onclick\": {\n                    \"enable\": true,\n                    \"mode\": \"push\"\n                },\n                \"resize\": true\n            },\n            \"modes\": {\n                \"grab\": {\n                    \"distance\": 400,\n                    \"line_linked\": {\n                        \"opacity\": 1\n                    }\n                },\n                \"bubble\": {\n                    \"distance\": 400,\n                    \"size\": 40,\n                    \"duration\": 2,\n                    \"opacity\": 8,\n                    \"speed\": 3\n                },\n                \"repulse\": {\n                    \"distance\": 200\n                },\n                \"push\": {\n                    \"particles_nb\": 4\n                },\n                \"remove\": {\n                    \"particles_nb\": 2\n                }\n            }\n        },\n        \"retina_detect\": true,\n        \"config_demo\": {\n            \"hide_card\": false,\n            \"background_color\": \"#b61924\",\n            \"background_image\": \"\",\n            \"background_position\": \"50% 50%\",\n            \"background_repeat\": \"no-repeat\",\n            \"background_size\": \"cover\"\n        }\n    }\n);"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/particles.js",
    "content": "\nvar pJS = function(tag_id, params){\n\n  var canvas_el = document.querySelector('#'+tag_id+' > .particles-js-canvas-el');\n\n  /* particles.js variables with default values */\n  this.pJS = {\n    canvas: {\n      el: canvas_el,\n      w: canvas_el.offsetWidth,\n      h: canvas_el.offsetHeight\n    },\n    particles: {\n      number: {\n        value: 400,\n        density: {\n          enable: true,\n          value_area: 800\n        }\n      },\n      color: {\n        value: '#000'\n      },\n      shape: {\n        type: 'circle',\n        stroke: {\n          width: 0,\n          color: '#ff0000'\n        },\n        polygon: {\n          nb_sides: 5\n        },\n        image: {\n          src: '',\n          width: 100,\n          height: 100\n        }\n      },\n      opacity: {\n        value: 1,\n        random: false,\n        anim: {\n          enable: false,\n          speed: 2,\n          opacity_min: 0,\n          sync: false\n        }\n      },\n      size: {\n        value: 20,\n        random: false,\n        anim: {\n          enable: false,\n          speed: 20,\n          size_min: 0,\n          sync: false\n        }\n      },\n      line_linked: {\n        enable: true,\n        distance: 100,\n        color: '#fff',\n        opacity: 1,\n        width: 1\n      },\n      move: {\n        enable: true,\n        speed: 2,\n        direction: 'none',\n        random: false,\n        straight: false,\n        out_mode: 'out',\n        bounce: false,\n        attract: {\n          enable: false,\n          rotateX: 3000,\n          rotateY: 3000\n        }\n      },\n      array: []\n    },\n    interactivity: {\n      detect_on: 'canvas',\n      events: {\n        onhover: {\n          enable: true,\n          mode: 'grab'\n        },\n        onclick: {\n          enable: true,\n          mode: 'push'\n        },\n        resize: true\n      },\n      modes: {\n        grab:{\n          distance: 100,\n          line_linked:{\n            opacity: 1\n          }\n        },\n        bubble:{\n          distance: 200,\n          size: 80,\n          duration: 0.4\n        },\n        repulse:{\n          distance: 200,\n          duration: 0.4\n        },\n        push:{\n          particles_nb: 4\n        },\n        remove:{\n          particles_nb: 2\n        }\n      },\n      mouse:{}\n    },\n    retina_detect: false,\n    fn: {\n      interact: {},\n      modes: {},\n      vendors:{}\n    },\n    tmp: {}\n  };\n\n  var pJS = this.pJS;\n\n  /* params settings */\n  if(params){\n    Object.deepExtend(pJS, params);\n  }\n\n  pJS.tmp.obj = {\n    size_value: pJS.particles.size.value,\n    size_anim_speed: pJS.particles.size.anim.speed,\n    move_speed: pJS.particles.move.speed,\n    line_linked_distance: pJS.particles.line_linked.distance,\n    line_linked_width: pJS.particles.line_linked.width,\n    mode_grab_distance: pJS.interactivity.modes.grab.distance,\n    mode_bubble_distance: pJS.interactivity.modes.bubble.distance,\n    mode_bubble_size: pJS.interactivity.modes.bubble.size,\n    mode_repulse_distance: pJS.interactivity.modes.repulse.distance\n  };\n\n\n  pJS.fn.retinaInit = function(){\n\n    if(pJS.retina_detect && window.devicePixelRatio > 1){\n      pJS.canvas.pxratio = window.devicePixelRatio; \n      pJS.tmp.retina = true;\n    } \n    else{\n      pJS.canvas.pxratio = 1;\n      pJS.tmp.retina = false;\n    }\n\n    pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio;\n    pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio;\n\n    pJS.particles.size.value = pJS.tmp.obj.size_value * pJS.canvas.pxratio;\n    pJS.particles.size.anim.speed = pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio;\n    pJS.particles.move.speed = pJS.tmp.obj.move_speed * pJS.canvas.pxratio;\n    pJS.particles.line_linked.distance = pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio;\n    pJS.interactivity.modes.grab.distance = pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio;\n    pJS.interactivity.modes.bubble.distance = pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio;\n    pJS.particles.line_linked.width = pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio;\n    pJS.interactivity.modes.bubble.size = pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio;\n    pJS.interactivity.modes.repulse.distance = pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio;\n\n  };\n\n\n\n  /* ---------- pJS functions - canvas ------------ */\n\n  pJS.fn.canvasInit = function(){\n    pJS.canvas.ctx = pJS.canvas.el.getContext('2d');\n  };\n\n  pJS.fn.canvasSize = function(){\n\n    pJS.canvas.el.width = pJS.canvas.w;\n    pJS.canvas.el.height = pJS.canvas.h;\n\n    if(pJS && pJS.interactivity.events.resize){\n\n      window.addEventListener('resize', function(){\n\n          pJS.canvas.w = pJS.canvas.el.offsetWidth;\n          pJS.canvas.h = pJS.canvas.el.offsetHeight;\n\n          /* resize canvas */\n          if(pJS.tmp.retina){\n            pJS.canvas.w *= pJS.canvas.pxratio;\n            pJS.canvas.h *= pJS.canvas.pxratio;\n          }\n\n          pJS.canvas.el.width = pJS.canvas.w;\n          pJS.canvas.el.height = pJS.canvas.h;\n\n          /* repaint canvas on anim disabled */\n          if(!pJS.particles.move.enable){\n            pJS.fn.particlesEmpty();\n            pJS.fn.particlesCreate();\n            pJS.fn.particlesDraw();\n            pJS.fn.vendors.densityAutoParticles();\n          }\n\n        /* density particles enabled */\n        pJS.fn.vendors.densityAutoParticles();\n\n      });\n\n    }\n\n  };\n\n\n  pJS.fn.canvasPaint = function(){\n    pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h);\n  };\n\n  pJS.fn.canvasClear = function(){\n    pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h);\n  };\n\n\n  /* --------- pJS functions - particles ----------- */\n\n  pJS.fn.particle = function(color, opacity, position){\n\n    /* size */\n    this.radius = (pJS.particles.size.random ? Math.random() : 1) * pJS.particles.size.value;\n    if(pJS.particles.size.anim.enable){\n      this.size_status = false;\n      this.vs = pJS.particles.size.anim.speed / 100;\n      if(!pJS.particles.size.anim.sync){\n        this.vs = this.vs * Math.random();\n      }\n    }\n\n    /* position */\n    this.x = position ? position.x : Math.random() * pJS.canvas.w;\n    this.y = position ? position.y : Math.random() * pJS.canvas.h;\n\n    /* check position  - into the canvas */\n    if(this.x > pJS.canvas.w - this.radius*2) this.x = this.x - this.radius;\n    else if(this.x < this.radius*2) this.x = this.x + this.radius;\n    if(this.y > pJS.canvas.h - this.radius*2) this.y = this.y - this.radius;\n    else if(this.y < this.radius*2) this.y = this.y + this.radius;\n\n    /* check position - avoid overlap */\n    if(pJS.particles.move.bounce){\n      pJS.fn.vendors.checkOverlap(this, position);\n    }\n\n    /* color */\n    this.color = {};\n    if(typeof(color.value) == 'object'){\n\n      if(color.value instanceof Array){\n        var color_selected = color.value[Math.floor(Math.random() * pJS.particles.color.value.length)];\n        this.color.rgb = hexToRgb(color_selected);\n      }else{\n        if(color.value.r != undefined && color.value.g != undefined && color.value.b != undefined){\n          this.color.rgb = {\n            r: color.value.r,\n            g: color.value.g,\n            b: color.value.b\n          }\n        }\n        if(color.value.h != undefined && color.value.s != undefined && color.value.l != undefined){\n          this.color.hsl = {\n            h: color.value.h,\n            s: color.value.s,\n            l: color.value.l\n          }\n        }\n      }\n\n    }\n    else if(color.value == 'random'){\n      this.color.rgb = {\n        r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0),\n        g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0),\n        b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0)\n      }\n    }\n    else if(typeof(color.value) == 'string'){\n      this.color = color;\n      this.color.rgb = hexToRgb(this.color.value);\n    }\n\n    /* opacity */\n    this.opacity = (pJS.particles.opacity.random ? Math.random() : 1) * pJS.particles.opacity.value;\n    if(pJS.particles.opacity.anim.enable){\n      this.opacity_status = false;\n      this.vo = pJS.particles.opacity.anim.speed / 100;\n      if(!pJS.particles.opacity.anim.sync){\n        this.vo = this.vo * Math.random();\n      }\n    }\n\n    /* animation - velocity for speed */\n    var velbase = {}\n    switch(pJS.particles.move.direction){\n      case 'top':\n        velbase = { x:0, y:-1 };\n      break;\n      case 'top-right':\n        velbase = { x:0.5, y:-0.5 };\n      break;\n      case 'right':\n        velbase = { x:1, y:-0 };\n      break;\n      case 'bottom-right':\n        velbase = { x:0.5, y:0.5 };\n      break;\n      case 'bottom':\n        velbase = { x:0, y:1 };\n      break;\n      case 'bottom-left':\n        velbase = { x:-0.5, y:1 };\n      break;\n      case 'left':\n        velbase = { x:-1, y:0 };\n      break;\n      case 'top-left':\n        velbase = { x:-0.5, y:-0.5 };\n      break;\n      default:\n        velbase = { x:0, y:0 };\n      break;\n    }\n\n    if(pJS.particles.move.straight){\n      this.vx = velbase.x;\n      this.vy = velbase.y;\n      if(pJS.particles.move.random){\n        this.vx = this.vx * (Math.random());\n        this.vy = this.vy * (Math.random());\n      }\n    }else{\n      this.vx = velbase.x + Math.random()-0.5;\n      this.vy = velbase.y + Math.random()-0.5;\n    }\n\n    // var theta = 2.0 * Math.PI * Math.random();\n    // this.vx = Math.cos(theta);\n    // this.vy = Math.sin(theta);\n\n    this.vx_i = this.vx;\n    this.vy_i = this.vy;\n\n    \n\n    /* if shape is image */\n\n    var shape_type = pJS.particles.shape.type;\n    if(typeof(shape_type) == 'object'){\n      if(shape_type instanceof Array){\n        var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)];\n        this.shape = shape_selected;\n      }\n    }else{\n      this.shape = shape_type;\n    }\n\n    if(this.shape == 'image'){\n      var sh = pJS.particles.shape;\n      this.img = {\n        src: sh.image.src,\n        ratio: sh.image.width / sh.image.height\n      }\n      if(!this.img.ratio) this.img.ratio = 1;\n      if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg != undefined){\n        pJS.fn.vendors.createSvgImg(this);\n        if(pJS.tmp.pushing){\n          this.img.loaded = false;\n        }\n      }\n    }\n\n    \n\n  };\n\n\n  pJS.fn.particle.prototype.draw = function() {\n\n    var p = this;\n\n    if(p.radius_bubble != undefined){\n      var radius = p.radius_bubble; \n    }else{\n      var radius = p.radius;\n    }\n\n    if(p.opacity_bubble != undefined){\n      var opacity = p.opacity_bubble;\n    }else{\n      var opacity = p.opacity;\n    }\n\n    if(p.color.rgb){\n      var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+opacity+')';\n    }else{\n      var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+opacity+')';\n    }\n\n    pJS.canvas.ctx.fillStyle = color_value;\n    pJS.canvas.ctx.beginPath();\n\n    switch(p.shape){\n\n      case 'circle':\n        pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false);\n      break;\n\n      case 'edge':\n        pJS.canvas.ctx.rect(p.x-radius, p.y-radius, radius*2, radius*2);\n      break;\n\n      case 'triangle':\n        pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x-radius, p.y+radius / 1.66, radius*2, 3, 2);\n      break;\n\n      case 'polygon':\n        pJS.fn.vendors.drawShape(\n          pJS.canvas.ctx,\n          p.x - radius / (pJS.particles.shape.polygon.nb_sides/3.5), // startX\n          p.y - radius / (2.66/3.5), // startY\n          radius*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength\n          pJS.particles.shape.polygon.nb_sides, // sideCountNumerator\n          1 // sideCountDenominator\n        );\n      break;\n\n      case 'star':\n        pJS.fn.vendors.drawShape(\n          pJS.canvas.ctx,\n          p.x - radius*2 / (pJS.particles.shape.polygon.nb_sides/4), // startX\n          p.y - radius / (2*2.66/3.5), // startY\n          radius*2*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength\n          pJS.particles.shape.polygon.nb_sides, // sideCountNumerator\n          2 // sideCountDenominator\n        );\n      break;\n\n      case 'image':\n\n        function draw(){\n          pJS.canvas.ctx.drawImage(\n            img_obj,\n            p.x-radius,\n            p.y-radius,\n            radius*2,\n            radius*2 / p.img.ratio\n          );\n        }\n\n        if(pJS.tmp.img_type == 'svg'){\n          var img_obj = p.img.obj;\n        }else{\n          var img_obj = pJS.tmp.img_obj;\n        }\n\n        if(img_obj){\n          draw();\n        }\n\n      break;\n\n    }\n\n    pJS.canvas.ctx.closePath();\n\n    if(pJS.particles.shape.stroke.width > 0){\n      pJS.canvas.ctx.strokeStyle = pJS.particles.shape.stroke.color;\n      pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width;\n      pJS.canvas.ctx.stroke();\n    }\n    \n    pJS.canvas.ctx.fill();\n    \n  };\n\n\n  pJS.fn.particlesCreate = function(){\n    for(var i = 0; i < pJS.particles.number.value; i++) {\n      pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value));\n    }\n  };\n\n  pJS.fn.particlesUpdate = function(){\n\n    for(var i = 0; i < pJS.particles.array.length; i++){\n\n      /* the particle */\n      var p = pJS.particles.array[i];\n\n      // var d = ( dx = pJS.interactivity.mouse.click_pos_x - p.x ) * dx + ( dy = pJS.interactivity.mouse.click_pos_y - p.y ) * dy;\n      // var f = -BANG_SIZE / d;\n      // if ( d < BANG_SIZE ) {\n      //     var t = Math.atan2( dy, dx );\n      //     p.vx = f * Math.cos(t);\n      //     p.vy = f * Math.sin(t);\n      // }\n\n      /* move the particle */\n      if(pJS.particles.move.enable){\n        var ms = pJS.particles.move.speed/2;\n        p.x += p.vx * ms;\n        p.y += p.vy * ms;\n      }\n\n      /* change opacity status */\n      if(pJS.particles.opacity.anim.enable) {\n        if(p.opacity_status == true) {\n          if(p.opacity >= pJS.particles.opacity.value) p.opacity_status = false;\n          p.opacity += p.vo;\n        }else {\n          if(p.opacity <= pJS.particles.opacity.anim.opacity_min) p.opacity_status = true;\n          p.opacity -= p.vo;\n        }\n        if(p.opacity < 0) p.opacity = 0;\n      }\n\n      /* change size */\n      if(pJS.particles.size.anim.enable){\n        if(p.size_status == true){\n          if(p.radius >= pJS.particles.size.value) p.size_status = false;\n          p.radius += p.vs;\n        }else{\n          if(p.radius <= pJS.particles.size.anim.size_min) p.size_status = true;\n          p.radius -= p.vs;\n        }\n        if(p.radius < 0) p.radius = 0;\n      }\n\n      /* change particle position if it is out of canvas */\n      if(pJS.particles.move.out_mode == 'bounce'){\n        var new_pos = {\n          x_left: p.radius,\n          x_right:  pJS.canvas.w,\n          y_top: p.radius,\n          y_bottom: pJS.canvas.h\n        }\n      }else{\n        var new_pos = {\n          x_left: -p.radius,\n          x_right: pJS.canvas.w + p.radius,\n          y_top: -p.radius,\n          y_bottom: pJS.canvas.h + p.radius\n        }\n      }\n\n      if(p.x - p.radius > pJS.canvas.w){\n        p.x = new_pos.x_left;\n        p.y = Math.random() * pJS.canvas.h;\n      }\n      else if(p.x + p.radius < 0){\n        p.x = new_pos.x_right;\n        p.y = Math.random() * pJS.canvas.h;\n      }\n      if(p.y - p.radius > pJS.canvas.h){\n        p.y = new_pos.y_top;\n        p.x = Math.random() * pJS.canvas.w;\n      }\n      else if(p.y + p.radius < 0){\n        p.y = new_pos.y_bottom;\n        p.x = Math.random() * pJS.canvas.w;\n      }\n\n      /* out of canvas modes */\n      switch(pJS.particles.move.out_mode){\n        case 'bounce':\n          if (p.x + p.radius > pJS.canvas.w) p.vx = -p.vx;\n          else if (p.x - p.radius < 0) p.vx = -p.vx;\n          if (p.y + p.radius > pJS.canvas.h) p.vy = -p.vy;\n          else if (p.y - p.radius < 0) p.vy = -p.vy;\n        break;\n      }\n\n      /* events */\n      if(isInArray('grab', pJS.interactivity.events.onhover.mode)){\n        pJS.fn.modes.grabParticle(p);\n      }\n\n      if(isInArray('bubble', pJS.interactivity.events.onhover.mode) || isInArray('bubble', pJS.interactivity.events.onclick.mode)){\n        pJS.fn.modes.bubbleParticle(p);\n      }\n\n      if(isInArray('repulse', pJS.interactivity.events.onhover.mode) || isInArray('repulse', pJS.interactivity.events.onclick.mode)){\n        pJS.fn.modes.repulseParticle(p);\n      }\n\n      /* interaction auto between particles */\n      if(pJS.particles.line_linked.enable || pJS.particles.move.attract.enable){\n        for(var j = i + 1; j < pJS.particles.array.length; j++){\n          var p2 = pJS.particles.array[j];\n\n          /* link particles */\n          if(pJS.particles.line_linked.enable){\n            pJS.fn.interact.linkParticles(p,p2);\n          }\n\n          /* attract particles */\n          if(pJS.particles.move.attract.enable){\n            pJS.fn.interact.attractParticles(p,p2);\n          }\n\n          /* bounce particles */\n          if(pJS.particles.move.bounce){\n            pJS.fn.interact.bounceParticles(p,p2);\n          }\n\n        }\n      }\n\n\n    }\n\n  };\n\n  pJS.fn.particlesDraw = function(){\n\n    /* clear canvas */\n    pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h);\n\n    /* update each particles param */\n    pJS.fn.particlesUpdate();\n\n    /* draw each particle */\n    for(var i = 0; i < pJS.particles.array.length; i++){\n      var p = pJS.particles.array[i];\n      p.draw();\n    }\n\n  };\n\n  pJS.fn.particlesEmpty = function(){\n    pJS.particles.array = [];\n  };\n\n  pJS.fn.particlesRefresh = function(){\n\n    /* init all */\n    cancelRequestAnimFrame(pJS.fn.checkAnimFrame);\n    cancelRequestAnimFrame(pJS.fn.drawAnimFrame);\n    pJS.tmp.source_svg = undefined;\n    pJS.tmp.img_obj = undefined;\n    pJS.tmp.count_svg = 0;\n    pJS.fn.particlesEmpty();\n    pJS.fn.canvasClear();\n    \n    /* restart */\n    pJS.fn.vendors.start();\n\n  };\n\n\n  /* ---------- pJS functions - particles interaction ------------ */\n\n  pJS.fn.interact.linkParticles = function(p1, p2){\n\n    var dx = p1.x - p2.x,\n        dy = p1.y - p2.y,\n        dist = Math.sqrt(dx*dx + dy*dy);\n\n    /* draw a line between p1 and p2 if the distance between them is under the config distance */\n    if(dist <= pJS.particles.line_linked.distance){\n\n      var opacity_line = pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance;\n\n      if(opacity_line > 0){        \n        \n        /* style */\n        var color_line = pJS.particles.line_linked.color_rgb_line;\n        pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')';\n        pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width;\n        //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */\n        \n        /* path */\n        pJS.canvas.ctx.beginPath();\n        pJS.canvas.ctx.moveTo(p1.x, p1.y);\n        pJS.canvas.ctx.lineTo(p2.x, p2.y);\n        pJS.canvas.ctx.stroke();\n        pJS.canvas.ctx.closePath();\n\n      }\n\n    }\n\n  };\n\n\n  pJS.fn.interact.attractParticles  = function(p1, p2){\n\n    /* condensed particles */\n    var dx = p1.x - p2.x,\n        dy = p1.y - p2.y,\n        dist = Math.sqrt(dx*dx + dy*dy);\n\n    if(dist <= pJS.particles.line_linked.distance){\n\n      var ax = dx/(pJS.particles.move.attract.rotateX*1000),\n          ay = dy/(pJS.particles.move.attract.rotateY*1000);\n\n      p1.vx -= ax;\n      p1.vy -= ay;\n\n      p2.vx += ax;\n      p2.vy += ay;\n\n    }\n    \n\n  }\n\n\n  pJS.fn.interact.bounceParticles = function(p1, p2){\n\n    var dx = p1.x - p2.x,\n        dy = p1.y - p2.y,\n        dist = Math.sqrt(dx*dx + dy*dy),\n        dist_p = p1.radius+p2.radius;\n\n    if(dist <= dist_p){\n      p1.vx = -p1.vx;\n      p1.vy = -p1.vy;\n\n      p2.vx = -p2.vx;\n      p2.vy = -p2.vy;\n    }\n\n  }\n\n\n  /* ---------- pJS functions - modes events ------------ */\n\n  pJS.fn.modes.pushParticles = function(nb, pos){\n\n    pJS.tmp.pushing = true;\n\n    for(var i = 0; i < nb; i++){\n      pJS.particles.array.push(\n        new pJS.fn.particle(\n          pJS.particles.color,\n          pJS.particles.opacity.value,\n          {\n            'x': pos ? pos.pos_x : Math.random() * pJS.canvas.w,\n            'y': pos ? pos.pos_y : Math.random() * pJS.canvas.h\n          }\n        )\n      )\n      if(i == nb-1){\n        if(!pJS.particles.move.enable){\n          pJS.fn.particlesDraw();\n        }\n        pJS.tmp.pushing = false;\n      }\n    }\n\n  };\n\n\n  pJS.fn.modes.removeParticles = function(nb){\n\n    pJS.particles.array.splice(0, nb);\n    if(!pJS.particles.move.enable){\n      pJS.fn.particlesDraw();\n    }\n\n  };\n\n\n  pJS.fn.modes.bubbleParticle = function(p){\n\n    /* on hover event */\n    if(pJS.interactivity.events.onhover.enable && isInArray('bubble', pJS.interactivity.events.onhover.mode)){\n\n      var dx_mouse = p.x - pJS.interactivity.mouse.pos_x,\n          dy_mouse = p.y - pJS.interactivity.mouse.pos_y,\n          dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse),\n          ratio = 1 - dist_mouse / pJS.interactivity.modes.bubble.distance;\n\n      function init(){\n        p.opacity_bubble = p.opacity;\n        p.radius_bubble = p.radius;\n      }\n\n      /* mousemove - check ratio */\n      if(dist_mouse <= pJS.interactivity.modes.bubble.distance){\n\n        if(ratio >= 0 && pJS.interactivity.status == 'mousemove'){\n          \n          /* size */\n          if(pJS.interactivity.modes.bubble.size != pJS.particles.size.value){\n\n            if(pJS.interactivity.modes.bubble.size > pJS.particles.size.value){\n              var size = p.radius + (pJS.interactivity.modes.bubble.size*ratio);\n              if(size >= 0){\n                p.radius_bubble = size;\n              }\n            }else{\n              var dif = p.radius - pJS.interactivity.modes.bubble.size,\n                  size = p.radius - (dif*ratio);\n              if(size > 0){\n                p.radius_bubble = size;\n              }else{\n                p.radius_bubble = 0;\n              }\n            }\n\n          }\n\n          /* opacity */\n          if(pJS.interactivity.modes.bubble.opacity != pJS.particles.opacity.value){\n\n            if(pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value){\n              var opacity = pJS.interactivity.modes.bubble.opacity*ratio;\n              if(opacity > p.opacity && opacity <= pJS.interactivity.modes.bubble.opacity){\n                p.opacity_bubble = opacity;\n              }\n            }else{\n              var opacity = p.opacity - (pJS.particles.opacity.value-pJS.interactivity.modes.bubble.opacity)*ratio;\n              if(opacity < p.opacity && opacity >= pJS.interactivity.modes.bubble.opacity){\n                p.opacity_bubble = opacity;\n              }\n            }\n\n          }\n\n        }\n\n      }else{\n        init();\n      }\n\n\n      /* mouseleave */\n      if(pJS.interactivity.status == 'mouseleave'){\n        init();\n      }\n    \n    }\n\n    /* on click event */\n    else if(pJS.interactivity.events.onclick.enable && isInArray('bubble', pJS.interactivity.events.onclick.mode)){\n\n\n      if(pJS.tmp.bubble_clicking){\n        var dx_mouse = p.x - pJS.interactivity.mouse.click_pos_x,\n            dy_mouse = p.y - pJS.interactivity.mouse.click_pos_y,\n            dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse),\n            time_spent = (new Date().getTime() - pJS.interactivity.mouse.click_time)/1000;\n\n        if(time_spent > pJS.interactivity.modes.bubble.duration){\n          pJS.tmp.bubble_duration_end = true;\n        }\n\n        if(time_spent > pJS.interactivity.modes.bubble.duration*2){\n          pJS.tmp.bubble_clicking = false;\n          pJS.tmp.bubble_duration_end = false;\n        }\n      }\n\n\n      function process(bubble_param, particles_param, p_obj_bubble, p_obj, id){\n\n        if(bubble_param != particles_param){\n\n          if(!pJS.tmp.bubble_duration_end){\n            if(dist_mouse <= pJS.interactivity.modes.bubble.distance){\n              if(p_obj_bubble != undefined) var obj = p_obj_bubble;\n              else var obj = p_obj;\n              if(obj != bubble_param){\n                var value = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration);\n                if(id == 'size') p.radius_bubble = value;\n                if(id == 'opacity') p.opacity_bubble = value;\n              }\n            }else{\n              if(id == 'size') p.radius_bubble = undefined;\n              if(id == 'opacity') p.opacity_bubble = undefined;\n            }\n          }else{\n            if(p_obj_bubble != undefined){\n              var value_tmp = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration),\n                  dif = bubble_param - value_tmp;\n                  value = bubble_param + dif;\n              if(id == 'size') p.radius_bubble = value;\n              if(id == 'opacity') p.opacity_bubble = value;\n            }\n          }\n\n        }\n\n      }\n\n      if(pJS.tmp.bubble_clicking){\n        /* size */\n        process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size');\n        /* opacity */\n        process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity');\n      }\n\n    }\n\n  };\n\n\n  pJS.fn.modes.repulseParticle = function(p){\n\n    if(pJS.interactivity.events.onhover.enable && isInArray('repulse', pJS.interactivity.events.onhover.mode) && pJS.interactivity.status == 'mousemove') {\n\n      var dx_mouse = p.x - pJS.interactivity.mouse.pos_x,\n          dy_mouse = p.y - pJS.interactivity.mouse.pos_y,\n          dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse);\n\n      var normVec = {x: dx_mouse/dist_mouse, y: dy_mouse/dist_mouse},\n          repulseRadius = pJS.interactivity.modes.repulse.distance,\n          velocity = 100,\n          repulseFactor = clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50);\n      \n      var pos = {\n        x: p.x + normVec.x * repulseFactor,\n        y: p.y + normVec.y * repulseFactor\n      }\n\n      if(pJS.particles.move.out_mode == 'bounce'){\n        if(pos.x - p.radius > 0 && pos.x + p.radius < pJS.canvas.w) p.x = pos.x;\n        if(pos.y - p.radius > 0 && pos.y + p.radius < pJS.canvas.h) p.y = pos.y;\n      }else{\n        p.x = pos.x;\n        p.y = pos.y;\n      }\n    \n    }\n\n\n    else if(pJS.interactivity.events.onclick.enable && isInArray('repulse', pJS.interactivity.events.onclick.mode)) {\n\n      if(!pJS.tmp.repulse_finish){\n        pJS.tmp.repulse_count++;\n        if(pJS.tmp.repulse_count == pJS.particles.array.length){\n          pJS.tmp.repulse_finish = true;\n        }\n      }\n\n      if(pJS.tmp.repulse_clicking){\n\n        var repulseRadius = Math.pow(pJS.interactivity.modes.repulse.distance/6, 3);\n\n        var dx = pJS.interactivity.mouse.click_pos_x - p.x,\n            dy = pJS.interactivity.mouse.click_pos_y - p.y,\n            d = dx*dx + dy*dy;\n\n        var force = -repulseRadius / d * 1;\n\n        function process(){\n\n          var f = Math.atan2(dy,dx);\n          p.vx = force * Math.cos(f);\n          p.vy = force * Math.sin(f);\n\n          if(pJS.particles.move.out_mode == 'bounce'){\n            var pos = {\n              x: p.x + p.vx,\n              y: p.y + p.vy\n            }\n            if (pos.x + p.radius > pJS.canvas.w) p.vx = -p.vx;\n            else if (pos.x - p.radius < 0) p.vx = -p.vx;\n            if (pos.y + p.radius > pJS.canvas.h) p.vy = -p.vy;\n            else if (pos.y - p.radius < 0) p.vy = -p.vy;\n          }\n\n        }\n\n        // default\n        if(d <= repulseRadius){\n          process();\n        }\n\n        // bang - slow motion mode\n        // if(!pJS.tmp.repulse_finish){\n        //   if(d <= repulseRadius){\n        //     process();\n        //   }\n        // }else{\n        //   process();\n        // }\n        \n\n      }else{\n\n        if(pJS.tmp.repulse_clicking == false){\n\n          p.vx = p.vx_i;\n          p.vy = p.vy_i;\n        \n        }\n\n      }\n\n    }\n\n  }\n\n\n  pJS.fn.modes.grabParticle = function(p){\n\n    if(pJS.interactivity.events.onhover.enable && pJS.interactivity.status == 'mousemove'){\n\n      var dx_mouse = p.x - pJS.interactivity.mouse.pos_x,\n          dy_mouse = p.y - pJS.interactivity.mouse.pos_y,\n          dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse);\n\n      /* draw a line between the cursor and the particle if the distance between them is under the config distance */\n      if(dist_mouse <= pJS.interactivity.modes.grab.distance){\n\n        var opacity_line = pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1/pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance;\n\n        if(opacity_line > 0){\n\n          /* style */\n          var color_line = pJS.particles.line_linked.color_rgb_line;\n          pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')';\n          pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width;\n          //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */\n          \n          /* path */\n          pJS.canvas.ctx.beginPath();\n          pJS.canvas.ctx.moveTo(p.x, p.y);\n          pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y);\n          pJS.canvas.ctx.stroke();\n          pJS.canvas.ctx.closePath();\n\n        }\n\n      }\n\n    }\n\n  };\n\n\n\n  /* ---------- pJS functions - vendors ------------ */\n\n  pJS.fn.vendors.eventsListeners = function(){\n\n    /* events target element */\n    if(pJS.interactivity.detect_on == 'window'){\n      pJS.interactivity.el = window;\n    }else{\n      pJS.interactivity.el = pJS.canvas.el;\n    }\n\n\n    /* detect mouse pos - on hover / click event */\n    if(pJS.interactivity.events.onhover.enable || pJS.interactivity.events.onclick.enable){\n\n      /* el on mousemove */\n      pJS.interactivity.el.addEventListener('mousemove', function(e){\n\n        if(pJS.interactivity.el == window){\n          var pos_x = e.clientX,\n              pos_y = e.clientY;\n        }\n        else{\n          var pos_x = e.offsetX || e.clientX,\n              pos_y = e.offsetY || e.clientY;\n        }\n\n        pJS.interactivity.mouse.pos_x = pos_x;\n        pJS.interactivity.mouse.pos_y = pos_y;\n\n        if(pJS.tmp.retina){\n          pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio;\n          pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio;\n        }\n\n        pJS.interactivity.status = 'mousemove';\n\n      });\n\n      /* el on onmouseleave */\n      pJS.interactivity.el.addEventListener('mouseleave', function(e){\n\n        pJS.interactivity.mouse.pos_x = null;\n        pJS.interactivity.mouse.pos_y = null;\n        pJS.interactivity.status = 'mouseleave';\n\n      });\n\n    }\n\n    /* on click event */\n    if(pJS.interactivity.events.onclick.enable){\n\n      pJS.interactivity.el.addEventListener('click', function(){\n\n        pJS.interactivity.mouse.click_pos_x = pJS.interactivity.mouse.pos_x;\n        pJS.interactivity.mouse.click_pos_y = pJS.interactivity.mouse.pos_y;\n        pJS.interactivity.mouse.click_time = new Date().getTime();\n\n        if(pJS.interactivity.events.onclick.enable){\n\n          switch(pJS.interactivity.events.onclick.mode){\n\n            case 'push':\n              if(pJS.particles.move.enable){\n                pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse);\n              }else{\n                if(pJS.interactivity.modes.push.particles_nb == 1){\n                  pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse);\n                }\n                else if(pJS.interactivity.modes.push.particles_nb > 1){\n                  pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb);\n                }\n              }\n            break;\n\n            case 'remove':\n              pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb);\n            break;\n\n            case 'bubble':\n              pJS.tmp.bubble_clicking = true;\n            break;\n\n            case 'repulse':\n              pJS.tmp.repulse_clicking = true;\n              pJS.tmp.repulse_count = 0;\n              pJS.tmp.repulse_finish = false;\n              setTimeout(function(){\n                pJS.tmp.repulse_clicking = false;\n              }, pJS.interactivity.modes.repulse.duration*1000)\n            break;\n\n          }\n\n        }\n\n      });\n        \n    }\n\n\n  };\n\n  pJS.fn.vendors.densityAutoParticles = function(){\n\n    if(pJS.particles.number.density.enable){\n\n      /* calc area */\n      var area = pJS.canvas.el.width * pJS.canvas.el.height / 1000;\n      if(pJS.tmp.retina){\n        area = area/(pJS.canvas.pxratio*2);\n      }\n\n      /* calc number of particles based on density area */\n      var nb_particles = area * pJS.particles.number.value / pJS.particles.number.density.value_area;\n\n      /* add or remove X particles */\n      var missing_particles = pJS.particles.array.length - nb_particles;\n      if(missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles));\n      else pJS.fn.modes.removeParticles(missing_particles);\n\n    }\n\n  };\n\n\n  pJS.fn.vendors.checkOverlap = function(p1, position){\n    for(var i = 0; i < pJS.particles.array.length; i++){\n      var p2 = pJS.particles.array[i];\n\n      var dx = p1.x - p2.x,\n          dy = p1.y - p2.y,\n          dist = Math.sqrt(dx*dx + dy*dy);\n\n      if(dist <= p1.radius + p2.radius){\n        p1.x = position ? position.x : Math.random() * pJS.canvas.w;\n        p1.y = position ? position.y : Math.random() * pJS.canvas.h;\n        pJS.fn.vendors.checkOverlap(p1);\n      }\n    }\n  };\n\n\n  pJS.fn.vendors.createSvgImg = function(p){\n\n    /* set color to svg element */\n    var svgXml = pJS.tmp.source_svg,\n        rgbHex = /#([0-9A-F]{3,6})/gi,\n        coloredSvgXml = svgXml.replace(rgbHex, function (m, r, g, b) {\n          if(p.color.rgb){\n            var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+p.opacity+')';\n          }else{\n            var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+p.opacity+')';\n          }\n          return color_value;\n        });\n\n    /* prepare to create img with colored svg */\n    var svg = new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}),\n        DOMURL = window.URL || window.webkitURL || window,\n        url = DOMURL.createObjectURL(svg);\n\n    /* create particle img obj */\n    var img = new Image();\n    img.addEventListener('load', function(){\n      p.img.obj = img;\n      p.img.loaded = true;\n      DOMURL.revokeObjectURL(url);\n      pJS.tmp.count_svg++;\n    });\n    img.src = url;\n\n  };\n\n\n  pJS.fn.vendors.destroypJS = function(){\n    cancelAnimationFrame(pJS.fn.drawAnimFrame);\n    canvas_el.remove();\n    pJSDom = null;\n  };\n\n\n  pJS.fn.vendors.drawShape = function(c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator){\n\n    // By Programming Thomas - https://programmingthomas.wordpress.com/2013/04/03/n-sided-shapes/\n    var sideCount = sideCountNumerator * sideCountDenominator;\n    var decimalSides = sideCountNumerator / sideCountDenominator;\n    var interiorAngleDegrees = (180 * (decimalSides - 2)) / decimalSides;\n    var interiorAngle = Math.PI - Math.PI * interiorAngleDegrees / 180; // convert to radians\n    c.save();\n    c.beginPath();\n    c.translate(startX, startY);\n    c.moveTo(0,0);\n    for (var i = 0; i < sideCount; i++) {\n      c.lineTo(sideLength,0);\n      c.translate(sideLength,0);\n      c.rotate(interiorAngle);\n    }\n    //c.stroke();\n    c.fill();\n    c.restore();\n\n  };\n\n  pJS.fn.vendors.exportImg = function(){\n    window.open(pJS.canvas.el.toDataURL('image/png'), '_blank');\n  };\n\n\n  pJS.fn.vendors.loadImg = function(type){\n\n    pJS.tmp.img_error = undefined;\n\n    if(pJS.particles.shape.image.src != ''){\n\n      if(type == 'svg'){\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', pJS.particles.shape.image.src);\n        xhr.onreadystatechange = function (data) {\n          if(xhr.readyState == 4){\n            if(xhr.status == 200){\n              pJS.tmp.source_svg = data.currentTarget.response;\n              pJS.fn.vendors.checkBeforeDraw();\n            }else{\n              console.log('Error pJS - Image not found');\n              pJS.tmp.img_error = true;\n            }\n          }\n        }\n        xhr.send();\n\n      }else{\n\n        var img = new Image();\n        img.addEventListener('load', function(){\n          pJS.tmp.img_obj = img;\n          pJS.fn.vendors.checkBeforeDraw();\n        });\n        img.src = pJS.particles.shape.image.src;\n\n      }\n\n    }else{\n      console.log('Error pJS - No image.src');\n      pJS.tmp.img_error = true;\n    }\n\n  };\n\n\n  pJS.fn.vendors.draw = function(){\n\n    if(pJS.particles.shape.type == 'image'){\n\n      if(pJS.tmp.img_type == 'svg'){\n\n        if(pJS.tmp.count_svg >= pJS.particles.number.value){\n          pJS.fn.particlesDraw();\n          if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame);\n          else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);\n        }else{\n          //console.log('still loading...');\n          if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);\n        }\n\n      }else{\n\n        if(pJS.tmp.img_obj != undefined){\n          pJS.fn.particlesDraw();\n          if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame);\n          else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);\n        }else{\n          if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);\n        }\n\n      }\n\n    }else{\n      pJS.fn.particlesDraw();\n      if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame);\n      else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);\n    }\n\n  };\n\n\n  pJS.fn.vendors.checkBeforeDraw = function(){\n\n    // if shape is image\n    if(pJS.particles.shape.type == 'image'){\n\n      if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg == undefined){\n        pJS.tmp.checkAnimFrame = requestAnimFrame(check);\n      }else{\n        //console.log('images loaded! cancel check');\n        cancelRequestAnimFrame(pJS.tmp.checkAnimFrame);\n        if(!pJS.tmp.img_error){\n          pJS.fn.vendors.init();\n          pJS.fn.vendors.draw();\n        }\n        \n      }\n\n    }else{\n      pJS.fn.vendors.init();\n      pJS.fn.vendors.draw();\n    }\n\n  };\n\n\n  pJS.fn.vendors.init = function(){\n\n    /* init canvas + particles */\n    pJS.fn.retinaInit();\n    pJS.fn.canvasInit();\n    pJS.fn.canvasSize();\n    pJS.fn.canvasPaint();\n    pJS.fn.particlesCreate();\n    pJS.fn.vendors.densityAutoParticles();\n\n    /* particles.line_linked - convert hex colors to rgb */\n    pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color);\n\n  };\n\n\n  pJS.fn.vendors.start = function(){\n\n    if(isInArray('image', pJS.particles.shape.type)){\n      pJS.tmp.img_type = pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3);\n      pJS.fn.vendors.loadImg(pJS.tmp.img_type);\n    }else{\n      pJS.fn.vendors.checkBeforeDraw();\n    }\n\n  };\n\n\n\n\n  /* ---------- pJS - start ------------ */\n\n\n  pJS.fn.vendors.eventsListeners();\n\n  pJS.fn.vendors.start();\n  \n\n\n};\n\n/* ---------- global functions - vendors ------------ */\n\nObject.deepExtend = function(destination, source) {\n  for (var property in source) {\n    if (source[property] && source[property].constructor &&\n     source[property].constructor === Object) {\n      destination[property] = destination[property] || {};\n      arguments.callee(destination[property], source[property]);\n    } else {\n      destination[property] = source[property];\n    }\n  }\n  return destination;\n};\n\nwindow.requestAnimFrame = (function(){\n  return  window.requestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.mozRequestAnimationFrame    ||\n    window.oRequestAnimationFrame      ||\n    window.msRequestAnimationFrame     ||\n    function(callback){\n      window.setTimeout(callback, 1000 / 60);\n    };\n})();\n\nwindow.cancelRequestAnimFrame = ( function() {\n  return window.cancelAnimationFrame         ||\n    window.webkitCancelRequestAnimationFrame ||\n    window.mozCancelRequestAnimationFrame    ||\n    window.oCancelRequestAnimationFrame      ||\n    window.msCancelRequestAnimationFrame     ||\n    clearTimeout\n} )();\n\nfunction hexToRgb(hex){\n  // By Tim Down - http://stackoverflow.com/a/5624139/3493650\n  // Expand shorthand form (e.g. \"03F\") to full form (e.g. \"0033FF\")\n  var shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n  hex = hex.replace(shorthandRegex, function(m, r, g, b) {\n     return r + r + g + g + b + b;\n  });\n  var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result ? {\n      r: parseInt(result[1], 16),\n      g: parseInt(result[2], 16),\n      b: parseInt(result[3], 16)\n  } : null;\n};\n\nfunction clamp(number, min, max) {\n  return Math.min(Math.max(number, min), max);\n};\n\nfunction isInArray(value, array) {\n  return array.indexOf(value) > -1;\n}\n\n\n/* ---------- particles.js functions - start ------------ */\n\nwindow.pJSDom = [];\n\nwindow.particlesJS = function(tag_id, params){\n\n  //console.log(params);\n\n  /* no string id? so it's object params, and set the id with default id */\n  if(typeof(tag_id) != 'string'){\n    params = tag_id;\n    tag_id = 'particles-js';\n  }\n\n  /* no id? set the id to default id */\n  if(!tag_id){\n    tag_id = 'particles-js';\n  }\n\n  /* pJS elements */\n  var pJS_tag = document.getElementById(tag_id),\n      pJS_canvas_class = 'particles-js-canvas-el',\n      exist_canvas = pJS_tag.getElementsByClassName(pJS_canvas_class);\n\n  /* remove canvas if exists into the pJS target tag */\n  if(exist_canvas.length){\n    while(exist_canvas.length > 0){\n      pJS_tag.removeChild(exist_canvas[0]);\n    }\n  }\n\n  /* create canvas element */\n  var canvas_el = document.createElement('canvas');\n  canvas_el.className = pJS_canvas_class;\n\n  /* set size canvas */\n  canvas_el.style.width = \"100%\";\n  canvas_el.style.height = \"100%\";\n\n  /* append canvas */\n  var canvas = document.getElementById(tag_id).appendChild(canvas_el);\n\n  /* launch particle.js */\n  if(canvas != null){\n    pJSDom.push(new pJS(tag_id, params));\n  }\n\n};\n\nwindow.particlesJS.load = function(tag_id, path_config_json, callback){\n\n  /* load json config */\n  var xhr = new XMLHttpRequest();\n  xhr.open('GET', path_config_json);\n  xhr.onreadystatechange = function (data) {\n    if(xhr.readyState == 4){\n      if(xhr.status == 200){\n        var params = JSON.parse(data.currentTarget.response);\n        window.particlesJS(tag_id, params);\n        if(callback) callback();\n      }else{\n        console.log('Error pJS - XMLHttpRequest status: '+xhr.status);\n        console.log('Error pJS - File config not found');\n      }\n    }\n  };\n  xhr.send();\n\n};"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/popper/esm/popper-utils.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/popper/esm/popper.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/popper/popper-utils.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/popper/popper.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/popper/umd/popper-utils.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/plugins/popper/umd/popper.js",
    "content": ""
  },
  {
    "path": "src/main/resources/static/admin/dist/js/profile.js",
    "content": "$(function () {\n    //修改个人信息\n    $('#updateUserNameButton').click(function () {\n        $(\"#updateUserNameButton\").attr(\"disabled\",true);\n        var userName = $('#loginUserName').val();\n        var nickName = $('#nickName').val();\n        if (validUserNameForUpdate(userName, nickName)) {\n            //ajax提交数据\n            var params = $(\"#userNameForm\").serialize();\n            $.ajax({\n                type: \"POST\",\n                url: \"/admin/profile/name\",\n                data: params,\n                success: function (r) {\n                    $(\"#updateUserNameButton\").attr(\"disabled\",false);\n                    console.log(r);\n                    if (r == 'success') {\n                        alert('修改成功');\n                    } else {\n                        alert('修改失败');\n                    }\n                }\n            });\n        }else{\n            $(\"#updateUserNameButton\").attr(\"disabled\",false);\n        }\n\n    });\n    //修改密码\n    $('#updatePasswordButton').click(function () {\n        $(\"#updatePasswordButton\").attr(\"disabled\",true);\n        var originalPassword = $('#originalPassword').val();\n        var newPassword = $('#newPassword').val();\n        if (validPasswordForUpdate(originalPassword, newPassword)) {\n            var params = $(\"#userPasswordForm\").serialize();\n            $.ajax({\n                type: \"POST\",\n                url: \"/admin/profile/password\",\n                data: params,\n                success: function (r) {\n                    $(\"#updatePasswordButton\").attr(\"disabled\",false);\n                    console.log(r);\n                    if (r == 'success') {\n                        alert('修改成功');\n                        window.location.href = '/admin/login';\n                    } else {\n                        alert('修改失败');\n                    }\n                }\n            });\n        }else {\n            $(\"#updatePasswordButton\").attr(\"disabled\",false);\n        }\n\n    });\n})\n\n/**\n * 名称验证\n */\nfunction validUserNameForUpdate(userName, nickName) {\n    if (isNull(userName) || userName.trim().length < 1) {\n        $('#updateUserName-info').css(\"display\", \"block\");\n        $('#updateUserName-info').html(\"请输入登陆名称！\");\n        return false;\n    }\n    if (isNull(nickName) || nickName.trim().length < 1) {\n        $('#updateUserName-info').css(\"display\", \"block\");\n        $('#updateUserName-info').html(\"昵称不能为空！\");\n        return false;\n    }\n    if (!validUserName(userName)) {\n        $('#updateUserName-info').css(\"display\", \"block\");\n        $('#updateUserName-info').html(\"请输入符合规范的登录名！\");\n        return false;\n    }\n    if (!validCN_ENString2_18(nickName)) {\n        $('#updateUserName-info').css(\"display\", \"block\");\n        $('#updateUserName-info').html(\"请输入符合规范的昵称！\");\n        return false;\n    }\n    return true;\n}\n\n/**\n * 密码验证\n */\nfunction validPasswordForUpdate(originalPassword, newPassword) {\n    if (isNull(originalPassword) || originalPassword.trim().length < 1) {\n        $('#updatePassword-info').css(\"display\", \"block\");\n        $('#updatePassword-info').html(\"请输入原密码！\");\n        return false;\n    }\n    if (isNull(newPassword) || newPassword.trim().length < 1) {\n        $('#updatePassword-info').css(\"display\", \"block\");\n        $('#updatePassword-info').html(\"新密码不能为空！\");\n        return false;\n    }\n    if (!validPassword(newPassword)) {\n        $('#updatePassword-info').css(\"display\", \"block\");\n        $('#updatePassword-info').html(\"请输入符合规范的密码！\");\n        return false;\n    }\n    return true;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/public.js",
    "content": "<!-- 正则验证 start-->\n/**\n * 判空\n *\n * @param obj\n * @returns {boolean}\n */\nfunction isNull(obj) {\n    if (obj == null || obj == undefined || obj.trim() == \"\") {\n        return true;\n    }\n    return false;\n}\n\n/**\n * 参数长度验证\n *\n * @param obj\n * @param length\n * @returns {boolean}\n */\nfunction validLength(obj, length) {\n    if (obj.trim().length < length) {\n        return true;\n    }\n    return false;\n}\n\n/**\n * url验证\n *\n * @param str\n * @returns {boolean}\n */\nfunction isURL(str_url) {\n    var strRegex = \"^((https|http|ftp|rtsp|mms)?://)\"\n        + \"(([0-9]{1,3}\\.){3}[0-9]{1,3}\"\n        + \"|\"\n        + \"([0-9a-zA-Z_!~*'()-]+\\.)*\"\n        + \"([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z]\\.\"\n        + \"[a-zA-Z]{2,6})\"\n        + \"(:[0-9]{1,4})?\"\n        + \"((/?)|\"\n        + \"(/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+/?)$\";\n    var re = new RegExp(strRegex);\n    if (re.test(str_url)) {\n        return (true);\n    } else {\n        return (false);\n    }\n}\n\n/**\n * 用户名称验证 4到16位（字母，数字，下划线，减号）\n *\n * @param userName\n * @returns {boolean}\n */\nfunction validUserName(userName) {\n    var pattern = /^[a-zA-Z0-9_-]{4,16}$/;\n    if (pattern.test(userName.trim())) {\n        return (true);\n    } else {\n        return (false);\n    }\n}\n\n/**\n * 手机号正则验证\n * @returns {boolean}\n */\nfunction validPhoneNumber(phone) {\n    if ((/^1(3|4|5|6|7|8|9)\\d{9}$/.test(phone))) {\n        return true;\n    }\n    return false;\n}\n\n/**\n * 正则匹配2-18位的中英文字符串\n *\n * @param str\n * @returns {boolean}\n */\nfunction validCN_ENString2_18(str) {\n    var pattern = /^[a-zA-Z0-9-\\u4E00-\\u9FA5_,， ]{2,18}$/;\n    if (pattern.test(str.trim())) {\n        return (true);\n    } else {\n        return (false);\n    }\n}\n\n/**\n * 正则匹配2-100位的中英文字符串\n *\n * @param str\n * @returns {boolean}\n */\nfunction validCN_ENString2_100(str) {\n    var pattern = /^[a-zA-Z0-9-\\u4E00-\\u9FA5_,， ]{2,100}$/;\n    if (pattern.test(str.trim())) {\n        return (true);\n    } else {\n        return (false);\n    }\n}\n\n/**\n * 用户密码验证 最少6位，最多20位字母或数字的组合\n *\n * @param password\n * @returns {boolean}\n */\nfunction validPassword(password) {\n    var pattern = /^[a-zA-Z0-9]{6,20}$/;\n    if (pattern.test(password.trim())) {\n        return (true);\n    } else {\n        return (false);\n    }\n}\n\n<!-- 正则验证 end-->\n\n/**\n * 获取jqGrid选中的一条记录\n * @returns {*}\n */\nfunction getSelectedRow() {\n    var grid = $(\"#jqGrid\");\n    var rowKey = grid.getGridParam(\"selrow\");\n    if (!rowKey) {\n        Swal.fire({\n            text: \"请选择一条记录\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n        });\n        return;\n    }\n    var selectedIDs = grid.getGridParam(\"selarrrow\");\n    if (selectedIDs.length > 1) {\n        Swal.fire({\n            text: \"只能选择一条记录\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n        });\n        return;\n    }\n    return selectedIDs[0];\n}\n\n/**\n * 获取jqGrid选中的一条记录(不出现弹框)\n * @returns {*}\n */\nfunction getSelectedRowWithoutAlert() {\n    var grid = $(\"#jqGrid\");\n    var rowKey = grid.getGridParam(\"selrow\");\n    if (!rowKey) {\n        return;\n    }\n    var selectedIDs = grid.getGridParam(\"selarrrow\");\n    if (selectedIDs.length > 1) {\n        return;\n    }\n    return selectedIDs[0];\n}\n\n/**\n * 获取jqGrid选中的多条记录\n * @returns {*}\n */\nfunction getSelectedRows() {\n    var grid = $(\"#jqGrid\");\n    var rowKey = grid.getGridParam(\"selrow\");\n    if (!rowKey) {\n        Swal.fire({\n            text: \"请选择一条记录\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n        });\n        return;\n    }\n    return grid.getGridParam(\"selarrrow\");\n}"
  },
  {
    "path": "src/main/resources/static/admin/dist/js/test.js",
    "content": "$(function () {\n    new AjaxUpload('#uploadButton', {\n        action: '/admin/upload/file',\n        name: 'file',\n        autoSubmit: true,\n        responseType: \"json\",\n        onSubmit: function (file, extension) {\n            if (!(extension && /^(jpg|jpeg|png|gif)$/.test(extension.toLowerCase()))) {\n                alert('只支持jpg、png、gif格式的文件！');\n                return false;\n            }\n        },\n        onComplete: function (file, r) {\n            if (r != null && r.resultCode == 200) {\n                console.log(r.data);\n                $(\"#img\").attr(\"src\", r.data);\n                $(\"#img\").attr(\"style\", \"width: 100px;display:block;\");\n                return false;\n            } else {\n                alert(\"error\");\n            }\n        }\n    });\n});"
  },
  {
    "path": "src/main/resources/static/admin/plugins/ajaxupload/ajaxupload.js",
    "content": "/**\n * AJAX Upload ( http://valums.com/ajax-upload/ ) \n * Copyright (c) Andris Valums\n * Licensed under the MIT license ( http://valums.com/mit-license/ )\n * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions \n */\n(function () {\n    /* global window */\n    /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */\n    \n    /**\n     * Wrapper for FireBug's console.log\n     */\n    function log(){\n        if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){            \n            Array.prototype.unshift.call(arguments, '[Ajax Upload]');\n            console.log( Array.prototype.join.call(arguments, ' '));\n        }\n    } \n\n    /**\n     * Attaches event to a dom element.\n     * @param {Element} el\n     * @param type event name\n     * @param fn callback This refers to the passed element\n     */\n    function addEvent(el, type, fn){\n        if (el.addEventListener) {\n            el.addEventListener(type, fn, false);\n        } else if (el.attachEvent) {\n            el.attachEvent('on' + type, function(){\n                fn.call(el);\n\t        });\n\t    } else {\n            throw new Error('not supported or DOM not loaded');\n        }\n    }   \n    \n    /**\n     * Attaches resize event to a window, limiting\n     * number of event fired. Fires only when encounteres\n     * delay of 100 after series of events.\n     * \n     * Some browsers fire event multiple times when resizing\n     * http://www.quirksmode.org/dom/events/resize.html\n     * \n     * @param fn callback This refers to the passed element\n     */\n    function addResizeEvent(fn){\n        var timeout;\n               \n\t    addEvent(window, 'resize', function(){\n            if (timeout){\n                clearTimeout(timeout);\n            }\n            timeout = setTimeout(fn, 100);                        \n        });\n    }    \n    \n    // Needs more testing, will be rewriten for next version        \n    // getOffset function copied from jQuery lib (http://jquery.com/)\n    if (document.documentElement.getBoundingClientRect){\n        // Get Offset using getBoundingClientRect\n        // http://ejohn.org/blog/getboundingclientrect-is-awesome/\n        var getOffset = function(el){\n            var box = el.getBoundingClientRect();\n            var doc = el.ownerDocument;\n            var body = doc.body;\n            var docElem = doc.documentElement; // for ie \n            var clientTop = docElem.clientTop || body.clientTop || 0;\n            var clientLeft = docElem.clientLeft || body.clientLeft || 0;\n             \n            // In Internet Explorer 7 getBoundingClientRect property is treated as physical,\n            // while others are logical. Make all logical, like in IE8.\t\n            var zoom = 1;            \n            if (body.getBoundingClientRect) {\n                var bound = body.getBoundingClientRect();\n                zoom = (bound.right - bound.left) / body.clientWidth;\n            }\n            \n            if (zoom > 1) {\n                clientTop = 0;\n                clientLeft = 0;\n            }\n            \n            var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;\n            \n            return {\n                top: top,\n                left: left\n            };\n        };        \n    } else {\n        // Get offset adding all offsets \n        var getOffset = function(el){\n            var top = 0, left = 0;\n            do {\n                top += el.offsetTop || 0;\n                left += el.offsetLeft || 0;\n                el = el.offsetParent;\n            } while (el);\n            \n            return {\n                left: left,\n                top: top\n            };\n        };\n    }\n    \n    /**\n     * Returns left, top, right and bottom properties describing the border-box,\n     * in pixels, with the top-left relative to the body\n     * @param {Element} el\n     * @return {Object} Contains left, top, right,bottom\n     */\n    function getBox(el){\n        var left, right, top, bottom;\n        var offset = getOffset(el);\n        left = offset.left;\n        top = offset.top;\n        \n        right = left + el.offsetWidth;\n        bottom = top + el.offsetHeight;\n        \n        return {\n            left: left,\n            right: right,\n            top: top,\n            bottom: bottom\n        };\n    }\n    \n    /**\n     * Helper that takes object literal\n     * and add all properties to element.style\n     * @param {Element} el\n     * @param {Object} styles\n     */\n    function addStyles(el, styles){\n        for (var name in styles) {\n            if (styles.hasOwnProperty(name)) {\n                el.style[name] = styles[name];\n            }\n        }\n    }\n        \n    /**\n     * Function places an absolutely positioned\n     * element on top of the specified element\n     * copying position and dimentions.\n     * @param {Element} from\n     * @param {Element} to\n     */    \n    function copyLayout(from, to){\n\t    var box = getBox(from);\n        \n        addStyles(to, {\n\t        position: 'absolute',                    \n\t        left : box.left + 'px',\n\t        top : box.top + 'px',\n\t        width : from.offsetWidth + 'px',\n\t        height : from.offsetHeight + 'px'\n\t    });        \n    }\n\n    /**\n    * Creates and returns element from html chunk\n    * Uses innerHTML to create an element\n    */\n    var toElement = (function(){\n        var div = document.createElement('div');\n        return function(html){\n            div.innerHTML = html;\n            var el = div.firstChild;\n            return div.removeChild(el);\n        };\n    })();\n            \n    /**\n     * Function generates unique id\n     * @return unique id \n     */\n    var getUID = (function(){\n        var id = 0;\n        return function(){\n            return 'ValumsAjaxUpload' + id++;\n        };\n    })();        \n \n    /**\n     * Get file name from path\n     * @param {String} file path to file\n     * @return filename\n     */  \n    function fileFromPath(file){\n        return file.replace(/.*(\\/|\\\\)/, \"\");\n    }\n    \n    /**\n     * Get file extension lowercase\n     * @param {String} file name\n     * @return file extenstion\n     */    \n    function getExt(file){\n        return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';\n    }\n\n    function hasClass(el, name){        \n        var re = new RegExp('\\\\b' + name + '\\\\b');        \n        return re.test(el.className);\n    }    \n    function addClass(el, name){\n        if ( ! hasClass(el, name)){   \n            el.className += ' ' + name;\n        }\n    }    \n    function removeClass(el, name){\n        var re = new RegExp('\\\\b' + name + '\\\\b');                \n        el.className = el.className.replace(re, '');        \n    }\n    \n    function removeNode(el){\n        el.parentNode.removeChild(el);\n    }\n\n    /**\n     * Easy styling and uploading\n     * @constructor\n     * @param button An element you want convert to \n     * upload button. Tested dimentions up to 500x500px\n     * @param {Object} options See defaults below.\n     */\n\n    window.AjaxUpload = function(button, options){\n        this._settings = {\n            // Location of the server-side upload script\n            action: 'upload.php',\n            // File upload name\n            name: 'userfile',\n            // Additional data to send\n            data: {},\n            // Submit file as soon as it's selected\n            autoSubmit: true,\n            // The type of data that you're expecting back from the server.\n            // html and xml are detected automatically.\n            // Only useful when you are using json data as a response.\n            // Set to \"json\" in that case. \n            responseType: false,\n            // Class applied to button when mouse is hovered\n            hoverClass: 'hover',\n            // Class applied to button when AU is disabled\n            disabledClass: 'disabled',            \n            // When user selects a file, useful with autoSubmit disabled\n            // You can return false to cancel upload\t\t\t\n            onChange: function(file, extension){\n            },\n            // Callback to fire before file is uploaded\n            // You can return false to cancel upload\n            onSubmit: function(file, extension){\n            },\n            // Fired when file upload is completed\n            // WARNING! DO NOT USE \"FALSE\" STRING AS A RESPONSE!\n            onComplete: function(file, response){\n            }\n        };\n                        \n        // Merge the users options with our defaults\n        for (var i in options) {\n            if (options.hasOwnProperty(i)){\n                this._settings[i] = options[i];\n            }\n        }\n                \n        // button isn't necessary a dom element\n        if (button.jquery){\n            // jQuery object was passed\n            button = button[0];\n        } else if (typeof button == \"string\") {\n            if (/^#.*/.test(button)){\n                // If jQuery user passes #elementId don't break it\t\t\t\t\t\n                button = button.slice(1);                \n            }\n            \n            button = document.getElementById(button);\n        }\n        \n        if ( ! button || button.nodeType !== 1){\n            throw new Error(\"Please make sure that you're passing a valid element\"); \n        }\n                \n        if ( button.nodeName.toUpperCase() == 'A'){\n            // disable link                       \n            addEvent(button, 'click', function(e){\n                if (e && e.preventDefault){\n                    e.preventDefault();\n                } else if (window.event){\n                    window.event.returnValue = false;\n                }\n            });\n        }\n                    \n        // DOM element\n        this._button = button;        \n        // DOM element                 \n        this._input = null;\n        // If disabled clicking on button won't do anything\n        this._disabled = false;\n        \n        // if the button was disabled before refresh if will remain\n        // disabled in FireFox, let's fix it\n        this.enable();        \n        \n        this._rerouteClicks();\n    };\n    \n    // assigning methods to our class\n    AjaxUpload.prototype = {\n        setData: function(data){\n            this._settings.data = data;\n        },\n        disable: function(){            \n            addClass(this._button, this._settings.disabledClass);\n            this._disabled = true;\n            \n            var nodeName = this._button.nodeName.toUpperCase();            \n            if (nodeName == 'INPUT' || nodeName == 'BUTTON'){\n                this._button.setAttribute('disabled', 'disabled');\n            }            \n            \n            // hide input\n            if (this._input){\n                // We use visibility instead of display to fix problem with Safari 4\n                // The problem is that the value of input doesn't change if it \n                // has display none when user selects a file           \n                this._input.parentNode.style.visibility = 'hidden';\n            }\n        },\n        enable: function(){\n            removeClass(this._button, this._settings.disabledClass);\n            this._button.removeAttribute('disabled');\n            this._disabled = false;\n            \n        },\n        /**\n         * Creates invisible file input \n         * that will hover above the button\n         * <div><input type='file' /></div>\n         */\n        _createInput: function(){ \n            var self = this;\n                        \n            var input = document.createElement(\"input\");\n            input.setAttribute('type', 'file');\n            input.setAttribute('name', this._settings.name);\n            \n            addStyles(input, {\n                'position' : 'absolute',\n                // in Opera only 'browse' button\n                // is clickable and it is located at\n                // the right side of the input\n                'right' : 0,\n                'margin' : 0,\n                'padding' : 0,\n                'fontSize' : '480px',                \n                'cursor' : 'pointer'\n            });            \n\n            var div = document.createElement(\"div\");                        \n            addStyles(div, {\n                'display' : 'block',\n                'position' : 'absolute',\n                'overflow' : 'hidden',\n                'margin' : 0,\n                'padding' : 0,                \n                'opacity' : 0,\n                // Make sure browse button is in the right side\n                // in Internet Explorer\n                'direction' : 'ltr',\n                //Max zIndex supported by Opera 9.0-9.2\n                'zIndex': 2147483583\n            });\n            \n            // Make sure that element opacity exists.\n            // Otherwise use IE filter            \n            if ( div.style.opacity !== \"0\") {\n                if (typeof(div.filters) == 'undefined'){\n                    throw new Error('Opacity not supported by the browser');\n                }\n                div.style.filter = \"alpha(opacity=0)\";\n            }            \n            \n            addEvent(input, 'change', function(){\n                 \n                if ( ! input || input.value === ''){                \n                    return;                \n                }\n                            \n                // Get filename from input, required                \n                // as some browsers have path instead of it          \n                var file = fileFromPath(input.value);\n                                \n                if (false === self._settings.onChange.call(self, file, getExt(file))){\n                    self._clearInput();                \n                    return;\n                }\n                \n                // Submit form when value is changed\n                if (self._settings.autoSubmit) {\n                    self.submit();\n                }\n            });            \n\n            addEvent(input, 'mouseover', function(){\n                addClass(self._button, self._settings.hoverClass);\n            });\n            \n            addEvent(input, 'mouseout', function(){\n                removeClass(self._button, self._settings.hoverClass);\n                \n                // We use visibility instead of display to fix problem with Safari 4\n                // The problem is that the value of input doesn't change if it \n                // has display none when user selects a file           \n                input.parentNode.style.visibility = 'hidden';\n\n            });   \n                        \n\t        div.appendChild(input);\n            document.body.appendChild(div);\n              \n            this._input = input;\n        },\n        _clearInput : function(){\n            if (!this._input){\n                return;\n            }            \n                             \n            // this._input.value = ''; Doesn't work in IE6                               \n            removeNode(this._input.parentNode);\n            this._input = null;                                                                   \n            this._createInput();\n            \n            removeClass(this._button, this._settings.hoverClass);\n        },\n        /**\n         * Function makes sure that when user clicks upload button,\n         * the this._input is clicked instead\n         */\n        _rerouteClicks: function(){\n            var self = this;\n            \n            // IE will later display 'access denied' error\n            // if you use using self._input.click()\n            // other browsers just ignore click()\n\n            addEvent(self._button, 'mouseover', function(){\n                if (self._disabled){\n                    return;\n                }\n                                \n                if ( ! self._input){\n\t                self._createInput();\n                }\n                \n                var div = self._input.parentNode;                            \n                copyLayout(self._button, div);\n                div.style.visibility = 'visible';\n                                \n            });\n            \n            \n            // commented because we now hide input on mouseleave\n            /**\n             * When the window is resized the elements \n             * can be misaligned if button position depends\n             * on window size\n             */\n            //addResizeEvent(function(){\n            //    if (self._input){\n            //        copyLayout(self._button, self._input.parentNode);\n            //    }\n            //});            \n                                         \n        },\n        /**\n         * Creates iframe with unique name\n         * @return {Element} iframe\n         */\n        _createIframe: function(){\n            // We can't use getTime, because it sometimes return\n            // same value in safari :(\n            var id = getUID();            \n             \n            // We can't use following code as the name attribute\n            // won't be properly registered in IE6, and new window\n            // on form submit will open\n            // var iframe = document.createElement('iframe');\n            // iframe.setAttribute('name', id);                        \n \n            var iframe = toElement('<iframe src=\"javascript:false;\" name=\"' + id + '\" />');\n            // src=\"javascript:false; was added\n            // because it possibly removes ie6 prompt \n            // \"This page contains both secure and nonsecure items\"\n            // Anyway, it doesn't do any harm.            \n            iframe.setAttribute('id', id);\n            \n            iframe.style.display = 'none';\n            document.body.appendChild(iframe);\n            \n            return iframe;\n        },\n        /**\n         * Creates form, that will be submitted to iframe\n         * @param {Element} iframe Where to submit\n         * @return {Element} form\n         */\n        _createForm: function(iframe){\n            var settings = this._settings;\n                        \n            // We can't use the following code in IE6\n            // var form = document.createElement('form');\n            // form.setAttribute('method', 'post');\n            // form.setAttribute('enctype', 'multipart/form-data');\n            // Because in this case file won't be attached to request                    \n            var form = toElement('<form method=\"post\" enctype=\"multipart/form-data\"></form>');\n                        \n            form.setAttribute('action', settings.action);\n            form.setAttribute('target', iframe.name);                                   \n            form.style.display = 'none';\n            document.body.appendChild(form);\n            \n            // Create hidden input element for each data key\n            for (var prop in settings.data) {\n                if (settings.data.hasOwnProperty(prop)){\n                    var el = document.createElement(\"input\");\n                    el.setAttribute('type', 'hidden');\n                    el.setAttribute('name', prop);\n                    el.setAttribute('value', settings.data[prop]);\n                    form.appendChild(el);\n                }\n            }\n            return form;\n        },\n        /**\n         * Gets response from iframe and fires onComplete event when ready\n         * @param iframe\n         * @param file Filename to use in onComplete callback \n         */\n        _getResponse : function(iframe, file){            \n            // getting response\n            var toDeleteFlag = false, self = this, settings = this._settings;   \n               \n            addEvent(iframe, 'load', function(){                \n                \n                if (// For Safari \n                    iframe.src == \"javascript:'%3Chtml%3E%3C/html%3E';\" ||\n                    // For FF, IE\n                    iframe.src == \"javascript:'<html></html>';\"){                                                                        \n                        // First time around, do not delete.\n                        // We reload to blank page, so that reloading main page\n                        // does not re-submit the post.\n                        \n                        if (toDeleteFlag) {\n                            // Fix busy state in FF3\n                            setTimeout(function(){\n                                removeNode(iframe);\n                            }, 0);\n                        }\n                                                \n                        return;\n                }\n                \n                var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;\n                \n                // fixing Opera 9.26,10.00\n                if (doc.readyState && doc.readyState != 'complete') {\n                   // Opera fires load event multiple times\n                   // Even when the DOM is not ready yet\n                   // this fix should not affect other browsers\n                   return;\n                }\n                \n                // fixing Opera 9.64\n                if (doc.body && doc.body.innerHTML == \"false\") {\n                    // In Opera 9.64 event was fired second time\n                    // when body.innerHTML changed from false \n                    // to server response approx. after 1 sec\n                    return;\n                }\n                \n                var response;\n                \n                if (doc.XMLDocument) {\n                    // response is a xml document Internet Explorer property\n                    response = doc.XMLDocument;\n                } else if (doc.body){\n                    // response is html document or plain text\n                    response = doc.body.innerHTML;\n                    \n                    if (settings.responseType && settings.responseType.toLowerCase() == 'json') {\n                        // If the document was sent as 'application/javascript' or\n                        // 'text/javascript', then the browser wraps the text in a <pre>\n                        // tag and performs html encoding on the contents.  In this case,\n                        // we need to pull the original text content from the text node's\n                        // nodeValue property to retrieve the unmangled content.\n                        // Note that IE6 only understands text/html\n                        if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {\n                            response = doc.body.firstChild.firstChild.nodeValue;\n                        }\n                        \n                        if (response) {\n                            response = eval(\"(\" + response + \")\");\n                        } else {\n                            response = {};\n                        }\n                    }\n                } else {\n                    // response is a xml document\n                    response = doc;\n                }\n                \n                settings.onComplete.call(self, file, response);\n                \n                // Reload blank page, so that reloading main page\n                // does not re-submit the post. Also, remember to\n                // delete the frame\n                toDeleteFlag = true;\n                \n                // Fix IE mixed content issue\n                iframe.src = \"javascript:'<html></html>';\";\n            });            \n        },        \n        /**\n         * Upload file contained in this._input\n         */\n        submit: function(){                        \n            var self = this, settings = this._settings;\n            \n            if ( ! this._input || this._input.value === ''){                \n                return;                \n            }\n                                    \n            var file = fileFromPath(this._input.value);\n            \n            // user returned false to cancel upload\n            if (false === settings.onSubmit.call(this, file, getExt(file))){\n                this._clearInput();                \n                return;\n            }\n            \n            // sending request    \n            var iframe = this._createIframe();\n            var form = this._createForm(iframe);\n            \n            // assuming following structure\n            // div -> input type='file'\n            removeNode(this._input.parentNode);            \n            removeClass(self._button, self._settings.hoverClass);\n                        \n            form.appendChild(this._input);\n                        \n            form.submit();\n\n            // request set, clean up                \n            removeNode(form); form = null;                          \n            removeNode(this._input); this._input = null;\n            \n            // Get response from iframe and fire onComplete event when ready\n            this._getResponse(iframe, file);            \n\n            // get ready for next request            \n            this._createInput();\n        }\n    };\n})(); \n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/bootstrap/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v4.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@-ms-viewport {\n  width: device-width;\n}\n\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: none;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "src/main/resources/static/admin/plugins/bootstrap/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v4.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\ndfn {\n  font-style: italic;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "src/main/resources/static/admin/plugins/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v4.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\ndfn {\n  font-style: italic;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.2;\n  color: inherit;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: none;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 1rem;\n  background-color: transparent;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table .table {\n  background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #212529;\n  border-color: #32383e;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #212529;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #32383e;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n  height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-sm > .input-group-append > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-lg > .input-group-append > .form-control-plaintext.btn {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(2.875rem + 2px);\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: .5rem;\n  margin-top: .1rem;\n  font-size: .875rem;\n  line-height: 1;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.8);\n  border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n  border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip, .was-validated\n.custom-select:valid ~ .valid-feedback,\n.was-validated\n.custom-select:valid ~ .valid-tooltip,\n.custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  background-color: #71dd8a;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label::before, .custom-file-input.is-valid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: .5rem;\n  margin-top: .1rem;\n  font-size: .875rem;\n  line-height: 1;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.8);\n  border-radius: .2rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n  border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  background-color: #efa2a9;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label::before, .custom-file-input.is-invalid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-flow: row wrap;\n  flex-flow: row wrap;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    -ms-flex-align: center;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n\n.btn:hover, .btn:focus {\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\n.btn:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\n.btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active {\n  background-image: none;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  background-color: transparent;\n  background-image: none;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  background-color: transparent;\n  background-image: none;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  background-color: transparent;\n  background-image: none;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  background-color: transparent;\n  background-image: none;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  background-color: transparent;\n  background-image: none;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  background-color: transparent;\n  background-image: none;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  background-color: transparent;\n  background-image: none;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  background-color: transparent;\n  background-image: none;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  border-color: transparent;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: center;\n  justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: stretch;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file:focus {\n  z-index: 3;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label,\n.input-group > .custom-file:not(:first-child) .custom-file-label::after {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  margin-bottom: 0;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: 0;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-color: #dee2e6;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: 0;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background-repeat: no-repeat;\n  background-position: center center;\n  background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n  background-size: 8px 10px;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  opacity: 0;\n}\n\n.custom-select-sm {\n  height: calc(1.8125rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 75%;\n}\n\n.custom-select-lg {\n  height: calc(2.875rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 125%;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:focus ~ .custom-file-label::after {\n  border-color: #80bdff;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(calc(2.25rem + 2px) - 1px * 2);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: 1px solid #ced4da;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  padding-left: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n.custom-range::-webkit-slider-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-range::-moz-range-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  appearance: none;\n}\n\n.custom-range::-ms-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #6c757d;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n  flex-basis: 100%;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  -ms-flex-flow: row nowrap;\n  flex-flow: row nowrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  -ms-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    -ms-flex-direction: column;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:first-child {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-top,\n  .card-group > .card:first-child .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-bottom,\n  .card-group > .card:first-child .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:last-child {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-top,\n  .card-group > .card:last-child .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-bottom,\n  .card-group > .card:last-child .card-footer {\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:only-child {\n    border-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-top,\n  .card-group > .card:only-child .card-header {\n    border-top-left-radius: 0.25rem;\n    border-top-right-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-bottom,\n  .card-group > .card:only-child .card-footer {\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {\n    border-radius: 0;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {\n    border-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n    -moz-column-count: 3;\n    column-count: 3;\n    -webkit-column-gap: 1.25rem;\n    -moz-column-gap: 1.25rem;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n\n.accordion .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n\n.accordion .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.breadcrumb {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-link:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.badge-primary[href]:hover, .badge-primary[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #0062cc;\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #6c757d;\n}\n\n.badge-secondary[href]:hover, .badge-secondary[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #545b62;\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n\n.badge-success[href]:hover, .badge-success[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #1e7e34;\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\n.badge-info[href]:hover, .badge-info[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #117a8b;\n}\n\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n\n.badge-warning[href]:hover, .badge-warning[href]:focus {\n  color: #212529;\n  text-decoration: none;\n  background-color: #d39e00;\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n\n.badge-danger[href]:hover, .badge-danger[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #bd2130;\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\n.badge-light[href]:hover, .badge-light[href]:focus {\n  color: #212529;\n  text-decoration: none;\n  background-color: #dae0e5;\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.badge-dark[href]:hover, .badge-dark[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #1d2124;\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n  color: #202326;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n}\n\n.media-body {\n  -ms-flex: 1;\n  flex: 1;\n}\n\n.list-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:hover, .list-group-item:focus {\n  z-index: 1;\n  text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:hover, .close:focus {\n  color: #000;\n  text-decoration: none;\n  opacity: .75;\n}\n\n.close:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n\n.modal-dialog-centered {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  min-height: calc(100% - (0.5rem * 2));\n}\n\n.modal-content {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 1rem;\n  border-bottom: 1px solid #e9ecef;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n  padding: 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - (1.75rem * 2));\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg {\n    max-width: 800px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top .arrow, .bs-popover-auto[x-placement^=\"top\"] .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0;\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n  bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  bottom: 1px;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right .arrow, .bs-popover-auto[x-placement^=\"right\"] .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n  left: 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  left: 1px;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n  top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  top: 1px;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left .arrow, .bs-popover-auto[x-placement^=\"left\"] .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n  right: 0;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  right: 1px;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  color: inherit;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  -ms-flex-align: center;\n  align-items: center;\n  width: 100%;\n  transition: -webkit-transform 0.6s ease;\n  transition: transform 0.6s ease;\n  transition: transform 0.6s ease, -webkit-transform 0.6s ease;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  -webkit-perspective: 1000px;\n  perspective: 1000px;\n}\n\n@media screen and (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n  position: absolute;\n  top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n  -webkit-transform: translateX(0);\n  transform: translateX(0);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-item-next.carousel-item-left,\n  .carousel-item-prev.carousel-item-right {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n  transform: translateX(100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-item-next,\n  .active.carousel-item-right {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-item-prev,\n  .active.carousel-item-left {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-duration: .6s;\n  transition-property: opacity;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  opacity: 0;\n}\n\n.carousel-fade .carousel-item-next,\n.carousel-fade .carousel-item-prev,\n.carousel-fade .carousel-item.active,\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-prev {\n  -webkit-transform: translateX(0);\n  transform: translateX(0);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-fade .carousel-item-next,\n  .carousel-fade .carousel-item-prev,\n  .carousel-fade .carousel-item.active,\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-prev {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: .9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: transparent no-repeat center center;\n  background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 10px;\n  left: 0;\n  z-index: 15;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-pack: center;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  position: relative;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n  position: absolute;\n  top: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n\n.carousel-indicators li::after {\n  position: absolute;\n  bottom: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n\n.carousel-indicators .active {\n  background-color: #fff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n\n.bg-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #0062cc !important;\n}\n\n.text-secondary {\n  color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #545b62 !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #1e7e34 !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #117a8b !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #d39e00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #bd2130 !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #dae0e5 !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #1d2124 !important;\n}\n\n.text-body {\n  color: #212529 !important;\n}\n\n.text-muted {\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "src/main/resources/static/admin/plugins/bootstrap/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v4.1.0 (https://getbootstrap.com/)\n  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n  (factory((global.bootstrap = {}),global.jQuery));\n}(this, (function (exports,$) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Util = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Private TransitionEnd Helpers\n     * ------------------------------------------------------------------------\n     */\n    var TRANSITION_END = 'transitionend';\n    var MAX_UID = 1000000;\n    var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n    function toType(obj) {\n      return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n    }\n\n    function getSpecialTransitionEndEvent() {\n      return {\n        bindType: TRANSITION_END,\n        delegateType: TRANSITION_END,\n        handle: function handle(event) {\n          if ($$$1(event.target).is(this)) {\n            return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n          }\n\n          return undefined; // eslint-disable-line no-undefined\n        }\n      };\n    }\n\n    function transitionEndEmulator(duration) {\n      var _this = this;\n\n      var called = false;\n      $$$1(this).one(Util.TRANSITION_END, function () {\n        called = true;\n      });\n      setTimeout(function () {\n        if (!called) {\n          Util.triggerTransitionEnd(_this);\n        }\n      }, duration);\n      return this;\n    }\n\n    function setTransitionEndSupport() {\n      $$$1.fn.emulateTransitionEnd = transitionEndEmulator;\n      $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n    }\n    /**\n     * --------------------------------------------------------------------------\n     * Public Util Api\n     * --------------------------------------------------------------------------\n     */\n\n\n    var Util = {\n      TRANSITION_END: 'bsTransitionEnd',\n      getUID: function getUID(prefix) {\n        do {\n          // eslint-disable-next-line no-bitwise\n          prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n        } while (document.getElementById(prefix));\n\n        return prefix;\n      },\n      getSelectorFromElement: function getSelectorFromElement(element) {\n        var selector = element.getAttribute('data-target');\n\n        if (!selector || selector === '#') {\n          selector = element.getAttribute('href') || '';\n        }\n\n        try {\n          var $selector = $$$1(document).find(selector);\n          return $selector.length > 0 ? selector : null;\n        } catch (err) {\n          return null;\n        }\n      },\n      getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n        if (!element) {\n          return 0;\n        } // Get transition-duration of the element\n\n\n        var transitionDuration = $$$1(element).css('transition-duration');\n        var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found\n\n        if (!floatTransitionDuration) {\n          return 0;\n        } // If multiple durations are defined, take the first\n\n\n        transitionDuration = transitionDuration.split(',')[0];\n        return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;\n      },\n      reflow: function reflow(element) {\n        return element.offsetHeight;\n      },\n      triggerTransitionEnd: function triggerTransitionEnd(element) {\n        $$$1(element).trigger(TRANSITION_END);\n      },\n      // TODO: Remove in v5\n      supportsTransitionEnd: function supportsTransitionEnd() {\n        return Boolean(TRANSITION_END);\n      },\n      isElement: function isElement(obj) {\n        return (obj[0] || obj).nodeType;\n      },\n      typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n        for (var property in configTypes) {\n          if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n            var expectedTypes = configTypes[property];\n            var value = config[property];\n            var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n            if (!new RegExp(expectedTypes).test(valueType)) {\n              throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n            }\n          }\n        }\n      }\n    };\n    setTransitionEndSupport();\n    return Util;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Alert = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'alert';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.alert';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Selector = {\n      DISMISS: '[data-dismiss=\"alert\"]'\n    };\n    var Event = {\n      CLOSE: \"close\" + EVENT_KEY,\n      CLOSED: \"closed\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      ALERT: 'alert',\n      FADE: 'fade',\n      SHOW: 'show'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Alert =\n    /*#__PURE__*/\n    function () {\n      function Alert(element) {\n        this._element = element;\n      } // Getters\n\n\n      var _proto = Alert.prototype;\n\n      // Public\n      _proto.close = function close(element) {\n        element = element || this._element;\n\n        var rootElement = this._getRootElement(element);\n\n        var customEvent = this._triggerCloseEvent(rootElement);\n\n        if (customEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        this._removeElement(rootElement);\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._element = null;\n      }; // Private\n\n\n      _proto._getRootElement = function _getRootElement(element) {\n        var selector = Util.getSelectorFromElement(element);\n        var parent = false;\n\n        if (selector) {\n          parent = $$$1(selector)[0];\n        }\n\n        if (!parent) {\n          parent = $$$1(element).closest(\".\" + ClassName.ALERT)[0];\n        }\n\n        return parent;\n      };\n\n      _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n        var closeEvent = $$$1.Event(Event.CLOSE);\n        $$$1(element).trigger(closeEvent);\n        return closeEvent;\n      };\n\n      _proto._removeElement = function _removeElement(element) {\n        var _this = this;\n\n        $$$1(element).removeClass(ClassName.SHOW);\n\n        if (!$$$1(element).hasClass(ClassName.FADE)) {\n          this._destroyElement(element);\n\n          return;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(element);\n        $$$1(element).one(Util.TRANSITION_END, function (event) {\n          return _this._destroyElement(element, event);\n        }).emulateTransitionEnd(transitionDuration);\n      };\n\n      _proto._destroyElement = function _destroyElement(element) {\n        $$$1(element).detach().trigger(Event.CLOSED).remove();\n      }; // Static\n\n\n      Alert._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var $element = $$$1(this);\n          var data = $element.data(DATA_KEY);\n\n          if (!data) {\n            data = new Alert(this);\n            $element.data(DATA_KEY, data);\n          }\n\n          if (config === 'close') {\n            data[config](this);\n          }\n        });\n      };\n\n      Alert._handleDismiss = function _handleDismiss(alertInstance) {\n        return function (event) {\n          if (event) {\n            event.preventDefault();\n          }\n\n          alertInstance.close(this);\n        };\n      };\n\n      _createClass(Alert, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }]);\n\n      return Alert;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Alert._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Alert;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Alert._jQueryInterface;\n    };\n\n    return Alert;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Button = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'button';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.button';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ClassName = {\n      ACTIVE: 'active',\n      BUTTON: 'btn',\n      FOCUS: 'focus'\n    };\n    var Selector = {\n      DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n      DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n      INPUT: 'input',\n      ACTIVE: '.active',\n      BUTTON: '.btn'\n    };\n    var Event = {\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n      FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY + DATA_API_KEY + \" \" + (\"blur\" + EVENT_KEY + DATA_API_KEY)\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Button =\n    /*#__PURE__*/\n    function () {\n      function Button(element) {\n        this._element = element;\n      } // Getters\n\n\n      var _proto = Button.prototype;\n\n      // Public\n      _proto.toggle = function toggle() {\n        var triggerChangeEvent = true;\n        var addAriaPressed = true;\n        var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];\n\n        if (rootElement) {\n          var input = $$$1(this._element).find(Selector.INPUT)[0];\n\n          if (input) {\n            if (input.type === 'radio') {\n              if (input.checked && $$$1(this._element).hasClass(ClassName.ACTIVE)) {\n                triggerChangeEvent = false;\n              } else {\n                var activeElement = $$$1(rootElement).find(Selector.ACTIVE)[0];\n\n                if (activeElement) {\n                  $$$1(activeElement).removeClass(ClassName.ACTIVE);\n                }\n              }\n            }\n\n            if (triggerChangeEvent) {\n              if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n                return;\n              }\n\n              input.checked = !$$$1(this._element).hasClass(ClassName.ACTIVE);\n              $$$1(input).trigger('change');\n            }\n\n            input.focus();\n            addAriaPressed = false;\n          }\n        }\n\n        if (addAriaPressed) {\n          this._element.setAttribute('aria-pressed', !$$$1(this._element).hasClass(ClassName.ACTIVE));\n        }\n\n        if (triggerChangeEvent) {\n          $$$1(this._element).toggleClass(ClassName.ACTIVE);\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._element = null;\n      }; // Static\n\n\n      Button._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          if (!data) {\n            data = new Button(this);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (config === 'toggle') {\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Button, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }]);\n\n      return Button;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n      event.preventDefault();\n      var button = event.target;\n\n      if (!$$$1(button).hasClass(ClassName.BUTTON)) {\n        button = $$$1(button).closest(Selector.BUTTON);\n      }\n\n      Button._jQueryInterface.call($$$1(button), 'toggle');\n    }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n      var button = $$$1(event.target).closest(Selector.BUTTON)[0];\n      $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Button._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Button;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Button._jQueryInterface;\n    };\n\n    return Button;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Carousel = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'carousel';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.carousel';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n    var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n    var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n    var Default = {\n      interval: 5000,\n      keyboard: true,\n      slide: false,\n      pause: 'hover',\n      wrap: true\n    };\n    var DefaultType = {\n      interval: '(number|boolean)',\n      keyboard: 'boolean',\n      slide: '(boolean|string)',\n      pause: '(string|boolean)',\n      wrap: 'boolean'\n    };\n    var Direction = {\n      NEXT: 'next',\n      PREV: 'prev',\n      LEFT: 'left',\n      RIGHT: 'right'\n    };\n    var Event = {\n      SLIDE: \"slide\" + EVENT_KEY,\n      SLID: \"slid\" + EVENT_KEY,\n      KEYDOWN: \"keydown\" + EVENT_KEY,\n      MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n      MOUSELEAVE: \"mouseleave\" + EVENT_KEY,\n      TOUCHEND: \"touchend\" + EVENT_KEY,\n      LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      CAROUSEL: 'carousel',\n      ACTIVE: 'active',\n      SLIDE: 'slide',\n      RIGHT: 'carousel-item-right',\n      LEFT: 'carousel-item-left',\n      NEXT: 'carousel-item-next',\n      PREV: 'carousel-item-prev',\n      ITEM: 'carousel-item'\n    };\n    var Selector = {\n      ACTIVE: '.active',\n      ACTIVE_ITEM: '.active.carousel-item',\n      ITEM: '.carousel-item',\n      NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n      INDICATORS: '.carousel-indicators',\n      DATA_SLIDE: '[data-slide], [data-slide-to]',\n      DATA_RIDE: '[data-ride=\"carousel\"]'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Carousel =\n    /*#__PURE__*/\n    function () {\n      function Carousel(element, config) {\n        this._items = null;\n        this._interval = null;\n        this._activeElement = null;\n        this._isPaused = false;\n        this._isSliding = false;\n        this.touchTimeout = null;\n        this._config = this._getConfig(config);\n        this._element = $$$1(element)[0];\n        this._indicatorsElement = $$$1(this._element).find(Selector.INDICATORS)[0];\n\n        this._addEventListeners();\n      } // Getters\n\n\n      var _proto = Carousel.prototype;\n\n      // Public\n      _proto.next = function next() {\n        if (!this._isSliding) {\n          this._slide(Direction.NEXT);\n        }\n      };\n\n      _proto.nextWhenVisible = function nextWhenVisible() {\n        // Don't call next when the page isn't visible\n        // or the carousel or its parent isn't visible\n        if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {\n          this.next();\n        }\n      };\n\n      _proto.prev = function prev() {\n        if (!this._isSliding) {\n          this._slide(Direction.PREV);\n        }\n      };\n\n      _proto.pause = function pause(event) {\n        if (!event) {\n          this._isPaused = true;\n        }\n\n        if ($$$1(this._element).find(Selector.NEXT_PREV)[0]) {\n          Util.triggerTransitionEnd(this._element);\n          this.cycle(true);\n        }\n\n        clearInterval(this._interval);\n        this._interval = null;\n      };\n\n      _proto.cycle = function cycle(event) {\n        if (!event) {\n          this._isPaused = false;\n        }\n\n        if (this._interval) {\n          clearInterval(this._interval);\n          this._interval = null;\n        }\n\n        if (this._config.interval && !this._isPaused) {\n          this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n        }\n      };\n\n      _proto.to = function to(index) {\n        var _this = this;\n\n        this._activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n        var activeIndex = this._getItemIndex(this._activeElement);\n\n        if (index > this._items.length - 1 || index < 0) {\n          return;\n        }\n\n        if (this._isSliding) {\n          $$$1(this._element).one(Event.SLID, function () {\n            return _this.to(index);\n          });\n          return;\n        }\n\n        if (activeIndex === index) {\n          this.pause();\n          this.cycle();\n          return;\n        }\n\n        var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n        this._slide(direction, this._items[index]);\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1(this._element).off(EVENT_KEY);\n        $$$1.removeData(this._element, DATA_KEY);\n        this._items = null;\n        this._config = null;\n        this._element = null;\n        this._interval = null;\n        this._isPaused = null;\n        this._isSliding = null;\n        this._activeElement = null;\n        this._indicatorsElement = null;\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._addEventListeners = function _addEventListeners() {\n        var _this2 = this;\n\n        if (this._config.keyboard) {\n          $$$1(this._element).on(Event.KEYDOWN, function (event) {\n            return _this2._keydown(event);\n          });\n        }\n\n        if (this._config.pause === 'hover') {\n          $$$1(this._element).on(Event.MOUSEENTER, function (event) {\n            return _this2.pause(event);\n          }).on(Event.MOUSELEAVE, function (event) {\n            return _this2.cycle(event);\n          });\n\n          if ('ontouchstart' in document.documentElement) {\n            // If it's a touch-enabled device, mouseenter/leave are fired as\n            // part of the mouse compatibility events on first tap - the carousel\n            // would stop cycling until user tapped out of it;\n            // here, we listen for touchend, explicitly pause the carousel\n            // (as if it's the second time we tap on it, mouseenter compat event\n            // is NOT fired) and after a timeout (to allow for mouse compatibility\n            // events to fire) we explicitly restart cycling\n            $$$1(this._element).on(Event.TOUCHEND, function () {\n              _this2.pause();\n\n              if (_this2.touchTimeout) {\n                clearTimeout(_this2.touchTimeout);\n              }\n\n              _this2.touchTimeout = setTimeout(function (event) {\n                return _this2.cycle(event);\n              }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);\n            });\n          }\n        }\n      };\n\n      _proto._keydown = function _keydown(event) {\n        if (/input|textarea/i.test(event.target.tagName)) {\n          return;\n        }\n\n        switch (event.which) {\n          case ARROW_LEFT_KEYCODE:\n            event.preventDefault();\n            this.prev();\n            break;\n\n          case ARROW_RIGHT_KEYCODE:\n            event.preventDefault();\n            this.next();\n            break;\n\n          default:\n        }\n      };\n\n      _proto._getItemIndex = function _getItemIndex(element) {\n        this._items = $$$1.makeArray($$$1(element).parent().find(Selector.ITEM));\n        return this._items.indexOf(element);\n      };\n\n      _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n        var isNextDirection = direction === Direction.NEXT;\n        var isPrevDirection = direction === Direction.PREV;\n\n        var activeIndex = this._getItemIndex(activeElement);\n\n        var lastItemIndex = this._items.length - 1;\n        var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n        if (isGoingToWrap && !this._config.wrap) {\n          return activeElement;\n        }\n\n        var delta = direction === Direction.PREV ? -1 : 1;\n        var itemIndex = (activeIndex + delta) % this._items.length;\n        return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n      };\n\n      _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n        var targetIndex = this._getItemIndex(relatedTarget);\n\n        var fromIndex = this._getItemIndex($$$1(this._element).find(Selector.ACTIVE_ITEM)[0]);\n\n        var slideEvent = $$$1.Event(Event.SLIDE, {\n          relatedTarget: relatedTarget,\n          direction: eventDirectionName,\n          from: fromIndex,\n          to: targetIndex\n        });\n        $$$1(this._element).trigger(slideEvent);\n        return slideEvent;\n      };\n\n      _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n        if (this._indicatorsElement) {\n          $$$1(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n\n          var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n          if (nextIndicator) {\n            $$$1(nextIndicator).addClass(ClassName.ACTIVE);\n          }\n        }\n      };\n\n      _proto._slide = function _slide(direction, element) {\n        var _this3 = this;\n\n        var activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n        var activeElementIndex = this._getItemIndex(activeElement);\n\n        var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n        var nextElementIndex = this._getItemIndex(nextElement);\n\n        var isCycling = Boolean(this._interval);\n        var directionalClassName;\n        var orderClassName;\n        var eventDirectionName;\n\n        if (direction === Direction.NEXT) {\n          directionalClassName = ClassName.LEFT;\n          orderClassName = ClassName.NEXT;\n          eventDirectionName = Direction.LEFT;\n        } else {\n          directionalClassName = ClassName.RIGHT;\n          orderClassName = ClassName.PREV;\n          eventDirectionName = Direction.RIGHT;\n        }\n\n        if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {\n          this._isSliding = false;\n          return;\n        }\n\n        var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n        if (slideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        if (!activeElement || !nextElement) {\n          // Some weirdness is happening, so we bail\n          return;\n        }\n\n        this._isSliding = true;\n\n        if (isCycling) {\n          this.pause();\n        }\n\n        this._setActiveIndicatorElement(nextElement);\n\n        var slidEvent = $$$1.Event(Event.SLID, {\n          relatedTarget: nextElement,\n          direction: eventDirectionName,\n          from: activeElementIndex,\n          to: nextElementIndex\n        });\n\n        if ($$$1(this._element).hasClass(ClassName.SLIDE)) {\n          $$$1(nextElement).addClass(orderClassName);\n          Util.reflow(nextElement);\n          $$$1(activeElement).addClass(directionalClassName);\n          $$$1(nextElement).addClass(directionalClassName);\n          var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n          $$$1(activeElement).one(Util.TRANSITION_END, function () {\n            $$$1(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName.ACTIVE);\n            $$$1(activeElement).removeClass(ClassName.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n            _this3._isSliding = false;\n            setTimeout(function () {\n              return $$$1(_this3._element).trigger(slidEvent);\n            }, 0);\n          }).emulateTransitionEnd(transitionDuration);\n        } else {\n          $$$1(activeElement).removeClass(ClassName.ACTIVE);\n          $$$1(nextElement).addClass(ClassName.ACTIVE);\n          this._isSliding = false;\n          $$$1(this._element).trigger(slidEvent);\n        }\n\n        if (isCycling) {\n          this.cycle();\n        }\n      }; // Static\n\n\n      Carousel._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = _objectSpread({}, Default, $$$1(this).data());\n\n          if (typeof config === 'object') {\n            _config = _objectSpread({}, _config, config);\n          }\n\n          var action = typeof config === 'string' ? config : _config.slide;\n\n          if (!data) {\n            data = new Carousel(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'number') {\n            data.to(config);\n          } else if (typeof action === 'string') {\n            if (typeof data[action] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n            }\n\n            data[action]();\n          } else if (_config.interval) {\n            data.pause();\n            data.cycle();\n          }\n        });\n      };\n\n      Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n        var selector = Util.getSelectorFromElement(this);\n\n        if (!selector) {\n          return;\n        }\n\n        var target = $$$1(selector)[0];\n\n        if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {\n          return;\n        }\n\n        var config = _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n        var slideIndex = this.getAttribute('data-slide-to');\n\n        if (slideIndex) {\n          config.interval = false;\n        }\n\n        Carousel._jQueryInterface.call($$$1(target), config);\n\n        if (slideIndex) {\n          $$$1(target).data(DATA_KEY).to(slideIndex);\n        }\n\n        event.preventDefault();\n      };\n\n      _createClass(Carousel, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return Carousel;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\n    $$$1(window).on(Event.LOAD_DATA_API, function () {\n      $$$1(Selector.DATA_RIDE).each(function () {\n        var $carousel = $$$1(this);\n\n        Carousel._jQueryInterface.call($carousel, $carousel.data());\n      });\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Carousel._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Carousel;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Carousel._jQueryInterface;\n    };\n\n    return Carousel;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Collapse = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'collapse';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.collapse';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Default = {\n      toggle: true,\n      parent: ''\n    };\n    var DefaultType = {\n      toggle: 'boolean',\n      parent: '(string|element)'\n    };\n    var Event = {\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      SHOW: 'show',\n      COLLAPSE: 'collapse',\n      COLLAPSING: 'collapsing',\n      COLLAPSED: 'collapsed'\n    };\n    var Dimension = {\n      WIDTH: 'width',\n      HEIGHT: 'height'\n    };\n    var Selector = {\n      ACTIVES: '.show, .collapsing',\n      DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Collapse =\n    /*#__PURE__*/\n    function () {\n      function Collapse(element, config) {\n        this._isTransitioning = false;\n        this._element = element;\n        this._config = this._getConfig(config);\n        this._triggerArray = $$$1.makeArray($$$1(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n        var tabToggles = $$$1(Selector.DATA_TOGGLE);\n\n        for (var i = 0; i < tabToggles.length; i++) {\n          var elem = tabToggles[i];\n          var selector = Util.getSelectorFromElement(elem);\n\n          if (selector !== null && $$$1(selector).filter(element).length > 0) {\n            this._selector = selector;\n\n            this._triggerArray.push(elem);\n          }\n        }\n\n        this._parent = this._config.parent ? this._getParent() : null;\n\n        if (!this._config.parent) {\n          this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n        }\n\n        if (this._config.toggle) {\n          this.toggle();\n        }\n      } // Getters\n\n\n      var _proto = Collapse.prototype;\n\n      // Public\n      _proto.toggle = function toggle() {\n        if ($$$1(this._element).hasClass(ClassName.SHOW)) {\n          this.hide();\n        } else {\n          this.show();\n        }\n      };\n\n      _proto.show = function show() {\n        var _this = this;\n\n        if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {\n          return;\n        }\n\n        var actives;\n        var activesData;\n\n        if (this._parent) {\n          actives = $$$1.makeArray($$$1(this._parent).find(Selector.ACTIVES).filter(\"[data-parent=\\\"\" + this._config.parent + \"\\\"]\"));\n\n          if (actives.length === 0) {\n            actives = null;\n          }\n        }\n\n        if (actives) {\n          activesData = $$$1(actives).not(this._selector).data(DATA_KEY);\n\n          if (activesData && activesData._isTransitioning) {\n            return;\n          }\n        }\n\n        var startEvent = $$$1.Event(Event.SHOW);\n        $$$1(this._element).trigger(startEvent);\n\n        if (startEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        if (actives) {\n          Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');\n\n          if (!activesData) {\n            $$$1(actives).data(DATA_KEY, null);\n          }\n        }\n\n        var dimension = this._getDimension();\n\n        $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\n        this._element.style[dimension] = 0;\n\n        if (this._triggerArray.length > 0) {\n          $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\n        }\n\n        this.setTransitioning(true);\n\n        var complete = function complete() {\n          $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);\n          _this._element.style[dimension] = '';\n\n          _this.setTransitioning(false);\n\n          $$$1(_this._element).trigger(Event.SHOWN);\n        };\n\n        var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n        var scrollSize = \"scroll\" + capitalizedDimension;\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        this._element.style[dimension] = this._element[scrollSize] + \"px\";\n      };\n\n      _proto.hide = function hide() {\n        var _this2 = this;\n\n        if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {\n          return;\n        }\n\n        var startEvent = $$$1.Event(Event.HIDE);\n        $$$1(this._element).trigger(startEvent);\n\n        if (startEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        var dimension = this._getDimension();\n\n        this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n        Util.reflow(this._element);\n        $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);\n\n        if (this._triggerArray.length > 0) {\n          for (var i = 0; i < this._triggerArray.length; i++) {\n            var trigger = this._triggerArray[i];\n            var selector = Util.getSelectorFromElement(trigger);\n\n            if (selector !== null) {\n              var $elem = $$$1(selector);\n\n              if (!$elem.hasClass(ClassName.SHOW)) {\n                $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\n              }\n            }\n          }\n        }\n\n        this.setTransitioning(true);\n\n        var complete = function complete() {\n          _this2.setTransitioning(false);\n\n          $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\n        };\n\n        this._element.style[dimension] = '';\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      };\n\n      _proto.setTransitioning = function setTransitioning(isTransitioning) {\n        this._isTransitioning = isTransitioning;\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._config = null;\n        this._parent = null;\n        this._element = null;\n        this._triggerArray = null;\n        this._isTransitioning = null;\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n        config.toggle = Boolean(config.toggle); // Coerce string values\n\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._getDimension = function _getDimension() {\n        var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);\n        return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n      };\n\n      _proto._getParent = function _getParent() {\n        var _this3 = this;\n\n        var parent = null;\n\n        if (Util.isElement(this._config.parent)) {\n          parent = this._config.parent; // It's a jQuery object\n\n          if (typeof this._config.parent.jquery !== 'undefined') {\n            parent = this._config.parent[0];\n          }\n        } else {\n          parent = $$$1(this._config.parent)[0];\n        }\n\n        var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n        $$$1(parent).find(selector).each(function (i, element) {\n          _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n        });\n        return parent;\n      };\n\n      _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n        if (element) {\n          var isOpen = $$$1(element).hasClass(ClassName.SHOW);\n\n          if (triggerArray.length > 0) {\n            $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n          }\n        }\n      }; // Static\n\n\n      Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n        var selector = Util.getSelectorFromElement(element);\n        return selector ? $$$1(selector)[0] : null;\n      };\n\n      Collapse._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var $this = $$$1(this);\n          var data = $this.data(DATA_KEY);\n\n          var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config);\n\n          if (!data && _config.toggle && /show|hide/.test(config)) {\n            _config.toggle = false;\n          }\n\n          if (!data) {\n            data = new Collapse(this, _config);\n            $this.data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Collapse, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return Collapse;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n      if (event.currentTarget.tagName === 'A') {\n        event.preventDefault();\n      }\n\n      var $trigger = $$$1(this);\n      var selector = Util.getSelectorFromElement(this);\n      $$$1(selector).each(function () {\n        var $target = $$$1(this);\n        var data = $target.data(DATA_KEY);\n        var config = data ? 'toggle' : $trigger.data();\n\n        Collapse._jQueryInterface.call($target, config);\n      });\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Collapse._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Collapse;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Collapse._jQueryInterface;\n    };\n\n    return Collapse;\n  }($);\n\n  /**!\n   * @fileOverview Kickass library to create and place poppers near their reference elements.\n   * @version 1.14.1\n   * @license\n   * Copyright (c) 2016 Federico Zivolo and contributors\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 all\n   * 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 FOR 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 THE\n   * SOFTWARE.\n   */\n  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  var timeoutDuration = 0;\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      timeoutDuration = 1;\n      break;\n    }\n  }\n\n  function microtaskDebounce(fn) {\n    var called = false;\n    return function () {\n      if (called) {\n        return;\n      }\n      called = true;\n      window.Promise.resolve().then(function () {\n        called = false;\n        fn();\n      });\n    };\n  }\n\n  function taskDebounce(fn) {\n    var scheduled = false;\n    return function () {\n      if (!scheduled) {\n        scheduled = true;\n        setTimeout(function () {\n          scheduled = false;\n          fn();\n        }, timeoutDuration);\n      }\n    };\n  }\n\n  var supportsMicroTasks = isBrowser && window.Promise;\n\n  /**\n  * Create a debounced version of a method, that's asynchronously deferred\n  * but called in the minimum time possible.\n  *\n  * @method\n  * @memberof Popper.Utils\n  * @argument {Function} fn\n  * @returns {Function}\n  */\n  var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n  /**\n   * Check if the given variable is a function\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Any} functionToCheck - variable to check\n   * @returns {Boolean} answer to: is a function?\n   */\n  function isFunction(functionToCheck) {\n    var getType = {};\n    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n  }\n\n  /**\n   * Get CSS computed property of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Eement} element\n   * @argument {String} property\n   */\n  function getStyleComputedProperty(element, property) {\n    if (element.nodeType !== 1) {\n      return [];\n    }\n    // NOTE: 1 DOM access here\n    var css = getComputedStyle(element, null);\n    return property ? css[property] : css;\n  }\n\n  /**\n   * Returns the parentNode or the host of the element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} parent\n   */\n  function getParentNode(element) {\n    if (element.nodeName === 'HTML') {\n      return element;\n    }\n    return element.parentNode || element.host;\n  }\n\n  /**\n   * Returns the scrolling parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} scroll parent\n   */\n  function getScrollParent(element) {\n    // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n    if (!element) {\n      return document.body;\n    }\n\n    switch (element.nodeName) {\n      case 'HTML':\n      case 'BODY':\n        return element.ownerDocument.body;\n      case '#document':\n        return element.body;\n    }\n\n    // Firefox want us to check `-x` and `-y` variations as well\n\n    var _getStyleComputedProp = getStyleComputedProperty(element),\n        overflow = _getStyleComputedProp.overflow,\n        overflowX = _getStyleComputedProp.overflowX,\n        overflowY = _getStyleComputedProp.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      return element;\n    }\n\n    return getScrollParent(getParentNode(element));\n  }\n\n  /**\n   * Tells if you are running Internet Explorer\n   * @method\n   * @memberof Popper.Utils\n   * @argument {number} version to check\n   * @returns {Boolean} isIE\n   */\n  var cache = {};\n\n  var isIE = function () {\n    var version = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all';\n\n    version = version.toString();\n    if (cache.hasOwnProperty(version)) {\n      return cache[version];\n    }\n    switch (version) {\n      case '11':\n        cache[version] = navigator.userAgent.indexOf('Trident') !== -1;\n        break;\n      case '10':\n        cache[version] = navigator.appVersion.indexOf('MSIE 10') !== -1;\n        break;\n      case 'all':\n        cache[version] = navigator.userAgent.indexOf('Trident') !== -1 || navigator.userAgent.indexOf('MSIE') !== -1;\n        break;\n    }\n\n    //Set IE\n    cache.all = cache.all || Object.keys(cache).some(function (key) {\n      return cache[key];\n    });\n    return cache[version];\n  };\n\n  /**\n   * Returns the offset parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} offset parent\n   */\n  function getOffsetParent(element) {\n    if (!element) {\n      return document.documentElement;\n    }\n\n    var noOffsetParent = isIE(10) ? document.body : null;\n\n    // NOTE: 1 DOM access here\n    var offsetParent = element.offsetParent;\n    // Skip hidden elements which don't have an offsetParent\n    while (offsetParent === noOffsetParent && element.nextElementSibling) {\n      offsetParent = (element = element.nextElementSibling).offsetParent;\n    }\n\n    var nodeName = offsetParent && offsetParent.nodeName;\n\n    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n      return element ? element.ownerDocument.documentElement : document.documentElement;\n    }\n\n    // .offsetParent will return the closest TD or TABLE in case\n    // no offsetParent is present, I hate this job...\n    if (['TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n      return getOffsetParent(offsetParent);\n    }\n\n    return offsetParent;\n  }\n\n  function isOffsetContainer(element) {\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY') {\n      return false;\n    }\n    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n  }\n\n  /**\n   * Finds the root node (document, shadowDOM root) of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} node\n   * @returns {Element} root node\n   */\n  function getRoot(node) {\n    if (node.parentNode !== null) {\n      return getRoot(node.parentNode);\n    }\n\n    return node;\n  }\n\n  /**\n   * Finds the offset parent common to the two provided nodes\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element1\n   * @argument {Element} element2\n   * @returns {Element} common offset parent\n   */\n  function findCommonOffsetParent(element1, element2) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n      return document.documentElement;\n    }\n\n    // Here we make sure to give as \"start\" the element that comes first in the DOM\n    var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n    var start = order ? element1 : element2;\n    var end = order ? element2 : element1;\n\n    // Get common ancestor container\n    var range = document.createRange();\n    range.setStart(start, 0);\n    range.setEnd(end, 0);\n    var commonAncestorContainer = range.commonAncestorContainer;\n\n    // Both nodes are inside #document\n\n    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n      if (isOffsetContainer(commonAncestorContainer)) {\n        return commonAncestorContainer;\n      }\n\n      return getOffsetParent(commonAncestorContainer);\n    }\n\n    // one of the nodes is inside shadowDOM, find which one\n    var element1root = getRoot(element1);\n    if (element1root.host) {\n      return findCommonOffsetParent(element1root.host, element2);\n    } else {\n      return findCommonOffsetParent(element1, getRoot(element2).host);\n    }\n  }\n\n  /**\n   * Gets the scroll value of the given element in the given side (top and left)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {String} side `top` or `left`\n   * @returns {number} amount of scrolled pixels\n   */\n  function getScroll(element) {\n    var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      var html = element.ownerDocument.documentElement;\n      var scrollingElement = element.ownerDocument.scrollingElement || html;\n      return scrollingElement[upperSide];\n    }\n\n    return element[upperSide];\n  }\n\n  /*\n   * Sum or subtract the element scroll values (left and top) from a given rect object\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} rect - Rect object you want to change\n   * @param {HTMLElement} element - The element from the function reads the scroll values\n   * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n   * @return {Object} rect - The modifier rect object\n   */\n  function includeScroll(rect, element) {\n    var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var scrollTop = getScroll(element, 'top');\n    var scrollLeft = getScroll(element, 'left');\n    var modifier = subtract ? -1 : 1;\n    rect.top += scrollTop * modifier;\n    rect.bottom += scrollTop * modifier;\n    rect.left += scrollLeft * modifier;\n    rect.right += scrollLeft * modifier;\n    return rect;\n  }\n\n  /*\n   * Helper to detect borders of a given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {CSSStyleDeclaration} styles\n   * Result of `getStyleComputedProperty` on the given element\n   * @param {String} axis - `x` or `y`\n   * @return {number} borders - The borders size of the given axis\n   */\n\n  function getBordersSize(styles, axis) {\n    var sideA = axis === 'x' ? 'Left' : 'Top';\n    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n  }\n\n  function getSize(axis, body, html, computedStyle) {\n    return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? html['offset' + axis] + computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')] + computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')] : 0);\n  }\n\n  function getWindowSizes() {\n    var body = document.body;\n    var html = document.documentElement;\n    var computedStyle = isIE(10) && getComputedStyle(html);\n\n    return {\n      height: getSize('Height', body, html, computedStyle),\n      width: getSize('Width', body, html, computedStyle)\n    };\n  }\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n  var defineProperty = function (obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  };\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Given element offsets, generate an output similar to getBoundingClientRect\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} offsets\n   * @returns {Object} ClientRect like output\n   */\n  function getClientRect(offsets) {\n    return _extends({}, offsets, {\n      right: offsets.left + offsets.width,\n      bottom: offsets.top + offsets.height\n    });\n  }\n\n  /**\n   * Get bounding client rect of given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} element\n   * @return {Object} client rect\n   */\n  function getBoundingClientRect(element) {\n    var rect = {};\n\n    // IE10 10 FIX: Please, don't ask, the element isn't\n    // considered in DOM in some circumstances...\n    // This isn't reproducible in IE10 compatibility mode of IE11\n    try {\n      if (isIE(10)) {\n        rect = element.getBoundingClientRect();\n        var scrollTop = getScroll(element, 'top');\n        var scrollLeft = getScroll(element, 'left');\n        rect.top += scrollTop;\n        rect.left += scrollLeft;\n        rect.bottom += scrollTop;\n        rect.right += scrollLeft;\n      } else {\n        rect = element.getBoundingClientRect();\n      }\n    } catch (e) {}\n\n    var result = {\n      left: rect.left,\n      top: rect.top,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n\n    // subtract scrollbar size from sizes\n    var sizes = element.nodeName === 'HTML' ? getWindowSizes() : {};\n    var width = sizes.width || element.clientWidth || result.right - result.left;\n    var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n    var horizScrollbar = element.offsetWidth - width;\n    var vertScrollbar = element.offsetHeight - height;\n\n    // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n    // we make this check conditional for performance reasons\n    if (horizScrollbar || vertScrollbar) {\n      var styles = getStyleComputedProperty(element);\n      horizScrollbar -= getBordersSize(styles, 'x');\n      vertScrollbar -= getBordersSize(styles, 'y');\n\n      result.width -= horizScrollbar;\n      result.height -= vertScrollbar;\n    }\n\n    return getClientRect(result);\n  }\n\n  function getOffsetRectRelativeToArbitraryNode(children, parent) {\n    var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var isIE10 = isIE(10);\n    var isHTML = parent.nodeName === 'HTML';\n    var childrenRect = getBoundingClientRect(children);\n    var parentRect = getBoundingClientRect(parent);\n    var scrollParent = getScrollParent(children);\n\n    var styles = getStyleComputedProperty(parent);\n    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n    // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n    if (fixedPosition && parent.nodeName === 'HTML') {\n      parentRect.top = Math.max(parentRect.top, 0);\n      parentRect.left = Math.max(parentRect.left, 0);\n    }\n    var offsets = getClientRect({\n      top: childrenRect.top - parentRect.top - borderTopWidth,\n      left: childrenRect.left - parentRect.left - borderLeftWidth,\n      width: childrenRect.width,\n      height: childrenRect.height\n    });\n    offsets.marginTop = 0;\n    offsets.marginLeft = 0;\n\n    // Subtract margins of documentElement in case it's being used as parent\n    // we do this only on HTML because it's the only element that behaves\n    // differently when margins are applied to it. The margins are included in\n    // the box of the documentElement, in the other cases not.\n    if (!isIE10 && isHTML) {\n      var marginTop = parseFloat(styles.marginTop, 10);\n      var marginLeft = parseFloat(styles.marginLeft, 10);\n\n      offsets.top -= borderTopWidth - marginTop;\n      offsets.bottom -= borderTopWidth - marginTop;\n      offsets.left -= borderLeftWidth - marginLeft;\n      offsets.right -= borderLeftWidth - marginLeft;\n\n      // Attach marginTop and marginLeft because in some circumstances we may need them\n      offsets.marginTop = marginTop;\n      offsets.marginLeft = marginLeft;\n    }\n\n    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n      offsets = includeScroll(offsets, parent);\n    }\n\n    return offsets;\n  }\n\n  function getViewportOffsetRectRelativeToArtbitraryNode(element) {\n    var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var html = element.ownerDocument.documentElement;\n    var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n    var width = Math.max(html.clientWidth, window.innerWidth || 0);\n    var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n    var scrollTop = !excludeScroll ? getScroll(html) : 0;\n    var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n    var offset = {\n      top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n      left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n      width: width,\n      height: height\n    };\n\n    return getClientRect(offset);\n  }\n\n  /**\n   * Check if the given element is fixed or is inside a fixed parent\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {Element} customContainer\n   * @returns {Boolean} answer to \"isFixed?\"\n   */\n  function isFixed(element) {\n    var nodeName = element.nodeName;\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      return false;\n    }\n    if (getStyleComputedProperty(element, 'position') === 'fixed') {\n      return true;\n    }\n    return isFixed(getParentNode(element));\n  }\n\n  /**\n   * Finds the first parent of an element that has a transformed property defined\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} first transformed parent or documentElement\n   */\n\n  function getFixedPositionOffsetParent(element) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element || !element.parentElement || isIE()) {\n      return document.documentElement;\n    }\n    var el = element.parentElement;\n    while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n      el = el.parentElement;\n    }\n    return el || document.documentElement;\n  }\n\n  /**\n   * Computed the boundaries limits and return them\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} popper\n   * @param {HTMLElement} reference\n   * @param {number} padding\n   * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n   * @param {Boolean} fixedPosition - Is in fixed position mode\n   * @returns {Object} Coordinates of the boundaries\n   */\n  function getBoundaries(popper, reference, padding, boundariesElement) {\n    var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n    // NOTE: 1 DOM access here\n\n    var boundaries = { top: 0, left: 0 };\n    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n    // Handle viewport case\n    if (boundariesElement === 'viewport') {\n      boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n    } else {\n      // Handle other cases based on DOM element used as boundaries\n      var boundariesNode = void 0;\n      if (boundariesElement === 'scrollParent') {\n        boundariesNode = getScrollParent(getParentNode(reference));\n        if (boundariesNode.nodeName === 'BODY') {\n          boundariesNode = popper.ownerDocument.documentElement;\n        }\n      } else if (boundariesElement === 'window') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      } else {\n        boundariesNode = boundariesElement;\n      }\n\n      var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n      // In case of HTML, we need a different computation\n      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n        var _getWindowSizes = getWindowSizes(),\n            height = _getWindowSizes.height,\n            width = _getWindowSizes.width;\n\n        boundaries.top += offsets.top - offsets.marginTop;\n        boundaries.bottom = height + offsets.top;\n        boundaries.left += offsets.left - offsets.marginLeft;\n        boundaries.right = width + offsets.left;\n      } else {\n        // for all the other DOM elements, this one is good\n        boundaries = offsets;\n      }\n    }\n\n    // Add paddings\n    boundaries.left += padding;\n    boundaries.top += padding;\n    boundaries.right -= padding;\n    boundaries.bottom -= padding;\n\n    return boundaries;\n  }\n\n  function getArea(_ref) {\n    var width = _ref.width,\n        height = _ref.height;\n\n    return width * height;\n  }\n\n  /**\n   * Utility used to transform the `auto` placement to the placement with more\n   * available space.\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n    var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n    if (placement.indexOf('auto') === -1) {\n      return placement;\n    }\n\n    var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n    var rects = {\n      top: {\n        width: boundaries.width,\n        height: refRect.top - boundaries.top\n      },\n      right: {\n        width: boundaries.right - refRect.right,\n        height: boundaries.height\n      },\n      bottom: {\n        width: boundaries.width,\n        height: boundaries.bottom - refRect.bottom\n      },\n      left: {\n        width: refRect.left - boundaries.left,\n        height: boundaries.height\n      }\n    };\n\n    var sortedAreas = Object.keys(rects).map(function (key) {\n      return _extends({\n        key: key\n      }, rects[key], {\n        area: getArea(rects[key])\n      });\n    }).sort(function (a, b) {\n      return b.area - a.area;\n    });\n\n    var filteredAreas = sortedAreas.filter(function (_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n      return width >= popper.clientWidth && height >= popper.clientHeight;\n    });\n\n    var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n    var variation = placement.split('-')[1];\n\n    return computedPlacement + (variation ? '-' + variation : '');\n  }\n\n  /**\n   * Get offsets to the reference element\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} state\n   * @param {Element} popper - the popper element\n   * @param {Element} reference - the reference element (the popper will be relative to this)\n   * @param {Element} fixedPosition - is in fixed position mode\n   * @returns {Object} An object containing the offsets which will be applied to the popper\n   */\n  function getReferenceOffsets(state, popper, reference) {\n    var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n    return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n  }\n\n  /**\n   * Get the outer sizes of the given element (offset size + margins)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Object} object containing width and height properties\n   */\n  function getOuterSizes(element) {\n    var styles = getComputedStyle(element);\n    var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);\n    var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);\n    var result = {\n      width: element.offsetWidth + y,\n      height: element.offsetHeight + x\n    };\n    return result;\n  }\n\n  /**\n   * Get the opposite placement of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement\n   * @returns {String} flipped placement\n   */\n  function getOppositePlacement(placement) {\n    var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  /**\n   * Get offsets to the popper\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} position - CSS position the Popper will get applied\n   * @param {HTMLElement} popper - the popper element\n   * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n   * @param {String} placement - one of the valid placement options\n   * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n   */\n  function getPopperOffsets(popper, referenceOffsets, placement) {\n    placement = placement.split('-')[0];\n\n    // Get popper node sizes\n    var popperRect = getOuterSizes(popper);\n\n    // Add position, width and height to our offsets object\n    var popperOffsets = {\n      width: popperRect.width,\n      height: popperRect.height\n    };\n\n    // depending by the popper placement we have to compute its offsets slightly differently\n    var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n    var mainSide = isHoriz ? 'top' : 'left';\n    var secondarySide = isHoriz ? 'left' : 'top';\n    var measurement = isHoriz ? 'height' : 'width';\n    var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n    if (placement === secondarySide) {\n      popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n    } else {\n      popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n    }\n\n    return popperOffsets;\n  }\n\n  /**\n   * Mimics the `find` method of Array\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function find(arr, check) {\n    // use native find if supported\n    if (Array.prototype.find) {\n      return arr.find(check);\n    }\n\n    // use `filter` to obtain the same behavior of `find`\n    return arr.filter(check)[0];\n  }\n\n  /**\n   * Return the index of the matching object\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function findIndex(arr, prop, value) {\n    // use native findIndex if supported\n    if (Array.prototype.findIndex) {\n      return arr.findIndex(function (cur) {\n        return cur[prop] === value;\n      });\n    }\n\n    // use `find` + `indexOf` if `findIndex` isn't supported\n    var match = find(arr, function (obj) {\n      return obj[prop] === value;\n    });\n    return arr.indexOf(match);\n  }\n\n  /**\n   * Loop trough the list of modifiers and run them in order,\n   * each of them will then edit the data object.\n   * @method\n   * @memberof Popper.Utils\n   * @param {dataObject} data\n   * @param {Array} modifiers\n   * @param {String} ends - Optional modifier name used as stopper\n   * @returns {dataObject}\n   */\n  function runModifiers(modifiers, data, ends) {\n    var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n    modifiersToRun.forEach(function (modifier) {\n      if (modifier['function']) {\n        // eslint-disable-line dot-notation\n        console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n      }\n      var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n      if (modifier.enabled && isFunction(fn)) {\n        // Add properties to offsets to make them a complete clientRect object\n        // we do this before each modifier to make sure the previous one doesn't\n        // mess with these values\n        data.offsets.popper = getClientRect(data.offsets.popper);\n        data.offsets.reference = getClientRect(data.offsets.reference);\n\n        data = fn(data, modifier);\n      }\n    });\n\n    return data;\n  }\n\n  /**\n   * Updates the position of the popper, computing the new offsets and applying\n   * the new style.<br />\n   * Prefer `scheduleUpdate` over `update` because of performance reasons.\n   * @method\n   * @memberof Popper\n   */\n  function update() {\n    // if popper is destroyed, don't perform any further update\n    if (this.state.isDestroyed) {\n      return;\n    }\n\n    var data = {\n      instance: this,\n      styles: {},\n      arrowStyles: {},\n      attributes: {},\n      flipped: false,\n      offsets: {}\n    };\n\n    // compute reference element offsets\n    data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n    // store the computed placement inside `originalPlacement`\n    data.originalPlacement = data.placement;\n\n    data.positionFixed = this.options.positionFixed;\n\n    // compute the popper offsets\n    data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n    data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n    // run the modifiers\n    data = runModifiers(this.modifiers, data);\n\n    // the first `update` will call `onCreate` callback\n    // the other ones will call `onUpdate` callback\n    if (!this.state.isCreated) {\n      this.state.isCreated = true;\n      this.options.onCreate(data);\n    } else {\n      this.options.onUpdate(data);\n    }\n  }\n\n  /**\n   * Helper used to know if the given modifier is enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @returns {Boolean}\n   */\n  function isModifierEnabled(modifiers, modifierName) {\n    return modifiers.some(function (_ref) {\n      var name = _ref.name,\n          enabled = _ref.enabled;\n      return enabled && name === modifierName;\n    });\n  }\n\n  /**\n   * Get the prefixed supported property name\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} property (camelCase)\n   * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n   */\n  function getSupportedPropertyName(property) {\n    var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n    var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n    for (var i = 0; i < prefixes.length; i++) {\n      var prefix = prefixes[i];\n      var toCheck = prefix ? '' + prefix + upperProp : property;\n      if (typeof document.body.style[toCheck] !== 'undefined') {\n        return toCheck;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Destroy the popper\n   * @method\n   * @memberof Popper\n   */\n  function destroy() {\n    this.state.isDestroyed = true;\n\n    // touch DOM only if `applyStyle` modifier is enabled\n    if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n      this.popper.removeAttribute('x-placement');\n      this.popper.style.position = '';\n      this.popper.style.top = '';\n      this.popper.style.left = '';\n      this.popper.style.right = '';\n      this.popper.style.bottom = '';\n      this.popper.style.willChange = '';\n      this.popper.style[getSupportedPropertyName('transform')] = '';\n    }\n\n    this.disableEventListeners();\n\n    // remove the popper if user explicity asked for the deletion on destroy\n    // do not use `remove` because IE11 doesn't support it\n    if (this.options.removeOnDestroy) {\n      this.popper.parentNode.removeChild(this.popper);\n    }\n    return this;\n  }\n\n  /**\n   * Get the window associated with the element\n   * @argument {Element} element\n   * @returns {Window}\n   */\n  function getWindow(element) {\n    var ownerDocument = element.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView : window;\n  }\n\n  function attachToScrollParents(scrollParent, event, callback, scrollParents) {\n    var isBody = scrollParent.nodeName === 'BODY';\n    var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n    target.addEventListener(event, callback, { passive: true });\n\n    if (!isBody) {\n      attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n    }\n    scrollParents.push(target);\n  }\n\n  /**\n   * Setup needed event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function setupEventListeners(reference, options, state, updateBound) {\n    // Resize event listener on window\n    state.updateBound = updateBound;\n    getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n    // Scroll event listener on scroll parents\n    var scrollElement = getScrollParent(reference);\n    attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n    state.scrollElement = scrollElement;\n    state.eventsEnabled = true;\n\n    return state;\n  }\n\n  /**\n   * It will add resize/scroll events and start recalculating\n   * position of the popper element when they are triggered.\n   * @method\n   * @memberof Popper\n   */\n  function enableEventListeners() {\n    if (!this.state.eventsEnabled) {\n      this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n    }\n  }\n\n  /**\n   * Remove event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function removeEventListeners(reference, state) {\n    // Remove resize event listener on window\n    getWindow(reference).removeEventListener('resize', state.updateBound);\n\n    // Remove scroll event listener on scroll parents\n    state.scrollParents.forEach(function (target) {\n      target.removeEventListener('scroll', state.updateBound);\n    });\n\n    // Reset state\n    state.updateBound = null;\n    state.scrollParents = [];\n    state.scrollElement = null;\n    state.eventsEnabled = false;\n    return state;\n  }\n\n  /**\n   * It will remove resize/scroll events and won't recalculate popper position\n   * when they are triggered. It also won't trigger onUpdate callback anymore,\n   * unless you call `update` method manually.\n   * @method\n   * @memberof Popper\n   */\n  function disableEventListeners() {\n    if (this.state.eventsEnabled) {\n      cancelAnimationFrame(this.scheduleUpdate);\n      this.state = removeEventListeners(this.reference, this.state);\n    }\n  }\n\n  /**\n   * Tells if a given input is a number\n   * @method\n   * @memberof Popper.Utils\n   * @param {*} input to check\n   * @return {Boolean}\n   */\n  function isNumeric(n) {\n    return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n  }\n\n  /**\n   * Set the style to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the style to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setStyles(element, styles) {\n    Object.keys(styles).forEach(function (prop) {\n      var unit = '';\n      // add unit if the value is numeric and is one of the following\n      if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n        unit = 'px';\n      }\n      element.style[prop] = styles[prop] + unit;\n    });\n  }\n\n  /**\n   * Set the attributes to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the attributes to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setAttributes(element, attributes) {\n    Object.keys(attributes).forEach(function (prop) {\n      var value = attributes[prop];\n      if (value !== false) {\n        element.setAttribute(prop, attributes[prop]);\n      } else {\n        element.removeAttribute(prop);\n      }\n    });\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} data.styles - List of style properties - values to apply to popper element\n   * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The same data object\n   */\n  function applyStyle(data) {\n    // any property present in `data.styles` will be applied to the popper,\n    // in this way we can make the 3rd party modifiers add custom styles to it\n    // Be aware, modifiers could override the properties defined in the previous\n    // lines of this modifier!\n    setStyles(data.instance.popper, data.styles);\n\n    // any property present in `data.attributes` will be applied to the popper,\n    // they will be set as HTML attributes of the element\n    setAttributes(data.instance.popper, data.attributes);\n\n    // if arrowElement is defined and arrowStyles has some properties\n    if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n      setStyles(data.arrowElement, data.arrowStyles);\n    }\n\n    return data;\n  }\n\n  /**\n   * Set the x-placement attribute before everything else because it could be used\n   * to add margins to the popper margins needs to be calculated to get the\n   * correct popper offsets.\n   * @method\n   * @memberof Popper.modifiers\n   * @param {HTMLElement} reference - The reference element used to position the popper\n   * @param {HTMLElement} popper - The HTML element used as popper\n   * @param {Object} options - Popper.js options\n   */\n  function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n    // compute reference element offsets\n    var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n    popper.setAttribute('x-placement', placement);\n\n    // Apply `position` to popper before anything else because\n    // without the position applied we can't guarantee correct computations\n    setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n    return options;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeStyle(data, options) {\n    var x = options.x,\n        y = options.y;\n    var popper = data.offsets.popper;\n\n    // Remove this legacy support in Popper.js v2\n\n    var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'applyStyle';\n    }).gpuAcceleration;\n    if (legacyGpuAccelerationOption !== undefined) {\n      console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n    }\n    var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n    var offsetParent = getOffsetParent(data.instance.popper);\n    var offsetParentRect = getBoundingClientRect(offsetParent);\n\n    // Styles\n    var styles = {\n      position: popper.position\n    };\n\n    // floor sides to avoid blurry text\n    var offsets = {\n      left: Math.floor(popper.left),\n      top: Math.floor(popper.top),\n      bottom: Math.floor(popper.bottom),\n      right: Math.floor(popper.right)\n    };\n\n    var sideA = x === 'bottom' ? 'top' : 'bottom';\n    var sideB = y === 'right' ? 'left' : 'right';\n\n    // if gpuAcceleration is set to `true` and transform is supported,\n    //  we use `translate3d` to apply the position to the popper we\n    // automatically use the supported prefixed version if needed\n    var prefixedProperty = getSupportedPropertyName('transform');\n\n    // now, let's make a step back and look at this code closely (wtf?)\n    // If the content of the popper grows once it's been positioned, it\n    // may happen that the popper gets misplaced because of the new content\n    // overflowing its reference element\n    // To avoid this problem, we provide two options (x and y), which allow\n    // the consumer to define the offset origin.\n    // If we position a popper on top of a reference element, we can set\n    // `x` to `top` to make the popper grow towards its top instead of\n    // its bottom.\n    var left = void 0,\n        top = void 0;\n    if (sideA === 'bottom') {\n      top = -offsetParentRect.height + offsets.bottom;\n    } else {\n      top = offsets.top;\n    }\n    if (sideB === 'right') {\n      left = -offsetParentRect.width + offsets.right;\n    } else {\n      left = offsets.left;\n    }\n    if (gpuAcceleration && prefixedProperty) {\n      styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n      styles[sideA] = 0;\n      styles[sideB] = 0;\n      styles.willChange = 'transform';\n    } else {\n      // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n      var invertTop = sideA === 'bottom' ? -1 : 1;\n      var invertLeft = sideB === 'right' ? -1 : 1;\n      styles[sideA] = top * invertTop;\n      styles[sideB] = left * invertLeft;\n      styles.willChange = sideA + ', ' + sideB;\n    }\n\n    // Attributes\n    var attributes = {\n      'x-placement': data.placement\n    };\n\n    // Update `data` attributes, styles and arrowStyles\n    data.attributes = _extends({}, attributes, data.attributes);\n    data.styles = _extends({}, styles, data.styles);\n    data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n    return data;\n  }\n\n  /**\n   * Helper used to know if the given modifier depends from another one.<br />\n   * It checks if the needed modifier is listed and enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @param {Array} modifiers - list of modifiers\n   * @param {String} requestingName - name of requesting modifier\n   * @param {String} requestedName - name of requested modifier\n   * @returns {Boolean}\n   */\n  function isModifierRequired(modifiers, requestingName, requestedName) {\n    var requesting = find(modifiers, function (_ref) {\n      var name = _ref.name;\n      return name === requestingName;\n    });\n\n    var isRequired = !!requesting && modifiers.some(function (modifier) {\n      return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n    });\n\n    if (!isRequired) {\n      var _requesting = '`' + requestingName + '`';\n      var requested = '`' + requestedName + '`';\n      console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n    }\n    return isRequired;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function arrow(data, options) {\n    var _data$offsets$arrow;\n\n    // arrow depends on keepTogether in order to work\n    if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n      return data;\n    }\n\n    var arrowElement = options.element;\n\n    // if arrowElement is a string, suppose it's a CSS selector\n    if (typeof arrowElement === 'string') {\n      arrowElement = data.instance.popper.querySelector(arrowElement);\n\n      // if arrowElement is not found, don't run the modifier\n      if (!arrowElement) {\n        return data;\n      }\n    } else {\n      // if the arrowElement isn't a query selector we must check that the\n      // provided DOM node is child of its popper node\n      if (!data.instance.popper.contains(arrowElement)) {\n        console.warn('WARNING: `arrow.element` must be child of its popper element!');\n        return data;\n      }\n    }\n\n    var placement = data.placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n    var len = isVertical ? 'height' : 'width';\n    var sideCapitalized = isVertical ? 'Top' : 'Left';\n    var side = sideCapitalized.toLowerCase();\n    var altSide = isVertical ? 'left' : 'top';\n    var opSide = isVertical ? 'bottom' : 'right';\n    var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n    //\n    // extends keepTogether behavior making sure the popper and its\n    // reference have enough pixels in conjuction\n    //\n\n    // top/left side\n    if (reference[opSide] - arrowElementSize < popper[side]) {\n      data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n    }\n    // bottom/right side\n    if (reference[side] + arrowElementSize > popper[opSide]) {\n      data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n    }\n    data.offsets.popper = getClientRect(data.offsets.popper);\n\n    // compute center of the popper\n    var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n    // Compute the sideValue using the updated popper offsets\n    // take popper margin in account because we don't have this info available\n    var css = getStyleComputedProperty(data.instance.popper);\n    var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n    var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n    var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n    // prevent arrowElement from being placed not contiguously to its popper\n    sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n    data.arrowElement = arrowElement;\n    data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n    return data;\n  }\n\n  /**\n   * Get the opposite placement variation of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement variation\n   * @returns {String} flipped placement variation\n   */\n  function getOppositeVariation(variation) {\n    if (variation === 'end') {\n      return 'start';\n    } else if (variation === 'start') {\n      return 'end';\n    }\n    return variation;\n  }\n\n  /**\n   * List of accepted placements to use as values of the `placement` option.<br />\n   * Valid placements are:\n   * - `auto`\n   * - `top`\n   * - `right`\n   * - `bottom`\n   * - `left`\n   *\n   * Each placement can have a variation from this list:\n   * - `-start`\n   * - `-end`\n   *\n   * Variations are interpreted easily if you think of them as the left to right\n   * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n   * is right.<br />\n   * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n   *\n   * Some valid examples are:\n   * - `top-end` (on top of reference, right aligned)\n   * - `right-start` (on right of reference, top aligned)\n   * - `bottom` (on bottom, centered)\n   * - `auto-right` (on the side with more space available, alignment depends by placement)\n   *\n   * @static\n   * @type {Array}\n   * @enum {String}\n   * @readonly\n   * @method placements\n   * @memberof Popper\n   */\n  var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n  // Get rid of `auto` `auto-start` and `auto-end`\n  var validPlacements = placements.slice(3);\n\n  /**\n   * Given an initial placement, returns all the subsequent placements\n   * clockwise (or counter-clockwise).\n   *\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement - A valid placement (it accepts variations)\n   * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n   * @returns {Array} placements including their variations\n   */\n  function clockwise(placement) {\n    var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var index = validPlacements.indexOf(placement);\n    var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n    return counter ? arr.reverse() : arr;\n  }\n\n  var BEHAVIORS = {\n    FLIP: 'flip',\n    CLOCKWISE: 'clockwise',\n    COUNTERCLOCKWISE: 'counterclockwise'\n  };\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function flip(data, options) {\n    // if `inner` modifier is enabled, we can't use the `flip` modifier\n    if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n      return data;\n    }\n\n    if (data.flipped && data.placement === data.originalPlacement) {\n      // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n      return data;\n    }\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n    var placement = data.placement.split('-')[0];\n    var placementOpposite = getOppositePlacement(placement);\n    var variation = data.placement.split('-')[1] || '';\n\n    var flipOrder = [];\n\n    switch (options.behavior) {\n      case BEHAVIORS.FLIP:\n        flipOrder = [placement, placementOpposite];\n        break;\n      case BEHAVIORS.CLOCKWISE:\n        flipOrder = clockwise(placement);\n        break;\n      case BEHAVIORS.COUNTERCLOCKWISE:\n        flipOrder = clockwise(placement, true);\n        break;\n      default:\n        flipOrder = options.behavior;\n    }\n\n    flipOrder.forEach(function (step, index) {\n      if (placement !== step || flipOrder.length === index + 1) {\n        return data;\n      }\n\n      placement = data.placement.split('-')[0];\n      placementOpposite = getOppositePlacement(placement);\n\n      var popperOffsets = data.offsets.popper;\n      var refOffsets = data.offsets.reference;\n\n      // using floor because the reference offsets may contain decimals we are not going to consider here\n      var floor = Math.floor;\n      var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n      var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n      var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n      var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n      var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n      var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n      // flip the variation if required\n      var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n      var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n      if (overlapsRef || overflowsBoundaries || flippedVariation) {\n        // this boolean to detect any flip loop\n        data.flipped = true;\n\n        if (overlapsRef || overflowsBoundaries) {\n          placement = flipOrder[index + 1];\n        }\n\n        if (flippedVariation) {\n          variation = getOppositeVariation(variation);\n        }\n\n        data.placement = placement + (variation ? '-' + variation : '');\n\n        // this object contains `position`, we want to preserve it along with\n        // any additional property we may add in the future\n        data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n        data = runModifiers(data.instance.modifiers, data, 'flip');\n      }\n    });\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function keepTogether(data) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var placement = data.placement.split('-')[0];\n    var floor = Math.floor;\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n    var side = isVertical ? 'right' : 'bottom';\n    var opSide = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    if (popper[side] < floor(reference[opSide])) {\n      data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n    }\n    if (popper[opSide] > floor(reference[side])) {\n      data.offsets.popper[opSide] = floor(reference[side]);\n    }\n\n    return data;\n  }\n\n  /**\n   * Converts a string containing value + unit into a px value number\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} str - Value + unit string\n   * @argument {String} measurement - `height` or `width`\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @returns {Number|String}\n   * Value in pixels, or original string if no values were extracted\n   */\n  function toValue(str, measurement, popperOffsets, referenceOffsets) {\n    // separate value from unit\n    var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n    var value = +split[1];\n    var unit = split[2];\n\n    // If it's not a number it's an operator, I guess\n    if (!value) {\n      return str;\n    }\n\n    if (unit.indexOf('%') === 0) {\n      var element = void 0;\n      switch (unit) {\n        case '%p':\n          element = popperOffsets;\n          break;\n        case '%':\n        case '%r':\n        default:\n          element = referenceOffsets;\n      }\n\n      var rect = getClientRect(element);\n      return rect[measurement] / 100 * value;\n    } else if (unit === 'vh' || unit === 'vw') {\n      // if is a vh or vw, we calculate the size based on the viewport\n      var size = void 0;\n      if (unit === 'vh') {\n        size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n      } else {\n        size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n      }\n      return size / 100 * value;\n    } else {\n      // if is an explicit pixel unit, we get rid of the unit and keep the value\n      // if is an implicit unit, it's px, and we return just the value\n      return value;\n    }\n  }\n\n  /**\n   * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} offset\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @argument {String} basePlacement\n   * @returns {Array} a two cells array with x and y offsets in numbers\n   */\n  function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n    var offsets = [0, 0];\n\n    // Use height if placement is left or right and index is 0 otherwise use width\n    // in this way the first offset will use an axis and the second one\n    // will use the other one\n    var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n    // Split the offset string to obtain a list of values and operands\n    // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n    var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n      return frag.trim();\n    });\n\n    // Detect if the offset string contains a pair of values or a single one\n    // they could be separated by comma or space\n    var divider = fragments.indexOf(find(fragments, function (frag) {\n      return frag.search(/,|\\s/) !== -1;\n    }));\n\n    if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n      console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n    }\n\n    // If divider is found, we divide the list of values and operands to divide\n    // them by ofset X and Y.\n    var splitRegex = /\\s*,\\s*|\\s+/;\n    var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n    // Convert the values with units to absolute pixels to allow our computations\n    ops = ops.map(function (op, index) {\n      // Most of the units rely on the orientation of the popper\n      var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n      var mergeWithPrevious = false;\n      return op\n      // This aggregates any `+` or `-` sign that aren't considered operators\n      // e.g.: 10 + +5 => [10, +, +5]\n      .reduce(function (a, b) {\n        if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n          a[a.length - 1] = b;\n          mergeWithPrevious = true;\n          return a;\n        } else if (mergeWithPrevious) {\n          a[a.length - 1] += b;\n          mergeWithPrevious = false;\n          return a;\n        } else {\n          return a.concat(b);\n        }\n      }, [])\n      // Here we convert the string values into number values (in px)\n      .map(function (str) {\n        return toValue(str, measurement, popperOffsets, referenceOffsets);\n      });\n    });\n\n    // Loop trough the offsets arrays and execute the operations\n    ops.forEach(function (op, index) {\n      op.forEach(function (frag, index2) {\n        if (isNumeric(frag)) {\n          offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n        }\n      });\n    });\n    return offsets;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @argument {Number|String} options.offset=0\n   * The offset value as described in the modifier description\n   * @returns {Object} The data object, properly modified\n   */\n  function offset(data, _ref) {\n    var offset = _ref.offset;\n    var placement = data.placement,\n        _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var basePlacement = placement.split('-')[0];\n\n    var offsets = void 0;\n    if (isNumeric(+offset)) {\n      offsets = [+offset, 0];\n    } else {\n      offsets = parseOffset(offset, popper, reference, basePlacement);\n    }\n\n    if (basePlacement === 'left') {\n      popper.top += offsets[0];\n      popper.left -= offsets[1];\n    } else if (basePlacement === 'right') {\n      popper.top += offsets[0];\n      popper.left += offsets[1];\n    } else if (basePlacement === 'top') {\n      popper.left += offsets[0];\n      popper.top -= offsets[1];\n    } else if (basePlacement === 'bottom') {\n      popper.left += offsets[0];\n      popper.top += offsets[1];\n    }\n\n    data.popper = popper;\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function preventOverflow(data, options) {\n    var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n    // If offsetParent is the reference element, we really want to\n    // go one step up and use the next offsetParent as reference to\n    // avoid to make this modifier completely useless and look like broken\n    if (data.instance.reference === boundariesElement) {\n      boundariesElement = getOffsetParent(boundariesElement);\n    }\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n    options.boundaries = boundaries;\n\n    var order = options.priority;\n    var popper = data.offsets.popper;\n\n    var check = {\n      primary: function primary(placement) {\n        var value = popper[placement];\n        if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n          value = Math.max(popper[placement], boundaries[placement]);\n        }\n        return defineProperty({}, placement, value);\n      },\n      secondary: function secondary(placement) {\n        var mainSide = placement === 'right' ? 'left' : 'top';\n        var value = popper[mainSide];\n        if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n          value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n        }\n        return defineProperty({}, mainSide, value);\n      }\n    };\n\n    order.forEach(function (placement) {\n      var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n      popper = _extends({}, popper, check[side](placement));\n    });\n\n    data.offsets.popper = popper;\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function shift(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var shiftvariation = placement.split('-')[1];\n\n    // if shift shiftvariation is specified, run the modifier\n    if (shiftvariation) {\n      var _data$offsets = data.offsets,\n          reference = _data$offsets.reference,\n          popper = _data$offsets.popper;\n\n      var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n      var side = isVertical ? 'left' : 'top';\n      var measurement = isVertical ? 'width' : 'height';\n\n      var shiftOffsets = {\n        start: defineProperty({}, side, reference[side]),\n        end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n      };\n\n      data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function hide(data) {\n    if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n      return data;\n    }\n\n    var refRect = data.offsets.reference;\n    var bound = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'preventOverflow';\n    }).boundaries;\n\n    if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === true) {\n        return data;\n      }\n\n      data.hide = true;\n      data.attributes['x-out-of-boundaries'] = '';\n    } else {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === false) {\n        return data;\n      }\n\n      data.hide = false;\n      data.attributes['x-out-of-boundaries'] = false;\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function inner(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n    var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n    popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n    data.placement = getOppositePlacement(placement);\n    data.offsets.popper = getClientRect(popper);\n\n    return data;\n  }\n\n  /**\n   * Modifier function, each modifier can have a function of this type assigned\n   * to its `fn` property.<br />\n   * These functions will be called on each update, this means that you must\n   * make sure they are performant enough to avoid performance bottlenecks.\n   *\n   * @function ModifierFn\n   * @argument {dataObject} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {dataObject} The data object, properly modified\n   */\n\n  /**\n   * Modifiers are plugins used to alter the behavior of your poppers.<br />\n   * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n   * needed by the library.\n   *\n   * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n   * All the other properties are configurations that could be tweaked.\n   * @namespace modifiers\n   */\n  var modifiers = {\n    /**\n     * Modifier used to shift the popper on the start or end of its reference\n     * element.<br />\n     * It will read the variation of the `placement` property.<br />\n     * It can be one either `-end` or `-start`.\n     * @memberof modifiers\n     * @inner\n     */\n    shift: {\n      /** @prop {number} order=100 - Index used to define the order of execution */\n      order: 100,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: shift\n    },\n\n    /**\n     * The `offset` modifier can shift your popper on both its axis.\n     *\n     * It accepts the following units:\n     * - `px` or unitless, interpreted as pixels\n     * - `%` or `%r`, percentage relative to the length of the reference element\n     * - `%p`, percentage relative to the length of the popper element\n     * - `vw`, CSS viewport width unit\n     * - `vh`, CSS viewport height unit\n     *\n     * For length is intended the main axis relative to the placement of the popper.<br />\n     * This means that if the placement is `top` or `bottom`, the length will be the\n     * `width`. In case of `left` or `right`, it will be the height.\n     *\n     * You can provide a single value (as `Number` or `String`), or a pair of values\n     * as `String` divided by a comma or one (or more) white spaces.<br />\n     * The latter is a deprecated method because it leads to confusion and will be\n     * removed in v2.<br />\n     * Additionally, it accepts additions and subtractions between different units.\n     * Note that multiplications and divisions aren't supported.\n     *\n     * Valid examples are:\n     * ```\n     * 10\n     * '10%'\n     * '10, 10'\n     * '10%, 10'\n     * '10 + 10%'\n     * '10 - 5vh + 3%'\n     * '-10px + 5vh, 5px - 6%'\n     * ```\n     * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n     * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n     * > More on this [reading this issue](https://github.com/FezVrasta/popper.js/issues/373)\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    offset: {\n      /** @prop {number} order=200 - Index used to define the order of execution */\n      order: 200,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: offset,\n      /** @prop {Number|String} offset=0\n       * The offset value as described in the modifier description\n       */\n      offset: 0\n    },\n\n    /**\n     * Modifier used to prevent the popper from being positioned outside the boundary.\n     *\n     * An scenario exists where the reference itself is not within the boundaries.<br />\n     * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n     * In this case we need to decide whether the popper should either:\n     *\n     * - detach from the reference and remain \"trapped\" in the boundaries, or\n     * - if it should ignore the boundary and \"escape with its reference\"\n     *\n     * When `escapeWithReference` is set to`true` and reference is completely\n     * outside its boundaries, the popper will overflow (or completely leave)\n     * the boundaries in order to remain attached to the edge of the reference.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    preventOverflow: {\n      /** @prop {number} order=300 - Index used to define the order of execution */\n      order: 300,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: preventOverflow,\n      /**\n       * @prop {Array} [priority=['left','right','top','bottom']]\n       * Popper will try to prevent overflow following these priorities by default,\n       * then, it could overflow on the left and on top of the `boundariesElement`\n       */\n      priority: ['left', 'right', 'top', 'bottom'],\n      /**\n       * @prop {number} padding=5\n       * Amount of pixel used to define a minimum distance between the boundaries\n       * and the popper this makes sure the popper has always a little padding\n       * between the edges of its container\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='scrollParent'\n       * Boundaries used by the modifier, can be `scrollParent`, `window`,\n       * `viewport` or any DOM element.\n       */\n      boundariesElement: 'scrollParent'\n    },\n\n    /**\n     * Modifier used to make sure the reference and its popper stay near eachothers\n     * without leaving any gap between the two. Expecially useful when the arrow is\n     * enabled and you want to assure it to point to its reference element.\n     * It cares only about the first axis, you can still have poppers with margin\n     * between the popper and its reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    keepTogether: {\n      /** @prop {number} order=400 - Index used to define the order of execution */\n      order: 400,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: keepTogether\n    },\n\n    /**\n     * This modifier is used to move the `arrowElement` of the popper to make\n     * sure it is positioned between the reference element and its popper element.\n     * It will read the outer size of the `arrowElement` node to detect how many\n     * pixels of conjuction are needed.\n     *\n     * It has no effect if no `arrowElement` is provided.\n     * @memberof modifiers\n     * @inner\n     */\n    arrow: {\n      /** @prop {number} order=500 - Index used to define the order of execution */\n      order: 500,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: arrow,\n      /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n      element: '[x-arrow]'\n    },\n\n    /**\n     * Modifier used to flip the popper's placement when it starts to overlap its\n     * reference element.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     *\n     * **NOTE:** this modifier will interrupt the current update cycle and will\n     * restart it if it detects the need to flip the placement.\n     * @memberof modifiers\n     * @inner\n     */\n    flip: {\n      /** @prop {number} order=600 - Index used to define the order of execution */\n      order: 600,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: flip,\n      /**\n       * @prop {String|Array} behavior='flip'\n       * The behavior used to change the popper's placement. It can be one of\n       * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n       * placements (with optional variations).\n       */\n      behavior: 'flip',\n      /**\n       * @prop {number} padding=5\n       * The popper will flip if it hits the edges of the `boundariesElement`\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='viewport'\n       * The element which will define the boundaries of the popper position,\n       * the popper will never be placed outside of the defined boundaries\n       * (except if keepTogether is enabled)\n       */\n      boundariesElement: 'viewport'\n    },\n\n    /**\n     * Modifier used to make the popper flow toward the inner of the reference element.\n     * By default, when this modifier is disabled, the popper will be placed outside\n     * the reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    inner: {\n      /** @prop {number} order=700 - Index used to define the order of execution */\n      order: 700,\n      /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n      enabled: false,\n      /** @prop {ModifierFn} */\n      fn: inner\n    },\n\n    /**\n     * Modifier used to hide the popper when its reference element is outside of the\n     * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n     * be used to hide with a CSS selector the popper when its reference is\n     * out of boundaries.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     * @memberof modifiers\n     * @inner\n     */\n    hide: {\n      /** @prop {number} order=800 - Index used to define the order of execution */\n      order: 800,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: hide\n    },\n\n    /**\n     * Computes the style that will be applied to the popper element to gets\n     * properly positioned.\n     *\n     * Note that this modifier will not touch the DOM, it just prepares the styles\n     * so that `applyStyle` modifier can apply it. This separation is useful\n     * in case you need to replace `applyStyle` with a custom implementation.\n     *\n     * This modifier has `850` as `order` value to maintain backward compatibility\n     * with previous versions of Popper.js. Expect the modifiers ordering method\n     * to change in future major versions of the library.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    computeStyle: {\n      /** @prop {number} order=850 - Index used to define the order of execution */\n      order: 850,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: computeStyle,\n      /**\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3d transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties.\n       */\n      gpuAcceleration: true,\n      /**\n       * @prop {string} [x='bottom']\n       * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n       * Change this if your popper should grow in a direction different from `bottom`\n       */\n      x: 'bottom',\n      /**\n       * @prop {string} [x='left']\n       * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n       * Change this if your popper should grow in a direction different from `right`\n       */\n      y: 'right'\n    },\n\n    /**\n     * Applies the computed styles to the popper element.\n     *\n     * All the DOM manipulations are limited to this modifier. This is useful in case\n     * you want to integrate Popper.js inside a framework or view library and you\n     * want to delegate all the DOM manipulations to it.\n     *\n     * Note that if you disable this modifier, you must make sure the popper element\n     * has its position set to `absolute` before Popper.js can do its work!\n     *\n     * Just disable this modifier and define you own to achieve the desired effect.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    applyStyle: {\n      /** @prop {number} order=900 - Index used to define the order of execution */\n      order: 900,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: applyStyle,\n      /** @prop {Function} */\n      onLoad: applyStyleOnLoad,\n      /**\n       * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3d transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties.\n       */\n      gpuAcceleration: undefined\n    }\n  };\n\n  /**\n   * The `dataObject` is an object containing all the informations used by Popper.js\n   * this object get passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n   * @name dataObject\n   * @property {Object} data.instance The Popper.js instance\n   * @property {String} data.placement Placement applied to popper\n   * @property {String} data.originalPlacement Placement originally defined on init\n   * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n   * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper.\n   * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n   * @property {Object} data.styles Any CSS property defined here will be applied to the popper, it expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow, it expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.boundaries Offsets of the popper boundaries\n   * @property {Object} data.offsets The measurements of popper, reference and arrow elements.\n   * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n   */\n\n  /**\n   * Default options provided to Popper.js constructor.<br />\n   * These can be overriden using the `options` argument of Popper.js.<br />\n   * To override an option, simply pass as 3rd argument an object with the same\n   * structure of this object, example:\n   * ```\n   * new Popper(ref, pop, {\n   *   modifiers: {\n   *     preventOverflow: { enabled: false }\n   *   }\n   * })\n   * ```\n   * @type {Object}\n   * @static\n   * @memberof Popper\n   */\n  var Defaults = {\n    /**\n     * Popper's placement\n     * @prop {Popper.placements} placement='bottom'\n     */\n    placement: 'bottom',\n\n    /**\n     * Set this to true if you want popper to position it self in 'fixed' mode\n     * @prop {Boolean} positionFixed=false\n     */\n    positionFixed: false,\n\n    /**\n     * Whether events (resize, scroll) are initially enabled\n     * @prop {Boolean} eventsEnabled=true\n     */\n    eventsEnabled: true,\n\n    /**\n     * Set to true if you want to automatically remove the popper when\n     * you call the `destroy` method.\n     * @prop {Boolean} removeOnDestroy=false\n     */\n    removeOnDestroy: false,\n\n    /**\n     * Callback called when the popper is created.<br />\n     * By default, is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onCreate}\n     */\n    onCreate: function onCreate() {},\n\n    /**\n     * Callback called when the popper is updated, this callback is not called\n     * on the initialization/creation of the popper, but only on subsequent\n     * updates.<br />\n     * By default, is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onUpdate}\n     */\n    onUpdate: function onUpdate() {},\n\n    /**\n     * List of modifiers used to modify the offsets before they are applied to the popper.\n     * They provide most of the functionalities of Popper.js\n     * @prop {modifiers}\n     */\n    modifiers: modifiers\n  };\n\n  /**\n   * @callback onCreate\n   * @param {dataObject} data\n   */\n\n  /**\n   * @callback onUpdate\n   * @param {dataObject} data\n   */\n\n  // Utils\n  // Methods\n  var Popper = function () {\n    /**\n     * Create a new Popper.js instance\n     * @class Popper\n     * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n     * @param {HTMLElement} popper - The HTML element used as popper.\n     * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n     * @return {Object} instance - The generated Popper.js instance\n     */\n    function Popper(reference, popper) {\n      var _this = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      classCallCheck(this, Popper);\n\n      this.scheduleUpdate = function () {\n        return requestAnimationFrame(_this.update);\n      };\n\n      // make update() debounced, so that it only runs at most once-per-tick\n      this.update = debounce(this.update.bind(this));\n\n      // with {} we create a new object with the options inside it\n      this.options = _extends({}, Popper.Defaults, options);\n\n      // init state\n      this.state = {\n        isDestroyed: false,\n        isCreated: false,\n        scrollParents: []\n      };\n\n      // get reference and popper elements (allow jQuery wrappers)\n      this.reference = reference && reference.jquery ? reference[0] : reference;\n      this.popper = popper && popper.jquery ? popper[0] : popper;\n\n      // Deep merge modifiers options\n      this.options.modifiers = {};\n      Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n        _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n      });\n\n      // Refactoring modifiers' list (Object => Array)\n      this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n        return _extends({\n          name: name\n        }, _this.options.modifiers[name]);\n      })\n      // sort the modifiers by order\n      .sort(function (a, b) {\n        return a.order - b.order;\n      });\n\n      // modifiers have the ability to execute arbitrary code when Popper.js get inited\n      // such code is executed in the same order of its modifier\n      // they could add new properties to their options configuration\n      // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n      this.modifiers.forEach(function (modifierOptions) {\n        if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n          modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n        }\n      });\n\n      // fire the first update to position the popper in the right place\n      this.update();\n\n      var eventsEnabled = this.options.eventsEnabled;\n      if (eventsEnabled) {\n        // setup event listeners, they will take care of update the position in specific situations\n        this.enableEventListeners();\n      }\n\n      this.state.eventsEnabled = eventsEnabled;\n    }\n\n    // We can't use class properties because they don't get listed in the\n    // class prototype and break stuff like Sinon stubs\n\n\n    createClass(Popper, [{\n      key: 'update',\n      value: function update$$1() {\n        return update.call(this);\n      }\n    }, {\n      key: 'destroy',\n      value: function destroy$$1() {\n        return destroy.call(this);\n      }\n    }, {\n      key: 'enableEventListeners',\n      value: function enableEventListeners$$1() {\n        return enableEventListeners.call(this);\n      }\n    }, {\n      key: 'disableEventListeners',\n      value: function disableEventListeners$$1() {\n        return disableEventListeners.call(this);\n      }\n\n      /**\n       * Schedule an update, it will run on the next UI update available\n       * @method scheduleUpdate\n       * @memberof Popper\n       */\n\n\n      /**\n       * Collection of utilities useful when writing custom modifiers.\n       * Starting from version 1.7, this method is available only if you\n       * include `popper-utils.js` before `popper.js`.\n       *\n       * **DEPRECATION**: This way to access PopperUtils is deprecated\n       * and will be removed in v2! Use the PopperUtils module directly instead.\n       * Due to the high instability of the methods contained in Utils, we can't\n       * guarantee them to follow semver. Use them at your own risk!\n       * @static\n       * @private\n       * @type {Object}\n       * @deprecated since version 1.8\n       * @member Utils\n       * @memberof Popper\n       */\n\n    }]);\n    return Popper;\n  }();\n\n  /**\n   * The `referenceObject` is an object that provides an interface compatible with Popper.js\n   * and lets you use it as replacement of a real DOM node.<br />\n   * You can use this method to position a popper relatively to a set of coordinates\n   * in case you don't have a DOM node to use as reference.\n   *\n   * ```\n   * new Popper(referenceObject, popperNode);\n   * ```\n   *\n   * NB: This feature isn't supported in Internet Explorer 10\n   * @name referenceObject\n   * @property {Function} data.getBoundingClientRect\n   * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n   * @property {number} data.clientWidth\n   * An ES6 getter that will return the width of the virtual reference element.\n   * @property {number} data.clientHeight\n   * An ES6 getter that will return the height of the virtual reference element.\n   */\n\n\n  Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n  Popper.placements = placements;\n  Popper.Defaults = Defaults;\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Dropdown = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'dropdown';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.dropdown';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n    var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n    var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n    var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n    var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n    var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n    var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      CLICK: \"click\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n      KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY + DATA_API_KEY,\n      KEYUP_DATA_API: \"keyup\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      DISABLED: 'disabled',\n      SHOW: 'show',\n      DROPUP: 'dropup',\n      DROPRIGHT: 'dropright',\n      DROPLEFT: 'dropleft',\n      MENURIGHT: 'dropdown-menu-right',\n      MENULEFT: 'dropdown-menu-left',\n      POSITION_STATIC: 'position-static'\n    };\n    var Selector = {\n      DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n      FORM_CHILD: '.dropdown form',\n      MENU: '.dropdown-menu',\n      NAVBAR_NAV: '.navbar-nav',\n      VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n    };\n    var AttachmentMap = {\n      TOP: 'top-start',\n      TOPEND: 'top-end',\n      BOTTOM: 'bottom-start',\n      BOTTOMEND: 'bottom-end',\n      RIGHT: 'right-start',\n      RIGHTEND: 'right-end',\n      LEFT: 'left-start',\n      LEFTEND: 'left-end'\n    };\n    var Default = {\n      offset: 0,\n      flip: true,\n      boundary: 'scrollParent',\n      reference: 'toggle',\n      display: 'dynamic'\n    };\n    var DefaultType = {\n      offset: '(number|string|function)',\n      flip: 'boolean',\n      boundary: '(string|element)',\n      reference: '(string|element)',\n      display: 'string'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Dropdown =\n    /*#__PURE__*/\n    function () {\n      function Dropdown(element, config) {\n        this._element = element;\n        this._popper = null;\n        this._config = this._getConfig(config);\n        this._menu = this._getMenuElement();\n        this._inNavbar = this._detectNavbar();\n\n        this._addEventListeners();\n      } // Getters\n\n\n      var _proto = Dropdown.prototype;\n\n      // Public\n      _proto.toggle = function toggle() {\n        if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);\n\n        Dropdown._clearMenus();\n\n        if (isActive) {\n          return;\n        }\n\n        var relatedTarget = {\n          relatedTarget: this._element\n        };\n        var showEvent = $$$1.Event(Event.SHOW, relatedTarget);\n        $$$1(parent).trigger(showEvent);\n\n        if (showEvent.isDefaultPrevented()) {\n          return;\n        } // Disable totally Popper.js for Dropdown in Navbar\n\n\n        if (!this._inNavbar) {\n          /**\n           * Check for Popper dependency\n           * Popper - https://popper.js.org\n           */\n          if (typeof Popper === 'undefined') {\n            throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');\n          }\n\n          var referenceElement = this._element;\n\n          if (this._config.reference === 'parent') {\n            referenceElement = parent;\n          } else if (Util.isElement(this._config.reference)) {\n            referenceElement = this._config.reference; // Check if it's jQuery element\n\n            if (typeof this._config.reference.jquery !== 'undefined') {\n              referenceElement = this._config.reference[0];\n            }\n          } // If boundary is not `scrollParent`, then set position to `static`\n          // to allow the menu to \"escape\" the scroll parent's boundaries\n          // https://github.com/twbs/bootstrap/issues/24251\n\n\n          if (this._config.boundary !== 'scrollParent') {\n            $$$1(parent).addClass(ClassName.POSITION_STATIC);\n          }\n\n          this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n        } // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n        if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n          $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n        }\n\n        this._element.focus();\n\n        this._element.setAttribute('aria-expanded', true);\n\n        $$$1(this._menu).toggleClass(ClassName.SHOW);\n        $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        $$$1(this._element).off(EVENT_KEY);\n        this._element = null;\n        this._menu = null;\n\n        if (this._popper !== null) {\n          this._popper.destroy();\n\n          this._popper = null;\n        }\n      };\n\n      _proto.update = function update() {\n        this._inNavbar = this._detectNavbar();\n\n        if (this._popper !== null) {\n          this._popper.scheduleUpdate();\n        }\n      }; // Private\n\n\n      _proto._addEventListeners = function _addEventListeners() {\n        var _this = this;\n\n        $$$1(this._element).on(Event.CLICK, function (event) {\n          event.preventDefault();\n          event.stopPropagation();\n\n          _this.toggle();\n        });\n      };\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, this.constructor.Default, $$$1(this._element).data(), config);\n        Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n        return config;\n      };\n\n      _proto._getMenuElement = function _getMenuElement() {\n        if (!this._menu) {\n          var parent = Dropdown._getParentFromElement(this._element);\n\n          this._menu = $$$1(parent).find(Selector.MENU)[0];\n        }\n\n        return this._menu;\n      };\n\n      _proto._getPlacement = function _getPlacement() {\n        var $parentDropdown = $$$1(this._element).parent();\n        var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n        if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n          placement = AttachmentMap.TOP;\n\n          if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n            placement = AttachmentMap.TOPEND;\n          }\n        } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n          placement = AttachmentMap.RIGHT;\n        } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n          placement = AttachmentMap.LEFT;\n        } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n          placement = AttachmentMap.BOTTOMEND;\n        }\n\n        return placement;\n      };\n\n      _proto._detectNavbar = function _detectNavbar() {\n        return $$$1(this._element).closest('.navbar').length > 0;\n      };\n\n      _proto._getPopperConfig = function _getPopperConfig() {\n        var _this2 = this;\n\n        var offsetConf = {};\n\n        if (typeof this._config.offset === 'function') {\n          offsetConf.fn = function (data) {\n            data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});\n            return data;\n          };\n        } else {\n          offsetConf.offset = this._config.offset;\n        }\n\n        var popperConfig = {\n          placement: this._getPlacement(),\n          modifiers: {\n            offset: offsetConf,\n            flip: {\n              enabled: this._config.flip\n            },\n            preventOverflow: {\n              boundariesElement: this._config.boundary\n            }\n          } // Disable Popper.js if we have a static display\n\n        };\n\n        if (this._config.display === 'static') {\n          popperConfig.modifiers.applyStyle = {\n            enabled: false\n          };\n        }\n\n        return popperConfig;\n      }; // Static\n\n\n      Dropdown._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' ? config : null;\n\n          if (!data) {\n            data = new Dropdown(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      Dropdown._clearMenus = function _clearMenus(event) {\n        if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n          return;\n        }\n\n        var toggles = $$$1.makeArray($$$1(Selector.DATA_TOGGLE));\n\n        for (var i = 0; i < toggles.length; i++) {\n          var parent = Dropdown._getParentFromElement(toggles[i]);\n\n          var context = $$$1(toggles[i]).data(DATA_KEY);\n          var relatedTarget = {\n            relatedTarget: toggles[i]\n          };\n\n          if (!context) {\n            continue;\n          }\n\n          var dropdownMenu = context._menu;\n\n          if (!$$$1(parent).hasClass(ClassName.SHOW)) {\n            continue;\n          }\n\n          if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {\n            continue;\n          }\n\n          var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);\n          $$$1(parent).trigger(hideEvent);\n\n          if (hideEvent.isDefaultPrevented()) {\n            continue;\n          } // If this is a touch-enabled device we remove the extra\n          // empty mouseover listeners we added for iOS support\n\n\n          if ('ontouchstart' in document.documentElement) {\n            $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n          }\n\n          toggles[i].setAttribute('aria-expanded', 'false');\n          $$$1(dropdownMenu).removeClass(ClassName.SHOW);\n          $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));\n        }\n      };\n\n      Dropdown._getParentFromElement = function _getParentFromElement(element) {\n        var parent;\n        var selector = Util.getSelectorFromElement(element);\n\n        if (selector) {\n          parent = $$$1(selector)[0];\n        }\n\n        return parent || element.parentNode;\n      }; // eslint-disable-next-line complexity\n\n\n      Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n        // If not input/textarea:\n        //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n        // If input/textarea:\n        //  - If space key => not a dropdown command\n        //  - If key is other than escape\n        //    - If key is not up or down => not a dropdown command\n        //    - If trigger inside the menu => not a dropdown command\n        if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n          return;\n        }\n\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var parent = Dropdown._getParentFromElement(this);\n\n        var isActive = $$$1(parent).hasClass(ClassName.SHOW);\n\n        if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n          if (event.which === ESCAPE_KEYCODE) {\n            var toggle = $$$1(parent).find(Selector.DATA_TOGGLE)[0];\n            $$$1(toggle).trigger('focus');\n          }\n\n          $$$1(this).trigger('click');\n          return;\n        }\n\n        var items = $$$1(parent).find(Selector.VISIBLE_ITEMS).get();\n\n        if (items.length === 0) {\n          return;\n        }\n\n        var index = items.indexOf(event.target);\n\n        if (event.which === ARROW_UP_KEYCODE && index > 0) {\n          // Up\n          index--;\n        }\n\n        if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n          // Down\n          index++;\n        }\n\n        if (index < 0) {\n          index = 0;\n        }\n\n        items[index].focus();\n      };\n\n      _createClass(Dropdown, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }, {\n        key: \"DefaultType\",\n        get: function get() {\n          return DefaultType;\n        }\n      }]);\n\n      return Dropdown;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + \" \" + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      Dropdown._jQueryInterface.call($$$1(this), 'toggle');\n    }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n      e.stopPropagation();\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Dropdown._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Dropdown;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Dropdown._jQueryInterface;\n    };\n\n    return Dropdown;\n  }($, Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Modal = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'modal';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.modal';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n    var Default = {\n      backdrop: true,\n      keyboard: true,\n      focus: true,\n      show: true\n    };\n    var DefaultType = {\n      backdrop: '(boolean|string)',\n      keyboard: 'boolean',\n      focus: 'boolean',\n      show: 'boolean'\n    };\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      FOCUSIN: \"focusin\" + EVENT_KEY,\n      RESIZE: \"resize\" + EVENT_KEY,\n      CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY,\n      KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY,\n      MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY,\n      MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n      BACKDROP: 'modal-backdrop',\n      OPEN: 'modal-open',\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      DIALOG: '.modal-dialog',\n      DATA_TOGGLE: '[data-toggle=\"modal\"]',\n      DATA_DISMISS: '[data-dismiss=\"modal\"]',\n      FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n      STICKY_CONTENT: '.sticky-top',\n      NAVBAR_TOGGLER: '.navbar-toggler'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Modal =\n    /*#__PURE__*/\n    function () {\n      function Modal(element, config) {\n        this._config = this._getConfig(config);\n        this._element = element;\n        this._dialog = $$$1(element).find(Selector.DIALOG)[0];\n        this._backdrop = null;\n        this._isShown = false;\n        this._isBodyOverflowing = false;\n        this._ignoreBackdropClick = false;\n        this._scrollbarWidth = 0;\n      } // Getters\n\n\n      var _proto = Modal.prototype;\n\n      // Public\n      _proto.toggle = function toggle(relatedTarget) {\n        return this._isShown ? this.hide() : this.show(relatedTarget);\n      };\n\n      _proto.show = function show(relatedTarget) {\n        var _this = this;\n\n        if (this._isTransitioning || this._isShown) {\n          return;\n        }\n\n        if ($$$1(this._element).hasClass(ClassName.FADE)) {\n          this._isTransitioning = true;\n        }\n\n        var showEvent = $$$1.Event(Event.SHOW, {\n          relatedTarget: relatedTarget\n        });\n        $$$1(this._element).trigger(showEvent);\n\n        if (this._isShown || showEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        this._isShown = true;\n\n        this._checkScrollbar();\n\n        this._setScrollbar();\n\n        this._adjustDialog();\n\n        $$$1(document.body).addClass(ClassName.OPEN);\n\n        this._setEscapeEvent();\n\n        this._setResizeEvent();\n\n        $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {\n          return _this.hide(event);\n        });\n        $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\n          $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {\n            if ($$$1(event.target).is(_this._element)) {\n              _this._ignoreBackdropClick = true;\n            }\n          });\n        });\n\n        this._showBackdrop(function () {\n          return _this._showElement(relatedTarget);\n        });\n      };\n\n      _proto.hide = function hide(event) {\n        var _this2 = this;\n\n        if (event) {\n          event.preventDefault();\n        }\n\n        if (this._isTransitioning || !this._isShown) {\n          return;\n        }\n\n        var hideEvent = $$$1.Event(Event.HIDE);\n        $$$1(this._element).trigger(hideEvent);\n\n        if (!this._isShown || hideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        this._isShown = false;\n        var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n        if (transition) {\n          this._isTransitioning = true;\n        }\n\n        this._setEscapeEvent();\n\n        this._setResizeEvent();\n\n        $$$1(document).off(Event.FOCUSIN);\n        $$$1(this._element).removeClass(ClassName.SHOW);\n        $$$1(this._element).off(Event.CLICK_DISMISS);\n        $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);\n\n        if (transition) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n          $$$1(this._element).one(Util.TRANSITION_END, function (event) {\n            return _this2._hideModal(event);\n          }).emulateTransitionEnd(transitionDuration);\n        } else {\n          this._hideModal();\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);\n        this._config = null;\n        this._element = null;\n        this._dialog = null;\n        this._backdrop = null;\n        this._isShown = null;\n        this._isBodyOverflowing = null;\n        this._ignoreBackdropClick = null;\n        this._scrollbarWidth = null;\n      };\n\n      _proto.handleUpdate = function handleUpdate() {\n        this._adjustDialog();\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._showElement = function _showElement(relatedTarget) {\n        var _this3 = this;\n\n        var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n        if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n          // Don't move modal's DOM position\n          document.body.appendChild(this._element);\n        }\n\n        this._element.style.display = 'block';\n\n        this._element.removeAttribute('aria-hidden');\n\n        this._element.scrollTop = 0;\n\n        if (transition) {\n          Util.reflow(this._element);\n        }\n\n        $$$1(this._element).addClass(ClassName.SHOW);\n\n        if (this._config.focus) {\n          this._enforceFocus();\n        }\n\n        var shownEvent = $$$1.Event(Event.SHOWN, {\n          relatedTarget: relatedTarget\n        });\n\n        var transitionComplete = function transitionComplete() {\n          if (_this3._config.focus) {\n            _this3._element.focus();\n          }\n\n          _this3._isTransitioning = false;\n          $$$1(_this3._element).trigger(shownEvent);\n        };\n\n        if (transition) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n          $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n        } else {\n          transitionComplete();\n        }\n      };\n\n      _proto._enforceFocus = function _enforceFocus() {\n        var _this4 = this;\n\n        $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop\n        .on(Event.FOCUSIN, function (event) {\n          if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) {\n            _this4._element.focus();\n          }\n        });\n      };\n\n      _proto._setEscapeEvent = function _setEscapeEvent() {\n        var _this5 = this;\n\n        if (this._isShown && this._config.keyboard) {\n          $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\n            if (event.which === ESCAPE_KEYCODE) {\n              event.preventDefault();\n\n              _this5.hide();\n            }\n          });\n        } else if (!this._isShown) {\n          $$$1(this._element).off(Event.KEYDOWN_DISMISS);\n        }\n      };\n\n      _proto._setResizeEvent = function _setResizeEvent() {\n        var _this6 = this;\n\n        if (this._isShown) {\n          $$$1(window).on(Event.RESIZE, function (event) {\n            return _this6.handleUpdate(event);\n          });\n        } else {\n          $$$1(window).off(Event.RESIZE);\n        }\n      };\n\n      _proto._hideModal = function _hideModal() {\n        var _this7 = this;\n\n        this._element.style.display = 'none';\n\n        this._element.setAttribute('aria-hidden', true);\n\n        this._isTransitioning = false;\n\n        this._showBackdrop(function () {\n          $$$1(document.body).removeClass(ClassName.OPEN);\n\n          _this7._resetAdjustments();\n\n          _this7._resetScrollbar();\n\n          $$$1(_this7._element).trigger(Event.HIDDEN);\n        });\n      };\n\n      _proto._removeBackdrop = function _removeBackdrop() {\n        if (this._backdrop) {\n          $$$1(this._backdrop).remove();\n          this._backdrop = null;\n        }\n      };\n\n      _proto._showBackdrop = function _showBackdrop(callback) {\n        var _this8 = this;\n\n        var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\n\n        if (this._isShown && this._config.backdrop) {\n          this._backdrop = document.createElement('div');\n          this._backdrop.className = ClassName.BACKDROP;\n\n          if (animate) {\n            $$$1(this._backdrop).addClass(animate);\n          }\n\n          $$$1(this._backdrop).appendTo(document.body);\n          $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {\n            if (_this8._ignoreBackdropClick) {\n              _this8._ignoreBackdropClick = false;\n              return;\n            }\n\n            if (event.target !== event.currentTarget) {\n              return;\n            }\n\n            if (_this8._config.backdrop === 'static') {\n              _this8._element.focus();\n            } else {\n              _this8.hide();\n            }\n          });\n\n          if (animate) {\n            Util.reflow(this._backdrop);\n          }\n\n          $$$1(this._backdrop).addClass(ClassName.SHOW);\n\n          if (!callback) {\n            return;\n          }\n\n          if (!animate) {\n            callback();\n            return;\n          }\n\n          var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n          $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n        } else if (!this._isShown && this._backdrop) {\n          $$$1(this._backdrop).removeClass(ClassName.SHOW);\n\n          var callbackRemove = function callbackRemove() {\n            _this8._removeBackdrop();\n\n            if (callback) {\n              callback();\n            }\n          };\n\n          if ($$$1(this._element).hasClass(ClassName.FADE)) {\n            var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n            $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n          } else {\n            callbackRemove();\n          }\n        } else if (callback) {\n          callback();\n        }\n      }; // ----------------------------------------------------------------------\n      // the following methods are used to handle overflowing modals\n      // todo (fat): these should probably be refactored out of modal.js\n      // ----------------------------------------------------------------------\n\n\n      _proto._adjustDialog = function _adjustDialog() {\n        var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n        if (!this._isBodyOverflowing && isModalOverflowing) {\n          this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n        }\n\n        if (this._isBodyOverflowing && !isModalOverflowing) {\n          this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n        }\n      };\n\n      _proto._resetAdjustments = function _resetAdjustments() {\n        this._element.style.paddingLeft = '';\n        this._element.style.paddingRight = '';\n      };\n\n      _proto._checkScrollbar = function _checkScrollbar() {\n        var rect = document.body.getBoundingClientRect();\n        this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n        this._scrollbarWidth = this._getScrollbarWidth();\n      };\n\n      _proto._setScrollbar = function _setScrollbar() {\n        var _this9 = this;\n\n        if (this._isBodyOverflowing) {\n          // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n          //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n          // Adjust fixed content padding\n          $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n            var actualPadding = $$$1(element)[0].style.paddingRight;\n            var calculatedPadding = $$$1(element).css('padding-right');\n            $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n          }); // Adjust sticky content margin\n\n          $$$1(Selector.STICKY_CONTENT).each(function (index, element) {\n            var actualMargin = $$$1(element)[0].style.marginRight;\n            var calculatedMargin = $$$1(element).css('margin-right');\n            $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n          }); // Adjust navbar-toggler margin\n\n          $$$1(Selector.NAVBAR_TOGGLER).each(function (index, element) {\n            var actualMargin = $$$1(element)[0].style.marginRight;\n            var calculatedMargin = $$$1(element).css('margin-right');\n            $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + \"px\");\n          }); // Adjust body padding\n\n          var actualPadding = document.body.style.paddingRight;\n          var calculatedPadding = $$$1(document.body).css('padding-right');\n          $$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n        }\n      };\n\n      _proto._resetScrollbar = function _resetScrollbar() {\n        // Restore fixed content padding\n        $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n          var padding = $$$1(element).data('padding-right');\n\n          if (typeof padding !== 'undefined') {\n            $$$1(element).css('padding-right', padding).removeData('padding-right');\n          }\n        }); // Restore sticky content and navbar-toggler margin\n\n        $$$1(Selector.STICKY_CONTENT + \", \" + Selector.NAVBAR_TOGGLER).each(function (index, element) {\n          var margin = $$$1(element).data('margin-right');\n\n          if (typeof margin !== 'undefined') {\n            $$$1(element).css('margin-right', margin).removeData('margin-right');\n          }\n        }); // Restore body padding\n\n        var padding = $$$1(document.body).data('padding-right');\n\n        if (typeof padding !== 'undefined') {\n          $$$1(document.body).css('padding-right', padding).removeData('padding-right');\n        }\n      };\n\n      _proto._getScrollbarWidth = function _getScrollbarWidth() {\n        // thx d.walsh\n        var scrollDiv = document.createElement('div');\n        scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\n        document.body.appendChild(scrollDiv);\n        var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n        document.body.removeChild(scrollDiv);\n        return scrollbarWidth;\n      }; // Static\n\n\n      Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = _objectSpread({}, Modal.Default, $$$1(this).data(), typeof config === 'object' && config);\n\n          if (!data) {\n            data = new Modal(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config](relatedTarget);\n          } else if (_config.show) {\n            data.show(relatedTarget);\n          }\n        });\n      };\n\n      _createClass(Modal, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return Modal;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      var _this10 = this;\n\n      var target;\n      var selector = Util.getSelectorFromElement(this);\n\n      if (selector) {\n        target = $$$1(selector)[0];\n      }\n\n      var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n      if (this.tagName === 'A' || this.tagName === 'AREA') {\n        event.preventDefault();\n      }\n\n      var $target = $$$1(target).one(Event.SHOW, function (showEvent) {\n        if (showEvent.isDefaultPrevented()) {\n          // Only register focus restorer if modal will actually get shown\n          return;\n        }\n\n        $target.one(Event.HIDDEN, function () {\n          if ($$$1(_this10).is(':visible')) {\n            _this10.focus();\n          }\n        });\n      });\n\n      Modal._jQueryInterface.call($$$1(target), config, this);\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Modal._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Modal;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Modal._jQueryInterface;\n    };\n\n    return Modal;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Tooltip = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'tooltip';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.tooltip';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var CLASS_PREFIX = 'bs-tooltip';\n    var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n    var DefaultType = {\n      animation: 'boolean',\n      template: 'string',\n      title: '(string|element|function)',\n      trigger: 'string',\n      delay: '(number|object)',\n      html: 'boolean',\n      selector: '(string|boolean)',\n      placement: '(string|function)',\n      offset: '(number|string)',\n      container: '(string|element|boolean)',\n      fallbackPlacement: '(string|array)',\n      boundary: '(string|element)'\n    };\n    var AttachmentMap = {\n      AUTO: 'auto',\n      TOP: 'top',\n      RIGHT: 'right',\n      BOTTOM: 'bottom',\n      LEFT: 'left'\n    };\n    var Default = {\n      animation: true,\n      template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n      trigger: 'hover focus',\n      title: '',\n      delay: 0,\n      html: false,\n      selector: false,\n      placement: 'top',\n      offset: 0,\n      container: false,\n      fallbackPlacement: 'flip',\n      boundary: 'scrollParent'\n    };\n    var HoverState = {\n      SHOW: 'show',\n      OUT: 'out'\n    };\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      INSERTED: \"inserted\" + EVENT_KEY,\n      CLICK: \"click\" + EVENT_KEY,\n      FOCUSIN: \"focusin\" + EVENT_KEY,\n      FOCUSOUT: \"focusout\" + EVENT_KEY,\n      MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n      MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n    };\n    var ClassName = {\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      TOOLTIP: '.tooltip',\n      TOOLTIP_INNER: '.tooltip-inner',\n      ARROW: '.arrow'\n    };\n    var Trigger = {\n      HOVER: 'hover',\n      FOCUS: 'focus',\n      CLICK: 'click',\n      MANUAL: 'manual'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Tooltip =\n    /*#__PURE__*/\n    function () {\n      function Tooltip(element, config) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');\n        } // private\n\n\n        this._isEnabled = true;\n        this._timeout = 0;\n        this._hoverState = '';\n        this._activeTrigger = {};\n        this._popper = null; // Protected\n\n        this.element = element;\n        this.config = this._getConfig(config);\n        this.tip = null;\n\n        this._setListeners();\n      } // Getters\n\n\n      var _proto = Tooltip.prototype;\n\n      // Public\n      _proto.enable = function enable() {\n        this._isEnabled = true;\n      };\n\n      _proto.disable = function disable() {\n        this._isEnabled = false;\n      };\n\n      _proto.toggleEnabled = function toggleEnabled() {\n        this._isEnabled = !this._isEnabled;\n      };\n\n      _proto.toggle = function toggle(event) {\n        if (!this._isEnabled) {\n          return;\n        }\n\n        if (event) {\n          var dataKey = this.constructor.DATA_KEY;\n          var context = $$$1(event.currentTarget).data(dataKey);\n\n          if (!context) {\n            context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n            $$$1(event.currentTarget).data(dataKey, context);\n          }\n\n          context._activeTrigger.click = !context._activeTrigger.click;\n\n          if (context._isWithActiveTrigger()) {\n            context._enter(null, context);\n          } else {\n            context._leave(null, context);\n          }\n        } else {\n          if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {\n            this._leave(null, this);\n\n            return;\n          }\n\n          this._enter(null, this);\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        clearTimeout(this._timeout);\n        $$$1.removeData(this.element, this.constructor.DATA_KEY);\n        $$$1(this.element).off(this.constructor.EVENT_KEY);\n        $$$1(this.element).closest('.modal').off('hide.bs.modal');\n\n        if (this.tip) {\n          $$$1(this.tip).remove();\n        }\n\n        this._isEnabled = null;\n        this._timeout = null;\n        this._hoverState = null;\n        this._activeTrigger = null;\n\n        if (this._popper !== null) {\n          this._popper.destroy();\n        }\n\n        this._popper = null;\n        this.element = null;\n        this.config = null;\n        this.tip = null;\n      };\n\n      _proto.show = function show() {\n        var _this = this;\n\n        if ($$$1(this.element).css('display') === 'none') {\n          throw new Error('Please use show on visible elements');\n        }\n\n        var showEvent = $$$1.Event(this.constructor.Event.SHOW);\n\n        if (this.isWithContent() && this._isEnabled) {\n          $$$1(this.element).trigger(showEvent);\n          var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);\n\n          if (showEvent.isDefaultPrevented() || !isInTheDom) {\n            return;\n          }\n\n          var tip = this.getTipElement();\n          var tipId = Util.getUID(this.constructor.NAME);\n          tip.setAttribute('id', tipId);\n          this.element.setAttribute('aria-describedby', tipId);\n          this.setContent();\n\n          if (this.config.animation) {\n            $$$1(tip).addClass(ClassName.FADE);\n          }\n\n          var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n          var attachment = this._getAttachment(placement);\n\n          this.addAttachmentClass(attachment);\n          var container = this.config.container === false ? document.body : $$$1(this.config.container);\n          $$$1(tip).data(this.constructor.DATA_KEY, this);\n\n          if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {\n            $$$1(tip).appendTo(container);\n          }\n\n          $$$1(this.element).trigger(this.constructor.Event.INSERTED);\n          this._popper = new Popper(this.element, tip, {\n            placement: attachment,\n            modifiers: {\n              offset: {\n                offset: this.config.offset\n              },\n              flip: {\n                behavior: this.config.fallbackPlacement\n              },\n              arrow: {\n                element: Selector.ARROW\n              },\n              preventOverflow: {\n                boundariesElement: this.config.boundary\n              }\n            },\n            onCreate: function onCreate(data) {\n              if (data.originalPlacement !== data.placement) {\n                _this._handlePopperPlacementChange(data);\n              }\n            },\n            onUpdate: function onUpdate(data) {\n              _this._handlePopperPlacementChange(data);\n            }\n          });\n          $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra\n          // empty mouseover listeners to the body's immediate children;\n          // only needed because of broken event delegation on iOS\n          // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n          if ('ontouchstart' in document.documentElement) {\n            $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n          }\n\n          var complete = function complete() {\n            if (_this.config.animation) {\n              _this._fixTransition();\n            }\n\n            var prevHoverState = _this._hoverState;\n            _this._hoverState = null;\n            $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n            if (prevHoverState === HoverState.OUT) {\n              _this._leave(null, _this);\n            }\n          };\n\n          if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n            var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n            $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n          } else {\n            complete();\n          }\n        }\n      };\n\n      _proto.hide = function hide(callback) {\n        var _this2 = this;\n\n        var tip = this.getTipElement();\n        var hideEvent = $$$1.Event(this.constructor.Event.HIDE);\n\n        var complete = function complete() {\n          if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n            tip.parentNode.removeChild(tip);\n          }\n\n          _this2._cleanTipClass();\n\n          _this2.element.removeAttribute('aria-describedby');\n\n          $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n          if (_this2._popper !== null) {\n            _this2._popper.destroy();\n          }\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        $$$1(this.element).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n        if ('ontouchstart' in document.documentElement) {\n          $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n        }\n\n        this._activeTrigger[Trigger.CLICK] = false;\n        this._activeTrigger[Trigger.FOCUS] = false;\n        this._activeTrigger[Trigger.HOVER] = false;\n\n        if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(tip);\n          $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n\n        this._hoverState = '';\n      };\n\n      _proto.update = function update() {\n        if (this._popper !== null) {\n          this._popper.scheduleUpdate();\n        }\n      }; // Protected\n\n\n      _proto.isWithContent = function isWithContent() {\n        return Boolean(this.getTitle());\n      };\n\n      _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n        $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n      };\n\n      _proto.getTipElement = function getTipElement() {\n        this.tip = this.tip || $$$1(this.config.template)[0];\n        return this.tip;\n      };\n\n      _proto.setContent = function setContent() {\n        var $tip = $$$1(this.getTipElement());\n        this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());\n        $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n      };\n\n      _proto.setElementContent = function setElementContent($element, content) {\n        var html = this.config.html;\n\n        if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n          // Content is a DOM node or a jQuery\n          if (html) {\n            if (!$$$1(content).parent().is($element)) {\n              $element.empty().append(content);\n            }\n          } else {\n            $element.text($$$1(content).text());\n          }\n        } else {\n          $element[html ? 'html' : 'text'](content);\n        }\n      };\n\n      _proto.getTitle = function getTitle() {\n        var title = this.element.getAttribute('data-original-title');\n\n        if (!title) {\n          title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n        }\n\n        return title;\n      }; // Private\n\n\n      _proto._getAttachment = function _getAttachment(placement) {\n        return AttachmentMap[placement.toUpperCase()];\n      };\n\n      _proto._setListeners = function _setListeners() {\n        var _this3 = this;\n\n        var triggers = this.config.trigger.split(' ');\n        triggers.forEach(function (trigger) {\n          if (trigger === 'click') {\n            $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {\n              return _this3.toggle(event);\n            });\n          } else if (trigger !== Trigger.MANUAL) {\n            var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;\n            var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;\n            $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {\n              return _this3._enter(event);\n            }).on(eventOut, _this3.config.selector, function (event) {\n              return _this3._leave(event);\n            });\n          }\n\n          $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {\n            return _this3.hide();\n          });\n        });\n\n        if (this.config.selector) {\n          this.config = _objectSpread({}, this.config, {\n            trigger: 'manual',\n            selector: ''\n          });\n        } else {\n          this._fixTitle();\n        }\n      };\n\n      _proto._fixTitle = function _fixTitle() {\n        var titleType = typeof this.element.getAttribute('data-original-title');\n\n        if (this.element.getAttribute('title') || titleType !== 'string') {\n          this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n          this.element.setAttribute('title', '');\n        }\n      };\n\n      _proto._enter = function _enter(event, context) {\n        var dataKey = this.constructor.DATA_KEY;\n        context = context || $$$1(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $$$1(event.currentTarget).data(dataKey, context);\n        }\n\n        if (event) {\n          context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n        }\n\n        if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n          context._hoverState = HoverState.SHOW;\n          return;\n        }\n\n        clearTimeout(context._timeout);\n        context._hoverState = HoverState.SHOW;\n\n        if (!context.config.delay || !context.config.delay.show) {\n          context.show();\n          return;\n        }\n\n        context._timeout = setTimeout(function () {\n          if (context._hoverState === HoverState.SHOW) {\n            context.show();\n          }\n        }, context.config.delay.show);\n      };\n\n      _proto._leave = function _leave(event, context) {\n        var dataKey = this.constructor.DATA_KEY;\n        context = context || $$$1(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $$$1(event.currentTarget).data(dataKey, context);\n        }\n\n        if (event) {\n          context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n        }\n\n        if (context._isWithActiveTrigger()) {\n          return;\n        }\n\n        clearTimeout(context._timeout);\n        context._hoverState = HoverState.OUT;\n\n        if (!context.config.delay || !context.config.delay.hide) {\n          context.hide();\n          return;\n        }\n\n        context._timeout = setTimeout(function () {\n          if (context._hoverState === HoverState.OUT) {\n            context.hide();\n          }\n        }, context.config.delay.hide);\n      };\n\n      _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n        for (var trigger in this._activeTrigger) {\n          if (this._activeTrigger[trigger]) {\n            return true;\n          }\n        }\n\n        return false;\n      };\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), config);\n\n        if (typeof config.delay === 'number') {\n          config.delay = {\n            show: config.delay,\n            hide: config.delay\n          };\n        }\n\n        if (typeof config.title === 'number') {\n          config.title = config.title.toString();\n        }\n\n        if (typeof config.content === 'number') {\n          config.content = config.content.toString();\n        }\n\n        Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n        return config;\n      };\n\n      _proto._getDelegateConfig = function _getDelegateConfig() {\n        var config = {};\n\n        if (this.config) {\n          for (var key in this.config) {\n            if (this.constructor.Default[key] !== this.config[key]) {\n              config[key] = this.config[key];\n            }\n          }\n        }\n\n        return config;\n      };\n\n      _proto._cleanTipClass = function _cleanTipClass() {\n        var $tip = $$$1(this.getTipElement());\n        var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n        if (tabClass !== null && tabClass.length > 0) {\n          $tip.removeClass(tabClass.join(''));\n        }\n      };\n\n      _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {\n        this._cleanTipClass();\n\n        this.addAttachmentClass(this._getAttachment(data.placement));\n      };\n\n      _proto._fixTransition = function _fixTransition() {\n        var tip = this.getTipElement();\n        var initConfigAnimation = this.config.animation;\n\n        if (tip.getAttribute('x-placement') !== null) {\n          return;\n        }\n\n        $$$1(tip).removeClass(ClassName.FADE);\n        this.config.animation = false;\n        this.hide();\n        this.show();\n        this.config.animation = initConfigAnimation;\n      }; // Static\n\n\n      Tooltip._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' && config;\n\n          if (!data && /dispose|hide/.test(config)) {\n            return;\n          }\n\n          if (!data) {\n            data = new Tooltip(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Tooltip, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }, {\n        key: \"NAME\",\n        get: function get() {\n          return NAME;\n        }\n      }, {\n        key: \"DATA_KEY\",\n        get: function get() {\n          return DATA_KEY;\n        }\n      }, {\n        key: \"Event\",\n        get: function get() {\n          return Event;\n        }\n      }, {\n        key: \"EVENT_KEY\",\n        get: function get() {\n          return EVENT_KEY;\n        }\n      }, {\n        key: \"DefaultType\",\n        get: function get() {\n          return DefaultType;\n        }\n      }]);\n\n      return Tooltip;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1.fn[NAME] = Tooltip._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Tooltip;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Tooltip._jQueryInterface;\n    };\n\n    return Tooltip;\n  }($, Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Popover = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'popover';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.popover';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var CLASS_PREFIX = 'bs-popover';\n    var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n\n    var Default = _objectSpread({}, Tooltip.Default, {\n      placement: 'right',\n      trigger: 'click',\n      content: '',\n      template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n    });\n\n    var DefaultType = _objectSpread({}, Tooltip.DefaultType, {\n      content: '(string|element|function)'\n    });\n\n    var ClassName = {\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      TITLE: '.popover-header',\n      CONTENT: '.popover-body'\n    };\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      INSERTED: \"inserted\" + EVENT_KEY,\n      CLICK: \"click\" + EVENT_KEY,\n      FOCUSIN: \"focusin\" + EVENT_KEY,\n      FOCUSOUT: \"focusout\" + EVENT_KEY,\n      MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n      MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Popover =\n    /*#__PURE__*/\n    function (_Tooltip) {\n      _inheritsLoose(Popover, _Tooltip);\n\n      function Popover() {\n        return _Tooltip.apply(this, arguments) || this;\n      }\n\n      var _proto = Popover.prototype;\n\n      // Overrides\n      _proto.isWithContent = function isWithContent() {\n        return this.getTitle() || this._getContent();\n      };\n\n      _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n        $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n      };\n\n      _proto.getTipElement = function getTipElement() {\n        this.tip = this.tip || $$$1(this.config.template)[0];\n        return this.tip;\n      };\n\n      _proto.setContent = function setContent() {\n        var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events\n\n        this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\n\n        var content = this._getContent();\n\n        if (typeof content === 'function') {\n          content = content.call(this.element);\n        }\n\n        this.setElementContent($tip.find(Selector.CONTENT), content);\n        $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n      }; // Private\n\n\n      _proto._getContent = function _getContent() {\n        return this.element.getAttribute('data-content') || this.config.content;\n      };\n\n      _proto._cleanTipClass = function _cleanTipClass() {\n        var $tip = $$$1(this.getTipElement());\n        var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n        if (tabClass !== null && tabClass.length > 0) {\n          $tip.removeClass(tabClass.join(''));\n        }\n      }; // Static\n\n\n      Popover._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' ? config : null;\n\n          if (!data && /destroy|hide/.test(config)) {\n            return;\n          }\n\n          if (!data) {\n            data = new Popover(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Popover, null, [{\n        key: \"VERSION\",\n        // Getters\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }, {\n        key: \"NAME\",\n        get: function get() {\n          return NAME;\n        }\n      }, {\n        key: \"DATA_KEY\",\n        get: function get() {\n          return DATA_KEY;\n        }\n      }, {\n        key: \"Event\",\n        get: function get() {\n          return Event;\n        }\n      }, {\n        key: \"EVENT_KEY\",\n        get: function get() {\n          return EVENT_KEY;\n        }\n      }, {\n        key: \"DefaultType\",\n        get: function get() {\n          return DefaultType;\n        }\n      }]);\n\n      return Popover;\n    }(Tooltip);\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1.fn[NAME] = Popover._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Popover;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Popover._jQueryInterface;\n    };\n\n    return Popover;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var ScrollSpy = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'scrollspy';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.scrollspy';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Default = {\n      offset: 10,\n      method: 'auto',\n      target: ''\n    };\n    var DefaultType = {\n      offset: 'number',\n      method: 'string',\n      target: '(string|element)'\n    };\n    var Event = {\n      ACTIVATE: \"activate\" + EVENT_KEY,\n      SCROLL: \"scroll\" + EVENT_KEY,\n      LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      DROPDOWN_ITEM: 'dropdown-item',\n      DROPDOWN_MENU: 'dropdown-menu',\n      ACTIVE: 'active'\n    };\n    var Selector = {\n      DATA_SPY: '[data-spy=\"scroll\"]',\n      ACTIVE: '.active',\n      NAV_LIST_GROUP: '.nav, .list-group',\n      NAV_LINKS: '.nav-link',\n      NAV_ITEMS: '.nav-item',\n      LIST_ITEMS: '.list-group-item',\n      DROPDOWN: '.dropdown',\n      DROPDOWN_ITEMS: '.dropdown-item',\n      DROPDOWN_TOGGLE: '.dropdown-toggle'\n    };\n    var OffsetMethod = {\n      OFFSET: 'offset',\n      POSITION: 'position'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var ScrollSpy =\n    /*#__PURE__*/\n    function () {\n      function ScrollSpy(element, config) {\n        var _this = this;\n\n        this._element = element;\n        this._scrollElement = element.tagName === 'BODY' ? window : element;\n        this._config = this._getConfig(config);\n        this._selector = this._config.target + \" \" + Selector.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector.DROPDOWN_ITEMS);\n        this._offsets = [];\n        this._targets = [];\n        this._activeTarget = null;\n        this._scrollHeight = 0;\n        $$$1(this._scrollElement).on(Event.SCROLL, function (event) {\n          return _this._process(event);\n        });\n        this.refresh();\n\n        this._process();\n      } // Getters\n\n\n      var _proto = ScrollSpy.prototype;\n\n      // Public\n      _proto.refresh = function refresh() {\n        var _this2 = this;\n\n        var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n        var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n        var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n        this._offsets = [];\n        this._targets = [];\n        this._scrollHeight = this._getScrollHeight();\n        var targets = $$$1.makeArray($$$1(this._selector));\n        targets.map(function (element) {\n          var target;\n          var targetSelector = Util.getSelectorFromElement(element);\n\n          if (targetSelector) {\n            target = $$$1(targetSelector)[0];\n          }\n\n          if (target) {\n            var targetBCR = target.getBoundingClientRect();\n\n            if (targetBCR.width || targetBCR.height) {\n              // TODO (fat): remove sketch reliance on jQuery position/offset\n              return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];\n            }\n          }\n\n          return null;\n        }).filter(function (item) {\n          return item;\n        }).sort(function (a, b) {\n          return a[0] - b[0];\n        }).forEach(function (item) {\n          _this2._offsets.push(item[0]);\n\n          _this2._targets.push(item[1]);\n        });\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        $$$1(this._scrollElement).off(EVENT_KEY);\n        this._element = null;\n        this._scrollElement = null;\n        this._config = null;\n        this._selector = null;\n        this._offsets = null;\n        this._targets = null;\n        this._activeTarget = null;\n        this._scrollHeight = null;\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n\n        if (typeof config.target !== 'string') {\n          var id = $$$1(config.target).attr('id');\n\n          if (!id) {\n            id = Util.getUID(NAME);\n            $$$1(config.target).attr('id', id);\n          }\n\n          config.target = \"#\" + id;\n        }\n\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._getScrollTop = function _getScrollTop() {\n        return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n      };\n\n      _proto._getScrollHeight = function _getScrollHeight() {\n        return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n      };\n\n      _proto._getOffsetHeight = function _getOffsetHeight() {\n        return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n      };\n\n      _proto._process = function _process() {\n        var scrollTop = this._getScrollTop() + this._config.offset;\n\n        var scrollHeight = this._getScrollHeight();\n\n        var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n        if (this._scrollHeight !== scrollHeight) {\n          this.refresh();\n        }\n\n        if (scrollTop >= maxScroll) {\n          var target = this._targets[this._targets.length - 1];\n\n          if (this._activeTarget !== target) {\n            this._activate(target);\n          }\n\n          return;\n        }\n\n        if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n          this._activeTarget = null;\n\n          this._clear();\n\n          return;\n        }\n\n        for (var i = this._offsets.length; i--;) {\n          var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n          if (isActiveTarget) {\n            this._activate(this._targets[i]);\n          }\n        }\n      };\n\n      _proto._activate = function _activate(target) {\n        this._activeTarget = target;\n\n        this._clear();\n\n        var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style\n\n\n        queries = queries.map(function (selector) {\n          return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + (selector + \"[href=\\\"\" + target + \"\\\"]\");\n        });\n        var $link = $$$1(queries.join(','));\n\n        if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n          $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n          $link.addClass(ClassName.ACTIVE);\n        } else {\n          // Set triggered link as active\n          $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + \", \" + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\n        }\n\n        $$$1(this._scrollElement).trigger(Event.ACTIVATE, {\n          relatedTarget: target\n        });\n      };\n\n      _proto._clear = function _clear() {\n        $$$1(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n      }; // Static\n\n\n      ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' && config;\n\n          if (!data) {\n            data = new ScrollSpy(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(ScrollSpy, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return ScrollSpy;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(window).on(Event.LOAD_DATA_API, function () {\n      var scrollSpys = $$$1.makeArray($$$1(Selector.DATA_SPY));\n\n      for (var i = scrollSpys.length; i--;) {\n        var $spy = $$$1(scrollSpys[i]);\n\n        ScrollSpy._jQueryInterface.call($spy, $spy.data());\n      }\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = ScrollSpy._jQueryInterface;\n    $$$1.fn[NAME].Constructor = ScrollSpy;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return ScrollSpy._jQueryInterface;\n    };\n\n    return ScrollSpy;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Tab = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'tab';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.tab';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      DROPDOWN_MENU: 'dropdown-menu',\n      ACTIVE: 'active',\n      DISABLED: 'disabled',\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      DROPDOWN: '.dropdown',\n      NAV_LIST_GROUP: '.nav, .list-group',\n      ACTIVE: '.active',\n      ACTIVE_UL: '> li > .active',\n      DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n      DROPDOWN_TOGGLE: '.dropdown-toggle',\n      DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Tab =\n    /*#__PURE__*/\n    function () {\n      function Tab(element) {\n        this._element = element;\n      } // Getters\n\n\n      var _proto = Tab.prototype;\n\n      // Public\n      _proto.show = function show() {\n        var _this = this;\n\n        if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var target;\n        var previous;\n        var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];\n        var selector = Util.getSelectorFromElement(this._element);\n\n        if (listElement) {\n          var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;\n          previous = $$$1.makeArray($$$1(listElement).find(itemSelector));\n          previous = previous[previous.length - 1];\n        }\n\n        var hideEvent = $$$1.Event(Event.HIDE, {\n          relatedTarget: this._element\n        });\n        var showEvent = $$$1.Event(Event.SHOW, {\n          relatedTarget: previous\n        });\n\n        if (previous) {\n          $$$1(previous).trigger(hideEvent);\n        }\n\n        $$$1(this._element).trigger(showEvent);\n\n        if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        if (selector) {\n          target = $$$1(selector)[0];\n        }\n\n        this._activate(this._element, listElement);\n\n        var complete = function complete() {\n          var hiddenEvent = $$$1.Event(Event.HIDDEN, {\n            relatedTarget: _this._element\n          });\n          var shownEvent = $$$1.Event(Event.SHOWN, {\n            relatedTarget: previous\n          });\n          $$$1(previous).trigger(hiddenEvent);\n          $$$1(_this._element).trigger(shownEvent);\n        };\n\n        if (target) {\n          this._activate(target, target.parentNode, complete);\n        } else {\n          complete();\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._element = null;\n      }; // Private\n\n\n      _proto._activate = function _activate(element, container, callback) {\n        var _this2 = this;\n\n        var activeElements;\n\n        if (container.nodeName === 'UL') {\n          activeElements = $$$1(container).find(Selector.ACTIVE_UL);\n        } else {\n          activeElements = $$$1(container).children(Selector.ACTIVE);\n        }\n\n        var active = activeElements[0];\n        var isTransitioning = callback && active && $$$1(active).hasClass(ClassName.FADE);\n\n        var complete = function complete() {\n          return _this2._transitionComplete(element, active, callback);\n        };\n\n        if (active && isTransitioning) {\n          var transitionDuration = Util.getTransitionDurationFromElement(active);\n          $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      };\n\n      _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n        if (active) {\n          $$$1(active).removeClass(ClassName.SHOW + \" \" + ClassName.ACTIVE);\n          var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\n\n          if (dropdownChild) {\n            $$$1(dropdownChild).removeClass(ClassName.ACTIVE);\n          }\n\n          if (active.getAttribute('role') === 'tab') {\n            active.setAttribute('aria-selected', false);\n          }\n        }\n\n        $$$1(element).addClass(ClassName.ACTIVE);\n\n        if (element.getAttribute('role') === 'tab') {\n          element.setAttribute('aria-selected', true);\n        }\n\n        Util.reflow(element);\n        $$$1(element).addClass(ClassName.SHOW);\n\n        if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n          var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];\n\n          if (dropdownElement) {\n            $$$1(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n          }\n\n          element.setAttribute('aria-expanded', true);\n        }\n\n        if (callback) {\n          callback();\n        }\n      }; // Static\n\n\n      Tab._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var $this = $$$1(this);\n          var data = $this.data(DATA_KEY);\n\n          if (!data) {\n            data = new Tab(this);\n            $this.data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Tab, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }]);\n\n      return Tab;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      event.preventDefault();\n\n      Tab._jQueryInterface.call($$$1(this), 'show');\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Tab._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Tab;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Tab._jQueryInterface;\n    };\n\n    return Tab;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.0.0): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function ($$$1) {\n    if (typeof $$$1 === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $$$1.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })($);\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/bootstrap/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v4.1.0 (https://getbootstrap.com/)\n  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n  (factory((global.bootstrap = {}),global.jQuery,global.Popper));\n}(this, (function (exports,$,Popper) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Util = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Private TransitionEnd Helpers\n     * ------------------------------------------------------------------------\n     */\n    var TRANSITION_END = 'transitionend';\n    var MAX_UID = 1000000;\n    var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n    function toType(obj) {\n      return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n    }\n\n    function getSpecialTransitionEndEvent() {\n      return {\n        bindType: TRANSITION_END,\n        delegateType: TRANSITION_END,\n        handle: function handle(event) {\n          if ($$$1(event.target).is(this)) {\n            return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n          }\n\n          return undefined; // eslint-disable-line no-undefined\n        }\n      };\n    }\n\n    function transitionEndEmulator(duration) {\n      var _this = this;\n\n      var called = false;\n      $$$1(this).one(Util.TRANSITION_END, function () {\n        called = true;\n      });\n      setTimeout(function () {\n        if (!called) {\n          Util.triggerTransitionEnd(_this);\n        }\n      }, duration);\n      return this;\n    }\n\n    function setTransitionEndSupport() {\n      $$$1.fn.emulateTransitionEnd = transitionEndEmulator;\n      $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n    }\n    /**\n     * --------------------------------------------------------------------------\n     * Public Util Api\n     * --------------------------------------------------------------------------\n     */\n\n\n    var Util = {\n      TRANSITION_END: 'bsTransitionEnd',\n      getUID: function getUID(prefix) {\n        do {\n          // eslint-disable-next-line no-bitwise\n          prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n        } while (document.getElementById(prefix));\n\n        return prefix;\n      },\n      getSelectorFromElement: function getSelectorFromElement(element) {\n        var selector = element.getAttribute('data-target');\n\n        if (!selector || selector === '#') {\n          selector = element.getAttribute('href') || '';\n        }\n\n        try {\n          var $selector = $$$1(document).find(selector);\n          return $selector.length > 0 ? selector : null;\n        } catch (err) {\n          return null;\n        }\n      },\n      getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n        if (!element) {\n          return 0;\n        } // Get transition-duration of the element\n\n\n        var transitionDuration = $$$1(element).css('transition-duration');\n        var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found\n\n        if (!floatTransitionDuration) {\n          return 0;\n        } // If multiple durations are defined, take the first\n\n\n        transitionDuration = transitionDuration.split(',')[0];\n        return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;\n      },\n      reflow: function reflow(element) {\n        return element.offsetHeight;\n      },\n      triggerTransitionEnd: function triggerTransitionEnd(element) {\n        $$$1(element).trigger(TRANSITION_END);\n      },\n      // TODO: Remove in v5\n      supportsTransitionEnd: function supportsTransitionEnd() {\n        return Boolean(TRANSITION_END);\n      },\n      isElement: function isElement(obj) {\n        return (obj[0] || obj).nodeType;\n      },\n      typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n        for (var property in configTypes) {\n          if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n            var expectedTypes = configTypes[property];\n            var value = config[property];\n            var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n            if (!new RegExp(expectedTypes).test(valueType)) {\n              throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n            }\n          }\n        }\n      }\n    };\n    setTransitionEndSupport();\n    return Util;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Alert = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'alert';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.alert';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Selector = {\n      DISMISS: '[data-dismiss=\"alert\"]'\n    };\n    var Event = {\n      CLOSE: \"close\" + EVENT_KEY,\n      CLOSED: \"closed\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      ALERT: 'alert',\n      FADE: 'fade',\n      SHOW: 'show'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Alert =\n    /*#__PURE__*/\n    function () {\n      function Alert(element) {\n        this._element = element;\n      } // Getters\n\n\n      var _proto = Alert.prototype;\n\n      // Public\n      _proto.close = function close(element) {\n        element = element || this._element;\n\n        var rootElement = this._getRootElement(element);\n\n        var customEvent = this._triggerCloseEvent(rootElement);\n\n        if (customEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        this._removeElement(rootElement);\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._element = null;\n      }; // Private\n\n\n      _proto._getRootElement = function _getRootElement(element) {\n        var selector = Util.getSelectorFromElement(element);\n        var parent = false;\n\n        if (selector) {\n          parent = $$$1(selector)[0];\n        }\n\n        if (!parent) {\n          parent = $$$1(element).closest(\".\" + ClassName.ALERT)[0];\n        }\n\n        return parent;\n      };\n\n      _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n        var closeEvent = $$$1.Event(Event.CLOSE);\n        $$$1(element).trigger(closeEvent);\n        return closeEvent;\n      };\n\n      _proto._removeElement = function _removeElement(element) {\n        var _this = this;\n\n        $$$1(element).removeClass(ClassName.SHOW);\n\n        if (!$$$1(element).hasClass(ClassName.FADE)) {\n          this._destroyElement(element);\n\n          return;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(element);\n        $$$1(element).one(Util.TRANSITION_END, function (event) {\n          return _this._destroyElement(element, event);\n        }).emulateTransitionEnd(transitionDuration);\n      };\n\n      _proto._destroyElement = function _destroyElement(element) {\n        $$$1(element).detach().trigger(Event.CLOSED).remove();\n      }; // Static\n\n\n      Alert._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var $element = $$$1(this);\n          var data = $element.data(DATA_KEY);\n\n          if (!data) {\n            data = new Alert(this);\n            $element.data(DATA_KEY, data);\n          }\n\n          if (config === 'close') {\n            data[config](this);\n          }\n        });\n      };\n\n      Alert._handleDismiss = function _handleDismiss(alertInstance) {\n        return function (event) {\n          if (event) {\n            event.preventDefault();\n          }\n\n          alertInstance.close(this);\n        };\n      };\n\n      _createClass(Alert, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }]);\n\n      return Alert;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Alert._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Alert;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Alert._jQueryInterface;\n    };\n\n    return Alert;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Button = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'button';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.button';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ClassName = {\n      ACTIVE: 'active',\n      BUTTON: 'btn',\n      FOCUS: 'focus'\n    };\n    var Selector = {\n      DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n      DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n      INPUT: 'input',\n      ACTIVE: '.active',\n      BUTTON: '.btn'\n    };\n    var Event = {\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n      FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY + DATA_API_KEY + \" \" + (\"blur\" + EVENT_KEY + DATA_API_KEY)\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Button =\n    /*#__PURE__*/\n    function () {\n      function Button(element) {\n        this._element = element;\n      } // Getters\n\n\n      var _proto = Button.prototype;\n\n      // Public\n      _proto.toggle = function toggle() {\n        var triggerChangeEvent = true;\n        var addAriaPressed = true;\n        var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];\n\n        if (rootElement) {\n          var input = $$$1(this._element).find(Selector.INPUT)[0];\n\n          if (input) {\n            if (input.type === 'radio') {\n              if (input.checked && $$$1(this._element).hasClass(ClassName.ACTIVE)) {\n                triggerChangeEvent = false;\n              } else {\n                var activeElement = $$$1(rootElement).find(Selector.ACTIVE)[0];\n\n                if (activeElement) {\n                  $$$1(activeElement).removeClass(ClassName.ACTIVE);\n                }\n              }\n            }\n\n            if (triggerChangeEvent) {\n              if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n                return;\n              }\n\n              input.checked = !$$$1(this._element).hasClass(ClassName.ACTIVE);\n              $$$1(input).trigger('change');\n            }\n\n            input.focus();\n            addAriaPressed = false;\n          }\n        }\n\n        if (addAriaPressed) {\n          this._element.setAttribute('aria-pressed', !$$$1(this._element).hasClass(ClassName.ACTIVE));\n        }\n\n        if (triggerChangeEvent) {\n          $$$1(this._element).toggleClass(ClassName.ACTIVE);\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._element = null;\n      }; // Static\n\n\n      Button._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          if (!data) {\n            data = new Button(this);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (config === 'toggle') {\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Button, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }]);\n\n      return Button;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n      event.preventDefault();\n      var button = event.target;\n\n      if (!$$$1(button).hasClass(ClassName.BUTTON)) {\n        button = $$$1(button).closest(Selector.BUTTON);\n      }\n\n      Button._jQueryInterface.call($$$1(button), 'toggle');\n    }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n      var button = $$$1(event.target).closest(Selector.BUTTON)[0];\n      $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Button._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Button;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Button._jQueryInterface;\n    };\n\n    return Button;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Carousel = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'carousel';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.carousel';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n    var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n    var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n    var Default = {\n      interval: 5000,\n      keyboard: true,\n      slide: false,\n      pause: 'hover',\n      wrap: true\n    };\n    var DefaultType = {\n      interval: '(number|boolean)',\n      keyboard: 'boolean',\n      slide: '(boolean|string)',\n      pause: '(string|boolean)',\n      wrap: 'boolean'\n    };\n    var Direction = {\n      NEXT: 'next',\n      PREV: 'prev',\n      LEFT: 'left',\n      RIGHT: 'right'\n    };\n    var Event = {\n      SLIDE: \"slide\" + EVENT_KEY,\n      SLID: \"slid\" + EVENT_KEY,\n      KEYDOWN: \"keydown\" + EVENT_KEY,\n      MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n      MOUSELEAVE: \"mouseleave\" + EVENT_KEY,\n      TOUCHEND: \"touchend\" + EVENT_KEY,\n      LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      CAROUSEL: 'carousel',\n      ACTIVE: 'active',\n      SLIDE: 'slide',\n      RIGHT: 'carousel-item-right',\n      LEFT: 'carousel-item-left',\n      NEXT: 'carousel-item-next',\n      PREV: 'carousel-item-prev',\n      ITEM: 'carousel-item'\n    };\n    var Selector = {\n      ACTIVE: '.active',\n      ACTIVE_ITEM: '.active.carousel-item',\n      ITEM: '.carousel-item',\n      NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n      INDICATORS: '.carousel-indicators',\n      DATA_SLIDE: '[data-slide], [data-slide-to]',\n      DATA_RIDE: '[data-ride=\"carousel\"]'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Carousel =\n    /*#__PURE__*/\n    function () {\n      function Carousel(element, config) {\n        this._items = null;\n        this._interval = null;\n        this._activeElement = null;\n        this._isPaused = false;\n        this._isSliding = false;\n        this.touchTimeout = null;\n        this._config = this._getConfig(config);\n        this._element = $$$1(element)[0];\n        this._indicatorsElement = $$$1(this._element).find(Selector.INDICATORS)[0];\n\n        this._addEventListeners();\n      } // Getters\n\n\n      var _proto = Carousel.prototype;\n\n      // Public\n      _proto.next = function next() {\n        if (!this._isSliding) {\n          this._slide(Direction.NEXT);\n        }\n      };\n\n      _proto.nextWhenVisible = function nextWhenVisible() {\n        // Don't call next when the page isn't visible\n        // or the carousel or its parent isn't visible\n        if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {\n          this.next();\n        }\n      };\n\n      _proto.prev = function prev() {\n        if (!this._isSliding) {\n          this._slide(Direction.PREV);\n        }\n      };\n\n      _proto.pause = function pause(event) {\n        if (!event) {\n          this._isPaused = true;\n        }\n\n        if ($$$1(this._element).find(Selector.NEXT_PREV)[0]) {\n          Util.triggerTransitionEnd(this._element);\n          this.cycle(true);\n        }\n\n        clearInterval(this._interval);\n        this._interval = null;\n      };\n\n      _proto.cycle = function cycle(event) {\n        if (!event) {\n          this._isPaused = false;\n        }\n\n        if (this._interval) {\n          clearInterval(this._interval);\n          this._interval = null;\n        }\n\n        if (this._config.interval && !this._isPaused) {\n          this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n        }\n      };\n\n      _proto.to = function to(index) {\n        var _this = this;\n\n        this._activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n        var activeIndex = this._getItemIndex(this._activeElement);\n\n        if (index > this._items.length - 1 || index < 0) {\n          return;\n        }\n\n        if (this._isSliding) {\n          $$$1(this._element).one(Event.SLID, function () {\n            return _this.to(index);\n          });\n          return;\n        }\n\n        if (activeIndex === index) {\n          this.pause();\n          this.cycle();\n          return;\n        }\n\n        var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n        this._slide(direction, this._items[index]);\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1(this._element).off(EVENT_KEY);\n        $$$1.removeData(this._element, DATA_KEY);\n        this._items = null;\n        this._config = null;\n        this._element = null;\n        this._interval = null;\n        this._isPaused = null;\n        this._isSliding = null;\n        this._activeElement = null;\n        this._indicatorsElement = null;\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._addEventListeners = function _addEventListeners() {\n        var _this2 = this;\n\n        if (this._config.keyboard) {\n          $$$1(this._element).on(Event.KEYDOWN, function (event) {\n            return _this2._keydown(event);\n          });\n        }\n\n        if (this._config.pause === 'hover') {\n          $$$1(this._element).on(Event.MOUSEENTER, function (event) {\n            return _this2.pause(event);\n          }).on(Event.MOUSELEAVE, function (event) {\n            return _this2.cycle(event);\n          });\n\n          if ('ontouchstart' in document.documentElement) {\n            // If it's a touch-enabled device, mouseenter/leave are fired as\n            // part of the mouse compatibility events on first tap - the carousel\n            // would stop cycling until user tapped out of it;\n            // here, we listen for touchend, explicitly pause the carousel\n            // (as if it's the second time we tap on it, mouseenter compat event\n            // is NOT fired) and after a timeout (to allow for mouse compatibility\n            // events to fire) we explicitly restart cycling\n            $$$1(this._element).on(Event.TOUCHEND, function () {\n              _this2.pause();\n\n              if (_this2.touchTimeout) {\n                clearTimeout(_this2.touchTimeout);\n              }\n\n              _this2.touchTimeout = setTimeout(function (event) {\n                return _this2.cycle(event);\n              }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);\n            });\n          }\n        }\n      };\n\n      _proto._keydown = function _keydown(event) {\n        if (/input|textarea/i.test(event.target.tagName)) {\n          return;\n        }\n\n        switch (event.which) {\n          case ARROW_LEFT_KEYCODE:\n            event.preventDefault();\n            this.prev();\n            break;\n\n          case ARROW_RIGHT_KEYCODE:\n            event.preventDefault();\n            this.next();\n            break;\n\n          default:\n        }\n      };\n\n      _proto._getItemIndex = function _getItemIndex(element) {\n        this._items = $$$1.makeArray($$$1(element).parent().find(Selector.ITEM));\n        return this._items.indexOf(element);\n      };\n\n      _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n        var isNextDirection = direction === Direction.NEXT;\n        var isPrevDirection = direction === Direction.PREV;\n\n        var activeIndex = this._getItemIndex(activeElement);\n\n        var lastItemIndex = this._items.length - 1;\n        var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n        if (isGoingToWrap && !this._config.wrap) {\n          return activeElement;\n        }\n\n        var delta = direction === Direction.PREV ? -1 : 1;\n        var itemIndex = (activeIndex + delta) % this._items.length;\n        return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n      };\n\n      _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n        var targetIndex = this._getItemIndex(relatedTarget);\n\n        var fromIndex = this._getItemIndex($$$1(this._element).find(Selector.ACTIVE_ITEM)[0]);\n\n        var slideEvent = $$$1.Event(Event.SLIDE, {\n          relatedTarget: relatedTarget,\n          direction: eventDirectionName,\n          from: fromIndex,\n          to: targetIndex\n        });\n        $$$1(this._element).trigger(slideEvent);\n        return slideEvent;\n      };\n\n      _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n        if (this._indicatorsElement) {\n          $$$1(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n\n          var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n          if (nextIndicator) {\n            $$$1(nextIndicator).addClass(ClassName.ACTIVE);\n          }\n        }\n      };\n\n      _proto._slide = function _slide(direction, element) {\n        var _this3 = this;\n\n        var activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n        var activeElementIndex = this._getItemIndex(activeElement);\n\n        var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n        var nextElementIndex = this._getItemIndex(nextElement);\n\n        var isCycling = Boolean(this._interval);\n        var directionalClassName;\n        var orderClassName;\n        var eventDirectionName;\n\n        if (direction === Direction.NEXT) {\n          directionalClassName = ClassName.LEFT;\n          orderClassName = ClassName.NEXT;\n          eventDirectionName = Direction.LEFT;\n        } else {\n          directionalClassName = ClassName.RIGHT;\n          orderClassName = ClassName.PREV;\n          eventDirectionName = Direction.RIGHT;\n        }\n\n        if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {\n          this._isSliding = false;\n          return;\n        }\n\n        var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n        if (slideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        if (!activeElement || !nextElement) {\n          // Some weirdness is happening, so we bail\n          return;\n        }\n\n        this._isSliding = true;\n\n        if (isCycling) {\n          this.pause();\n        }\n\n        this._setActiveIndicatorElement(nextElement);\n\n        var slidEvent = $$$1.Event(Event.SLID, {\n          relatedTarget: nextElement,\n          direction: eventDirectionName,\n          from: activeElementIndex,\n          to: nextElementIndex\n        });\n\n        if ($$$1(this._element).hasClass(ClassName.SLIDE)) {\n          $$$1(nextElement).addClass(orderClassName);\n          Util.reflow(nextElement);\n          $$$1(activeElement).addClass(directionalClassName);\n          $$$1(nextElement).addClass(directionalClassName);\n          var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n          $$$1(activeElement).one(Util.TRANSITION_END, function () {\n            $$$1(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName.ACTIVE);\n            $$$1(activeElement).removeClass(ClassName.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n            _this3._isSliding = false;\n            setTimeout(function () {\n              return $$$1(_this3._element).trigger(slidEvent);\n            }, 0);\n          }).emulateTransitionEnd(transitionDuration);\n        } else {\n          $$$1(activeElement).removeClass(ClassName.ACTIVE);\n          $$$1(nextElement).addClass(ClassName.ACTIVE);\n          this._isSliding = false;\n          $$$1(this._element).trigger(slidEvent);\n        }\n\n        if (isCycling) {\n          this.cycle();\n        }\n      }; // Static\n\n\n      Carousel._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = _objectSpread({}, Default, $$$1(this).data());\n\n          if (typeof config === 'object') {\n            _config = _objectSpread({}, _config, config);\n          }\n\n          var action = typeof config === 'string' ? config : _config.slide;\n\n          if (!data) {\n            data = new Carousel(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'number') {\n            data.to(config);\n          } else if (typeof action === 'string') {\n            if (typeof data[action] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n            }\n\n            data[action]();\n          } else if (_config.interval) {\n            data.pause();\n            data.cycle();\n          }\n        });\n      };\n\n      Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n        var selector = Util.getSelectorFromElement(this);\n\n        if (!selector) {\n          return;\n        }\n\n        var target = $$$1(selector)[0];\n\n        if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {\n          return;\n        }\n\n        var config = _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n        var slideIndex = this.getAttribute('data-slide-to');\n\n        if (slideIndex) {\n          config.interval = false;\n        }\n\n        Carousel._jQueryInterface.call($$$1(target), config);\n\n        if (slideIndex) {\n          $$$1(target).data(DATA_KEY).to(slideIndex);\n        }\n\n        event.preventDefault();\n      };\n\n      _createClass(Carousel, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return Carousel;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\n    $$$1(window).on(Event.LOAD_DATA_API, function () {\n      $$$1(Selector.DATA_RIDE).each(function () {\n        var $carousel = $$$1(this);\n\n        Carousel._jQueryInterface.call($carousel, $carousel.data());\n      });\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Carousel._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Carousel;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Carousel._jQueryInterface;\n    };\n\n    return Carousel;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Collapse = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'collapse';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.collapse';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Default = {\n      toggle: true,\n      parent: ''\n    };\n    var DefaultType = {\n      toggle: 'boolean',\n      parent: '(string|element)'\n    };\n    var Event = {\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      SHOW: 'show',\n      COLLAPSE: 'collapse',\n      COLLAPSING: 'collapsing',\n      COLLAPSED: 'collapsed'\n    };\n    var Dimension = {\n      WIDTH: 'width',\n      HEIGHT: 'height'\n    };\n    var Selector = {\n      ACTIVES: '.show, .collapsing',\n      DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Collapse =\n    /*#__PURE__*/\n    function () {\n      function Collapse(element, config) {\n        this._isTransitioning = false;\n        this._element = element;\n        this._config = this._getConfig(config);\n        this._triggerArray = $$$1.makeArray($$$1(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n        var tabToggles = $$$1(Selector.DATA_TOGGLE);\n\n        for (var i = 0; i < tabToggles.length; i++) {\n          var elem = tabToggles[i];\n          var selector = Util.getSelectorFromElement(elem);\n\n          if (selector !== null && $$$1(selector).filter(element).length > 0) {\n            this._selector = selector;\n\n            this._triggerArray.push(elem);\n          }\n        }\n\n        this._parent = this._config.parent ? this._getParent() : null;\n\n        if (!this._config.parent) {\n          this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n        }\n\n        if (this._config.toggle) {\n          this.toggle();\n        }\n      } // Getters\n\n\n      var _proto = Collapse.prototype;\n\n      // Public\n      _proto.toggle = function toggle() {\n        if ($$$1(this._element).hasClass(ClassName.SHOW)) {\n          this.hide();\n        } else {\n          this.show();\n        }\n      };\n\n      _proto.show = function show() {\n        var _this = this;\n\n        if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {\n          return;\n        }\n\n        var actives;\n        var activesData;\n\n        if (this._parent) {\n          actives = $$$1.makeArray($$$1(this._parent).find(Selector.ACTIVES).filter(\"[data-parent=\\\"\" + this._config.parent + \"\\\"]\"));\n\n          if (actives.length === 0) {\n            actives = null;\n          }\n        }\n\n        if (actives) {\n          activesData = $$$1(actives).not(this._selector).data(DATA_KEY);\n\n          if (activesData && activesData._isTransitioning) {\n            return;\n          }\n        }\n\n        var startEvent = $$$1.Event(Event.SHOW);\n        $$$1(this._element).trigger(startEvent);\n\n        if (startEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        if (actives) {\n          Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');\n\n          if (!activesData) {\n            $$$1(actives).data(DATA_KEY, null);\n          }\n        }\n\n        var dimension = this._getDimension();\n\n        $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\n        this._element.style[dimension] = 0;\n\n        if (this._triggerArray.length > 0) {\n          $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\n        }\n\n        this.setTransitioning(true);\n\n        var complete = function complete() {\n          $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);\n          _this._element.style[dimension] = '';\n\n          _this.setTransitioning(false);\n\n          $$$1(_this._element).trigger(Event.SHOWN);\n        };\n\n        var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n        var scrollSize = \"scroll\" + capitalizedDimension;\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        this._element.style[dimension] = this._element[scrollSize] + \"px\";\n      };\n\n      _proto.hide = function hide() {\n        var _this2 = this;\n\n        if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {\n          return;\n        }\n\n        var startEvent = $$$1.Event(Event.HIDE);\n        $$$1(this._element).trigger(startEvent);\n\n        if (startEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        var dimension = this._getDimension();\n\n        this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n        Util.reflow(this._element);\n        $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);\n\n        if (this._triggerArray.length > 0) {\n          for (var i = 0; i < this._triggerArray.length; i++) {\n            var trigger = this._triggerArray[i];\n            var selector = Util.getSelectorFromElement(trigger);\n\n            if (selector !== null) {\n              var $elem = $$$1(selector);\n\n              if (!$elem.hasClass(ClassName.SHOW)) {\n                $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\n              }\n            }\n          }\n        }\n\n        this.setTransitioning(true);\n\n        var complete = function complete() {\n          _this2.setTransitioning(false);\n\n          $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\n        };\n\n        this._element.style[dimension] = '';\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      };\n\n      _proto.setTransitioning = function setTransitioning(isTransitioning) {\n        this._isTransitioning = isTransitioning;\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._config = null;\n        this._parent = null;\n        this._element = null;\n        this._triggerArray = null;\n        this._isTransitioning = null;\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n        config.toggle = Boolean(config.toggle); // Coerce string values\n\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._getDimension = function _getDimension() {\n        var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);\n        return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n      };\n\n      _proto._getParent = function _getParent() {\n        var _this3 = this;\n\n        var parent = null;\n\n        if (Util.isElement(this._config.parent)) {\n          parent = this._config.parent; // It's a jQuery object\n\n          if (typeof this._config.parent.jquery !== 'undefined') {\n            parent = this._config.parent[0];\n          }\n        } else {\n          parent = $$$1(this._config.parent)[0];\n        }\n\n        var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n        $$$1(parent).find(selector).each(function (i, element) {\n          _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n        });\n        return parent;\n      };\n\n      _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n        if (element) {\n          var isOpen = $$$1(element).hasClass(ClassName.SHOW);\n\n          if (triggerArray.length > 0) {\n            $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n          }\n        }\n      }; // Static\n\n\n      Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n        var selector = Util.getSelectorFromElement(element);\n        return selector ? $$$1(selector)[0] : null;\n      };\n\n      Collapse._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var $this = $$$1(this);\n          var data = $this.data(DATA_KEY);\n\n          var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config);\n\n          if (!data && _config.toggle && /show|hide/.test(config)) {\n            _config.toggle = false;\n          }\n\n          if (!data) {\n            data = new Collapse(this, _config);\n            $this.data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Collapse, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return Collapse;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n      if (event.currentTarget.tagName === 'A') {\n        event.preventDefault();\n      }\n\n      var $trigger = $$$1(this);\n      var selector = Util.getSelectorFromElement(this);\n      $$$1(selector).each(function () {\n        var $target = $$$1(this);\n        var data = $target.data(DATA_KEY);\n        var config = data ? 'toggle' : $trigger.data();\n\n        Collapse._jQueryInterface.call($target, config);\n      });\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Collapse._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Collapse;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Collapse._jQueryInterface;\n    };\n\n    return Collapse;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Dropdown = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'dropdown';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.dropdown';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n    var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n    var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n    var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n    var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n    var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n    var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      CLICK: \"click\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n      KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY + DATA_API_KEY,\n      KEYUP_DATA_API: \"keyup\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      DISABLED: 'disabled',\n      SHOW: 'show',\n      DROPUP: 'dropup',\n      DROPRIGHT: 'dropright',\n      DROPLEFT: 'dropleft',\n      MENURIGHT: 'dropdown-menu-right',\n      MENULEFT: 'dropdown-menu-left',\n      POSITION_STATIC: 'position-static'\n    };\n    var Selector = {\n      DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n      FORM_CHILD: '.dropdown form',\n      MENU: '.dropdown-menu',\n      NAVBAR_NAV: '.navbar-nav',\n      VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n    };\n    var AttachmentMap = {\n      TOP: 'top-start',\n      TOPEND: 'top-end',\n      BOTTOM: 'bottom-start',\n      BOTTOMEND: 'bottom-end',\n      RIGHT: 'right-start',\n      RIGHTEND: 'right-end',\n      LEFT: 'left-start',\n      LEFTEND: 'left-end'\n    };\n    var Default = {\n      offset: 0,\n      flip: true,\n      boundary: 'scrollParent',\n      reference: 'toggle',\n      display: 'dynamic'\n    };\n    var DefaultType = {\n      offset: '(number|string|function)',\n      flip: 'boolean',\n      boundary: '(string|element)',\n      reference: '(string|element)',\n      display: 'string'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Dropdown =\n    /*#__PURE__*/\n    function () {\n      function Dropdown(element, config) {\n        this._element = element;\n        this._popper = null;\n        this._config = this._getConfig(config);\n        this._menu = this._getMenuElement();\n        this._inNavbar = this._detectNavbar();\n\n        this._addEventListeners();\n      } // Getters\n\n\n      var _proto = Dropdown.prototype;\n\n      // Public\n      _proto.toggle = function toggle() {\n        if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);\n\n        Dropdown._clearMenus();\n\n        if (isActive) {\n          return;\n        }\n\n        var relatedTarget = {\n          relatedTarget: this._element\n        };\n        var showEvent = $$$1.Event(Event.SHOW, relatedTarget);\n        $$$1(parent).trigger(showEvent);\n\n        if (showEvent.isDefaultPrevented()) {\n          return;\n        } // Disable totally Popper.js for Dropdown in Navbar\n\n\n        if (!this._inNavbar) {\n          /**\n           * Check for Popper dependency\n           * Popper - https://popper.js.org\n           */\n          if (typeof Popper === 'undefined') {\n            throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');\n          }\n\n          var referenceElement = this._element;\n\n          if (this._config.reference === 'parent') {\n            referenceElement = parent;\n          } else if (Util.isElement(this._config.reference)) {\n            referenceElement = this._config.reference; // Check if it's jQuery element\n\n            if (typeof this._config.reference.jquery !== 'undefined') {\n              referenceElement = this._config.reference[0];\n            }\n          } // If boundary is not `scrollParent`, then set position to `static`\n          // to allow the menu to \"escape\" the scroll parent's boundaries\n          // https://github.com/twbs/bootstrap/issues/24251\n\n\n          if (this._config.boundary !== 'scrollParent') {\n            $$$1(parent).addClass(ClassName.POSITION_STATIC);\n          }\n\n          this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n        } // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n        if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n          $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n        }\n\n        this._element.focus();\n\n        this._element.setAttribute('aria-expanded', true);\n\n        $$$1(this._menu).toggleClass(ClassName.SHOW);\n        $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        $$$1(this._element).off(EVENT_KEY);\n        this._element = null;\n        this._menu = null;\n\n        if (this._popper !== null) {\n          this._popper.destroy();\n\n          this._popper = null;\n        }\n      };\n\n      _proto.update = function update() {\n        this._inNavbar = this._detectNavbar();\n\n        if (this._popper !== null) {\n          this._popper.scheduleUpdate();\n        }\n      }; // Private\n\n\n      _proto._addEventListeners = function _addEventListeners() {\n        var _this = this;\n\n        $$$1(this._element).on(Event.CLICK, function (event) {\n          event.preventDefault();\n          event.stopPropagation();\n\n          _this.toggle();\n        });\n      };\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, this.constructor.Default, $$$1(this._element).data(), config);\n        Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n        return config;\n      };\n\n      _proto._getMenuElement = function _getMenuElement() {\n        if (!this._menu) {\n          var parent = Dropdown._getParentFromElement(this._element);\n\n          this._menu = $$$1(parent).find(Selector.MENU)[0];\n        }\n\n        return this._menu;\n      };\n\n      _proto._getPlacement = function _getPlacement() {\n        var $parentDropdown = $$$1(this._element).parent();\n        var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n        if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n          placement = AttachmentMap.TOP;\n\n          if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n            placement = AttachmentMap.TOPEND;\n          }\n        } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n          placement = AttachmentMap.RIGHT;\n        } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n          placement = AttachmentMap.LEFT;\n        } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n          placement = AttachmentMap.BOTTOMEND;\n        }\n\n        return placement;\n      };\n\n      _proto._detectNavbar = function _detectNavbar() {\n        return $$$1(this._element).closest('.navbar').length > 0;\n      };\n\n      _proto._getPopperConfig = function _getPopperConfig() {\n        var _this2 = this;\n\n        var offsetConf = {};\n\n        if (typeof this._config.offset === 'function') {\n          offsetConf.fn = function (data) {\n            data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});\n            return data;\n          };\n        } else {\n          offsetConf.offset = this._config.offset;\n        }\n\n        var popperConfig = {\n          placement: this._getPlacement(),\n          modifiers: {\n            offset: offsetConf,\n            flip: {\n              enabled: this._config.flip\n            },\n            preventOverflow: {\n              boundariesElement: this._config.boundary\n            }\n          } // Disable Popper.js if we have a static display\n\n        };\n\n        if (this._config.display === 'static') {\n          popperConfig.modifiers.applyStyle = {\n            enabled: false\n          };\n        }\n\n        return popperConfig;\n      }; // Static\n\n\n      Dropdown._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' ? config : null;\n\n          if (!data) {\n            data = new Dropdown(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      Dropdown._clearMenus = function _clearMenus(event) {\n        if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n          return;\n        }\n\n        var toggles = $$$1.makeArray($$$1(Selector.DATA_TOGGLE));\n\n        for (var i = 0; i < toggles.length; i++) {\n          var parent = Dropdown._getParentFromElement(toggles[i]);\n\n          var context = $$$1(toggles[i]).data(DATA_KEY);\n          var relatedTarget = {\n            relatedTarget: toggles[i]\n          };\n\n          if (!context) {\n            continue;\n          }\n\n          var dropdownMenu = context._menu;\n\n          if (!$$$1(parent).hasClass(ClassName.SHOW)) {\n            continue;\n          }\n\n          if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {\n            continue;\n          }\n\n          var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);\n          $$$1(parent).trigger(hideEvent);\n\n          if (hideEvent.isDefaultPrevented()) {\n            continue;\n          } // If this is a touch-enabled device we remove the extra\n          // empty mouseover listeners we added for iOS support\n\n\n          if ('ontouchstart' in document.documentElement) {\n            $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n          }\n\n          toggles[i].setAttribute('aria-expanded', 'false');\n          $$$1(dropdownMenu).removeClass(ClassName.SHOW);\n          $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));\n        }\n      };\n\n      Dropdown._getParentFromElement = function _getParentFromElement(element) {\n        var parent;\n        var selector = Util.getSelectorFromElement(element);\n\n        if (selector) {\n          parent = $$$1(selector)[0];\n        }\n\n        return parent || element.parentNode;\n      }; // eslint-disable-next-line complexity\n\n\n      Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n        // If not input/textarea:\n        //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n        // If input/textarea:\n        //  - If space key => not a dropdown command\n        //  - If key is other than escape\n        //    - If key is not up or down => not a dropdown command\n        //    - If trigger inside the menu => not a dropdown command\n        if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n          return;\n        }\n\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var parent = Dropdown._getParentFromElement(this);\n\n        var isActive = $$$1(parent).hasClass(ClassName.SHOW);\n\n        if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n          if (event.which === ESCAPE_KEYCODE) {\n            var toggle = $$$1(parent).find(Selector.DATA_TOGGLE)[0];\n            $$$1(toggle).trigger('focus');\n          }\n\n          $$$1(this).trigger('click');\n          return;\n        }\n\n        var items = $$$1(parent).find(Selector.VISIBLE_ITEMS).get();\n\n        if (items.length === 0) {\n          return;\n        }\n\n        var index = items.indexOf(event.target);\n\n        if (event.which === ARROW_UP_KEYCODE && index > 0) {\n          // Up\n          index--;\n        }\n\n        if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n          // Down\n          index++;\n        }\n\n        if (index < 0) {\n          index = 0;\n        }\n\n        items[index].focus();\n      };\n\n      _createClass(Dropdown, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }, {\n        key: \"DefaultType\",\n        get: function get() {\n          return DefaultType;\n        }\n      }]);\n\n      return Dropdown;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + \" \" + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      Dropdown._jQueryInterface.call($$$1(this), 'toggle');\n    }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n      e.stopPropagation();\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Dropdown._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Dropdown;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Dropdown._jQueryInterface;\n    };\n\n    return Dropdown;\n  }($, Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Modal = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'modal';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.modal';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n    var Default = {\n      backdrop: true,\n      keyboard: true,\n      focus: true,\n      show: true\n    };\n    var DefaultType = {\n      backdrop: '(boolean|string)',\n      keyboard: 'boolean',\n      focus: 'boolean',\n      show: 'boolean'\n    };\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      FOCUSIN: \"focusin\" + EVENT_KEY,\n      RESIZE: \"resize\" + EVENT_KEY,\n      CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY,\n      KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY,\n      MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY,\n      MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n      BACKDROP: 'modal-backdrop',\n      OPEN: 'modal-open',\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      DIALOG: '.modal-dialog',\n      DATA_TOGGLE: '[data-toggle=\"modal\"]',\n      DATA_DISMISS: '[data-dismiss=\"modal\"]',\n      FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n      STICKY_CONTENT: '.sticky-top',\n      NAVBAR_TOGGLER: '.navbar-toggler'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Modal =\n    /*#__PURE__*/\n    function () {\n      function Modal(element, config) {\n        this._config = this._getConfig(config);\n        this._element = element;\n        this._dialog = $$$1(element).find(Selector.DIALOG)[0];\n        this._backdrop = null;\n        this._isShown = false;\n        this._isBodyOverflowing = false;\n        this._ignoreBackdropClick = false;\n        this._scrollbarWidth = 0;\n      } // Getters\n\n\n      var _proto = Modal.prototype;\n\n      // Public\n      _proto.toggle = function toggle(relatedTarget) {\n        return this._isShown ? this.hide() : this.show(relatedTarget);\n      };\n\n      _proto.show = function show(relatedTarget) {\n        var _this = this;\n\n        if (this._isTransitioning || this._isShown) {\n          return;\n        }\n\n        if ($$$1(this._element).hasClass(ClassName.FADE)) {\n          this._isTransitioning = true;\n        }\n\n        var showEvent = $$$1.Event(Event.SHOW, {\n          relatedTarget: relatedTarget\n        });\n        $$$1(this._element).trigger(showEvent);\n\n        if (this._isShown || showEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        this._isShown = true;\n\n        this._checkScrollbar();\n\n        this._setScrollbar();\n\n        this._adjustDialog();\n\n        $$$1(document.body).addClass(ClassName.OPEN);\n\n        this._setEscapeEvent();\n\n        this._setResizeEvent();\n\n        $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {\n          return _this.hide(event);\n        });\n        $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\n          $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {\n            if ($$$1(event.target).is(_this._element)) {\n              _this._ignoreBackdropClick = true;\n            }\n          });\n        });\n\n        this._showBackdrop(function () {\n          return _this._showElement(relatedTarget);\n        });\n      };\n\n      _proto.hide = function hide(event) {\n        var _this2 = this;\n\n        if (event) {\n          event.preventDefault();\n        }\n\n        if (this._isTransitioning || !this._isShown) {\n          return;\n        }\n\n        var hideEvent = $$$1.Event(Event.HIDE);\n        $$$1(this._element).trigger(hideEvent);\n\n        if (!this._isShown || hideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        this._isShown = false;\n        var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n        if (transition) {\n          this._isTransitioning = true;\n        }\n\n        this._setEscapeEvent();\n\n        this._setResizeEvent();\n\n        $$$1(document).off(Event.FOCUSIN);\n        $$$1(this._element).removeClass(ClassName.SHOW);\n        $$$1(this._element).off(Event.CLICK_DISMISS);\n        $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);\n\n        if (transition) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n          $$$1(this._element).one(Util.TRANSITION_END, function (event) {\n            return _this2._hideModal(event);\n          }).emulateTransitionEnd(transitionDuration);\n        } else {\n          this._hideModal();\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);\n        this._config = null;\n        this._element = null;\n        this._dialog = null;\n        this._backdrop = null;\n        this._isShown = null;\n        this._isBodyOverflowing = null;\n        this._ignoreBackdropClick = null;\n        this._scrollbarWidth = null;\n      };\n\n      _proto.handleUpdate = function handleUpdate() {\n        this._adjustDialog();\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._showElement = function _showElement(relatedTarget) {\n        var _this3 = this;\n\n        var transition = $$$1(this._element).hasClass(ClassName.FADE);\n\n        if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n          // Don't move modal's DOM position\n          document.body.appendChild(this._element);\n        }\n\n        this._element.style.display = 'block';\n\n        this._element.removeAttribute('aria-hidden');\n\n        this._element.scrollTop = 0;\n\n        if (transition) {\n          Util.reflow(this._element);\n        }\n\n        $$$1(this._element).addClass(ClassName.SHOW);\n\n        if (this._config.focus) {\n          this._enforceFocus();\n        }\n\n        var shownEvent = $$$1.Event(Event.SHOWN, {\n          relatedTarget: relatedTarget\n        });\n\n        var transitionComplete = function transitionComplete() {\n          if (_this3._config.focus) {\n            _this3._element.focus();\n          }\n\n          _this3._isTransitioning = false;\n          $$$1(_this3._element).trigger(shownEvent);\n        };\n\n        if (transition) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n          $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n        } else {\n          transitionComplete();\n        }\n      };\n\n      _proto._enforceFocus = function _enforceFocus() {\n        var _this4 = this;\n\n        $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop\n        .on(Event.FOCUSIN, function (event) {\n          if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) {\n            _this4._element.focus();\n          }\n        });\n      };\n\n      _proto._setEscapeEvent = function _setEscapeEvent() {\n        var _this5 = this;\n\n        if (this._isShown && this._config.keyboard) {\n          $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\n            if (event.which === ESCAPE_KEYCODE) {\n              event.preventDefault();\n\n              _this5.hide();\n            }\n          });\n        } else if (!this._isShown) {\n          $$$1(this._element).off(Event.KEYDOWN_DISMISS);\n        }\n      };\n\n      _proto._setResizeEvent = function _setResizeEvent() {\n        var _this6 = this;\n\n        if (this._isShown) {\n          $$$1(window).on(Event.RESIZE, function (event) {\n            return _this6.handleUpdate(event);\n          });\n        } else {\n          $$$1(window).off(Event.RESIZE);\n        }\n      };\n\n      _proto._hideModal = function _hideModal() {\n        var _this7 = this;\n\n        this._element.style.display = 'none';\n\n        this._element.setAttribute('aria-hidden', true);\n\n        this._isTransitioning = false;\n\n        this._showBackdrop(function () {\n          $$$1(document.body).removeClass(ClassName.OPEN);\n\n          _this7._resetAdjustments();\n\n          _this7._resetScrollbar();\n\n          $$$1(_this7._element).trigger(Event.HIDDEN);\n        });\n      };\n\n      _proto._removeBackdrop = function _removeBackdrop() {\n        if (this._backdrop) {\n          $$$1(this._backdrop).remove();\n          this._backdrop = null;\n        }\n      };\n\n      _proto._showBackdrop = function _showBackdrop(callback) {\n        var _this8 = this;\n\n        var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\n\n        if (this._isShown && this._config.backdrop) {\n          this._backdrop = document.createElement('div');\n          this._backdrop.className = ClassName.BACKDROP;\n\n          if (animate) {\n            $$$1(this._backdrop).addClass(animate);\n          }\n\n          $$$1(this._backdrop).appendTo(document.body);\n          $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {\n            if (_this8._ignoreBackdropClick) {\n              _this8._ignoreBackdropClick = false;\n              return;\n            }\n\n            if (event.target !== event.currentTarget) {\n              return;\n            }\n\n            if (_this8._config.backdrop === 'static') {\n              _this8._element.focus();\n            } else {\n              _this8.hide();\n            }\n          });\n\n          if (animate) {\n            Util.reflow(this._backdrop);\n          }\n\n          $$$1(this._backdrop).addClass(ClassName.SHOW);\n\n          if (!callback) {\n            return;\n          }\n\n          if (!animate) {\n            callback();\n            return;\n          }\n\n          var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n          $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n        } else if (!this._isShown && this._backdrop) {\n          $$$1(this._backdrop).removeClass(ClassName.SHOW);\n\n          var callbackRemove = function callbackRemove() {\n            _this8._removeBackdrop();\n\n            if (callback) {\n              callback();\n            }\n          };\n\n          if ($$$1(this._element).hasClass(ClassName.FADE)) {\n            var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n            $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n          } else {\n            callbackRemove();\n          }\n        } else if (callback) {\n          callback();\n        }\n      }; // ----------------------------------------------------------------------\n      // the following methods are used to handle overflowing modals\n      // todo (fat): these should probably be refactored out of modal.js\n      // ----------------------------------------------------------------------\n\n\n      _proto._adjustDialog = function _adjustDialog() {\n        var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n        if (!this._isBodyOverflowing && isModalOverflowing) {\n          this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n        }\n\n        if (this._isBodyOverflowing && !isModalOverflowing) {\n          this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n        }\n      };\n\n      _proto._resetAdjustments = function _resetAdjustments() {\n        this._element.style.paddingLeft = '';\n        this._element.style.paddingRight = '';\n      };\n\n      _proto._checkScrollbar = function _checkScrollbar() {\n        var rect = document.body.getBoundingClientRect();\n        this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n        this._scrollbarWidth = this._getScrollbarWidth();\n      };\n\n      _proto._setScrollbar = function _setScrollbar() {\n        var _this9 = this;\n\n        if (this._isBodyOverflowing) {\n          // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n          //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n          // Adjust fixed content padding\n          $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n            var actualPadding = $$$1(element)[0].style.paddingRight;\n            var calculatedPadding = $$$1(element).css('padding-right');\n            $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n          }); // Adjust sticky content margin\n\n          $$$1(Selector.STICKY_CONTENT).each(function (index, element) {\n            var actualMargin = $$$1(element)[0].style.marginRight;\n            var calculatedMargin = $$$1(element).css('margin-right');\n            $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n          }); // Adjust navbar-toggler margin\n\n          $$$1(Selector.NAVBAR_TOGGLER).each(function (index, element) {\n            var actualMargin = $$$1(element)[0].style.marginRight;\n            var calculatedMargin = $$$1(element).css('margin-right');\n            $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + \"px\");\n          }); // Adjust body padding\n\n          var actualPadding = document.body.style.paddingRight;\n          var calculatedPadding = $$$1(document.body).css('padding-right');\n          $$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n        }\n      };\n\n      _proto._resetScrollbar = function _resetScrollbar() {\n        // Restore fixed content padding\n        $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n          var padding = $$$1(element).data('padding-right');\n\n          if (typeof padding !== 'undefined') {\n            $$$1(element).css('padding-right', padding).removeData('padding-right');\n          }\n        }); // Restore sticky content and navbar-toggler margin\n\n        $$$1(Selector.STICKY_CONTENT + \", \" + Selector.NAVBAR_TOGGLER).each(function (index, element) {\n          var margin = $$$1(element).data('margin-right');\n\n          if (typeof margin !== 'undefined') {\n            $$$1(element).css('margin-right', margin).removeData('margin-right');\n          }\n        }); // Restore body padding\n\n        var padding = $$$1(document.body).data('padding-right');\n\n        if (typeof padding !== 'undefined') {\n          $$$1(document.body).css('padding-right', padding).removeData('padding-right');\n        }\n      };\n\n      _proto._getScrollbarWidth = function _getScrollbarWidth() {\n        // thx d.walsh\n        var scrollDiv = document.createElement('div');\n        scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\n        document.body.appendChild(scrollDiv);\n        var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n        document.body.removeChild(scrollDiv);\n        return scrollbarWidth;\n      }; // Static\n\n\n      Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = _objectSpread({}, Modal.Default, $$$1(this).data(), typeof config === 'object' && config);\n\n          if (!data) {\n            data = new Modal(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config](relatedTarget);\n          } else if (_config.show) {\n            data.show(relatedTarget);\n          }\n        });\n      };\n\n      _createClass(Modal, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return Modal;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      var _this10 = this;\n\n      var target;\n      var selector = Util.getSelectorFromElement(this);\n\n      if (selector) {\n        target = $$$1(selector)[0];\n      }\n\n      var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $$$1(target).data(), $$$1(this).data());\n\n      if (this.tagName === 'A' || this.tagName === 'AREA') {\n        event.preventDefault();\n      }\n\n      var $target = $$$1(target).one(Event.SHOW, function (showEvent) {\n        if (showEvent.isDefaultPrevented()) {\n          // Only register focus restorer if modal will actually get shown\n          return;\n        }\n\n        $target.one(Event.HIDDEN, function () {\n          if ($$$1(_this10).is(':visible')) {\n            _this10.focus();\n          }\n        });\n      });\n\n      Modal._jQueryInterface.call($$$1(target), config, this);\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Modal._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Modal;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Modal._jQueryInterface;\n    };\n\n    return Modal;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Tooltip = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'tooltip';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.tooltip';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var CLASS_PREFIX = 'bs-tooltip';\n    var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n    var DefaultType = {\n      animation: 'boolean',\n      template: 'string',\n      title: '(string|element|function)',\n      trigger: 'string',\n      delay: '(number|object)',\n      html: 'boolean',\n      selector: '(string|boolean)',\n      placement: '(string|function)',\n      offset: '(number|string)',\n      container: '(string|element|boolean)',\n      fallbackPlacement: '(string|array)',\n      boundary: '(string|element)'\n    };\n    var AttachmentMap = {\n      AUTO: 'auto',\n      TOP: 'top',\n      RIGHT: 'right',\n      BOTTOM: 'bottom',\n      LEFT: 'left'\n    };\n    var Default = {\n      animation: true,\n      template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n      trigger: 'hover focus',\n      title: '',\n      delay: 0,\n      html: false,\n      selector: false,\n      placement: 'top',\n      offset: 0,\n      container: false,\n      fallbackPlacement: 'flip',\n      boundary: 'scrollParent'\n    };\n    var HoverState = {\n      SHOW: 'show',\n      OUT: 'out'\n    };\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      INSERTED: \"inserted\" + EVENT_KEY,\n      CLICK: \"click\" + EVENT_KEY,\n      FOCUSIN: \"focusin\" + EVENT_KEY,\n      FOCUSOUT: \"focusout\" + EVENT_KEY,\n      MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n      MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n    };\n    var ClassName = {\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      TOOLTIP: '.tooltip',\n      TOOLTIP_INNER: '.tooltip-inner',\n      ARROW: '.arrow'\n    };\n    var Trigger = {\n      HOVER: 'hover',\n      FOCUS: 'focus',\n      CLICK: 'click',\n      MANUAL: 'manual'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Tooltip =\n    /*#__PURE__*/\n    function () {\n      function Tooltip(element, config) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');\n        } // private\n\n\n        this._isEnabled = true;\n        this._timeout = 0;\n        this._hoverState = '';\n        this._activeTrigger = {};\n        this._popper = null; // Protected\n\n        this.element = element;\n        this.config = this._getConfig(config);\n        this.tip = null;\n\n        this._setListeners();\n      } // Getters\n\n\n      var _proto = Tooltip.prototype;\n\n      // Public\n      _proto.enable = function enable() {\n        this._isEnabled = true;\n      };\n\n      _proto.disable = function disable() {\n        this._isEnabled = false;\n      };\n\n      _proto.toggleEnabled = function toggleEnabled() {\n        this._isEnabled = !this._isEnabled;\n      };\n\n      _proto.toggle = function toggle(event) {\n        if (!this._isEnabled) {\n          return;\n        }\n\n        if (event) {\n          var dataKey = this.constructor.DATA_KEY;\n          var context = $$$1(event.currentTarget).data(dataKey);\n\n          if (!context) {\n            context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n            $$$1(event.currentTarget).data(dataKey, context);\n          }\n\n          context._activeTrigger.click = !context._activeTrigger.click;\n\n          if (context._isWithActiveTrigger()) {\n            context._enter(null, context);\n          } else {\n            context._leave(null, context);\n          }\n        } else {\n          if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {\n            this._leave(null, this);\n\n            return;\n          }\n\n          this._enter(null, this);\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        clearTimeout(this._timeout);\n        $$$1.removeData(this.element, this.constructor.DATA_KEY);\n        $$$1(this.element).off(this.constructor.EVENT_KEY);\n        $$$1(this.element).closest('.modal').off('hide.bs.modal');\n\n        if (this.tip) {\n          $$$1(this.tip).remove();\n        }\n\n        this._isEnabled = null;\n        this._timeout = null;\n        this._hoverState = null;\n        this._activeTrigger = null;\n\n        if (this._popper !== null) {\n          this._popper.destroy();\n        }\n\n        this._popper = null;\n        this.element = null;\n        this.config = null;\n        this.tip = null;\n      };\n\n      _proto.show = function show() {\n        var _this = this;\n\n        if ($$$1(this.element).css('display') === 'none') {\n          throw new Error('Please use show on visible elements');\n        }\n\n        var showEvent = $$$1.Event(this.constructor.Event.SHOW);\n\n        if (this.isWithContent() && this._isEnabled) {\n          $$$1(this.element).trigger(showEvent);\n          var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);\n\n          if (showEvent.isDefaultPrevented() || !isInTheDom) {\n            return;\n          }\n\n          var tip = this.getTipElement();\n          var tipId = Util.getUID(this.constructor.NAME);\n          tip.setAttribute('id', tipId);\n          this.element.setAttribute('aria-describedby', tipId);\n          this.setContent();\n\n          if (this.config.animation) {\n            $$$1(tip).addClass(ClassName.FADE);\n          }\n\n          var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n          var attachment = this._getAttachment(placement);\n\n          this.addAttachmentClass(attachment);\n          var container = this.config.container === false ? document.body : $$$1(this.config.container);\n          $$$1(tip).data(this.constructor.DATA_KEY, this);\n\n          if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {\n            $$$1(tip).appendTo(container);\n          }\n\n          $$$1(this.element).trigger(this.constructor.Event.INSERTED);\n          this._popper = new Popper(this.element, tip, {\n            placement: attachment,\n            modifiers: {\n              offset: {\n                offset: this.config.offset\n              },\n              flip: {\n                behavior: this.config.fallbackPlacement\n              },\n              arrow: {\n                element: Selector.ARROW\n              },\n              preventOverflow: {\n                boundariesElement: this.config.boundary\n              }\n            },\n            onCreate: function onCreate(data) {\n              if (data.originalPlacement !== data.placement) {\n                _this._handlePopperPlacementChange(data);\n              }\n            },\n            onUpdate: function onUpdate(data) {\n              _this._handlePopperPlacementChange(data);\n            }\n          });\n          $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra\n          // empty mouseover listeners to the body's immediate children;\n          // only needed because of broken event delegation on iOS\n          // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n          if ('ontouchstart' in document.documentElement) {\n            $$$1(document.body).children().on('mouseover', null, $$$1.noop);\n          }\n\n          var complete = function complete() {\n            if (_this.config.animation) {\n              _this._fixTransition();\n            }\n\n            var prevHoverState = _this._hoverState;\n            _this._hoverState = null;\n            $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n            if (prevHoverState === HoverState.OUT) {\n              _this._leave(null, _this);\n            }\n          };\n\n          if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n            var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n            $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n          } else {\n            complete();\n          }\n        }\n      };\n\n      _proto.hide = function hide(callback) {\n        var _this2 = this;\n\n        var tip = this.getTipElement();\n        var hideEvent = $$$1.Event(this.constructor.Event.HIDE);\n\n        var complete = function complete() {\n          if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n            tip.parentNode.removeChild(tip);\n          }\n\n          _this2._cleanTipClass();\n\n          _this2.element.removeAttribute('aria-describedby');\n\n          $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n          if (_this2._popper !== null) {\n            _this2._popper.destroy();\n          }\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        $$$1(this.element).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n        if ('ontouchstart' in document.documentElement) {\n          $$$1(document.body).children().off('mouseover', null, $$$1.noop);\n        }\n\n        this._activeTrigger[Trigger.CLICK] = false;\n        this._activeTrigger[Trigger.FOCUS] = false;\n        this._activeTrigger[Trigger.HOVER] = false;\n\n        if ($$$1(this.tip).hasClass(ClassName.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(tip);\n          $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n\n        this._hoverState = '';\n      };\n\n      _proto.update = function update() {\n        if (this._popper !== null) {\n          this._popper.scheduleUpdate();\n        }\n      }; // Protected\n\n\n      _proto.isWithContent = function isWithContent() {\n        return Boolean(this.getTitle());\n      };\n\n      _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n        $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n      };\n\n      _proto.getTipElement = function getTipElement() {\n        this.tip = this.tip || $$$1(this.config.template)[0];\n        return this.tip;\n      };\n\n      _proto.setContent = function setContent() {\n        var $tip = $$$1(this.getTipElement());\n        this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());\n        $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n      };\n\n      _proto.setElementContent = function setElementContent($element, content) {\n        var html = this.config.html;\n\n        if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n          // Content is a DOM node or a jQuery\n          if (html) {\n            if (!$$$1(content).parent().is($element)) {\n              $element.empty().append(content);\n            }\n          } else {\n            $element.text($$$1(content).text());\n          }\n        } else {\n          $element[html ? 'html' : 'text'](content);\n        }\n      };\n\n      _proto.getTitle = function getTitle() {\n        var title = this.element.getAttribute('data-original-title');\n\n        if (!title) {\n          title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n        }\n\n        return title;\n      }; // Private\n\n\n      _proto._getAttachment = function _getAttachment(placement) {\n        return AttachmentMap[placement.toUpperCase()];\n      };\n\n      _proto._setListeners = function _setListeners() {\n        var _this3 = this;\n\n        var triggers = this.config.trigger.split(' ');\n        triggers.forEach(function (trigger) {\n          if (trigger === 'click') {\n            $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {\n              return _this3.toggle(event);\n            });\n          } else if (trigger !== Trigger.MANUAL) {\n            var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;\n            var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;\n            $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {\n              return _this3._enter(event);\n            }).on(eventOut, _this3.config.selector, function (event) {\n              return _this3._leave(event);\n            });\n          }\n\n          $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {\n            return _this3.hide();\n          });\n        });\n\n        if (this.config.selector) {\n          this.config = _objectSpread({}, this.config, {\n            trigger: 'manual',\n            selector: ''\n          });\n        } else {\n          this._fixTitle();\n        }\n      };\n\n      _proto._fixTitle = function _fixTitle() {\n        var titleType = typeof this.element.getAttribute('data-original-title');\n\n        if (this.element.getAttribute('title') || titleType !== 'string') {\n          this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n          this.element.setAttribute('title', '');\n        }\n      };\n\n      _proto._enter = function _enter(event, context) {\n        var dataKey = this.constructor.DATA_KEY;\n        context = context || $$$1(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $$$1(event.currentTarget).data(dataKey, context);\n        }\n\n        if (event) {\n          context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n        }\n\n        if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n          context._hoverState = HoverState.SHOW;\n          return;\n        }\n\n        clearTimeout(context._timeout);\n        context._hoverState = HoverState.SHOW;\n\n        if (!context.config.delay || !context.config.delay.show) {\n          context.show();\n          return;\n        }\n\n        context._timeout = setTimeout(function () {\n          if (context._hoverState === HoverState.SHOW) {\n            context.show();\n          }\n        }, context.config.delay.show);\n      };\n\n      _proto._leave = function _leave(event, context) {\n        var dataKey = this.constructor.DATA_KEY;\n        context = context || $$$1(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $$$1(event.currentTarget).data(dataKey, context);\n        }\n\n        if (event) {\n          context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n        }\n\n        if (context._isWithActiveTrigger()) {\n          return;\n        }\n\n        clearTimeout(context._timeout);\n        context._hoverState = HoverState.OUT;\n\n        if (!context.config.delay || !context.config.delay.hide) {\n          context.hide();\n          return;\n        }\n\n        context._timeout = setTimeout(function () {\n          if (context._hoverState === HoverState.OUT) {\n            context.hide();\n          }\n        }, context.config.delay.hide);\n      };\n\n      _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n        for (var trigger in this._activeTrigger) {\n          if (this._activeTrigger[trigger]) {\n            return true;\n          }\n        }\n\n        return false;\n      };\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), config);\n\n        if (typeof config.delay === 'number') {\n          config.delay = {\n            show: config.delay,\n            hide: config.delay\n          };\n        }\n\n        if (typeof config.title === 'number') {\n          config.title = config.title.toString();\n        }\n\n        if (typeof config.content === 'number') {\n          config.content = config.content.toString();\n        }\n\n        Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n        return config;\n      };\n\n      _proto._getDelegateConfig = function _getDelegateConfig() {\n        var config = {};\n\n        if (this.config) {\n          for (var key in this.config) {\n            if (this.constructor.Default[key] !== this.config[key]) {\n              config[key] = this.config[key];\n            }\n          }\n        }\n\n        return config;\n      };\n\n      _proto._cleanTipClass = function _cleanTipClass() {\n        var $tip = $$$1(this.getTipElement());\n        var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n        if (tabClass !== null && tabClass.length > 0) {\n          $tip.removeClass(tabClass.join(''));\n        }\n      };\n\n      _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {\n        this._cleanTipClass();\n\n        this.addAttachmentClass(this._getAttachment(data.placement));\n      };\n\n      _proto._fixTransition = function _fixTransition() {\n        var tip = this.getTipElement();\n        var initConfigAnimation = this.config.animation;\n\n        if (tip.getAttribute('x-placement') !== null) {\n          return;\n        }\n\n        $$$1(tip).removeClass(ClassName.FADE);\n        this.config.animation = false;\n        this.hide();\n        this.show();\n        this.config.animation = initConfigAnimation;\n      }; // Static\n\n\n      Tooltip._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' && config;\n\n          if (!data && /dispose|hide/.test(config)) {\n            return;\n          }\n\n          if (!data) {\n            data = new Tooltip(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Tooltip, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }, {\n        key: \"NAME\",\n        get: function get() {\n          return NAME;\n        }\n      }, {\n        key: \"DATA_KEY\",\n        get: function get() {\n          return DATA_KEY;\n        }\n      }, {\n        key: \"Event\",\n        get: function get() {\n          return Event;\n        }\n      }, {\n        key: \"EVENT_KEY\",\n        get: function get() {\n          return EVENT_KEY;\n        }\n      }, {\n        key: \"DefaultType\",\n        get: function get() {\n          return DefaultType;\n        }\n      }]);\n\n      return Tooltip;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1.fn[NAME] = Tooltip._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Tooltip;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Tooltip._jQueryInterface;\n    };\n\n    return Tooltip;\n  }($, Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Popover = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'popover';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.popover';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var CLASS_PREFIX = 'bs-popover';\n    var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n\n    var Default = _objectSpread({}, Tooltip.Default, {\n      placement: 'right',\n      trigger: 'click',\n      content: '',\n      template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n    });\n\n    var DefaultType = _objectSpread({}, Tooltip.DefaultType, {\n      content: '(string|element|function)'\n    });\n\n    var ClassName = {\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      TITLE: '.popover-header',\n      CONTENT: '.popover-body'\n    };\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      INSERTED: \"inserted\" + EVENT_KEY,\n      CLICK: \"click\" + EVENT_KEY,\n      FOCUSIN: \"focusin\" + EVENT_KEY,\n      FOCUSOUT: \"focusout\" + EVENT_KEY,\n      MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n      MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Popover =\n    /*#__PURE__*/\n    function (_Tooltip) {\n      _inheritsLoose(Popover, _Tooltip);\n\n      function Popover() {\n        return _Tooltip.apply(this, arguments) || this;\n      }\n\n      var _proto = Popover.prototype;\n\n      // Overrides\n      _proto.isWithContent = function isWithContent() {\n        return this.getTitle() || this._getContent();\n      };\n\n      _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n        $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n      };\n\n      _proto.getTipElement = function getTipElement() {\n        this.tip = this.tip || $$$1(this.config.template)[0];\n        return this.tip;\n      };\n\n      _proto.setContent = function setContent() {\n        var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events\n\n        this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\n\n        var content = this._getContent();\n\n        if (typeof content === 'function') {\n          content = content.call(this.element);\n        }\n\n        this.setElementContent($tip.find(Selector.CONTENT), content);\n        $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n      }; // Private\n\n\n      _proto._getContent = function _getContent() {\n        return this.element.getAttribute('data-content') || this.config.content;\n      };\n\n      _proto._cleanTipClass = function _cleanTipClass() {\n        var $tip = $$$1(this.getTipElement());\n        var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n        if (tabClass !== null && tabClass.length > 0) {\n          $tip.removeClass(tabClass.join(''));\n        }\n      }; // Static\n\n\n      Popover._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' ? config : null;\n\n          if (!data && /destroy|hide/.test(config)) {\n            return;\n          }\n\n          if (!data) {\n            data = new Popover(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Popover, null, [{\n        key: \"VERSION\",\n        // Getters\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }, {\n        key: \"NAME\",\n        get: function get() {\n          return NAME;\n        }\n      }, {\n        key: \"DATA_KEY\",\n        get: function get() {\n          return DATA_KEY;\n        }\n      }, {\n        key: \"Event\",\n        get: function get() {\n          return Event;\n        }\n      }, {\n        key: \"EVENT_KEY\",\n        get: function get() {\n          return EVENT_KEY;\n        }\n      }, {\n        key: \"DefaultType\",\n        get: function get() {\n          return DefaultType;\n        }\n      }]);\n\n      return Popover;\n    }(Tooltip);\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1.fn[NAME] = Popover._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Popover;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Popover._jQueryInterface;\n    };\n\n    return Popover;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var ScrollSpy = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'scrollspy';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.scrollspy';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Default = {\n      offset: 10,\n      method: 'auto',\n      target: ''\n    };\n    var DefaultType = {\n      offset: 'number',\n      method: 'string',\n      target: '(string|element)'\n    };\n    var Event = {\n      ACTIVATE: \"activate\" + EVENT_KEY,\n      SCROLL: \"scroll\" + EVENT_KEY,\n      LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      DROPDOWN_ITEM: 'dropdown-item',\n      DROPDOWN_MENU: 'dropdown-menu',\n      ACTIVE: 'active'\n    };\n    var Selector = {\n      DATA_SPY: '[data-spy=\"scroll\"]',\n      ACTIVE: '.active',\n      NAV_LIST_GROUP: '.nav, .list-group',\n      NAV_LINKS: '.nav-link',\n      NAV_ITEMS: '.nav-item',\n      LIST_ITEMS: '.list-group-item',\n      DROPDOWN: '.dropdown',\n      DROPDOWN_ITEMS: '.dropdown-item',\n      DROPDOWN_TOGGLE: '.dropdown-toggle'\n    };\n    var OffsetMethod = {\n      OFFSET: 'offset',\n      POSITION: 'position'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var ScrollSpy =\n    /*#__PURE__*/\n    function () {\n      function ScrollSpy(element, config) {\n        var _this = this;\n\n        this._element = element;\n        this._scrollElement = element.tagName === 'BODY' ? window : element;\n        this._config = this._getConfig(config);\n        this._selector = this._config.target + \" \" + Selector.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector.DROPDOWN_ITEMS);\n        this._offsets = [];\n        this._targets = [];\n        this._activeTarget = null;\n        this._scrollHeight = 0;\n        $$$1(this._scrollElement).on(Event.SCROLL, function (event) {\n          return _this._process(event);\n        });\n        this.refresh();\n\n        this._process();\n      } // Getters\n\n\n      var _proto = ScrollSpy.prototype;\n\n      // Public\n      _proto.refresh = function refresh() {\n        var _this2 = this;\n\n        var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n        var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n        var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n        this._offsets = [];\n        this._targets = [];\n        this._scrollHeight = this._getScrollHeight();\n        var targets = $$$1.makeArray($$$1(this._selector));\n        targets.map(function (element) {\n          var target;\n          var targetSelector = Util.getSelectorFromElement(element);\n\n          if (targetSelector) {\n            target = $$$1(targetSelector)[0];\n          }\n\n          if (target) {\n            var targetBCR = target.getBoundingClientRect();\n\n            if (targetBCR.width || targetBCR.height) {\n              // TODO (fat): remove sketch reliance on jQuery position/offset\n              return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];\n            }\n          }\n\n          return null;\n        }).filter(function (item) {\n          return item;\n        }).sort(function (a, b) {\n          return a[0] - b[0];\n        }).forEach(function (item) {\n          _this2._offsets.push(item[0]);\n\n          _this2._targets.push(item[1]);\n        });\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        $$$1(this._scrollElement).off(EVENT_KEY);\n        this._element = null;\n        this._scrollElement = null;\n        this._config = null;\n        this._selector = null;\n        this._offsets = null;\n        this._targets = null;\n        this._activeTarget = null;\n        this._scrollHeight = null;\n      }; // Private\n\n\n      _proto._getConfig = function _getConfig(config) {\n        config = _objectSpread({}, Default, config);\n\n        if (typeof config.target !== 'string') {\n          var id = $$$1(config.target).attr('id');\n\n          if (!id) {\n            id = Util.getUID(NAME);\n            $$$1(config.target).attr('id', id);\n          }\n\n          config.target = \"#\" + id;\n        }\n\n        Util.typeCheckConfig(NAME, config, DefaultType);\n        return config;\n      };\n\n      _proto._getScrollTop = function _getScrollTop() {\n        return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n      };\n\n      _proto._getScrollHeight = function _getScrollHeight() {\n        return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n      };\n\n      _proto._getOffsetHeight = function _getOffsetHeight() {\n        return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n      };\n\n      _proto._process = function _process() {\n        var scrollTop = this._getScrollTop() + this._config.offset;\n\n        var scrollHeight = this._getScrollHeight();\n\n        var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n        if (this._scrollHeight !== scrollHeight) {\n          this.refresh();\n        }\n\n        if (scrollTop >= maxScroll) {\n          var target = this._targets[this._targets.length - 1];\n\n          if (this._activeTarget !== target) {\n            this._activate(target);\n          }\n\n          return;\n        }\n\n        if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n          this._activeTarget = null;\n\n          this._clear();\n\n          return;\n        }\n\n        for (var i = this._offsets.length; i--;) {\n          var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n          if (isActiveTarget) {\n            this._activate(this._targets[i]);\n          }\n        }\n      };\n\n      _proto._activate = function _activate(target) {\n        this._activeTarget = target;\n\n        this._clear();\n\n        var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style\n\n\n        queries = queries.map(function (selector) {\n          return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + (selector + \"[href=\\\"\" + target + \"\\\"]\");\n        });\n        var $link = $$$1(queries.join(','));\n\n        if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n          $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n          $link.addClass(ClassName.ACTIVE);\n        } else {\n          // Set triggered link as active\n          $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + \", \" + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\n        }\n\n        $$$1(this._scrollElement).trigger(Event.ACTIVATE, {\n          relatedTarget: target\n        });\n      };\n\n      _proto._clear = function _clear() {\n        $$$1(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n      }; // Static\n\n\n      ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var data = $$$1(this).data(DATA_KEY);\n\n          var _config = typeof config === 'object' && config;\n\n          if (!data) {\n            data = new ScrollSpy(this, _config);\n            $$$1(this).data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(ScrollSpy, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }, {\n        key: \"Default\",\n        get: function get() {\n          return Default;\n        }\n      }]);\n\n      return ScrollSpy;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(window).on(Event.LOAD_DATA_API, function () {\n      var scrollSpys = $$$1.makeArray($$$1(Selector.DATA_SPY));\n\n      for (var i = scrollSpys.length; i--;) {\n        var $spy = $$$1(scrollSpys[i]);\n\n        ScrollSpy._jQueryInterface.call($spy, $spy.data());\n      }\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = ScrollSpy._jQueryInterface;\n    $$$1.fn[NAME].Constructor = ScrollSpy;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return ScrollSpy._jQueryInterface;\n    };\n\n    return ScrollSpy;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.1.0): tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  var Tab = function ($$$1) {\n    /**\n     * ------------------------------------------------------------------------\n     * Constants\n     * ------------------------------------------------------------------------\n     */\n    var NAME = 'tab';\n    var VERSION = '4.1.0';\n    var DATA_KEY = 'bs.tab';\n    var EVENT_KEY = \".\" + DATA_KEY;\n    var DATA_API_KEY = '.data-api';\n    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n    var Event = {\n      HIDE: \"hide\" + EVENT_KEY,\n      HIDDEN: \"hidden\" + EVENT_KEY,\n      SHOW: \"show\" + EVENT_KEY,\n      SHOWN: \"shown\" + EVENT_KEY,\n      CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n    };\n    var ClassName = {\n      DROPDOWN_MENU: 'dropdown-menu',\n      ACTIVE: 'active',\n      DISABLED: 'disabled',\n      FADE: 'fade',\n      SHOW: 'show'\n    };\n    var Selector = {\n      DROPDOWN: '.dropdown',\n      NAV_LIST_GROUP: '.nav, .list-group',\n      ACTIVE: '.active',\n      ACTIVE_UL: '> li > .active',\n      DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n      DROPDOWN_TOGGLE: '.dropdown-toggle',\n      DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n      /**\n       * ------------------------------------------------------------------------\n       * Class Definition\n       * ------------------------------------------------------------------------\n       */\n\n    };\n\n    var Tab =\n    /*#__PURE__*/\n    function () {\n      function Tab(element) {\n        this._element = element;\n      } // Getters\n\n\n      var _proto = Tab.prototype;\n\n      // Public\n      _proto.show = function show() {\n        var _this = this;\n\n        if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n          return;\n        }\n\n        var target;\n        var previous;\n        var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];\n        var selector = Util.getSelectorFromElement(this._element);\n\n        if (listElement) {\n          var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;\n          previous = $$$1.makeArray($$$1(listElement).find(itemSelector));\n          previous = previous[previous.length - 1];\n        }\n\n        var hideEvent = $$$1.Event(Event.HIDE, {\n          relatedTarget: this._element\n        });\n        var showEvent = $$$1.Event(Event.SHOW, {\n          relatedTarget: previous\n        });\n\n        if (previous) {\n          $$$1(previous).trigger(hideEvent);\n        }\n\n        $$$1(this._element).trigger(showEvent);\n\n        if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n          return;\n        }\n\n        if (selector) {\n          target = $$$1(selector)[0];\n        }\n\n        this._activate(this._element, listElement);\n\n        var complete = function complete() {\n          var hiddenEvent = $$$1.Event(Event.HIDDEN, {\n            relatedTarget: _this._element\n          });\n          var shownEvent = $$$1.Event(Event.SHOWN, {\n            relatedTarget: previous\n          });\n          $$$1(previous).trigger(hiddenEvent);\n          $$$1(_this._element).trigger(shownEvent);\n        };\n\n        if (target) {\n          this._activate(target, target.parentNode, complete);\n        } else {\n          complete();\n        }\n      };\n\n      _proto.dispose = function dispose() {\n        $$$1.removeData(this._element, DATA_KEY);\n        this._element = null;\n      }; // Private\n\n\n      _proto._activate = function _activate(element, container, callback) {\n        var _this2 = this;\n\n        var activeElements;\n\n        if (container.nodeName === 'UL') {\n          activeElements = $$$1(container).find(Selector.ACTIVE_UL);\n        } else {\n          activeElements = $$$1(container).children(Selector.ACTIVE);\n        }\n\n        var active = activeElements[0];\n        var isTransitioning = callback && active && $$$1(active).hasClass(ClassName.FADE);\n\n        var complete = function complete() {\n          return _this2._transitionComplete(element, active, callback);\n        };\n\n        if (active && isTransitioning) {\n          var transitionDuration = Util.getTransitionDurationFromElement(active);\n          $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      };\n\n      _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n        if (active) {\n          $$$1(active).removeClass(ClassName.SHOW + \" \" + ClassName.ACTIVE);\n          var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\n\n          if (dropdownChild) {\n            $$$1(dropdownChild).removeClass(ClassName.ACTIVE);\n          }\n\n          if (active.getAttribute('role') === 'tab') {\n            active.setAttribute('aria-selected', false);\n          }\n        }\n\n        $$$1(element).addClass(ClassName.ACTIVE);\n\n        if (element.getAttribute('role') === 'tab') {\n          element.setAttribute('aria-selected', true);\n        }\n\n        Util.reflow(element);\n        $$$1(element).addClass(ClassName.SHOW);\n\n        if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n          var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];\n\n          if (dropdownElement) {\n            $$$1(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n          }\n\n          element.setAttribute('aria-expanded', true);\n        }\n\n        if (callback) {\n          callback();\n        }\n      }; // Static\n\n\n      Tab._jQueryInterface = function _jQueryInterface(config) {\n        return this.each(function () {\n          var $this = $$$1(this);\n          var data = $this.data(DATA_KEY);\n\n          if (!data) {\n            data = new Tab(this);\n            $this.data(DATA_KEY, data);\n          }\n\n          if (typeof config === 'string') {\n            if (typeof data[config] === 'undefined') {\n              throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n            }\n\n            data[config]();\n          }\n        });\n      };\n\n      _createClass(Tab, null, [{\n        key: \"VERSION\",\n        get: function get() {\n          return VERSION;\n        }\n      }]);\n\n      return Tab;\n    }();\n    /**\n     * ------------------------------------------------------------------------\n     * Data Api implementation\n     * ------------------------------------------------------------------------\n     */\n\n\n    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n      event.preventDefault();\n\n      Tab._jQueryInterface.call($$$1(this), 'show');\n    });\n    /**\n     * ------------------------------------------------------------------------\n     * jQuery\n     * ------------------------------------------------------------------------\n     */\n\n    $$$1.fn[NAME] = Tab._jQueryInterface;\n    $$$1.fn[NAME].Constructor = Tab;\n\n    $$$1.fn[NAME].noConflict = function () {\n      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n      return Tab._jQueryInterface;\n    };\n\n    return Tab;\n  }($);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.0.0): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function ($$$1) {\n    if (typeof $$$1 === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $$$1.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })($);\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js",
    "content": "/**\n * jqGrid Chinese Translation\n * 咖啡兔 yanhonglei@gmail.com \n * http://www.kafeitu.me \n * \n * 花岗岩 marbleqi@163.com\n * \n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html \n**/\n/*global jQuery, define */\n(function( factory ) {\n\t\"use strict\";\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\n\t\t\t\"jquery\",\n\t\t\t\"../grid.base\"\n\t\t], factory );\n\t} else {\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.jgrid = $.jgrid || {};\nif(!$.jgrid.hasOwnProperty(\"regional\")) {\n\t$.jgrid.regional = [];\n}\n$.jgrid.regional[\"cn\"] = {\n    defaults : {\n        recordtext: \"第{0}到第{1}条\\u3000共 {2} 条\", // 共字前是全角空格\n        emptyrecords: \"没有记录！\",\n        loadtext: \"读取中...\",\n\tsavetext: \"保存中...\",\n        pgtext : \"第{0}页\\u3000共{1}页\",\n\t\tpgfirst : \"第一页\",\n\t\tpglast : \"最后一页\",\n\t\tpgnext : \"下一页\",\n\t\tpgprev : \"上一页\",\n\t\tpgrecs : \"每页记录数\",\n\t\tshowhide: \"切换 展开 折叠 表格\",\n\t\t// mobile\n\t\tpagerCaption : \"表格::页面设置\",\n\t\tpageText : \"Page:\",\n\t\trecordPage : \"每页记录数\",\n\t\tnomorerecs : \"没有更多记录...\",\n\t\tscrollPullup: \"加载更多...\",\n\t\tscrollPulldown : \"刷新...\",\n\t\tscrollRefresh : \"滚动刷新...\"\n    },\n    search : {\n        caption: \"搜索...\",\n        Find: \"查找\",\n        Reset: \"重置\",\n        odata: [{ oper:'eq', text:'等于\\u3000\\u3000'},{ oper:'ne', text:'不等于\\u3000'},{ oper:'lt', text:'小于\\u3000\\u3000'},{ oper:'le', text:'小于等于'},{ oper:'gt', text:'大于\\u3000\\u3000'},{ oper:'ge', text:'大于等于'},{ oper:'bw', text:'开头是'},{ oper:'bn', text:'开头不是'},{ oper:'in', text:'属于\\u3000\\u3000'},{ oper:'ni', text:'不属于'},{ oper:'ew', text:'结尾是'},{ oper:'en', text:'结尾不是'},{ oper:'cn', text:'包含\\u3000\\u3000'},{ oper:'nc', text:'不包含'},{ oper:'nu', text:'为空'},{ oper:'nn', text:'不为空'}, {oper:'bt', text:'区间'}],\n        groupOps: [ { op: \"AND\", text: \"满足所有条件\" },    { op: \"OR\",  text: \"满足任一条件\" } ],\n\t\toperandTitle : \"单击进行搜索。\",\n\t\tresetTitle : \"重置搜索条件\",\n\t\taddsubgrup : \"添加条件组\",\n\t\taddrule : \"添加条件\",\n\t\tdelgroup : \"删除条件组\",\n\t\tdelrule : \"删除条件\",\n\t\tClose : \"Close\",\n\t\tOperand : \"Operand : \",\n\t\tOperation : \"Oper : \"\n    },\n    edit : {\n        addCaption: \"添加记录\",\n        editCaption: \"编辑记录\",\n        bSubmit: \"提交\",\n        bCancel: \"取消\",\n        bClose: \"关闭\",\n        saveData: \"数据已修改，是否保存？\",\n        bYes : \"是\",\n        bNo : \"否\",\n        bExit : \"取消\",\n        msg: {\n            required:\"此字段必需\",\n            number:\"请输入有效数字\",\n            minValue:\"输值必须大于等于 \",\n            maxValue:\"输值必须小于等于 \",\n            email: \"这不是有效的e-mail地址\",\n            integer: \"请输入有效整数\",\n            date: \"请输入有效时间\",\n            url: \"无效网址。前缀必须为 ('http://' 或 'https://')\",\n            nodefined : \" 未定义！\",\n            novalue : \" 需要返回值！\",\n            customarray : \"自定义函数需要返回数组！\",\n            customfcheck : \"必须有自定义函数!\"\n        }\n    },\n    view : {\n        caption: \"查看记录\",\n        bClose: \"关闭\"\n    },\n    del : {\n        caption: \"删除\",\n        msg: \"删除所选记录？\",\n        bSubmit: \"删除\",\n        bCancel: \"取消\"\n    },\n    nav : {\n        edittext: \"\",\n        edittitle: \"编辑所选记录\",\n        addtext:\"\",\n        addtitle: \"添加新记录\",\n        deltext: \"\",\n        deltitle: \"删除所选记录\",\n        searchtext: \"\",\n        searchtitle: \"查找\",\n        refreshtext: \"\",\n        refreshtitle: \"刷新表格\",\n        alertcap: \"注意\",\n        alerttext: \"请选择记录\",\n        viewtext: \"\",\n        viewtitle: \"查看所选记录\",\n\t\tsavetext: \"\",\n\t\tsavetitle: \"保存记录\",\n\t\tcanceltext: \"\",\n\t\tcanceltitle : \"取消编辑记录\",\n\t\tselectcaption : \"操作...\"\n    },\n    col : {\n        caption: \"选择列\",\n        bSubmit: \"确定\",\n        bCancel: \"取消\"\n    },\n    errors : {\n        errcap : \"错误\",\n        nourl : \"没有设置url\",\n        norecords: \"没有需要处理的记录\",\n        model : \"colNames 和 colModel 长度不等！\"\n    },\n    formatter : {\n        integer : {thousandsSeparator: \",\", defaultValue: '0'},\n        number : {decimalSeparator:\".\", thousandsSeparator: \",\", decimalPlaces: 2, defaultValue: '0.00'},\n        currency : {decimalSeparator:\".\", thousandsSeparator: \",\", decimalPlaces: 2, prefix: \"\", suffix:\"\", defaultValue: '0.00'},\n        date : {\n            dayNames:   [\n                \"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\",\n                \"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\",\n            ],\n            monthNames: [\n                \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\", \"十\", \"十一\", \"十二\",\n                \"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"\n            ],\n            AmPm : [\"am\",\"pm\",\"上午\",\"下午\"],\n            S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},\n            srcformat: 'Y-m-d',\n            newformat: 'Y-m-d',\n            parseRe : /[#%\\\\\\/:_;.,\\t\\s-]/,\n            masks : {\n                // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid\n                // and see http://docs.jquery.com/UI/Datepicker/formatDate\n                // and https://github.com/jquery/globalize#dates for alternative formats used frequently\n                // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many\n                // information about date, time, numbers and currency formats used in different countries\n                // one should just convert the information in PHP format\n                ISO8601Long:\"Y-m-d H:i:s\",\n                ISO8601Short:\"Y-m-d\",\n                // short date:\n                //    n - Numeric representation of a month, without leading zeros\n                //    j - Day of the month without leading zeros\n                //    Y - A full numeric representation of a year, 4 digits\n                // example: 3/1/2012 which means 1 March 2012\n                ShortDate: \"n/j/Y\", // in jQuery UI Datepicker: \"M/d/yyyy\"\n                // long date:\n                //    l - A full textual representation of the day of the week\n                //    F - A full textual representation of a month\n                //    d - Day of the month, 2 digits with leading zeros\n                //    Y - A full numeric representation of a year, 4 digits\n                LongDate: \"l, F d, Y\", // in jQuery UI Datepicker: \"dddd, MMMM dd, yyyy\"\n                // long date with long time:\n                //    l - A full textual representation of the day of the week\n                //    F - A full textual representation of a month\n                //    d - Day of the month, 2 digits with leading zeros\n                //    Y - A full numeric representation of a year, 4 digits\n                //    g - 12-hour format of an hour without leading zeros\n                //    i - Minutes with leading zeros\n                //    s - Seconds, with leading zeros\n                //    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n                FullDateTime: \"l, F d, Y g:i:s A\", // in jQuery UI Datepicker: \"dddd, MMMM dd, yyyy h:mm:ss tt\"\n                // month day:\n                //    F - A full textual representation of a month\n                //    d - Day of the month, 2 digits with leading zeros\n                MonthDay: \"F d\", // in jQuery UI Datepicker: \"MMMM dd\"\n                // short time (without seconds)\n                //    g - 12-hour format of an hour without leading zeros\n                //    i - Minutes with leading zeros\n                //    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n                ShortTime: \"g:i A\", // in jQuery UI Datepicker: \"h:mm tt\"\n                // long time (with seconds)\n                //    g - 12-hour format of an hour without leading zeros\n                //    i - Minutes with leading zeros\n                //    s - Seconds, with leading zeros\n                //    A - Uppercase Ante meridiem and Post meridiem (AM or PM)\n                LongTime: \"g:i:s A\", // in jQuery UI Datepicker: \"h:mm:ss tt\"\n                SortableDateTime: \"Y-m-d\\\\TH:i:s\",\n                UniversalSortableDateTime: \"Y-m-d H:i:sO\",\n                // month with year\n                //    Y - A full numeric representation of a year, 4 digits\n                //    F - A full textual representation of a month\n                YearMonth: \"F, Y\" // in jQuery UI Datepicker: \"MMMM, yyyy\"\n            },\n            reformatAfterEdit : false,\n\t\t\tuserLocalTime : false\n        },\n        baseLinkUrl: '',\n        showAction: '',\n        target: '',\n        checkbox : {disabled:true},\n        idName : 'id'\n    },\n\tcolmenu : {\n\t\tsortasc : \"升序排序\",\n\t\tsortdesc : \"降序排序\",\n\t\tcolumns : \"列\",\n\t\tfilter : \"筛选\",\n\t\tgrouping : \"分类\",\n\t\tungrouping : \"取消分类\",\n\t\tsearchTitle : \"查找:\",\n\t\tfreeze : \"冻结\",\n\t\tunfreeze : \"取消冻结\",\n\t\treorder : \"重新排序\",\n\t\thovermenu: \"Click for column quick actions\"\n\t}\n};\n}));\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jqgrid-5.7.0/ui.jqgrid-bootstrap-ui.css",
    "content": "/*\nTo change this license header, choose License Headers in Project Properties.\nTo change this template file, choose Tools | Templates\nand open the template in the editor.\n*/\n/* \n    Created on : Mar 16, 2015, 10:24:01 AM\n    Author     : tony\n*/\n\n.ui-jqgrid tr.jqgrow td { height: 26px;}\n.ui-jqgrid .ui-pg-input,.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { height:20px }\n.ui-state-hover\n{\n    border: .15em solid;\n\tborder-color: inherit;\n\n}\n.ui-jqdialog .ui-jqdialog-titlebar  {\n\theight:29px;\n\tborder-color: inherit;\n}\n\n.ui-jqdialog-content input.FormElement {\n    padding: 0.25em;\n}\n\n.fm-button {\n    height:30px;\n}\n#nData, #pData { height:20px; width:18px; }"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jqgrid-5.7.0/ui.jqgrid-bootstrap.css",
    "content": "/*Grid*/\n.ui-jqgrid {\n\tposition: relative; \n\tborder: 1px solid #ddd;      /*default*/\n\t-webkit-border-radius: 3px;\n\t-moz-border-radius: 3px;\n\tborder-radius: 3px;\n}\n.ui-jqgrid .ui-jqgrid-view {\n\tposition: relative;\n\tleft:0; \n\ttop: 0; \n\tpadding: 0;\n}\n.ui-jqgrid .ui-common-table {}\n\n/* Caption*/\n.ui-jqgrid .ui-jqgrid-titlebar {\n\tfont-weight: normal;\n\tmin-height:37px; \n\tpadding: 4px 8px; \n\tposition: relative; \n\tmargin-right: 2px;\n\tborder-bottom: 1px solid #ddd; /*default*/\n\n}\n.ui-jqgrid .ui-jqgrid-caption {\n\ttext-align: left;\n}\n.ui-jqgrid .ui-jqgrid-title { \n\tpadding-top: 5px; \n\tvertical-align: middle;\n\tposition: absolute;\n}\n\n.ui-jqgrid .ui-jqgrid-titlebar-close { \n\tcolor: inherit; \n\tposition: absolute;\n\ttop: 50%; \n\tmargin: -10px 7px 0 0; \n\tpadding: 1px; \n\tcursor:pointer;\n}\n.ui-jqgrid .ui-jqgrid-titlebar-close span { \n\tdisplay: block; \n\tmargin: 1px; \n}\n.ui-jqgrid .ui-jqgrid-titlebar-close:hover {  }\n\n/* Header*/\n.ui-jqgrid .ui-jqgrid-hdiv {\n\tposition: relative; \n\tmargin: 0;\n\tpadding: 0; \n\toverflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-hbox {\n\tfloat: left; \n\tpadding-right: 20px;\n}\n.ui-jqgrid .ui-jqgrid-htable { \n\tmargin-bottom: 0; \n\ttable-layout: fixed; \n\tborder-top:none;\n}\n.ui-jqgrid .ui-jqgrid-htable thead th {\n\toverflow : hidden; \n\tborder-bottom : none;\n\tpadding-right: 2px;\n}\n.ui-jqgrid .ui-jqgrid-htable thead th div {\n\toverflow: hidden; \n\tposition:relative;\n}\n.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-th-column-header, \n.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {}\n.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {text-align: center; }\n.ui-first-th-ltr { }\n.ui-first-th-rtl { }\n.ui-jqgrid tr.jqg-first-row-header th {\n\theight:auto; \n\tborder-top:none; \n\tpadding-bottom: 0;\n\tpadding-top: 0;\n\tborder-bottom: none; \n\tpadding-right: 2px;\n\ttext-align: center;\n}\n.ui-jqgrid tr.jqg-second-row-header th,\n.ui-jqgrid tr.jqg-third--row-header th\n{\n\tborder-top:none;\n\ttext-align: center;\n}\n\n.ui-jqgrid .ui-th-div-ie {\n\twhite-space: nowrap; \n\theight:17px;\n}\n.ui-jqgrid .ui-jqgrid-resize {\n\theight:20px !important;\n\tposition: relative; \n\tcursor :e-resize;\n\tdisplay: inline;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-grid-ico-sort { \n\tmargin-left:5px; \n\toverflow:hidden;\n\tposition:absolute;\n\tright: auto;\n\tfont-size:12px;\n}\n.ui-jqgrid .ui-icon-asc {\n\tmargin-top:-3px;\n}\n.ui-jqgrid .ui-icon-desc {\n\tmargin-top:4px;\n}\n.ui-jqgrid .ui-i-asc {\n\tmargin-top:0;\n}\n.ui-jqgrid .ui-i-desc {\n\tmargin-top:0;\n\tmargin-right:13px;\n}\n.ui-jqgrid .ui-single-sort-asc {\n\tmargin-top:0;\n}\n.ui-jqgrid .ui-single-sort-desc {}\n.ui-jqgrid .ui-jqgrid-sortable {\n\tcursor:pointer;\n}\n.ui-jqgrid tr.ui-search-toolbar th { }\n.ui-jqgrid .ui-search-table td.ui-search-clear { }\n.ui-jqgrid tr.ui-search-toolbar td > input { }\n.ui-jqgrid tr.ui-search-toolbar select {}\n\n.ui-jqgrid .ui-th-column > .ui-th-div  {\n\tpadding-left: 14px;\n}\n.ui-jqgrid .ui-icon-left .ui-grid-ico-sort {\n\tmargin-left: -14px;\n}\n\n\n/* Body */ \n.ui-jqgrid .table-bordered,\n.ui-jqgrid .table-bordered td,\n.ui-jqgrid .table-bordered th.ui-th-ltr\n{\n\tborder-left:0px none !important;\n}\n.ui-jqgrid .table-bordered th.ui-th-rtl\n{\n\tborder-right:0px none !important;\n}\n.ui-jqgrid .table-bordered tr.ui-row-rtl td\n{\n\tborder-right:0px none !important;\n\tborder-left: 1px solid #ddd !important;\n}\ndiv.tablediv > .table-bordered {\n\tborder-left : 1px solid #ddd !important;\n}\n.ui-jqgrid  .ui-jqgrid-bdiv table.table-bordered td {\n\tborder-top: 0px none;\n}\n.ui-jqgrid .ui-jqgrid-bdiv {\n\tposition: relative; \n\tmargin: 0; \n\tpadding:0; \n\toverflow: auto; \n\ttext-align:left; \n}\n.ui-jqgrid .ui-jqgrid-btable {\n\ttable-layout: fixed; \n\tborder-left:none ; \n\tborder-top:none; \n\tmargin-bottom: 0px\n}\n.ui-jqgrid tr.jqgrow {  \n\toutline-style: none; \n}\n.ui-jqgrid tr.jqgroup {  \n\toutline-style: none; \n}\n.ui-jqgrid .ui-jqgrid-btable tbody tr.jqgrow td { \n\toverflow: hidden; \n\twhite-space: pre; \n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.jqgfirstrow  td {\n\theight:auto; \n\tborder-top:none; \n\tpadding-bottom: 0;\n\tpadding-top: 0;\n\tborder-bottom: none; \n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.jqgroup td { \n\twhite-space: nowrap;\n}\n.ui-jqgrid tr.jqfoot td {\n\twhite-space: nowrap;\n}\n.ui-jqgrid tr.ui-row-ltr td {}\n.ui-jqgrid tr.ui-row-rtl td {}\n.ui-jqgrid td.jqgrid-rownum { }\n.ui-jqgrid .ui-jqgrid-resize-mark { \n\twidth:2px; \n\tleft:0; \n\tbackground-color:#777; \n\tcursor: e-resize; \n\tcursor: col-resize; \n\tposition:absolute; \n\ttop:0; \n\theight:100px; \n\toverflow:hidden; \n\tdisplay:none; \n\tborder:0 none; \n\tz-index: 99999;\n\n}\n/* Footer */\n.ui-jqgrid .ui-jqgrid-sdiv {\n\tposition: relative; \n\tmargin: 0;\n\tpadding: 0; \n\toverflow: hidden; \n\tborder-left: 0 none !important; \n\tborder-top : 0 none !important; \n\tborder-right : 0 none !important;\n}\n.ui-jqgrid .ui-jqgrid-ftable {\n\ttable-layout:fixed;\n\tmargin-bottom:0;\n}\n\n.ui-jqgrid tr.footrow td {\n\tfont-weight: bold; \n\toverflow: hidden; \n\twhite-space:nowrap; \n\tpadding-right: 2px;\n\tborder-bottom: 0px none;\n}\n.ui-jqgrid tr.footrow-ltr td {\n\ttext-align:left;\n}\n.ui-jqgrid tr.footrow-rtl td {\n\ttext-align:right;\n}\n\n/* Pager*/\n.ui-jqgrid .ui-jqgrid-pager,\n.ui-jqgrid .ui-jqgrid-toppager\n{ \n\tborder-left-width: 0px;\n\tborder-top: 1px solid #ddd;  \n\t/*padding : 4px 0px;*/\n\tposition: relative; \n\t/*height: auto; */\n\twhite-space: nowrap;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-toppager {\n\tborder-top-width :0;\n\tborder-bottom : 1px solid #ddd;\n}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, \n.ui-jqgrid .ui-jqgrid-pager .ui-pager-control {\n\tposition: relative;\n\tborder-left: 0;\n\tborder-bottom: 0;\n\tborder-top: 0; \n\t/*height: 30px;*/\n}\n.ui-jqgrid .ui-pg-table {\n\tposition: relative; \n\tpadding: 1px 0; \n\twidth:auto; \n\tmargin: 0;\n}\n.ui-jqgrid .ui-pg-table td {\n\tfont-weight:normal; \n\tvertical-align:middle; \n\t/*padding:0px 6px;*/\n}\n.ui-jqgrid .ui-pager-control .ui-pager-table td {\n\tborder-top : 0px none !important;\n\tmin-height : 20px !important;\n}\n.ui-jqgrid .ui-pg-button  { \n\theight:auto; \n}\n.ui-jqgrid  .ui-paging-pager td {\n\tpadding : 0 5px;\n}\n.ui-jqgrid .ui-pg-button span { \n\tdisplay: block; \n\tmargin: 0px 2px; \n\tfloat:left;\n}\n.ui-jqgrid .ui-pg-button:hover {  }\n.ui-jqgrid .ui-disabled:hover {}\n.ui-jqgrid .ui-pg-input,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { \n\tdisplay: inline-block;\n\theight:auto;\n\twidth: auto;\n\tfont-size:.9em; \n\tmargin:0;\n\tline-height: inherit;\n\tborder: none; \n\tpadding: 0px 3px\n}\n.ui-jqgrid .ui-pg-selbox, \n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox {\n\tfont-size:.9em; \n\tline-height:inherit; \n\tdisplay:block; \n\theight:22px; \n\tmargin: 0; \n\tpadding: 3px 0px 3px 3px; \n\tborder:none;\n}\n.ui-jqgrid .ui-separator {\n\theight: 18px; \n\tborder : none;\n\tborder-left: 2px solid #ccc ; /*default*/\n\t\n}\n.ui-separator-li {\n\theight: 2px; \n\tborder : none;\n\tborder-top: 2px solid #ccc ;  /*default*/\n\tmargin: 0; padding: 0; width:100%\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div\n{\n\tfloat:left;\n\tposition:relative; \n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-button,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button\n{ \n\tcursor:pointer; \n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div  span,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span\n{\n\tfloat:left;\n}\n.ui-jqgrid td input, \n.ui-jqgrid td select, \n.ui-jqgrid td textarea { \n\tmargin: 0;\n}\n.ui-jqgrid td textarea {\n\twidth:auto;\n\theight:auto;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pager-table,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-table\n{\n\twidth:100%;\n\ttable-layout:fixed;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-info,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-info\n{ \n\tfont-weight: normal;\n\theight:auto; \n\tmargin-top:3px;\n\tmargin-right:4px;\n\tdisplay: inline;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-pager,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager\n{\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable,\n.ui-jqgrid .ui-jqgrid-toppager .navtable\n{\n\tfloat:left;\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable td,\n.ui-jqgrid .ui-jqgrid-toppager .navtable td \n{ \n\tpadding : 0 5px;\n}\n\n/*Subgrid*/\n\n.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {\n\tdisplay: block;\n}\n.ui-jqgrid .ui-subgrid {\n\tmargin:0;\n\tpadding:0; \n\twidth:100%;\n}\n.ui-jqgrid .ui-subgrid table {\n\ttable-layout: fixed;\n}\n.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {}\n.ui-jqgrid .ui-subgrid td.subgrid-data {\n\tborder-top:  0 none !important;\n}\n.ui-jqgrid .ui-subgrid td.subgrid-cell { \n\tvertical-align: middle\n}\n.ui-jqgrid a.ui-sghref {\n\ttext-decoration: none;\n\tcolor : #010101; /*default*/\n}\n.ui-jqgrid .ui-th-subgrid {height:20px;}\n.tablediv > .row { margin: 0 0}\n/* loading */\n.ui-jqgrid .loading,\n.loading_pivot {\n\tposition: absolute; \n\ttop: 45%;\n\tleft: 45%;\n\twidth: auto;\n\tz-index:101;\n\tpadding: 6px; \n\tmargin: 5px;\n\ttext-align: center;\n\tdisplay: none;\n\tborder: 1px solid #ddd;  /*default*/\n\tfont-size: 14px;\n\tbackground-color: #d9edf7;\n}\n.ui-jqgrid .jqgrid-overlay { \n\tdisplay:none;\n}\n/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */\n* .jqgrid-overlay iframe {\n\tposition:absolute;\n\ttop:0;\n\tleft:0;\n\tz-index:-1;\n}\n/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n/* end loading div */\n\n/* Toolbar */\n.ui-jqgrid .ui-userdata {\n\tpadding: 4px 0px; \n\toverflow: hidden; \n\tmin-height: 32px; \n}\n.ui-jqgrid .ui-userdata-top {\n\tborder-left-width: 0px;    /*default*/\n\tborder-bottom: 1px solid #ddd;\t\n}\n.ui-jqgrid .ui-userdata-bottom {\n\tborder-left-width: 0px;    /*default*/\n\tborder-top: 1px solid #ddd;\t\n}\n/*Modal Window */\n.ui-jqdialog { }\n.ui-jqdialog { \n\tdisplay: none; \n\twidth: 500px; \n\tposition: absolute; \n\t/*padding: 5px; */\n\toverflow:visible;\n}\n.ui-jqdialog .ui-jqdialog-titlebar {\n\tpadding: .1em .1em; \n\tmin-height: 35px; \n}\n.ui-jqdialog .ui-jqdialog-title { \n\tmargin: .3em 0 .2em;  \n\tfont-weight: bold;\n\tpadding-left :6px;\n\tpadding-right:6px;\n} \n.ui-jqdialog .ui-jqdialog-titlebar-close { \n\tposition: absolute;  \n\ttop: 0%; \n\tmargin: 3px 5px 0 0; \n\tpadding: 8px;  \n\tcursor:pointer;\n}\n\n.ui-jqdialog .ui-jqdialog-titlebar-close span {  }\n.ui-jqdialog .ui-jqdialog-titlebar-close:hover, \n.ui-jqdialog .ui-jqdialog-titlebar-close:focus { \n\tpadding: 8px; \n}\n.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { \n\tborder: 0; \n\tpadding: .3em .2em; \n\tbackground: none; \n\theight:auto;\n}\n.ui-jqdialog .ui-jqconfirm {\n\tpadding: .4em 1em; \n\tborder-width:3px;\n\tposition:absolute;\n\tbottom:10px;\n\tright:10px;\n\toverflow:visible;\n\tdisplay:none;\n\theight:120px;\n\twidth:220px;\n\ttext-align:center;\n\tbackground-color: #fff;\n\tborder-radius: 4px;\n\t-webkit-border-radius: 4px;\n\t-moz-border-radius: 4px;\n}\n.ui-jqdialog>.ui-resizable-se { }\n.ui-jqgrid>.ui-resizable-se { }\n.jqgrid-overlay-modal {\n\tdisplay : none;\n}\n/* end Modal window*/\n/* Form edit */\n.ui-jqdialog-content .FormGrid { \n\tmargin: 0 8px 0 8px; \n\toverflow:auto;\n\tposition:relative;\n}\n.ui-jqdialog-content .EditTable { \n\twidth: 100%; \n\tmargin-bottom:0; \n}\n.ui-jqdialog-content .DelTable { \n\twidth: 100%; \n\tmargin-bottom:0;\n}\n.EditTable td input, \n.EditTable td select, \n.EditTable td textarea { \n\twidth: 98%; \n\tdisplay: inline-block;\n}\n.EditTable td textarea { \n\twidth:auto; \n\theight:auto;\n}\n.EditTable .FormData td { \n\theight:37px !important;\n}\n.ui-jqdialog-content td.EditButton {\n\ttext-align: right; \n\tpadding: 5px 5px 5px 0;\n}\n.ui-jqdialog-content td.navButton {\n\ttext-align: center; \n\tborder-left: 0 none;\n\tborder-top: 0 none;\n\tborder-right: 0 none; \n\tpadding-bottom:5px; \n\tpadding-top:5px;\n}\n.ui-jqdialog-content input.FormElement {\n\tpadding: .5em .3em; \n\tmargin-bottom: 5px\n}\n.ui-jqdialog-content select.FormElement {\n\tpadding:.3em; \n\tmargin-bottom: 3px;\n}\n.ui-jqdialog-content .data-line {\n\tpadding-top:.1em;\n\tborder: 0 none;\n}\n\n.ui-jqdialog-content .CaptionTD {\n\tvertical-align: middle;\n\tborder: 0 none; \n\tpadding: 2px;\n\twhite-space: nowrap;\n}\n.ui-jqdialog-content .DataTD {\n\tpadding: 2px; \n\tborder: 0 none; \n\tvertical-align: top;\n}\n.ui-jqdialog-content .form-view-data {\n\twhite-space:pre\n}\n.fm-button {  }\n.fm-button-icon-left { \n\tmargin-left: 4px; \n\tmargin-right: 4px;  \n}\n.fm-button-icon-right { \n\tmargin-left: 4px; \n\tmargin-right: 4px; \n}\n.fm-button-icon-left  {  }\n.fm-button-icon-right  { }\n#nData, #pData { \n\tmargin-left: 4px; \n\tmargin-right: 4px; \n}\n#sData span, #cData span { \n\tmargin-left: 5px;\n}\n/* End Eorm edit */\n/*.ui-jqgrid .edit-cell {}*/\n.ui-jqgrid .selected-row, \ndiv.ui-jqgrid .selected-row td {\n\tfont-style : normal;\n}\n/* inline edit actions button*/\n.ui-inline-del, .ui-inline-cancel {\n    margin-left: 14px;\n}\n.ui-jqgrid .inline-edit-cell {}\n/* Tree Grid */\n.ui-jqgrid .tree-wrap {\n\tfloat: left; \n\tposition: relative;\n\theight: 18px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-minus {\n\tposition: absolute; \n\theight: 18px; \n\twidth: 18px; \n\toverflow: hidden;\n}\n.ui-jqgrid .tree-plus {\n\tposition: absolute;\t\n\theight: 18px; \n\twidth: 18px;\t\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-leaf {\n\tposition: absolute;\t\n\theight: 18px; \n\twidth: 18px;\n\toverflow: hidden;\n}\n.ui-jqgrid .treeclick {\n\tcursor: pointer;\n}\n/* moda dialog */\n* iframe.jqm {\n\tposition:absolute;\n\ttop:0;\n\tleft:0;\n\tz-index:-1;\n}\n/*\t width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n.ui-jqgrid-dnd tr td {\n\tborder-right-width: 1px;\n\tborder-right-color: inherit;\n\tborder-right-style: solid; \n\theight:20px\n}\n/* RTL Support */\n.ui-jqgrid .ui-jqgrid-caption-rtl {\n\ttext-align: right;\n}\n.ui-jqgrid .ui-jqgrid-hbox-rtl {\n\tfloat: right; \n\t/*padding-left: 20px;*/\n}\n.ui-jqgrid .ui-jqgrid-resize-ltr {\n\tfloat: right;\n\tmargin: -2px -2px -2px 0;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-resize-rtl {\n\tfloat: left;\n\tmargin: -2px -2px -2px -0px;\n}\n.ui-jqgrid .ui-sort-rtl {\n\t\n}\n.ui-jqgrid .tree-wrap-ltr {\n\tfloat: left;\n}\n.ui-jqgrid .tree-wrap-rtl {\n\tfloat: right;\n}\n.ui-jqgrid .ui-ellipsis {\n\t-moz-text-overflow:ellipsis;\n\ttext-overflow:ellipsis;\n}\n/* Toolbar Search Menu. Nav menu */\n.ui-search-menu, \n.ui-nav-menu {\n\tposition: absolute; \n\tpadding: 2px 5px; \n\tz-index:99999;\n}\n.ui-search-menu.ui-menu .ui-menu-item,\n.ui-nav-menu.ui-menu .ui-menu-item\n{ \n\tlist-style-image: none; \n\tpadding-right: 0; \n\tpadding-left: 0; \n}\n.ui-search-menu.ui-menu .ui-menu-item a, \n.ui-nav-menu.ui-menu .ui-menu-item a \n{ \n\tdisplay: block; \n}\n.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover,\n.ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover \n{ \n\tmargin: -1px; \n\tfont-weight: normal; \n}\n.ui-jqgrid .ui-search-table { \n\tpadding: 0; \n\tborder: 0 none; \n\theight:20px; \n\twidth:100%;\n}\n.ui-jqgrid .ui-search-table .ui-search-oper { \n\twidth:20px; \n}\na.g-menu-item, a.soptclass, a.clearsearchclass { \n\tcursor: pointer; \n} \n.ui-jqgrid .ui-jqgrid-view input,\n.ui-jqgrid .ui-jqgrid-view select,\n.ui-jqgrid .ui-jqgrid-view textarea,\n.ui-jqgrid .ui-jqgrid-view button {\n    /*font-size: 11px*/\n}\n.ui-jqgrid .ui-scroll-popup {\n\twidth: 100px;\n}\n.ui-search-table select,\n.ui-search-table input \n{\n\tpadding: 4px 3px;\n}\n\t\n.ui-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: rgba(0,0,0,0.5);\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n \n.ui-jqgrid-pager .ui-pg-table .ui-pg-button:hover,\n.ui-jqgrid-toppager .ui-pg-table .ui-pg-button:hover\n{\n\tbackground-color: #ddd;\n}\n.ui-jqgrid-corner  {\n\t border-radius: 5px\n}\n.ui-resizable-handle {\n\t/*position: absolute;*/\n\tdisplay: block;\n\tleft :auto;\n}\n.ui-jqdialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -5px;\n\tbackground-position: 16px 16px;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-icon {\n\tresize: both;\n\toverflow: auto;\n}\n.ui-top-corner {\n\tborder-top-left-radius: 5px;\n\tborder-top-right-radius: 5px;\n}\n.ui-bottom-corner {\n\tborder-bottom-left-radius: 5px;\n\tborder-bottom-right-radius: 5px;\n}\n\n.ui-search-table {\n\tmargin-bottom: 0;\n}\n.ui-search-table .columns, .ui-search-table .operators {\n\tpadding-right: 5px;\n}\n.opsel {\n\tfloat :left;\n\twidth : 100px;\n\tmargin-right : 5px;\n}\n.add-group, .add-rule, .delete-group {\n\twidth: 14%;\t\n\tmargin-right : 5px;\n}\n.delete-rule {\n\twidth : 15px;\n}\nul.ui-search-menu, ul.ui-nav-menu {\n\t list-style-type:  none;\n}\nul.ui-search-menu li a, \nul.ui-nav-menu li a,\n.soptclass, \n.clearsearchclass {\n\ttext-decoration: none;\n\tcolor : #010101;\n}\nul.ui-search-menu li a:hover, ul.ui-nav-menu li a:hover, a.soptclass:hover, a.clearsearchclass:hover {\n\tbackground-color: #ddd;\n\tpadding: 1px 1px;\n\ttext-decoration: none;\n}\nul.ui-search-menu li, ul.ui-nav-menu li {\n\tpadding : 5px 5px;\n}\n.ui-menu-item hr {\n\tmargin-bottom: 0px;\n\tmargin-top:0px;\n}\n\n.searchFilter .ui-search-table td,\n.searchFilter .ui-search-table th\n{\n\tborder-top: 0px none !important;\n}\n\n.searchFilter .queryresult {\n\tmargin-bottom: 5px;\n}\n.searchFilter .queryresult tr td{\n\tborder-top: 0px none;\n}\n.ui-search-label { \n\tpadding-left: 5px;\n}\n\n.frozen-div, .frozen-bdiv {\n\tbackground-color: #fff;\n}\n/*\n.ui-jqgrid .ui-jqgrid-caption,\n.ui-jqgrid .ui-jqgrid-pager,\n.ui-jqgrid .ui-jqgrid-toppager,\n.ui-jqgrid .ui-jqgrid-htable thead th,\n.ui-jqgrid .ui-userdata-top,\n.ui-jqgrid .ui-userdata-bottom,\n.ui-jqgrid .ui-jqgrid-hdiv,\n.ui-jqdialog .ui-jqdialog-titlebar\n{\n    background-image: none, linear-gradient(to bottom, #fff 0px, #e0e0e0 100%);\n    background-repeat: repeat-x;\n    border-color: #ccc;\n    text-shadow: 0 1px 0 #fff;\n}\n*/\n/* Column menu */\n.ui-jqgrid .ui-jqgrid-htable .colmenu {\n\tposition:absolute;\n\tright:1px;\n\theight:100%;\n\tcolor : black;\n}\n.ui-jqgrid .ui-jqgrid-htable .colmenu-rtl {\n\tright: auto;\n\tleft : 1px;\n}\n.ui-jqgrid .ui-jqgrid-htable .colmenuspan {\n\tdisplay:inline-block;\n}\n\n.ui-jqgrid .ui-jqgrid-htable .ui-th-div {\n\theight:17px;\n\tmargin-top:5px;\n}\n.column-menu, .ui-search-menu {\n\tpadding: 10px 15px;\n}\n.column-menu .divider {\n\tbackground-color: #e5e5e5; \n\theight: 1px;\n\tpadding:0 0;\n\tmargin: 5px 0;  \n\toverflow: hidden;\n}\n.ui-menu-item .ui-common-table .menu_icon {\n\tpadding-right: 8px;\n\tpadding-left: 8px;\n}\ntd.menu_text {\n\twidth: auto;\n\tpadding-left: 1px;\n\twhite-space: nowrap;\n}\n#search_menu .ui-menu-item div {\n\tpadding: 3px 0;\n\twhite-space: nowrap;\n}\n\n#search_menu  .search_buttons {\n\tdisplay:inline-block;\n\twidth:50%;\n\tpadding: 3px 3px;\n}\n.search_buttons .btn-default:hover {\n\tpadding-bottom: 6px;\n\tpadding-top: 6px;\n}\n.search_buttons #bs_reset {\n\tmargin-right: 3px;\n}\n.search_buttons #bs_search {\n\tmargin-left: 3px;\n}\n/*menubar*/\n.ui-jqgrid .ui-jqgrid-menubar {\n\tmargin: 5px 5px;\n\twidth:16px;\n\theight:16px;\n}\n.ui-jqgrid a.ui-jqgrid-menubar {\n\ttext-decoration: none;\n\tcolor : #010101; /*default*/\n}\n.ui-jqgrid .ui-jqgrid-menubar:hover {\n\tmargin: 5px 5px;\n\tbackground-color: #ddd;\n\ttext-decoration: none;\n}\n.ui-jqgrid .menubar-rtl {\n\tfloat : right;\n}\n\n.ui-jqgrid .menubar-ltr {\n\tfloat : left;\n}\n/*printing*/\n\n.jqgridprint {\n\twidth : 100%;\n\tfont-size: 13px;\n}\n\n.jqgridprint th,\n.jqgridprint td {\n\tpadding: 4px 4px 4px 4px ;\n\ttext-align: center ;\n}\n.jqgridprint th {\n\tborder-bottom: 2px solid #333333 ;\n}\n.jqgridprint td {\n\tborder-bottom: 1px dotted #999999 ;\n}\n\n.jqgridprint tfoot td {\n\tborder-bottom-width: 0px ;\n\tborder-top: 2px solid #333333 ;\n\tpadding-top: 20px ;\n}\n.ui-jqgrid .jqgrid-caption-menu \n{ \n\tleft:0;\n\ttop:30px;\n\tposition:absolute;\n\tdisplay:none;\n\tfont-size: inherit;\n\twidth : auto;\n}\n.ui-jqgrid .jqgrid-column-menu\n{\n\tfont-size:inherit;\n\twidth:auto;\n\tposition :absolute;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jqgrid-5.7.0/ui.jqgrid-bootstrap4.css",
    "content": "/*Grid*/\n.ui-jqgrid {\n\tposition: relative; \n\tborder: 1px solid #ddd;      /*default*/\n\t-webkit-border-radius: 3px;\n\t-moz-border-radius: 3px;\n\tborder-radius: 3px;\n\tline-height:  normal; /*calc(2px + 1rem + 2px); */        \n}\n.ui-jqgrid .ui-jqgrid-view {\n\tposition: relative;\n\tleft:0; \n\ttop: 0; \n\tpadding: 0;\n}\n.ui-jqgrid .ui-common-table {}\n\n/* Caption*/\n.ui-jqgrid .ui-jqgrid-titlebar {\n\tfont-weight: normal;\n\tmin-height:37px; \n\tpadding: 4px 8px; \n\tposition: relative; \n\tmargin-right: 2px;\n\tborder-bottom: 1px solid #ddd; /*default*/\n\n}\n.ui-jqgrid .ui-jqgrid-caption {\n\ttext-align: left;\n}\n.ui-jqgrid .ui-jqgrid-title { \n\t/*padding-top: .475rem; */\n\tvertical-align: middle;\n\tline-height: 28px;\n}\n.ui-jqgrid .ui-jqgrid-titlebar-close { \n\tcolor: inherit; \n\tposition: absolute;\n\ttop: 50%; \n\tmargin: -7px 7px 0 0; \n\tpadding: 1px; \n\tcursor:pointer;\n}\n.ui-jqgrid .ui-jqgrid-titlebar-close span { \n\tdisplay: block; \n\tmargin: 1px; \n}\n.ui-jqgrid .ui-jqgrid-titlebar-close:hover {  }\n\n/* Header*/\n.ui-jqgrid .ui-jqgrid-hdiv {\n\tposition: relative; \n\tmargin: 0;\n\tpadding: 0; \n\toverflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-hbox {\n\tfloat: left; \n\tpadding-right: 20px;\n}\n.ui-jqgrid .ui-jqgrid-htable { \n\tmargin-bottom: 0; \n\ttable-layout: fixed; \n\tborder-top: 0 none !important;\n}\n.ui-jqgrid .ui-jqgrid-htable thead th {\n\toverflow : hidden; \n\tborder-bottom : 0 none;\n\tborder-top: 0 none;\n\tpadding-right: 2px;\n}\n.ui-jqgrid .ui-jqgrid-htable thead th div {\n\toverflow: hidden; \n\tposition:relative;\n}\n.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-th-column-header, \n.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {}\n.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {text-align: center; }\n.ui-first-th-ltr { }\n.ui-first-th-rtl { }\n.ui-jqgrid tr.jqg-first-row-header th {\n\theight:auto; \n\tborder-top:none; \n\tpadding-bottom: 0;\n\tpadding-top: 0;\n\tborder-bottom: none; \n\tborder-left: none;\n\tpadding-right: 2px;\n\t/*text-align: center;*/\n}\n.ui-jqgrid tr.jqg-second-row-header th\n/*.ui-jqgrid tr.jqg-third-row-header th*/\n{\n\t/*border-top:none;*/\n\ttext-align: center;\n}\n.ui-jqgrid tr.jqg-third-row-header th\n{\n\tborder-top: 1px solid #dee2e6;\n}\n.ui-jqgrid .ui-th-div-ie {\n\twhite-space: nowrap; \n\t/*height:17px;*/\n}\n.ui-jqgrid .ui-jqgrid-resize {\n\theight:20px !important;\n\tposition: relative; \n\tcursor :e-resize;\n\tdisplay: inline;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-grid-ico-sort { \n\tmargin-left:5px; \n\toverflow:hidden;\n\tposition:absolute;\n\tright: auto;\n\tfont-size:12px;\n}\n.ui-jqgrid .ui-icon-asc {\n\tmargin-top:2px;\n}\n.ui-jqgrid .ui-icon-desc {\n\tmargin-top:8px;\n}\n.ui-jqgrid .ui-i-asc {\n\tmargin-top:4px;\n}\n.ui-jqgrid .ui-i-desc {\n\tmargin-top:4px;\n\tmargin-left:13px;\n}\n.ui-jqgrid .ui-single-sort-asc {\n\tmargin-top:0;\n}\n.ui-jqgrid .ui-single-sort-desc {}\n.ui-jqgrid .ui-jqgrid-sortable {\n\tcursor:pointer;\n}\n.ui-jqgrid tr.ui-search-toolbar th {\n\tpadding:  0.45rem;\n\tborder-top: 1px solid #dee2e6;\n}\n.ui-jqgrid .ui-search-table td.ui-search-clear \n{\n\tfont-size: inherit;\n}\n.ui-jqgrid tr.ui-search-toolbar td input { \n\tfont-size: inherit;\n\tpadding: 3px 0;\n}\n.ui-jqgrid tr.ui-search-toolbar select {\n\tfont-size: inherit;\n\tpadding: 0;\n}\n.ui-jqgrid .ui-th-column > .ui-th-div  {\n\tpadding-left: 7px;\n}\n.ui-jqgrid th.ui-th-column.jqgrid-multibox > .ui-th-div  {\n\tpadding-left: 0px;\n}\n\n.ui-jqgrid .ui-icon-left .ui-grid-ico-sort {\n\tmargin-left: -9px;\n}\n\n/* Body */ \n.ui-jqgrid .table-bordered,\n.ui-jqgrid .table-bordered td,\n.ui-jqgrid .table-bordered th.ui-th-ltr\n{\n\tborder-left:0px none !important;\n}\n.ui-jqgrid .table-bordered th.ui-th-rtl\n{\n\tborder-right:0px none !important;\n}\n.ui-jqgrid .table-bordered tr.ui-row-rtl td\n{\n\tborder-right:0px none !important;\n\tborder-left: 1px solid #ddd !important;\n}\ndiv.tablediv > .table-bordered {\n\tborder-left : 1px solid #ddd !important;\n}\n.ui-jqgrid .ui-jqgrid-bdiv table.table-bordered td {\n\tborder-top: 0px none;\n}\n\n.ui-subgrid .ui-jqgrid .ui-pager-control .ui-pager-table td {\n\tborder-top: 0px none;\n\tborder-right: 0px none;\n\tborder-bottom: 0 none;\n}\n\n.ui-jqgrid .ui-jqgrid-bdiv {\n\tposition: relative; \n\tmargin: 0; \n\tpadding:0; \n\toverflow: auto; \n\ttext-align:left; \n}\n.ui-jqgrid .ui-jqgrid-btable {\n\ttable-layout: fixed; \n\tborder-left:none ; \n\tborder-top:none; \n\tmargin-bottom: 0px\n}\n.ui-jqgrid tr.jqgrow {  \n\toutline-style: none; \n}\n.ui-jqgrid tr.jqgroup {  \n\toutline-style: none; \n}\n.ui-jqgrid .ui-jqgrid-btable tbody tr.jqgrow td { \n\toverflow: hidden; \n\twhite-space: pre; \n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.jqgfirstrow  td {\n\theight:auto; \n\tborder-top:none; \n\tpadding-bottom: 0;\n\tpadding-top: 0;\n\tborder-bottom: none; \n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.jqgroup td { \n\twhite-space: nowrap;\n}\n.ui-jqgrid tr.jqfoot td {\n\twhite-space: nowrap;\n}\n.ui-jqgrid tr.ui-row-ltr td {}\n.ui-jqgrid tr.ui-row-rtl td {}\n.ui-jqgrid td.jqgrid-rownum {\n\tpadding-left: 3px;\n\tpadding-right: 3px !important;\n}\n.ui-jqgrid .ui-jqgrid-resize-mark { \n\twidth:2px; \n\tleft:0; \n\tbackground-color:#777; \n\tcursor: e-resize; \n\tcursor: col-resize; \n\tposition:absolute; \n\ttop:0; \n\theight:100px; \n\toverflow:hidden; \n\tdisplay:none; \n\tborder:0 none; \n\tz-index: 99999;\n\n}\n/* Footer, Header row*/\n.ui-jqgrid .ui-jqgrid-hrdiv,\n.ui-jqgrid .ui-jqgrid-sdiv {\n\tposition: relative; \n\tmargin: 0;\n\tpadding: 0; \n\toverflow: hidden; \n\tborder-left: 0 none !important; \n\tborder-top : 0 none !important; \n\tborder-right : 0 none !important;\n}\n.ui-jqgrid .ui-jqgrid-hrtable,\n.ui-jqgrid .ui-jqgrid-ftable {\n\ttable-layout:fixed;\n\tmargin-bottom:0 !important;\n\tborder: 0px none;\t\n}\n.ui-jqgrid tr.hrheadrow td,\n.ui-jqgrid tr.footrow td {\n\tfont-weight: bold; \n\toverflow: hidden; \n\twhite-space:nowrap; \n\tpadding-right: 2px;\n}\n.ui-jqgrid tr.footrow td { \n\tborder-bottom: 0px none;\n}\n.ui-jqgrid tr.hrheadrow td {\n\tborder-top: 0px none;\n}\n.ui-jqgrid tr.hrheadrow-ltr td,\n.ui-jqgrid tr.footrow-ltr td {\n\ttext-align:left;\n}\n.ui-jqgrid tr.hrheadrow-rtl td,\n.ui-jqgrid tr.footrow-rtl td {\n\ttext-align:right;\n}\n\n/* Pager*/\n.ui-jqgrid .ui-jqgrid-pager,\n.ui-jqgrid .ui-jqgrid-toppager\n{ \n\tborder-left-width: 0px;\n\tborder-top: 1px solid #ddd;  \n\t/*padding : 4px 0px;*/\n\tposition: relative; \n\t/*height: auto; */\n\twhite-space: nowrap;\n\toverflow: hidden;\n}\n.ui-jqgrid .ui-jqgrid-toppager {\n\tborder-top-width :0;\n\tborder-bottom : 1px solid #ddd;\n}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, \n.ui-jqgrid .ui-jqgrid-pager .ui-pager-control {\n\tposition: relative;\n\tborder-left: 0;\n\tborder-bottom: 0;\n\tborder-top: 0; \n\t/*height: 30px;*/\n}\n.ui-jqgrid .ui-pg-table {\n\tposition: relative; \n\tpadding: 1px 0; \n\twidth:auto; \n\tmargin: 0;\n}\n.ui-jqgrid .ui-pg-table td {\n\tfont-weight:normal; \n\tvertical-align:middle; \n\t/*padding:0px 6px;*/\n}\n.ui-jqgrid .ui-pager-control .ui-pager-table td {\n\tborder-top : 0px none !important;\n\tmin-height : 20px !important;\n}\n\n.ui-jqgrid .ui-pg-button  { \n\theight:auto; \n}\n.ui-jqgrid  .ui-paging-pager td {\n\tpadding : 0 5px;\n}\n.ui-jqgrid .ui-pg-button span { \n\tdisplay: block; \n\tmargin: 3px 2px; \n\tfloat:left;\n}\n.ui-jqgrid .ui-pg-button:hover {  }\n.ui-jqgrid .ui-disabled:hover {}\n.ui-jqgrid .ui-pg-input,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { \n\tdisplay: inline-block;\n\theight:auto;\n\twidth: auto;\n\tfont-size: inherit; \n\tmargin:0;\n\tline-height: inherit;\n\t/*border: none; */\n\tpadding: 0px 3px\n}\n.ui-jqgrid .ui-pg-selbox, \n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox {\n\tfont-size: inherit; \n\tline-height:inherit; \n\tdisplay:block; \n\tmargin: 0;\n\twidth : auto;\n\tpadding: 0px 0px 0px 3px; \n\tborder:none;\n}\n.ui-jqgrid .ui-separator {\n\theight: 16px; \n\tborder : none;\n\tborder-left: 2px solid #ccc ; /*default*/\n\t\n}\n.ui-separator-li {\n\theight: 2px; \n\tborder : none;\n\tborder-top: 2px solid #ccc ;  /*default*/\n\tmargin: 0; padding: 0; width:100%\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div\n{\n\tfloat:left;\n\tposition:relative; \n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-button,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button\n{ \n\tcursor:pointer; \n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div  span,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span\n{\n\tfloat:left;\n}\n.ui-jqgrid td input, \n.ui-jqgrid td select, \n.ui-jqgrid td textarea { \n\tmargin: 0;\n}\n.ui-jqgrid td textarea {\n\twidth:auto;\n\theight:auto;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pager-table,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-table\n{\n\twidth:100%;\n\ttable-layout:fixed;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-info,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-info\n{ \n\tfont-weight: normal;\n\theight:auto; \n\tmargin-top:3px;\n\tmargin-right:4px;\n\tdisplay: inline;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-pager,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager\n{\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable,\n.ui-jqgrid .ui-jqgrid-toppager .navtable\n{\n\tfloat:left;\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable td,\n.ui-jqgrid .ui-jqgrid-toppager .navtable td \n{ \n\tpadding : 0 5px;\n\toverflow: hidden;\n}\n\n/*Subgrid*/\n.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed {\n\theight: 100%;\n\tpadding: 0 0;\n\tpadding-right: 0px !important;\n\tvertical-align: middle;\n}\n\n.ui-jqgrid .ui-sgcollapsed a.ui-sghref span {\n    display: table-cell;\n    text-align:center;\n    vertical-align: middle;\n}\n/*octicons fix*/\n.ui-jqgrid .ui-sgcollapsed a.ui-sghref span.octicon {\n\tpadding-left: 7px;\n}\n\n.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {\n\tdisplay: block;\n}\n.ui-jqgrid .ui-subgrid {\n\tmargin:0;\n\tpadding:0; \n\twidth:100%;\n}\n.ui-jqgrid .ui-subgrid table {\n\ttable-layout: fixed;\n}\n.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {}\n.ui-jqgrid .ui-subgrid td.subgrid-data {\n\tborder-top:  0 none !important;\n}\n.ui-jqgrid .ui-subgrid td.subgrid-cell { \n\tvertical-align: middle\n}\n.ui-jqgrid a.ui-sghref {\n\ttext-decoration: none;\n\tcolor : #010101; /*default*/\n\tdisplay: table;\n    position: relative;\n    height: 100%;\n    width: 100%;\n}\n.ui-jqgrid .ui-th-subgrid {height:20px;}\n.tablediv > .row { margin: 0 0}\n\n/*Table striped fix \n.ui-jqgrid-view .table-striped tbody tr:nth-of-type(2n+1)\n{\n    background-color: inherit;\n}\n.ui-jqgrid-view .table-striped > tbody > tr:nth-child(odd) > td,\n.ui-jqgrid-view .table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: rgba(0,0,0,.05);\n}\n*/\n\n/* loading */\n.ui-jqgrid .loading,\n.loading_pivot {\n\tposition: absolute; \n\ttop: 45%;\n\tleft: 45%;\n\twidth: auto;\n\tz-index:101;\n\tpadding: 6px; \n\tmargin: 5px;\n\ttext-align: center;\n\tdisplay: none;\n\tborder: 1px solid #ddd;  /*default*/\n\tfont-size: 14px;\n\tbackground-color: #d9edf7;\n}\n.ui-jqgrid .jqgrid-overlay { \n\tdisplay:none;\n\tz-index:100;\n}\n/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */\n* .jqgrid-overlay iframe {\n\tposition:absolute;\n\ttop:0;\n\tleft:0;\n\tz-index:-1;\n}\n/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n/* end loading div */\n\n/* Toolbar */\n.ui-jqgrid .ui-userdata {\n\tpadding: 4px 0px; \n\toverflow: hidden; \n\tmin-height: 32px; \n}\n.ui-jqgrid .ui-userdata-top {\n\tborder-left-width: 0px;    /*default*/\n\tborder-bottom: 1px solid #ddd;\t\n}\n.ui-jqgrid .ui-userdata-bottom {\n\tborder-left-width: 0px;    /*default*/\n\tborder-top: 1px solid #ddd;\t\n}\n/*Modal Window */\n.ui-jqdialog.modal-content { \n\tdisplay: none; \n\tposition: absolute; \n}\n.ui-jqdialog { \n\tdisplay: none; \n\twidth: 500px; \n\tposition: absolute; \n\t/*padding: 5px; */\n\toverflow:visible;\n}\n.ui-jqdialog .ui-jqdialog-titlebar {\n\tpadding: .1em .1em; \n\tmin-height: 38px; \n}\n.ui-jqdialog .ui-jqdialog-title { \n\tmargin: .3em 0 .2em;  \n\tfont-weight: bold;\n\tpadding-left :6px;\n\tpadding-right:6px;\n\tpadding-top:6px;\n} \n.ui-jqdialog .ui-jqdialog-titlebar-close { \n\tposition: absolute;  \n\ttop: 0%; \n\tmargin: 3px 5px 0 0; \n\tpadding: 8px;  \n\tcursor:pointer;\n}\n\n.ui-jqdialog .ui-jqdialog-titlebar-close span {  }\n.ui-jqdialog .ui-jqdialog-titlebar-close:hover, \n.ui-jqdialog .ui-jqdialog-titlebar-close:focus \n{ \n\tpadding: 8px; \n}\n.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { \n\tborder: 0; \n\tpadding: .3em .2em; \n\tbackground: none; \n\theight:auto;\n}\n.ui-jqdialog .ui-jqconfirm {\n\tpadding: .4em 1em; \n\tborder-width:3px;\n\tposition:absolute;\n\tbottom:10px;\n\tright:10px;\n\toverflow:visible;\n\tdisplay:none;\n\theight:120px;\n\twidth:220px;\n\ttext-align:center;\n\tbackground-color: #fff;\n\tborder-radius: 4px;\n\t-webkit-border-radius: 4px;\n\t-moz-border-radius: 4px;\n}\n.ui-jqdialog>.ui-resizable-se { }\n.ui-jqgrid>.ui-resizable-se { }\n.jqgrid-overlay-modal {\n\tdisplay : none;\n}\n/* end Modal window*/\n/* Form edit */\n.ui-jqdialog-content .FormGrid { \n\tmargin: 0 8px 0 8px; \n\toverflow:auto;\n\tposition:relative;\n}\n.ui-jqdialog-content .EditTable { \n\twidth: 100%; \n\tmargin-bottom:0; \n}\n.ui-jqdialog-content .DelTable { \n\twidth: 100%; \n\tmargin-bottom:0;\n}\n.EditTable td input, \n.EditTable td select, \n.EditTable td textarea { \n\twidth: 100%;\n\tdisplay: inline-block;\n}\n.EditTable td textarea { \n\twidth:auto; \n\theight:auto;\n}\n.EditTable .FormData td { \n\theight:37px !important;\n}\n.ui-jqdialog-content td.EditButton {\n\ttext-align: right; \n\tpadding: 3px 1px 3px 0;\n}\n.ui-jqdialog-content td.navButton {\n\ttext-align: center; \n\tborder-left: 0 none;\n\tborder-top: 0 none;\n\tborder-right: 0 none; \n\tpadding-bottom:5px; \n\tpadding-top:5px;\n}\n.ui-jqdialog-content input.FormElement {\n\tpadding: .5em .3em; \n\tmargin-bottom: 5px;\n\tfont-size: inherit;\n}\n.ui-jqdialog-content select.FormElement {\n\tpadding:.3em; \n\tmargin-bottom: 3px;\n\tfont-size: inherit;\n}\n.ui-jqdialog-content .data-line {\n\tpadding-top:.1em;\n\tborder: 0 none;\n}\n\n.ui-jqdialog-content .CaptionTD {\n\tvertical-align: middle;\n\tborder: 0 none; \n\tpadding: 2px;\n\twhite-space: nowrap;\n}\n.ui-jqdialog-content .DataTD {\n\tpadding: 2px 5px;\n\tborder: 0 none; \n\t/*vertical-align: top;*/\n}\n.ui-jqdialog-content .form-view-data {\n\twhite-space:pre\n}\n.fm-button {  }\n.fm-button-icon-left { \n\tmargin-left: 4px; \n\tmargin-right: 4px;  \n}\n.fm-button-icon-right { \n\tmargin-left: 4px; \n\tmargin-right: 4px; \n}\n.fm-button-icon-left  {  }\n.fm-button-icon-right  { }\n#nData, #pData { \n\tmargin-left: 4px; \n\tmargin-right: 4px; \n}\n#sData span, #cData span { \n\tmargin-left: 5px;\n}\n/* End Eorm edit */\n/*.ui-jqgrid .edit-cell {}*/\n.ui-jqgrid .selected-row, \ndiv.ui-jqgrid .selected-row td {\n\tfont-style : normal;\n}\n/* inline edit actions button*/\n.ui-inline-del, .ui-inline-cancel {\n    margin-left: 14px;\n}\n.ui-jqgrid .inline-edit-cell {}\n/* Tree Grid */\n.ui-jqgrid .tree-wrap {\n\tfloat: left; \n\tposition: relative;\n\theight: 18px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-minus {\n\tposition: absolute; \n\theight: 18px; \n\twidth: 18px; \n\toverflow: hidden;\n}\n.ui-jqgrid .tree-plus {\n\tposition: absolute;\t\n\theight: 18px; \n\twidth: 18px;\t\n\toverflow: hidden;\n}\n.ui-jqgrid .tree-leaf {\n\tposition: absolute;\t\n\theight: 18px; \n\twidth: 18px;\n\toverflow: hidden;\n}\n.ui-jqgrid .treeclick {\n\tcursor: pointer;\n}\n/* moda dialog */\n* iframe.jqm {\n\tposition:absolute;\n\ttop:0;\n\tleft:0;\n\tz-index:-1;\n}\n/*\t width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n.ui-jqgrid-dnd tr td {\n\tborder-right-width: 1px;\n\tborder-right-color: inherit;\n\tborder-right-style: solid; \n\theight:20px\n}\n/* RTL Support */\n.ui-jqgrid .ui-jqgrid-caption-rtl {\n\ttext-align: right;\n}\n.ui-jqgrid .ui-jqgrid-hbox-rtl {\n\tfloat: right; \n\t/*padding-left: 20px;*/\n}\n.ui-jqgrid .ui-jqgrid-resize-ltr {\n\tfloat: right;\n\tmargin: -2px -2px -2px 0;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-resize-rtl {\n\tfloat: left;\n\tmargin: -2px -2px -2px -0px;\n}\n.ui-jqgrid .ui-sort-rtl {\n\t\n}\n.ui-jqgrid .tree-wrap-ltr {\n\tfloat: left;\n}\n.ui-jqgrid .tree-wrap-rtl {\n\tfloat: right;\n}\n.ui-jqgrid .ui-ellipsis {\n\t-moz-text-overflow:ellipsis;\n\ttext-overflow:ellipsis;\n}\n/* Toolbar Search Menu. Nav menu */\n.ui-search-menu, \n.ui-nav-menu {\n\tposition: absolute !important; \n\tpadding: 2px 5px; \n\tz-index:99999;\n}\n.ui-nav-menu {\n\tpadding: 8px 8px; \n}\n.ui-search-menu.ui-menu .ui-menu-item,\n.ui-nav-menu.ui-menu .ui-menu-item\n{ \n\tlist-style-image: none; \n\tpadding-right: 0; \n\tpadding-left: 0; \n}\n.ui-search-menu.ui-menu .ui-menu-item a, \n.ui-nav-menu.ui-menu .ui-menu-item a \n{ \n\tdisplay: block; \n}\n.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover,\n.ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover \n{ \n\tmargin: -1px; \n\tfont-weight: normal; \n}\n.ui-jqgrid .ui-search-table { \n\tpadding: 0; \n\tborder: 0 none; \n\theight:20px; \n\twidth:100%;\n}\n.ui-jqgrid .ui-search-table .ui-search-oper { \n\twidth:20px; \n\ttext-align: center;\n}\na.g-menu-item, a.soptclass, a.clearsearchclass { \n\tcursor: pointer; \n} \n\n.ui-menu-item a.g-menu-item .opersign \n{\n\twidth : 23px;\n}\n\n.ui-jqgrid .ui-jqgrid-view input,\n.ui-jqgrid .ui-jqgrid-view select,\n.ui-jqgrid .ui-jqgrid-view textarea,\n.ui-jqgrid .ui-jqgrid-view button {\n    /*font-size: 11px*/\n}\n.ui-jqgrid .ui-scroll-popup {\n\twidth: 100px;\n}\n.ui-search-table select,\n.ui-search-table input \n{\n\tpadding: 0px 0px;\n}\n\t\n.ui-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: rgba(0,0,0,0.5);\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n \n.ui-jqgrid-pager .ui-pg-table .ui-pg-button:hover,\n.ui-jqgrid-toppager .ui-pg-table .ui-pg-button:hover\n{\n\tbackground-color: #ddd;\n}\n.ui-jqgrid-corner  {\n\t border-radius: 5px\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tdisplay: block;\n\tleft : auto;\n}\n.ui-jqdialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -3px;\n\tleft : auto;\n\ttop: auto;\n\tbackground-position: 16px 16px;\n}\n.ui-resizable-icon {\n\tresize: both;\n\toverflow: auto;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-top-corner {\n\tborder-top-left-radius: 5px;\n\tborder-top-right-radius: 5px;\n}\n.ui-bottom-corner {\n\tborder-bottom-left-radius: 5px;\n\tborder-bottom-right-radius: 5px;\n}\n\n.ui-search-table {\n\tmargin-bottom: 0;\n}\n.ui-search-table .columns, .ui-search-table .operators {\n\tpadding-right: 5px;\n}\n.ui-search-table .columns select,\n.ui-search-table .operators select,\n.ui-search-table .data select,\n.ui-search-table .data input\n{\n\tpadding : 5px 2px;\n\tfont-size: inherit;\n}\n\n\n.ui-search-table .opsel {\n\tfloat :left;\n\twidth : 100px;\n\tmargin-right : 5px;\n\tpadding : 5px 2px;\n\tfont-size: inherit;\n}\n.add-group, .add-rule, .delete-group {\n\twidth: 14%;\t\n\tmargin-right : 5px;\n}\n.delete-rule {\n\twidth : 15px;\n}\nul.ui-search-menu, ul.ui-nav-menu {\n\t list-style-type:  none;\n\t width: auto;\n}\nul.ui-search-menu li a, \nul.ui-nav-menu li a,\n.soptclass, \n.clearsearchclass {\n\ttext-decoration: none;\n\tcolor : #010101;\n}\nul.ui-search-menu li a:hover, ul.ui-nav-menu li a:hover, a.soptclass:hover, a.clearsearchclass:hover {\n\tbackground-color: #ddd;\n\tpadding: 1px 1px;\n\ttext-decoration: none;\n}\nul.ui-search-menu li, ul.ui-nav-menu li {\n\tpadding : 5px 5px;\n}\n.ui-menu-item hr {\n\tmargin-bottom: 0px;\n\tmargin-top:0px;\n}\n\n.ui-search-oper a.soptclass \n{\n\tpadding-left: 0.4em !important;\n\tpadding-right: 0.4em !important;\n}\n\n.searchFilter .ui-search-table td,\n.searchFilter .ui-search-table th\n{\n\tborder-top: 0px none !important;\n\tpadding: .45rem;\n}\n\n.searchFilter .queryresult {\n\tmargin-bottom: 5px;\n}\n.searchFilter .queryresult tr td{\n\tborder-top: 0px none;\n\tpadding : .45rem;\n}\n.ui-search-label { \n\tpadding-left: 5px;\n}\n\n.frozen-div, .frozen-bdiv, .frozen-sdiv, .frozen-hrdiv, .frozen-rdiv {\n\tbackground-color: #fff;\n}\n.frozen-div .ui-jqgrid-htable {\n\tborder-bottom: 0px none;\n}\n/*\n.ui-jqgrid .ui-jqgrid-caption,\n.ui-jqgrid .ui-jqgrid-pager,\n.ui-jqgrid .ui-jqgrid-toppager,\n.ui-jqgrid .ui-jqgrid-htable thead th,\n.ui-jqgrid .ui-userdata-top,\n.ui-jqgrid .ui-userdata-bottom,\n.ui-jqgrid .ui-jqgrid-hdiv,\n.ui-jqdialog .ui-jqdialog-titlebar\n{\n    background-image: none, linear-gradient(to bottom, #fff 0px, #e0e0e0 100%);\n    background-repeat: repeat-x;\n    border-color: #ccc;\n    text-shadow: 0 1px 0 #fff;\n}\n*/\n/* Column menu */\n.ui-jqgrid .ui-jqgrid-htable .colmenu {\n\tposition:absolute;\n\tright:1px;\n\theight:100%;\n\tcolor : black;\n\twidth: 16px;\n\t/*cursor: context-menu;*/\n}\n.ui-jqgrid .ui-jqgrid-htable .colmenu-rtl {\n\tright: auto;\n\tleft : 1px;\n\tposition:absolute;\n\theight:100%;\n\tcolor : black;\n}\n.ui-jqgrid .ui-jqgrid-htable .colmenuspan {\n\tdisplay:inline-block;\n\tpadding-left: 7px;\n}\n\n.ui-jqgrid .ui-jqgrid-htable .ui-th-div {\n\t/*height:17px;\n\tmargin-top:5px;*/\n}\n.column-menu, .ui-search-menu {\n\tpadding: 8px 8px;\n}\n.column-menu .divider {\n\tbackground-color: #e5e5e5; \n\theight: 1px;\n\tpadding:0 0;\n\tmargin: 5px 0;  \n\toverflow: hidden;\n}\n.ui-menu-item .ui-common-table .menu_icon {\n\tpadding-right: 2px;\n\tpadding-left: 8px;\n}\ntd.menu_text {\n\twidth: auto;\n\tpadding-left: 1px;\n\twhite-space: nowrap;\n}\n#search_menu .ui-menu-item div {\n\tpadding: 3px 0;\n\twhite-space: nowrap;\n}\n\n#search_menu  .search_buttons {\n\tdisplay:inline-block;\n\twidth:50%;\n\tpadding: 3px 3px;\n}\n#search_menu  #bs_close {\n\tposition: absolute;\n\tpadding:  0px 0px;\n\ttop: 0px;\n\tright: 0px;\n}\n\n.search_buttons .btn-default:hover {\n\tpadding-bottom: 6px;\n\tpadding-top: 6px;\n}\n.search_buttons #bs_reset {\n\tmargin-right: 3px;\n\tpadding: 0;\n}\n.search_buttons #bs_search {\n\tmargin-left: 3px;\n\tpadding: 0;\n}\ndiv[id^='searchcnt'] .fm-button .oi,\ndiv[id^='searchcnt'] .fm-button .octicon\n{\n\tpadding-right:  4px;\n}\n/*menubar*/\n.ui-jqgrid .ui-jqgrid-menubar {\n\tmargin: 6px 5px;\n\twidth:16px;\n\theight:16px;\n}\n.ui-jqgrid a.ui-jqgrid-menubar {\n\ttext-decoration: none;\n\tcolor : #010101; /*default*/\n}\n.ui-jqgrid .ui-jqgrid-menubar:hover {\n\tmargin: 6px 5px;\n\tbackground-color: #ddd;\n\ttext-decoration: none;\n}\n.ui-jqgrid .menubar-rtl {\n\tfloat : right;\n}\n\n.ui-jqgrid .menubar-ltr {\n\tfloat : left;\n}\n/*printing*/\n\n.jqgridprint {\n\twidth : 100%;\n\tfont-size: 13px;\n}\n\n.jqgridprint th,\n.jqgridprint td {\n\tpadding: 4px 4px 4px 4px ;\n\ttext-align: center ;\n}\n.jqgridprint th {\n\tborder-bottom: 2px solid #333333 ;\n}\n.jqgridprint td {\n\tborder-bottom: 1px dotted #999999 ;\n}\n\n.jqgridprint tfoot td {\n\tborder-bottom-width: 0px ;\n\tborder-top: 2px solid #333333 ;\n\tpadding-top: 20px ;\n}\n.ui-jqgrid td.ui-search-input,\n.ui-jqgrid td.ui-search-clear,\n.ui-jqgrid .ui-search-table .ui-search-oper\n{\n\tborder: 0 none;\n\tpadding: 0 0;\n\tvertical-align: middle;\n}\n\n.ui-jqgrid .jqgrid-caption-menu \n{ \n\tleft:0;\n\ttop:30px;\n\tposition:absolute;\n\tdisplay:none;\n\tfont-size: inherit;\n\twidth : auto;\n}\n.ui-jqgrid .jqgrid-column-menu\n{\n\tfont-size:inherit;\n\twidth:auto;\n\tposition :absolute;\n}\n.ui-jqgrid .ui-menu-item form\n{\n\tmargin: 0 8px;\n}\n.ui-jqgrid .ui-menu-item form input,\n.ui-jqgrid .ui-menu-item form select,\n.ui-jqgrid .ui-menu-item form a\n{\n\tfont-size: inherit;\n\tpadding : 0.3rem\n}\n.ui-jqdialog-content .EditTable .EditButton a {\n\tfont-size: inherit;\n\tpadding: .275rem .375rem\n}\n.ui-jqdialog-content .EditTable .EditButton a > :first-child {\n\tpadding: 0 4px;\n}\n.ui-jqdialog-content td.navButton a {\n\tfont-size: inherit;\n\tpadding: .275rem .375rem\n}\n.ui-jqgrid .dropdownmenu \n{\n\tpadding: 0;\n\tfont-size: inherit;\n}\n.ui-jqgrid th.jqgrid-multibox,\n.ui-jqgrid td.jqgrid-multibox\n{\n\tpadding-left: 7px;\n\tpadding-right: 7px !important;\n\tline-height: normal;\n}\n.ui-jqgrid th.jqgrid-multibox {\n\ttext-align: center\n}\n\n.ui-jqgrid-btable tbody tr.table-active:hover > td,\n.ui-jqgrid-htable thead tr > th.table-active:hover\n{\n  color: #212529;\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.ui-jqgrid-btable tbody tr.table-success > td\n{\n  background-color: #c3e6cb !important;\n}\n\n.ui-jqgrid-btable tbody tr.table-success.table-active > td \n{\n\tbackground-color: rgba(0, 0, 0, 0.075)  !important;\n}\n.ui-jqgrid .search-col-input\n{\n\tpadding: 1px 1px !important;\n}\n.ui-jqgrid .jqgrid-searchcol {\n\tpadding:  1px 1px;\n}\n\n.jqgrid-searchcol > .form-control {\n\tpadding:  1px 1px;\n}\na.colmenu .colmenuspan \n{\n\tcursor: pointer;\n}\n.ui-jqgrid td.jqgrid-searchcol  input {\n\twidth: 100%;\n\toverflow: auto;\n}\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jqgrid-5.7.0/ui.jqgrid.css",
    "content": "/*Grid*/\n.ui-jqgrid {\n\tposition: relative;\n\t-moz-box-sizing: content-box; \n\t-webkit-box-sizing: content-box; \n\tbox-sizing: content-box;\n\tfont-size:11px;\n}\n.ui-jqgrid .ui-jqgrid-view {\n\tposition: relative;\n\tleft:0; \n\ttop: 0; \n\tpadding: 0;\n\t/*font-size:11px;*/\n\tz-index:100;\n}\n.ui-jqgrid .ui-common-table {border-width: 0px; border-style: none; border-spacing: 0px; padding: 0;}\n/* caption*/\n.ui-jqgrid .ui-jqgrid-titlebar {\n\theight:19px; \n\tpadding: .3em .2em .2em .3em; \n\tposition: relative; \n\tfont-size: 12px; \n\tborder-left: 0 none;\n\tborder-right: 0 none; \n\tborder-top: 0 none;\n\tbox-sizing:content-box;\n}\n.ui-jqgrid .ui-jqgrid-caption {text-align: left;}\n.ui-jqgrid .ui-jqgrid-title {\n\tpadding: .2em .1em .1em;\n\tposition: absolute; \n}\n.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px; cursor:pointer;}\n.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; }\n.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; }\n.ui-jqgrid .menubar:hover {  border: 0 none;}\n/* header*/\n.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}\n.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;}\n.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0;border-collapse: separate;}\n.ui-jqgrid .ui-jqgrid-htable th { height: 27px; padding: 0 2px 0 2px;}\n.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative;margin: .1em 0em .1em 0em;}\n.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none;border-bottom : 0 none;}\n.ui-th-column-header, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none; height: 26px;}\n.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0 none;}\n.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0 none;}\n.ui-first-th-ltr {border-right: 1px solid; }\n.ui-first-th-rtl {border-left: 1px solid; }\n.ui-jqgrid .ui-th-div-ie {white-space: nowrap; height:17px;}\n.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;}\n.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;}\n.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;}\n.ui-jqgrid .ui-icon-desc {margin-top:3px;margin-left:-1px;height:12px;}\n.ui-jqgrid .ui-i-asc {margin-top:0;height:18px;}\n.ui-jqgrid .ui-i-desc {margin-top:0;margin-left:12px;height:18px;}\n.ui-jqgrid .ui-single-sort-asc {margin-top:-1px;height:18px;}\n.ui-jqgrid .ui-single-sort-desc {margin-top:0;height:18px;}\n.ui-jqgrid .ui-icon-left .s-ico {margin-right: 16px;}\n.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;height:14px}\n.ui-jqgrid tr.ui-search-toolbar th { border-bottom: 0px none}\n.ui-jqgrid .ui-search-table td.ui-search-clear { width:25px;}\n.ui-jqgrid tr.ui-search-toolbar td input { padding-right: 0px; width: 95%;}\n.ui-jqgrid tr.ui-search-toolbar select {}\n/* body */ \n.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0; padding:0; overflow: auto; text-align:left;z-index: 101;}\n.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0; outline-style: none; border-collapse: separate;}\n.ui-jqgrid tr.jqgrow,\n.ui-jqgrid tr.jqgroup \n\t{ outline-style: none; }\n.ui-jqgrid tr.jqgrow td,\n.ui-jqgrid tr.jqgroup td\n{\tfont-weight: normal; \n\toverflow: hidden; \n\twhite-space: pre; \n\theight: 23px;\n\tpadding: 1px 2px 1px 2px;\n\tborder-bottom-width: 1px; \n\tborder-bottom-color: inherit; \n\tborder-bottom-style: solid;\n}\n.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid; height:auto;}\n.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}\n.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}\n.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}\n.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0; border: 0 none;}\n.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999;}\n.ui-jqgrid-table-striped > tbody > tr:nth-of-type(odd) {\n\topacity: .7;\n\tfont-weight: normal;\n}\n/* footer */\n.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}\n.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0;border-collapse: separate;}\n.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 23px;padding: 1px 2px 1px 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;border-bottom: 0 none;}\n.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}\n.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}\n/* headerrow */\n.ui-jqgrid .ui-jqgrid-hrdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}\n.ui-jqgrid .ui-jqgrid-hrtable {table-layout:fixed; margin-bottom:0;border-collapse: separate;}\n.ui-jqgrid tr.hrheadrow td { overflow: hidden; white-space:nowrap; height: 23px;padding: 1px 2px 1px 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;border-top: 0 none;}\n.ui-jqgrid tr.hrheadrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}\n.ui-jqgrid tr.hrheadrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}\n/* Pager*/\n.ui-jqgrid .ui-jqgrid-pager { \n\tborder-left: 0 none !important;\n\tborder-right: 0 none !important; \n\tborder-bottom: 0 none !important; \n\tborder-top: 0 none; \n\tmargin: 0 !important; \n\tpadding: 0 !important; \n\tposition: relative; \n\theight: auto; \n\tmin-height: 28px; \n\twhite-space: nowrap;\n\toverflow: hidden;\n\t/*font-size:11px; */\n\tz-index:100\n}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, .ui-jqgrid .ui-jqgrid-pager .ui-pager-control {position: relative;border-left: 0;border-bottom: 0;border-top: 0; height: 28px;}\n.ui-jqgrid .ui-pg-table {position: relative; padding: 1px 0; width:auto; margin: 0;}\n.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:0px 1px;}\n.ui-jqgrid .ui-pg-button  { height:auto}\n.ui-jqgrid .ui-pg-button span { display: block; margin: 2px; float:left;}\n.ui-jqgrid .ui-pg-button:hover { padding: 0;}\n.ui-jqgrid .ui-state-disabled:hover {padding:0px;}\n.ui-jqgrid .ui-pg-input,.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { height:14px;width: auto;font-size:.9em; margin:0;line-height: inherit;border: none; padding: 3px 2px}\n.ui-jqgrid .ui-pg-selbox, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox {font-size:.9em; line-height:inherit; display:block; height:19px; margin: 0; padding: 3px 0px; border:none;}\n.ui-jqgrid .ui-separator {height: 18px; border-left: 2px solid #ccc ;}\n.ui-separator-li {height: 2px; border : none;border-top: 2px solid #ccc ; margin: 0; padding: 0; width:100%}\n.ui-jqgrid  .dropdownmenu {\n\tpadding: 3px 0 3px 0;\n\tmargin-left: 4px;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div\n{padding:1px 0;float:left;position:relative; line-height: 20px;}\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-button,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button\n{ cursor:pointer; }\n.ui-jqgrid .ui-jqgrid-pager .ui-pg-div  span.ui-icon,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span.ui-icon\n{float:left;margin: 2px; width:18px;}\n.ui-jqgrid td input, .ui-jqgrid td select, .ui-jqgrid td textarea { margin: 0; padding-top:5px;padding-bottom: 5px;}\n.ui-jqgrid td textarea {width:auto;height:auto;}\n.ui-jqgrid .ui-jqgrid-toppager {border-left: 0 none !important;border-right: 0 none !important; border-top: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative;white-space: nowrap;overflow: hidden;}\n.ui-jqgrid .ui-jqgrid-pager .ui-pager-table,\n.ui-jqgrid .ui-jqgrid-toppager .ui-pager-table \n{\n\twidth:100%;\n\ttable-layout:fixed;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-info,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-info\n{ \n\tfont-weight: normal;\n\theight:auto; \n\tmargin-top:3px;\n\tmargin-right:4px;\n\tdisplay: inline;\n}\n.ui-jqgrid .ui-jqgrid-pager .ui-paging-pager,\n.ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager\n{\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable,\n.ui-jqgrid .ui-jqgrid-toppager .navtable\n{\n\tfloat:left;\n\ttable-layout:auto;\n\theight:100%;\n}\n.ui-jqgrid .ui-jqgrid-pager .navtable td,\n.ui-jqgrid .ui-jqgrid-toppager .navtable td \n{ \n\toverflow: hidden;\n}\n\n\n/*.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div {padding:1px 0;float:left;position:relative; line-height: 20px; margin-right:3px;}\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; }\n.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span.ui-icon {float:left;margin: 2px; width:18px;}\n*/\n\n/*subgrid*/\n.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display: block;}\n.ui-jqgrid .ui-subgrid {margin:0;padding:0; width:100%;}\n.ui-jqgrid .ui-subgrid table {table-layout: fixed;}\n.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}\n.ui-jqgrid .ui-subgrid td.subgrid-data {border-top:  0 none !important; border-left: 0 none !important;}\n.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0 1px 1px 0;}\n.ui-jqgrid .ui-th-subgrid {height:20px;}\n/* loading */\n.ui-jqgrid .loading,\n.loading_pivot {\n\tposition: absolute; \n\ttop: 45%;\n\tleft: 45%;\n\twidth: auto;\n\tz-index:101;\n\tpadding: 6px;\n\tmargin: 5px;\n\ttext-align: center;\n\tfont-weight: bold;\n\tdisplay: none;\n\tborder-width: 2px !important;\n\t/*font-size:11px;*/\n}\n.ui-jqgrid .jqgrid-overlay {display:none;}\n/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */\n* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;}\n/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n/* end loading div */\n/* toolbar */\n.ui-jqgrid .ui-userdata {border-left: 0 none;    border-right: 0 none;\theight : 27px;overflow: hidden;\t}\n/*Modal Window */\n.ui-jqdialog { \n\t/*font-size:11px !important; */\n}\n.ui-jqdialog { \n\tdisplay: none; \n\twidth: 300px; \n\tposition: absolute; \n\tpadding: .2em; \n\t/*font-size:11px;*/\n\toverflow:visible;\n\tbox-sizing:content-box;\n}\n.ui-jqdialog .ui-jqdialog-titlebar { \n\tpadding: .3em .2em; \n\tposition: relative; height:20px;\n\tbox-sizing:content-box;\n}\n.ui-jqdialog .ui-jqdialog-title { margin: .3em .2em .2em .2em;} \n.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute;  top: 50%; width: 19px; margin: -12px 0 0 0; padding: 1px; height: 18px; cursor:pointer;}\n\n.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; }\n.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; }\n.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;}\n.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;}\n.ui-jqdialog>.ui-resizable-se { \n\tbottom: 2px; \n\tright: 2px;\n\tbackground-position: -64px -224px;\n}\n.ui-jqgrid>.ui-resizable-se { bottom: -3px; right: -3px }\n.ui-resizable-icon {\n\tresize: both;\n\toverflow: auto;\n}\n.jqgrid-overlay-modal {\tdisplay : none; }\n/* end Modal window*/\n/* Form edit */\n.ui-jqdialog-content .FormGrid {margin: 0; overflow:auto;position:relative;}\n.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0;}\n.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0;}\n.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0;}\n.EditTable td textarea { width:auto; height:auto;}\n.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0 none;border-left: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}\n.ui-jqdialog-content td.navButton {text-align: center; border-left: 0 none;border-top: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}\n.ui-jqdialog-content input.FormElement {\n\tpadding: .5em .3em; \n\tmargin-bottom: 3px;\n\tfont-size: inherit;\n}\n.ui-jqdialog-content select.FormElement {\n\tpadding:.3em; \n\tmargin-bottom: 3px;\n\tfont-size: inherit;\n}\n.ui-jqdialog-content .data-line {padding-top:.1em;border: 0 none;}\n\n.ui-jqdialog-content .CaptionTD {vertical-align: middle;border: 0 none; padding: 2px;white-space: nowrap;}\n.ui-jqdialog-content .DataTD {\n\tpadding: 2px; \n\tborder: 0 none; \n\tvertical-align: middle;\n}\n.ui-jqdialog-content .form-view-data {white-space:pre}\n.fm-button { \n\theight: 18px; \n\tdisplay: inline-block; \n\tmargin:2px 4px 0 0; \n\tpadding: .6em .5em .2em .5em; \n\ttext-decoration:none !important; \n\tcursor:pointer; \n\tposition: relative; \n\ttext-align: center; \n\tbox-sizing:content-box;\n}\n.fm-button-icon-left { padding-left: 1.9em; }\n.fm-button-icon-right { padding-right: 1.9em; }\n.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; }\n.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;}\n#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; }\n.ViewTable {\n\tborder-width: 0; \n\tborder-style: none; \n\tborder-spacing: 1px;\n\tpadding: 4px;\n\ttable-layout: fixed;\n}\n.ViewTable .CaptionTD, .ViewTable .DataTD {padding : 4px;} \n/* End Eorm edit */\n/*cell edit*/\n.ui-jqgrid .edit-cell {\n\tpadding: 4px 0px 4px 4px;\n}\n.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0 none;}\n/* inline edit actions button*/\n.ui-inline-del.ui-state-hover span, .ui-inline-edit.ui-state-hover span,\n.ui-inline-save.ui-state-hover span, .ui-inline-cancel.ui-state-hover span {\n    margin: -1px;\n}\n.ui-inline-del, .ui-inline-cancel {\n    margin-left: 8px;\n}\n\n.ui-jqgrid .inline-edit-cell {\n\tpadding: 4px 0px 4px 4px;\n}\n/* Tree Grid */\n.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;}\n.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;}\n.ui-jqgrid .tree-plus {position: absolute;\theight: 18px; width: 18px;\toverflow: hidden;}\n.ui-jqgrid .tree-leaf {position: absolute;\theight: 18px; width: 18px;overflow: hidden;}\n.ui-jqgrid .treeclick {cursor: pointer;}\n/* moda dialog */\n* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;}\n/*\t width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/\n.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px}\n/* RTL Support */\n.ui-jqgrid .ui-jqgrid-caption-rtl {text-align: right;}\n.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right;}\n.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0;}\n.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0 -1px -3px;}\n.ui-jqgrid .ui-sort-rtl {left:0;}\n.ui-jqgrid .tree-wrap-ltr {float: left;}\n.ui-jqgrid .tree-wrap-rtl {float: right;}\n.ui-jqgrid .ui-ellipsis {-moz-text-overflow:ellipsis;text-overflow:ellipsis;}\n\n/* Toolbar Search Menu , Nav menu*/\n.ui-search-menu, \n.ui-nav-menu {\n\tposition: absolute; \n\tpadding: 2px 5px; \n\tz-index:99999;\n\t-webkit-box-shadow: 7px 7px 5px 0px rgba(50, 50, 50, 0.75);\n\t-moz-box-shadow:    7px 7px 5px 0px rgba(50, 50, 50, 0.75);\n\tbox-shadow:         7px 7px 5px 0px rgba(50, 50, 50, 0.75);\n}\n.ui-search-menu.ui-menu .ui-menu-item,\n.ui-nav-menu.ui-menu .ui-menu-item\n{ \n\tlist-style-image: none; \n\tpadding-right: 0; \n\tpadding-left: 0; \n}\n.ui-search-menu.ui-menu .ui-menu-item a, \n.ui-nav-menu.ui-menu .ui-menu-item a \n{ \n\tdisplay: block; \n}\n.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover,\n.ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover \n{ \n\tmargin: -1px; \n\tfont-weight: normal; \n}\n.ui-jqgrid .ui-search-table { padding: 0; border: 0 none; height:20px; width:100%;}\n.ui-jqgrid .ui-search-table .ui-search-oper { width:20px; }\na.g-menu-item, a.soptclass, a.clearsearchclass { cursor: pointer; } \n.ui-jqgrid .ui-jqgrid-view input,\n.ui-jqgrid .ui-jqgrid-view select,\n.ui-jqgrid .ui-jqgrid-view textarea,\n.ui-jqgrid .ui-jqgrid-view button {\n    font-size: inherit;\n}\n\n.ui-search-menu a.soptclass \n{\n\tpadding-left: 0.4em;\n\tpadding-right: 0.4em\n}\n\n.ui-menu-item a.g-menu-item .opersign \n{\n\twidth : 20px;\n}\n\n\n.ui-jqgrid .ui-scroll-popup {width: 95px;}\n.ui-search-table select,\n.ui-search-table input \n{\n\tpadding: 4px 3px;\n}\n\n.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover > .ui-separator {\n\tmargin-left: 3px;\n\tmargin-right: 3px;\n}\n\n.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover > .ui-pg-div > .ui-icon {\n\tmargin-left: 3px;\n\tmargin-right: 3px;\n}\n/* Column menu */\n.ui-jqgrid .ui-jqgrid-htable .colmenu\n{\n\tposition:absolute;\n\tright:1px;\n\theight:100%;\n\tcolor : black;\n}\n.ui-jqgrid .ui-jqgrid-htable .colmenu-rtl\n{\n\tright: auto;\n\tleft : 1px;\n\tposition:absolute;\n\theight:100%;\n\tcolor : black;\n}\n.ui-jqgrid .ui-jqgrid-htable .colmenuspan\n{\n\tdisplay:inline-block;\n}\n.ui-jqgrid .ui-jqgrid-htable .ui-th-div {\n\theight:17px;\n\tmargin-top:5px;\n}\nth.jqgrid-multibox .ui-th-div {\n\tmargin-top:2px !important;\n\tpadding-bottom: 4px;\n}\n.column-menu, .ui-search-menu {\n\tpadding: 10px 10px;\n}\n.column-menu .divider {\n\tbackground-color: #e5e5e5; \n\theight: 1px;\n\tpadding:0 0;\n\tmargin: 5px 0;  \n\toverflow: hidden;\n}\n.ui-menu-item .ui-common-table .menu_icon {\n\twhite-space: pre;\n\tpadding-right: 4px;\n\tpadding-left: 4px;\n\twidth : auto;\n}\n.ui-menu-item .ui-common-table .menu_icon .ui-icon {\n\tdisplay : inline-block;\n\tposition: relative;\n}\ntd.menu_text {\n\twidth: auto;\n\twhite-space: nowrap;\n}\n.ui-search-menu .ui-menu-item {\n\tpadding : 0 0;\n}\n.ui-col-menu .ui-menu-item td.menu_text{\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tpadding-left : 1px;\n}\n.ui-col-menu .ui-menu-item td.menu_icon{\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tvertical-align: middle;\n}\n.ui-col-menu .ui-menu-item td.menu_icon input{\n\tmargin: 2px 0;\n\t\n}\n#search_menu .ui-menu-item div {\n\tmargin: 3px 0;\n\twhite-space: nowrap;\n}\n\n#search_menu .ui-menu-item div input,\n#search_menu .ui-menu-item div select\n{\n\tpadding: 3px 2px;\n}\n#search_menu  .search_buttons {\n\tdisplay:inline-block;\n\twidth:50%;\n}\n#search_menu  #bs_close {\n\tposition: absolute;\n\tpadding:  0px 0px;\n\ttop: 8px;\n\tright: 19px;\n}\n\n#column_menu.ui-menu .ui-menu-item {\n\tposition :static;\n}\n/*menubar*/\n.ui-jqgrid .ui-jqgrid-menubar {\n\tmargin: 0px 5px;\n\twidth:19px;\n\theight:18px;\n}\n.ui-jqgrid .ui-jqgrid-menubar:hover {\n\tborder: 0 none;\n}\n.ui-jqgrid .menubar-rtl {\n\tfloat : right;\n}\n\n.ui-jqgrid .menubar-ltr {\n\tfloat : left;\n}\n/*printing*/\n\n.jqgridprint {\n\twidth : 100%;\n\tfont-size: 13px;\n}\n\n.jqgridprint th,\n.jqgridprint td {\n\tpadding: 4px 4px 4px 4px ;\n\ttext-align: center ;\n}\n.jqgridprint th {\n\tborder-bottom: 2px solid #333333 ;\n}\n.jqgridprint td {\n\tborder-bottom: 1px dotted #999999 ;\n}\n\n.jqgridprint tfoot td {\n\tborder-bottom-width: 0px ;\n\tborder-top: 2px solid #333333 ;\n\tpadding-top: 20px ;\n}\n\n.ui-jqgrid .jqgrid-caption-menu \n{ \n\tleft:0;\n\ttop:30px;\n\tposition:absolute;\n\tdisplay:none;\n\tfont-size: inherit;\n\twidth : auto;\n}\n.ui-jqgrid .jqgrid-column-menu\n{\n\tfont-size:inherit;\n\twidth:auto;\n\tposition: absolute;\n}\n\n.ui-jqgrid .search-col-input\n{\n\tpadding: 3px 2px;\n}\n.ui-jqgrid td.jqgrid-searchcol input {\n\twidth: 100%;\n\toverflow: auto;\n}\n\n.ui-jqgrid .frozen-rdiv  {\n\tz-index: 10000;\n}"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jquery/core.js",
    "content": "/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\ndefine( [\n\t\"./var/arr\",\n\t\"./var/document\",\n\t\"./var/getProto\",\n\t\"./var/slice\",\n\t\"./var/concat\",\n\t\"./var/push\",\n\t\"./var/indexOf\",\n\t\"./var/class2type\",\n\t\"./var/toString\",\n\t\"./var/hasOwn\",\n\t\"./var/fnToString\",\n\t\"./var/ObjectFunctionString\",\n\t\"./var/support\",\n\t\"./var/isFunction\",\n\t\"./var/isWindow\",\n\t\"./core/DOMEval\",\n\t\"./core/toType\"\n], function( arr, document, getProto, slice, concat, push, indexOf,\n\tclass2type, toString, hasOwn, fnToString, ObjectFunctionString,\n\tsupport, isFunction, isWindow, DOMEval, toType ) {\n\n\"use strict\";\n\nvar\n\tversion = \"3.3.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jquery/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v3.3.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, doc, node ) {\n\t\tdoc = doc || document;\n\n\t\tvar i,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\t\t\t\tif ( node[ i ] ) {\n\t\t\t\t\tscript[ i ] = node[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.3.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: 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\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n        if ( nodeName( elem, \"iframe\" ) ) {\n            return elem.contentDocument;\n        }\n\n        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n        // Treat the template element as a regular one in browsers that\n        // don't support it.\n        if ( nodeName( elem, \"template\" ) ) {\n            elem = elem.content || elem;\n        }\n\n        return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\t\t) );\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\t\tval = curCSS( elem, dimension, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox;\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = valueIsBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\tif ( val === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n\t\tval = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n\t\t// offsetWidth/offsetHeight provide border-box values\n\t\tvalueIsBorderBox = true;\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\t\t\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra && boxModelAdjustment(\n\t\t\t\t\telem,\n\t\t\t\t\tdimension,\n\t\t\t\t\textra,\n\t\t\t\t\tisBorderBox,\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && support.scrollboxSize() === styles.position ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/jquery/jquery.slim.js",
    "content": "/*!\n * jQuery JavaScript Library v3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, doc, node ) {\n\t\tdoc = doc || document;\n\n\t\tvar i,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\t\t\t\tif ( node[ i ] ) {\n\t\t\t\t\tscript[ i ] = node[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: 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\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n        if ( nodeName( elem, \"iframe\" ) ) {\n            return elem.contentDocument;\n        }\n\n        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n        // Treat the template element as a regular one in browsers that\n        // don't support it.\n        if ( nodeName( elem, \"template\" ) ) {\n            elem = elem.content || elem;\n        }\n\n        return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\t\t) );\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\t\tval = curCSS( elem, dimension, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox;\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = valueIsBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\tif ( val === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n\t\tval = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n\t\t// offsetWidth/offsetHeight provide border-box values\n\t\tvalueIsBorderBox = true;\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\t\t\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra && boxModelAdjustment(\n\t\t\t\t\telem,\n\t\t\t\t\tdimension,\n\t\t\t\t\textra,\n\t\t\t\t\tisBorderBox,\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && support.scrollboxSize() === styles.position ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/az.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/az\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+\" simvol silin\"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+\" simvol daxil edin\"},loadingMore:function(){return\"Daha çox nəticə yüklənir…\"},maximumSelected:function(e){return\"Sadəcə \"+e.maximum+\" element seçə bilərsiniz\"},noResults:function(){return\"Nəticə tapılmadı\"},searching:function(){return\"Axtarılır…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/bg.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/bg\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Моля въведете с \"+t+\" по-малко символ\";return t>1&&(n+=\"a\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Моля въведете още \"+t+\" символ\";return t>1&&(n+=\"a\"),n},loadingMore:function(){return\"Зареждат се още…\"},maximumSelected:function(e){var t=\"Можете да направите до \"+e.maximum+\" \";return e.maximum>1?t+=\"избора\":t+=\"избор\",t},noResults:function(){return\"Няма намерени съвпадения\"},searching:function(){return\"Търсене…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/ca.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/ca\",[],function(){return{errorLoading:function(){return\"La càrrega ha fallat\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Si us plau, elimina \"+t+\" car\";return t==1?n+=\"àcter\":n+=\"àcters\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Si us plau, introdueix \"+t+\" car\";return t==1?n+=\"àcter\":n+=\"àcters\",n},loadingMore:function(){return\"Carregant més resultats…\"},maximumSelected:function(e){var t=\"Només es pot seleccionar \"+e.maximum+\" element\";return e.maximum!=1&&(t+=\"s\"),t},noResults:function(){return\"No s'han trobat resultats\"},searching:function(){return\"Cercant…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/cs.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/cs\",[],function(){function e(e,t){switch(e){case 2:return t?\"dva\":\"dvě\";case 3:return\"tři\";case 4:return\"čtyři\"}return\"\"}return{errorLoading:function(){return\"Výsledky nemohly být načteny.\"},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?\"Prosím zadejte o jeden znak méně\":n<=4?\"Prosím zadejte o \"+e(n,!0)+\" znaky méně\":\"Prosím zadejte o \"+n+\" znaků méně\"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?\"Prosím zadejte ještě jeden znak\":n<=4?\"Prosím zadejte ještě další \"+e(n,!0)+\" znaky\":\"Prosím zadejte ještě dalších \"+n+\" znaků\"},loadingMore:function(){return\"Načítají se další výsledky…\"},maximumSelected:function(t){var n=t.maximum;return n==1?\"Můžete zvolit jen jednu položku\":n<=4?\"Můžete zvolit maximálně \"+e(n,!1)+\" položky\":\"Můžete zvolit maximálně \"+n+\" položek\"},noResults:function(){return\"Nenalezeny žádné položky\"},searching:function(){return\"Vyhledávání…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/da.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/da\",[],function(){return{errorLoading:function(){return\"The results could not be loaded.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Angiv venligst \"+t+\" tegn mindre\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Angiv venligst \"+t+\" tegn mere\";return n},loadingMore:function(){return\"Indlæser flere resultater…\"},maximumSelected:function(e){var t=\"Du kan kun vælge \"+e.maximum+\" emne\";return e.maximum!=1&&(t+=\"r\"),t},noResults:function(){return\"Ingen resultater fundet\"},searching:function(){return\"Søger…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/de.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/de\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return\"Bitte \"+t+\" Zeichen weniger eingeben\"},inputTooShort:function(e){var t=e.minimum-e.input.length;return\"Bitte \"+t+\" Zeichen mehr eingeben\"},loadingMore:function(){return\"Lade mehr Ergebnisse…\"},maximumSelected:function(e){var t=\"Sie können nur \"+e.maximum+\" Eintr\";return e.maximum===1?t+=\"ag\":t+=\"äge\",t+=\" auswählen\",t},noResults:function(){return\"Keine Übereinstimmungen gefunden\"},searching:function(){return\"Suche…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/en.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/en\",[],function(){return{errorLoading:function(){return\"The results could not be loaded.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Please delete \"+t+\" character\";return t!=1&&(n+=\"s\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Please enter \"+t+\" or more characters\";return n},loadingMore:function(){return\"Loading more results…\"},maximumSelected:function(e){var t=\"You can only select \"+e.maximum+\" item\";return e.maximum!=1&&(t+=\"s\"),t},noResults:function(){return\"No results found\"},searching:function(){return\"Searching…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/es.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/es\",[],function(){return{errorLoading:function(){return\"La carga falló\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Por favor, elimine \"+t+\" car\";return t==1?n+=\"ácter\":n+=\"acteres\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Por favor, introduzca \"+t+\" car\";return t==1?n+=\"ácter\":n+=\"acteres\",n},loadingMore:function(){return\"Cargando más resultados…\"},maximumSelected:function(e){var t=\"Sólo puede seleccionar \"+e.maximum+\" elemento\";return e.maximum!=1&&(t+=\"s\"),t},noResults:function(){return\"No se encontraron resultados\"},searching:function(){return\"Buscando…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/et.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/et\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Sisesta \"+t+\" täht\";return t!=1&&(n+=\"e\"),n+=\" vähem\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Sisesta \"+t+\" täht\";return t!=1&&(n+=\"e\"),n+=\" rohkem\",n},loadingMore:function(){return\"Laen tulemusi…\"},maximumSelected:function(e){var t=\"Saad vaid \"+e.maximum+\" tulemus\";return e.maximum==1?t+=\"e\":t+=\"t\",t+=\" valida\",t},noResults:function(){return\"Tulemused puuduvad\"},searching:function(){return\"Otsin…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/eu.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/eu\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Idatzi \";return t==1?n+=\"karaktere bat\":n+=t+\" karaktere\",n+=\" gutxiago\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Idatzi \";return t==1?n+=\"karaktere bat\":n+=t+\" karaktere\",n+=\" gehiago\",n},loadingMore:function(){return\"Emaitza gehiago kargatzen…\"},maximumSelected:function(e){return e.maximum===1?\"Elementu bakarra hauta dezakezu\":e.maximum+\" elementu hauta ditzakezu soilik\"},noResults:function(){return\"Ez da bat datorrenik aurkitu\"},searching:function(){return\"Bilatzen…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/fa.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/fa\",[],function(){return{errorLoading:function(){return\"امکان بارگذاری نتایج وجود ندارد.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"لطفاً \"+t+\" کاراکتر را حذف نمایید\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"لطفاً تعداد \"+t+\" کاراکتر یا بیشتر وارد نمایید\";return n},loadingMore:function(){return\"در حال بارگذاری نتایج بیشتر...\"},maximumSelected:function(e){var t=\"شما تنها می‌توانید \"+e.maximum+\" آیتم را انتخاب نمایید\";return t},noResults:function(){return\"هیچ نتیجه‌ای یافت نشد\"},searching:function(){return\"در حال جستجو...\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/fi.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/fi\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return\"Ole hyvä ja anna \"+t+\" merkkiä vähemmän\"},inputTooShort:function(e){var t=e.minimum-e.input.length;return\"Ole hyvä ja anna \"+t+\" merkkiä lisää\"},loadingMore:function(){return\"Ladataan lisää tuloksia…\"},maximumSelected:function(e){return\"Voit valita ainoastaan \"+e.maximum+\" kpl\"},noResults:function(){return\"Ei tuloksia\"},searching:function(){}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/fr.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/fr\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Supprimez \"+t+\" caractère\";return t!==1&&(n+=\"s\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Saisissez \"+t+\" caractère\";return t!==1&&(n+=\"s\"),n},loadingMore:function(){return\"Chargement de résultats supplémentaires…\"},maximumSelected:function(e){var t=\"Vous pouvez seulement sélectionner \"+e.maximum+\" élément\";return e.maximum!==1&&(t+=\"s\"),t},noResults:function(){return\"Aucun résultat trouvé\"},searching:function(){return\"Recherche en cours…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/gl.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/gl\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Engada \";return t===1?n+=\"un carácter\":n+=t+\" caracteres\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Elimine \";return t===1?n+=\"un carácter\":n+=t+\" caracteres\",n},loadingMore:function(){return\"Cargando máis resultados…\"},maximumSelected:function(e){var t=\"Só pode \";return e.maximum===1?t+=\"un elemento\":t+=e.maximum+\" elementos\",t},noResults:function(){return\"Non se atoparon resultados\"},searching:function(){return\"Buscando…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/he.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/he\",[],function(){return{errorLoading:function(){return\"התוצאות לא נטענו בהלכה\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"נא למחוק \"+t+\" תווים\";return t!=1&&(n+=\"s\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"נא להכניס \"+t+\" תווים או יותר\";return n},loadingMore:function(){return\"טען תוצאות נוספות…\"},maximumSelected:function(e){var t=\"באפשרותך לבחור רק \"+e.maximum+\" פריטים\";return e.maximum!=1&&(t+=\"s\"),t},noResults:function(){return\"לא נמצאו תוצאות\"},searching:function(){return\"מחפש…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/hi.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/hi\",[],function(){return{errorLoading:function(){return\"परिणामों को लोड नहीं किया जा सका।\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+\" अक्षर को हटा दें\";return t>1&&(n=t+\" अक्षरों को हटा दें \"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"कृपया \"+t+\" या अधिक अक्षर दर्ज करें\";return n},loadingMore:function(){return\"अधिक परिणाम लोड हो रहे है...\"},maximumSelected:function(e){var t=\"आप केवल \"+e.maximum+\" आइटम का चयन कर सकते हैं\";return t},noResults:function(){return\"कोई परिणाम नहीं मिला\"},searching:function(){return\"खोज रहा है...\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/hr.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/hr\",[],function(){function e(e){var t=\" \"+e+\" znak\";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+=\"a\"):t+=\"ova\",t}return{inputTooLong:function(t){var n=t.input.length-t.maximum;return\"Unesite \"+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return\"Unesite još \"+e(n)},loadingMore:function(){return\"Učitavanje rezultata…\"},maximumSelected:function(e){return\"Maksimalan broj odabranih stavki je \"+e.maximum},noResults:function(){return\"Nema rezultata\"},searching:function(){return\"Pretraga…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/hu.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/hu\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return\"Túl hosszú. \"+t+\" karakterrel több, mint kellene.\"},inputTooShort:function(e){var t=e.minimum-e.input.length;return\"Túl rövid. Még \"+t+\" karakter hiányzik.\"},loadingMore:function(){return\"Töltés…\"},maximumSelected:function(e){return\"Csak \"+e.maximum+\" elemet lehet kiválasztani.\"},noResults:function(){return\"Nincs találat.\"},searching:function(){return\"Keresés…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/id.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/id\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return\"Hapuskan \"+t+\" huruf\"},inputTooShort:function(e){var t=e.minimum-e.input.length;return\"Masukkan \"+t+\" huruf lagi\"},loadingMore:function(){return\"Mengambil data…\"},maximumSelected:function(e){return\"Anda hanya dapat memilih \"+e.maximum+\" pilihan\"},noResults:function(){return\"Tidak ada data yang sesuai\"},searching:function(){return\"Mencari…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/is.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/is\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Vinsamlegast styttið texta um \"+t+\" staf\";return t<=1?n:n+\"i\"},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Vinsamlegast skrifið \"+t+\" staf\";return t>1&&(n+=\"i\"),n+=\" í viðbót\",n},loadingMore:function(){return\"Sæki fleiri niðurstöður…\"},maximumSelected:function(e){return\"Þú getur aðeins valið \"+e.maximum+\" atriði\"},noResults:function(){return\"Ekkert fannst\"},searching:function(){return\"Leita…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/it.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/it\",[],function(){return{errorLoading:function(){return\"I risultati non possono essere caricati.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Per favore cancella \"+t+\" caratter\";return t!==1?n+=\"i\":n+=\"e\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Per favore inserisci \"+t+\" o più caratteri\";return n},loadingMore:function(){return\"Caricando più risultati…\"},maximumSelected:function(e){var t=\"Puoi selezionare solo \"+e.maximum+\" element\";return e.maximum!==1?t+=\"i\":t+=\"o\",t},noResults:function(){return\"Nessun risultato trovato\"},searching:function(){return\"Sto cercando…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/ko.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/ko\",[],function(){return{errorLoading:function(){return\"결과를 불러올 수 없습니다.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"너무 깁니다. \"+t+\" 글자 지워주세요.\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"너무 짧습니다. \"+t+\" 글자 더 입력해주세요.\";return n},loadingMore:function(){return\"불러오는 중…\"},maximumSelected:function(e){var t=\"최대 \"+e.maximum+\"개까지만 선택 가능합니다.\";return t},noResults:function(){return\"결과가 없습니다.\"},searching:function(){return\"검색 중…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/lt.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/lt\",[],function(){function e(e,t,n,r){return e%100>9&&e%100<21||e%10===0?e%10>1?n:r:t}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r=\"Pašalinkite \"+n+\" simbol\";return r+=e(n,\"ių\",\"ius\",\"į\"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r=\"Įrašykite dar \"+n+\" simbol\";return r+=e(n,\"ių\",\"ius\",\"į\"),r},loadingMore:function(){return\"Kraunama daugiau rezultatų…\"},maximumSelected:function(t){var n=\"Jūs galite pasirinkti tik \"+t.maximum+\" element\";return n+=e(t.maximum,\"ų\",\"us\",\"ą\"),n},noResults:function(){return\"Atitikmenų nerasta\"},searching:function(){return\"Ieškoma…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/lv.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/lv\",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r=\"Lūdzu ievadiet par  \"+n;return r+=\" simbol\"+e(n,\"iem\",\"u\",\"iem\"),r+\" mazāk\"},inputTooShort:function(t){var n=t.minimum-t.input.length,r=\"Lūdzu ievadiet vēl \"+n;return r+=\" simbol\"+e(n,\"us\",\"u\",\"us\"),r},loadingMore:function(){return\"Datu ielāde…\"},maximumSelected:function(t){var n=\"Jūs varat izvēlēties ne vairāk kā \"+t.maximum;return n+=\" element\"+e(t.maximum,\"us\",\"u\",\"us\"),n},noResults:function(){return\"Sakritību nav\"},searching:function(){return\"Meklēšana…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/mk.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/mk\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Ве молиме внесете \"+e.maximum+\" помалку карактер\";return e.maximum!==1&&(n+=\"и\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Ве молиме внесете уште \"+e.maximum+\" карактер\";return e.maximum!==1&&(n+=\"и\"),n},loadingMore:function(){return\"Вчитување резултати…\"},maximumSelected:function(e){var t=\"Можете да изберете само \"+e.maximum+\" ставк\";return e.maximum===1?t+=\"а\":t+=\"и\",t},noResults:function(){return\"Нема пронајдено совпаѓања\"},searching:function(){return\"Пребарување…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/nb.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/nb\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return\"Vennligst fjern \"+t+\" tegn\"},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Vennligst skriv inn \";return t>1?n+=\" flere tegn\":n+=\" tegn til\",n},loadingMore:function(){return\"Laster flere resultater…\"},maximumSelected:function(e){return\"Du kan velge maks \"+e.maximum+\" elementer\"},noResults:function(){return\"Ingen treff\"},searching:function(){return\"Søker…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/nl.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/nl\",[],function(){return{errorLoading:function(){return\"De resultaten konden niet worden geladen.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Gelieve \"+t+\" karakters te verwijderen\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Gelieve \"+t+\" of meer karakters in te voeren\";return n},loadingMore:function(){return\"Meer resultaten laden…\"},maximumSelected:function(e){var t=\"Er kunnen maar \"+e.maximum+\" item\";return e.maximum!=1&&(t+=\"s\"),t+=\" worden geselecteerd\",t},noResults:function(){return\"Geen resultaten gevonden…\"},searching:function(){return\"Zoeken…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/pl.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/pl\",[],function(){var e=[\"znak\",\"znaki\",\"znaków\"],t=[\"element\",\"elementy\",\"elementów\"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return\"Nie można załadować wyników.\"},inputTooLong:function(t){var r=t.input.length-t.maximum;return\"Usuń \"+r+\" \"+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return\"Podaj przynajmniej \"+r+\" \"+n(r,e)},loadingMore:function(){return\"Trwa ładowanie…\"},maximumSelected:function(e){return\"Możesz zaznaczyć tylko \"+e.maximum+\" \"+n(e.maxiumum,t)},noResults:function(){return\"Brak wyników\"},searching:function(){return\"Trwa wyszukiwanie…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/pt-BR.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/pt-BR\",[],function(){return{errorLoading:function(){return\"Os resultados não puderam ser carregados.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Apague \"+t+\" caracter\";return t!=1&&(n+=\"es\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Digite \"+t+\" ou mais caracteres\";return n},loadingMore:function(){return\"Carregando mais resultados…\"},maximumSelected:function(e){var t=\"Você só pode selecionar \"+e.maximum+\" ite\";return e.maximum==1?t+=\"m\":t+=\"ns\",t},noResults:function(){return\"Nenhum resultado encontrado\"},searching:function(){return\"Buscando…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/pt.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/pt\",[],function(){return{errorLoading:function(){return\"Os resultados não puderam ser carregados.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Por favor apague \"+t+\" \";return n+=t!=1?\"caracteres\":\"carácter\",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Introduza \"+t+\" ou mais caracteres\";return n},loadingMore:function(){return\"A carregar mais resultados…\"},maximumSelected:function(e){var t=\"Apenas pode seleccionar \"+e.maximum+\" \";return t+=e.maximum!=1?\"itens\":\"item\",t},noResults:function(){return\"Sem resultados\"},searching:function(){return\"A procurar…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/ro.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/ro\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Vă rugăm să introduceți mai puțin de \"+t;return n+=\" caracter\",n!==1&&(n+=\"e\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Vă rugăm să introduceți incă \"+t;return n+=\" caracter\",n!==1&&(n+=\"e\"),n},loadingMore:function(){return\"Se încarcă…\"},maximumSelected:function(e){var t=\"Aveți voie să selectați cel mult \"+e.maximum;return t+=\" element\",t!==1&&(t+=\"e\"),t},noResults:function(){return\"Nu a fost găsit nimic\"},searching:function(){return\"Căutare…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/ru.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/ru\",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return\"Невозможно загрузить результаты\"},inputTooLong:function(t){var n=t.input.length-t.maximum,r=\"Пожалуйста, введите на \"+n+\" символ\";return r+=e(n,\"\",\"a\",\"ов\"),r+=\" меньше\",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r=\"Пожалуйста, введите еще хотя бы \"+n+\" символ\";return r+=e(n,\"\",\"a\",\"ов\"),r},loadingMore:function(){return\"Загрузка данных…\"},maximumSelected:function(t){var n=\"Вы можете выбрать не более \"+t.maximum+\" элемент\";return n+=e(t.maximum,\"\",\"a\",\"ов\"),n},noResults:function(){return\"Совпадений не найдено\"},searching:function(){return\"Поиск…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/sk.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/sk\",[],function(){var e={2:function(e){return e?\"dva\":\"dve\"},3:function(){return\"tri\"},4:function(){return\"štyri\"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?\"Prosím, zadajte o jeden znak menej\":n>=2&&n<=4?\"Prosím, zadajte o \"+e[n](!0)+\" znaky menej\":\"Prosím, zadajte o \"+n+\" znakov menej\"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?\"Prosím, zadajte ešte jeden znak\":n<=4?\"Prosím, zadajte ešte ďalšie \"+e[n](!0)+\" znaky\":\"Prosím, zadajte ešte ďalších \"+n+\" znakov\"},loadingMore:function(){return\"Loading more results…\"},maximumSelected:function(t){return t.maximum==1?\"Môžete zvoliť len jednu položku\":t.maximum>=2&&t.maximum<=4?\"Môžete zvoliť najviac \"+e[t.maximum](!1)+\" položky\":\"Môžete zvoliť najviac \"+t.maximum+\" položiek\"},noResults:function(){return\"Nenašli sa žiadne položky\"},searching:function(){return\"Vyhľadávanie…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/sr.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/sr\",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r=\"Obrišite \"+n+\" simbol\";return r+=e(n,\"\",\"a\",\"a\"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r=\"Ukucajte bar još \"+n+\" simbol\";return r+=e(n,\"\",\"a\",\"a\"),r},loadingMore:function(){return\"Preuzimanje još rezultata…\"},maximumSelected:function(t){var n=\"Možete izabrati samo \"+t.maximum+\" stavk\";return n+=e(t.maximum,\"u\",\"e\",\"i\"),n},noResults:function(){return\"Ništa nije pronađeno\"},searching:function(){return\"Pretraga…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/sv.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/sv\",[],function(){return{errorLoading:function(){return\"Resultat kunde inte laddas.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Vänligen sudda ut \"+t+\" tecken\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Vänligen skriv in \"+t+\" eller fler tecken\";return n},loadingMore:function(){return\"Laddar fler resultat…\"},maximumSelected:function(e){var t=\"Du kan max välja \"+e.maximum+\" element\";return t},noResults:function(){return\"Inga träffar\"},searching:function(){return\"Söker…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/th.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/th\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"โปรดลบออก \"+t+\" ตัวอักษร\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"โปรดพิมพ์เพิ่มอีก \"+t+\" ตัวอักษร\";return n},loadingMore:function(){return\"กำลังค้นข้อมูลเพิ่ม…\"},maximumSelected:function(e){var t=\"คุณสามารถเลือกได้ไม่เกิน \"+e.maximum+\" รายการ\";return t},noResults:function(){return\"ม่พบข้อมูล\"},searching:function(){return\"กำลังค้นข้อมูล…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/tr.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/tr\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+\" karakter daha girmelisiniz\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"En az \"+t+\" karakter daha girmelisiniz\";return n},loadingMore:function(){return\"Daha fazla…\"},maximumSelected:function(e){var t=\"Sadece \"+e.maximum+\" seçim yapabilirsiniz\";return t},noResults:function(){return\"Sonuç bulunamadı\"},searching:function(){return\"Aranıyor…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/uk.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/uk\",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return\"Неможливо завантажити результати\"},inputTooLong:function(t){var n=t.input.length-t.maximum;return\"Будь ласка, видаліть \"+n+\" \"+e(t.maximum,\"літеру\",\"літери\",\"літер\")},inputTooShort:function(e){var t=e.minimum-e.input.length;return\"Будь ласка, введіть \"+t+\" або більше літер\"},loadingMore:function(){return\"Завантаження інших результатів…\"},maximumSelected:function(t){return\"Ви можете вибрати лише \"+t.maximum+\" \"+e(t.maximum,\"пункт\",\"пункти\",\"пунктів\")},noResults:function(){return\"Нічого не знайдено\"},searching:function(){return\"Пошук…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/vi.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/vi\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"Vui lòng nhập ít hơn \"+t+\" ký tự\";return t!=1&&(n+=\"s\"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"Vui lòng nhập nhiều hơn \"+t+' ký tự\"';return n},loadingMore:function(){return\"Đang lấy thêm kết quả…\"},maximumSelected:function(e){var t=\"Chỉ có thể chọn được \"+e.maximum+\" lựa chọn\";return t},noResults:function(){return\"Không tìm thấy kết quả\"},searching:function(){return\"Đang tìm…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/zh-CN.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/zh-CN\",[],function(){return{errorLoading:function(){return\"无法载入结果。\"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"请删除\"+t+\"个字符\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"请再输入至少\"+t+\"个字符\";return n},loadingMore:function(){return\"载入更多结果…\"},maximumSelected:function(e){var t=\"最多只能选择\"+e.maximum+\"个项目\";return t},noResults:function(){return\"未找到结果\"},searching:function(){return\"搜索中…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/i18n/zh-TW.js",
    "content": "/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n\n(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define(\"select2/i18n/zh-TW\",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=\"請刪掉\"+t+\"個字元\";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n=\"請再輸入\"+t+\"個字元\";return n},loadingMore:function(){return\"載入中…\"},maximumSelected:function(e){var t=\"你只能選擇最多\"+e.maximum+\"項\";return t},noResults:function(){return\"沒有找到相符的項目\"},searching:function(){return\"搜尋中…\"}}}),{define:e.define,require:e.require}})();"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/select2.css",
    "content": ".select2-container {\n  box-sizing: border-box;\n  display: inline-block;\n  margin: 0;\n  position: relative;\n  vertical-align: middle; }\n  .select2-container .select2-selection--single {\n    box-sizing: border-box;\n    cursor: pointer;\n    display: block;\n    height: 100%;\n    user-select: none;\n    -webkit-user-select: none; }\n    .select2-container .select2-selection--single .select2-selection__rendered {\n      display: block;\n      padding-left: 8px;\n      padding-right: 20px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap; }\n  .select2-container[dir=\"rtl\"] .select2-selection--single .select2-selection__rendered {\n    padding-right: 8px;\n    padding-left: 20px; }\n  .select2-container .select2-selection--multiple {\n    box-sizing: border-box;\n    cursor: pointer;\n    display: block;\n    min-height: 32px;\n    user-select: none;\n    -webkit-user-select: none; }\n    .select2-container .select2-selection--multiple .select2-selection__rendered {\n      display: inline-block;\n      overflow: hidden;\n      padding-left: 8px;\n      text-overflow: ellipsis;\n      white-space: nowrap; }\n  .select2-container .select2-search--inline {\n    float: left; }\n    .select2-container .select2-search--inline .select2-search__field {\n      box-sizing: border-box;\n      border: none;\n      font-size: 100%;\n      margin-top: 5px; }\n      .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {\n        -webkit-appearance: none; }\n\n.select2-dropdown {\n  background-color: white;\n  border: 1px solid #aaa;\n  border-radius: 4px;\n  box-sizing: border-box;\n  display: block;\n  position: absolute;\n  left: -100000px;\n  width: 100%;\n  z-index: 1051; }\n\n.select2-results {\n  display: block; }\n\n.select2-results__options {\n  list-style: none;\n  margin: 0;\n  padding: 0; }\n\n.select2-results__option {\n  padding: 6px;\n  user-select: none;\n  -webkit-user-select: none; }\n  .select2-results__option[aria-selected] {\n    cursor: pointer; }\n\n.select2-container--open .select2-dropdown {\n  left: 0; }\n\n.select2-container--open .select2-dropdown--above {\n  border-bottom: none;\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0; }\n\n.select2-container--open .select2-dropdown--below {\n  border-top: none;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0; }\n\n.select2-search--dropdown {\n  display: block;\n  padding: 4px; }\n  .select2-search--dropdown .select2-search__field {\n    padding: 4px;\n    width: 100%;\n    box-sizing: border-box; }\n    .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {\n      -webkit-appearance: none; }\n  .select2-search--dropdown.select2-search--hide {\n    display: none; }\n\n.select2-close-mask {\n  border: 0;\n  margin: 0;\n  padding: 0;\n  display: block;\n  position: fixed;\n  left: 0;\n  top: 0;\n  min-height: 100%;\n  min-width: 100%;\n  height: auto;\n  width: auto;\n  opacity: 0;\n  z-index: 99;\n  background-color: #fff;\n  filter: alpha(opacity=0); }\n\n.select2-hidden-accessible {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px; }\n\n.select2-container--default .select2-selection--single {\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }\n  .select2-container--default .select2-selection--single .select2-selection__rendered {\n    color: #444;\n    line-height: 28px; }\n  .select2-container--default .select2-selection--single .select2-selection__clear {\n    cursor: pointer;\n    float: right;\n    font-weight: bold; }\n  .select2-container--default .select2-selection--single .select2-selection__placeholder {\n    color: #999; }\n  .select2-container--default .select2-selection--single .select2-selection__arrow {\n    height: 26px;\n    position: absolute;\n    top: 1px;\n    right: 1px;\n    width: 20px; }\n    .select2-container--default .select2-selection--single .select2-selection__arrow b {\n      border-color: #888 transparent transparent transparent;\n      border-style: solid;\n      border-width: 5px 4px 0 4px;\n      height: 0;\n      left: 50%;\n      margin-left: -4px;\n      margin-top: -2px;\n      position: absolute;\n      top: 50%;\n      width: 0; }\n.select2-container--default[dir=\"rtl\"] .select2-selection--single .select2-selection__clear {\n  float: left; }\n.select2-container--default[dir=\"rtl\"] .select2-selection--single .select2-selection__arrow {\n  left: 1px;\n  right: auto; }\n.select2-container--default.select2-container--disabled .select2-selection--single {\n  background-color: #eee;\n  cursor: default; }\n  .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {\n    display: none; }\n.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {\n  border-color: transparent transparent #888 transparent;\n  border-width: 0 4px 5px 4px; }\n.select2-container--default .select2-selection--multiple {\n  background-color: white;\n  border: 1px solid #aaa;\n  border-radius: 4px;\n  cursor: text; }\n  .select2-container--default .select2-selection--multiple .select2-selection__rendered {\n    box-sizing: border-box;\n    list-style: none;\n    margin: 0;\n    padding: 0 5px;\n    width: 100%; }\n  .select2-container--default .select2-selection--multiple .select2-selection__placeholder {\n    color: #999;\n    margin-top: 5px;\n    float: left; }\n  .select2-container--default .select2-selection--multiple .select2-selection__clear {\n    cursor: pointer;\n    float: right;\n    font-weight: bold;\n    margin-top: 5px;\n    margin-right: 10px; }\n  .select2-container--default .select2-selection--multiple .select2-selection__choice {\n    background-color: #e4e4e4;\n    border: 1px solid #aaa;\n    border-radius: 4px;\n    cursor: default;\n    float: left;\n    margin-right: 5px;\n    margin-top: 5px;\n    padding: 0 5px; }\n  .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n    color: #999;\n    cursor: pointer;\n    display: inline-block;\n    font-weight: bold;\n    margin-right: 2px; }\n    .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {\n      color: #333; }\n.select2-container--default[dir=\"rtl\"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=\"rtl\"] .select2-selection--multiple .select2-selection__placeholder {\n  float: right; }\n.select2-container--default[dir=\"rtl\"] .select2-selection--multiple .select2-selection__choice {\n  margin-left: 5px;\n  margin-right: auto; }\n.select2-container--default[dir=\"rtl\"] .select2-selection--multiple .select2-selection__choice__remove {\n  margin-left: 2px;\n  margin-right: auto; }\n.select2-container--default.select2-container--focus .select2-selection--multiple {\n  border: solid black 1px;\n  outline: 0; }\n.select2-container--default.select2-container--disabled .select2-selection--multiple {\n  background-color: #eee;\n  cursor: default; }\n.select2-container--default.select2-container--disabled .select2-selection__choice__remove {\n  display: none; }\n.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0; }\n.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0; }\n.select2-container--default .select2-search--dropdown .select2-search__field {\n  border: 1px solid #aaa; }\n.select2-container--default .select2-search--inline .select2-search__field {\n  background: transparent;\n  border: none;\n  outline: 0; }\n.select2-container--default .select2-results > .select2-results__options {\n  max-height: 200px;\n  overflow-y: auto; }\n.select2-container--default .select2-results__option[role=group] {\n  padding: 0; }\n.select2-container--default .select2-results__option[aria-disabled=true] {\n  color: #999; }\n.select2-container--default .select2-results__option[aria-selected=true] {\n  background-color: #ddd; }\n.select2-container--default .select2-results__option .select2-results__option {\n  padding-left: 1em; }\n  .select2-container--default .select2-results__option .select2-results__option .select2-results__group {\n    padding-left: 0; }\n  .select2-container--default .select2-results__option .select2-results__option .select2-results__option {\n    margin-left: -1em;\n    padding-left: 2em; }\n    .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {\n      margin-left: -2em;\n      padding-left: 3em; }\n      .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {\n        margin-left: -3em;\n        padding-left: 4em; }\n        .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {\n          margin-left: -4em;\n          padding-left: 5em; }\n          .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {\n            margin-left: -5em;\n            padding-left: 6em; }\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: #5897fb;\n  color: white; }\n.select2-container--default .select2-results__group {\n  cursor: default;\n  display: block;\n  padding: 6px; }\n\n.select2-container--classic .select2-selection--single {\n  background-color: #f6f6f6;\n  border: 1px solid #aaa;\n  border-radius: 4px;\n  outline: 0;\n  background-image: -webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%);\n  background-image: -o-linear-gradient(top, #ffffff 50%, #eeeeee 100%);\n  background-image: linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); }\n  .select2-container--classic .select2-selection--single:focus {\n    border: 1px solid #5897fb; }\n  .select2-container--classic .select2-selection--single .select2-selection__rendered {\n    color: #444;\n    line-height: 28px; }\n  .select2-container--classic .select2-selection--single .select2-selection__clear {\n    cursor: pointer;\n    float: right;\n    font-weight: bold;\n    margin-right: 10px; }\n  .select2-container--classic .select2-selection--single .select2-selection__placeholder {\n    color: #999; }\n  .select2-container--classic .select2-selection--single .select2-selection__arrow {\n    background-color: #ddd;\n    border: none;\n    border-left: 1px solid #aaa;\n    border-top-right-radius: 4px;\n    border-bottom-right-radius: 4px;\n    height: 26px;\n    position: absolute;\n    top: 1px;\n    right: 1px;\n    width: 20px;\n    background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);\n    background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);\n    background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0); }\n    .select2-container--classic .select2-selection--single .select2-selection__arrow b {\n      border-color: #888 transparent transparent transparent;\n      border-style: solid;\n      border-width: 5px 4px 0 4px;\n      height: 0;\n      left: 50%;\n      margin-left: -4px;\n      margin-top: -2px;\n      position: absolute;\n      top: 50%;\n      width: 0; }\n.select2-container--classic[dir=\"rtl\"] .select2-selection--single .select2-selection__clear {\n  float: left; }\n.select2-container--classic[dir=\"rtl\"] .select2-selection--single .select2-selection__arrow {\n  border: none;\n  border-right: 1px solid #aaa;\n  border-radius: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n  left: 1px;\n  right: auto; }\n.select2-container--classic.select2-container--open .select2-selection--single {\n  border: 1px solid #5897fb; }\n  .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {\n    background: transparent;\n    border: none; }\n    .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {\n      border-color: transparent transparent #888 transparent;\n      border-width: 0 4px 5px 4px; }\n.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {\n  border-top: none;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #eeeeee 50%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); }\n.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {\n  border-bottom: none;\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n  background-image: -webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%);\n  background-image: -o-linear-gradient(top, #eeeeee 50%, #ffffff 100%);\n  background-image: linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); }\n.select2-container--classic .select2-selection--multiple {\n  background-color: white;\n  border: 1px solid #aaa;\n  border-radius: 4px;\n  cursor: text;\n  outline: 0; }\n  .select2-container--classic .select2-selection--multiple:focus {\n    border: 1px solid #5897fb; }\n  .select2-container--classic .select2-selection--multiple .select2-selection__rendered {\n    list-style: none;\n    margin: 0;\n    padding: 0 5px; }\n  .select2-container--classic .select2-selection--multiple .select2-selection__clear {\n    display: none; }\n  .select2-container--classic .select2-selection--multiple .select2-selection__choice {\n    background-color: #e4e4e4;\n    border: 1px solid #aaa;\n    border-radius: 4px;\n    cursor: default;\n    float: left;\n    margin-right: 5px;\n    margin-top: 5px;\n    padding: 0 5px; }\n  .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {\n    color: #888;\n    cursor: pointer;\n    display: inline-block;\n    font-weight: bold;\n    margin-right: 2px; }\n    .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {\n      color: #555; }\n.select2-container--classic[dir=\"rtl\"] .select2-selection--multiple .select2-selection__choice {\n  float: right; }\n.select2-container--classic[dir=\"rtl\"] .select2-selection--multiple .select2-selection__choice {\n  margin-left: 5px;\n  margin-right: auto; }\n.select2-container--classic[dir=\"rtl\"] .select2-selection--multiple .select2-selection__choice__remove {\n  margin-left: 2px;\n  margin-right: auto; }\n.select2-container--classic.select2-container--open .select2-selection--multiple {\n  border: 1px solid #5897fb; }\n.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {\n  border-top: none;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0; }\n.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {\n  border-bottom: none;\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0; }\n.select2-container--classic .select2-search--dropdown .select2-search__field {\n  border: 1px solid #aaa;\n  outline: 0; }\n.select2-container--classic .select2-search--inline .select2-search__field {\n  outline: 0; }\n.select2-container--classic .select2-dropdown {\n  background-color: white;\n  border: 1px solid transparent; }\n.select2-container--classic .select2-dropdown--above {\n  border-bottom: none; }\n.select2-container--classic .select2-dropdown--below {\n  border-top: none; }\n.select2-container--classic .select2-results > .select2-results__options {\n  max-height: 200px;\n  overflow-y: auto; }\n.select2-container--classic .select2-results__option[role=group] {\n  padding: 0; }\n.select2-container--classic .select2-results__option[aria-disabled=true] {\n  color: grey; }\n.select2-container--classic .select2-results__option--highlighted[aria-selected] {\n  background-color: #3875d7;\n  color: white; }\n.select2-container--classic .select2-results__group {\n  cursor: default;\n  display: block;\n  padding: 6px; }\n.select2-container--classic.select2-container--open .select2-dropdown {\n  border-color: #5897fb; }\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/select2.full.js",
    "content": "/*!\n * Select2 4.0.0\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\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 exports === 'object') {\n    // Node/CommonJS\n    factory(require('jquery'));\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n}(function (jQuery) {\n  // This is needed so we can catch the AMD loader configuration and use it\n  // The inner file should be wrapped (by `banner.start.js`) in a function that\n  // returns the AMD loader references.\n  var S2 =\n(function () {\n  // Restore the Select2 AMD loader so it can be used\n  // Needed mostly in the language files, where the loader is not inserted\n  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n    var S2 = jQuery.fn.select2.amd;\n  }\nvar S2;(function () { if (!S2 || !S2.requirejs) {\nif (!S2) { S2 = {}; } else { require = S2; }\n/**\n * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*jslint sloppy: true */\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n    var main, req, makeMap, handlers,\n        defined = {},\n        waiting = {},\n        config = {},\n        defining = {},\n        hasOwn = Object.prototype.hasOwnProperty,\n        aps = [].slice,\n        jsSuffixRegExp = /\\.js$/;\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    /**\n     * Given a relative module name, like ./something, normalize it to\n     * a real name that can be mapped to a path.\n     * @param {String} name the relative name\n     * @param {String} baseName a real name that the name arg is relative\n     * to.\n     * @returns {String} normalized name\n     */\n    function normalize(name, baseName) {\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n            foundI, foundStarMap, starI, i, j, part,\n            baseParts = baseName && baseName.split(\"/\"),\n            map = config.map,\n            starMap = (map && map['*']) || {};\n\n        //Adjust any relative paths.\n        if (name && name.charAt(0) === \".\") {\n            //If have a base name, try to normalize against it,\n            //otherwise, assume it is a top-level require that will\n            //be relative to baseUrl in the end.\n            if (baseName) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that \"directory\" and not name of the baseName's\n                //module. For instance, baseName of \"one/two/three\", maps to\n                //\"one/two/three.js\", but we want the directory, \"one/two\" for\n                //this normalization.\n                baseParts = baseParts.slice(0, baseParts.length - 1);\n                name = name.split('/');\n                lastIndex = name.length - 1;\n\n                // Node .js allowance:\n                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n                }\n\n                name = baseParts.concat(name);\n\n                //start trimDots\n                for (i = 0; i < name.length; i += 1) {\n                    part = name[i];\n                    if (part === \".\") {\n                        name.splice(i, 1);\n                        i -= 1;\n                    } else if (part === \"..\") {\n                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {\n                            //End of the line. Keep at least one non-dot\n                            //path segment at the front so it can be mapped\n                            //correctly to disk. Otherwise, there is likely\n                            //no path mapping for a path starting with '..'.\n                            //This can still fail, but catches the most reasonable\n                            //uses of ..\n                            break;\n                        } else if (i > 0) {\n                            name.splice(i - 1, 2);\n                            i -= 2;\n                        }\n                    }\n                }\n                //end trimDots\n\n                name = name.join(\"/\");\n            } else if (name.indexOf('./') === 0) {\n                // No baseName, so this is ID is resolved relative\n                // to baseUrl, pull off the leading dot.\n                name = name.substring(2);\n            }\n        }\n\n        //Apply map config if available.\n        if ((baseParts || starMap) && map) {\n            nameParts = name.split('/');\n\n            for (i = nameParts.length; i > 0; i -= 1) {\n                nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                if (baseParts) {\n                    //Find the longest baseName segment match in the config.\n                    //So, do joins on the biggest to smallest lengths of baseParts.\n                    for (j = baseParts.length; j > 0; j -= 1) {\n                        mapValue = map[baseParts.slice(0, j).join('/')];\n\n                        //baseName segment has  config, find if it has one for\n                        //this name.\n                        if (mapValue) {\n                            mapValue = mapValue[nameSegment];\n                            if (mapValue) {\n                                //Match, update name to the new value.\n                                foundMap = mapValue;\n                                foundI = i;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (foundMap) {\n                    break;\n                }\n\n                //Check for a star map match, but just hold on to it,\n                //if there is a shorter segment match later in a matching\n                //config, then favor over this star map.\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\n                    foundStarMap = starMap[nameSegment];\n                    starI = i;\n                }\n            }\n\n            if (!foundMap && foundStarMap) {\n                foundMap = foundStarMap;\n                foundI = starI;\n            }\n\n            if (foundMap) {\n                nameParts.splice(0, foundI, foundMap);\n                name = nameParts.join('/');\n            }\n        }\n\n        return name;\n    }\n\n    function makeRequire(relName, forceSync) {\n        return function () {\n            //A version of a require function that passes a moduleName\n            //value for items that may need to\n            //look up paths relative to the moduleName\n            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));\n        };\n    }\n\n    function makeNormalize(relName) {\n        return function (name) {\n            return normalize(name, relName);\n        };\n    }\n\n    function makeLoad(depName) {\n        return function (value) {\n            defined[depName] = value;\n        };\n    }\n\n    function callDep(name) {\n        if (hasProp(waiting, name)) {\n            var args = waiting[name];\n            delete waiting[name];\n            defining[name] = true;\n            main.apply(undef, args);\n        }\n\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\n            throw new Error('No ' + name);\n        }\n        return defined[name];\n    }\n\n    //Turns a plugin!resource to [plugin, resource]\n    //with the plugin being undefined if the name\n    //did not have a plugin prefix.\n    function splitPrefix(name) {\n        var prefix,\n            index = name ? name.indexOf('!') : -1;\n        if (index > -1) {\n            prefix = name.substring(0, index);\n            name = name.substring(index + 1, name.length);\n        }\n        return [prefix, name];\n    }\n\n    /**\n     * Makes a name map, normalizing the name, and using a plugin\n     * for normalization if necessary. Grabs a ref to plugin\n     * too, as an optimization.\n     */\n    makeMap = function (name, relName) {\n        var plugin,\n            parts = splitPrefix(name),\n            prefix = parts[0];\n\n        name = parts[1];\n\n        if (prefix) {\n            prefix = normalize(prefix, relName);\n            plugin = callDep(prefix);\n        }\n\n        //Normalize according\n        if (prefix) {\n            if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relName));\n            } else {\n                name = normalize(name, relName);\n            }\n        } else {\n            name = normalize(name, relName);\n            parts = splitPrefix(name);\n            prefix = parts[0];\n            name = parts[1];\n            if (prefix) {\n                plugin = callDep(prefix);\n            }\n        }\n\n        //Using ridiculous property names for space reasons\n        return {\n            f: prefix ? prefix + '!' + name : name, //fullName\n            n: name,\n            pr: prefix,\n            p: plugin\n        };\n    };\n\n    function makeConfig(name) {\n        return function () {\n            return (config && config.config && config.config[name]) || {};\n        };\n    }\n\n    handlers = {\n        require: function (name) {\n            return makeRequire(name);\n        },\n        exports: function (name) {\n            var e = defined[name];\n            if (typeof e !== 'undefined') {\n                return e;\n            } else {\n                return (defined[name] = {});\n            }\n        },\n        module: function (name) {\n            return {\n                id: name,\n                uri: '',\n                exports: defined[name],\n                config: makeConfig(name)\n            };\n        }\n    };\n\n    main = function (name, deps, callback, relName) {\n        var cjsModule, depName, ret, map, i,\n            args = [],\n            callbackType = typeof callback,\n            usingExports;\n\n        //Use name if no relName\n        relName = relName || name;\n\n        //Call the callback to define the module, if necessary.\n        if (callbackType === 'undefined' || callbackType === 'function') {\n            //Pull out the defined dependencies and pass the ordered\n            //values to the callback.\n            //Default to [require, exports, module] if no deps\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n            for (i = 0; i < deps.length; i += 1) {\n                map = makeMap(deps[i], relName);\n                depName = map.f;\n\n                //Fast path CommonJS standard dependencies.\n                if (depName === \"require\") {\n                    args[i] = handlers.require(name);\n                } else if (depName === \"exports\") {\n                    //CommonJS module spec 1.1\n                    args[i] = handlers.exports(name);\n                    usingExports = true;\n                } else if (depName === \"module\") {\n                    //CommonJS module spec 1.1\n                    cjsModule = args[i] = handlers.module(name);\n                } else if (hasProp(defined, depName) ||\n                           hasProp(waiting, depName) ||\n                           hasProp(defining, depName)) {\n                    args[i] = callDep(depName);\n                } else if (map.p) {\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                    args[i] = defined[depName];\n                } else {\n                    throw new Error(name + ' missing ' + depName);\n                }\n            }\n\n            ret = callback ? callback.apply(defined[name], args) : undefined;\n\n            if (name) {\n                //If setting exports via \"module\" is in play,\n                //favor that over return value and exports. After that,\n                //favor a non-undefined return value over exports use.\n                if (cjsModule && cjsModule.exports !== undef &&\n                        cjsModule.exports !== defined[name]) {\n                    defined[name] = cjsModule.exports;\n                } else if (ret !== undef || !usingExports) {\n                    //Use the return value from the function.\n                    defined[name] = ret;\n                }\n            }\n        } else if (name) {\n            //May just be an object definition for the module. Only\n            //worry about defining if have a module name.\n            defined[name] = callback;\n        }\n    };\n\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n        if (typeof deps === \"string\") {\n            if (handlers[deps]) {\n                //callback in this case is really relName\n                return handlers[deps](callback);\n            }\n            //Just return the module wanted. In this scenario, the\n            //deps arg is the module name, and second arg (if passed)\n            //is just the relName.\n            //Normalize module name, if it contains . or ..\n            return callDep(makeMap(deps, callback).f);\n        } else if (!deps.splice) {\n            //deps is a config object, not an array.\n            config = deps;\n            if (config.deps) {\n                req(config.deps, config.callback);\n            }\n            if (!callback) {\n                return;\n            }\n\n            if (callback.splice) {\n                //callback is an array, which means it is a dependency list.\n                //Adjust args if there are dependencies\n                deps = callback;\n                callback = relName;\n                relName = null;\n            } else {\n                deps = undef;\n            }\n        }\n\n        //Support require(['a'])\n        callback = callback || function () {};\n\n        //If relName is a function, it is an errback handler,\n        //so remove it.\n        if (typeof relName === 'function') {\n            relName = forceSync;\n            forceSync = alt;\n        }\n\n        //Simulate async callback;\n        if (forceSync) {\n            main(undef, deps, callback, relName);\n        } else {\n            //Using a non-zero value because of concern for what old browsers\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n            //If want a value immediately, use require('id') instead -- something\n            //that works in almond on the global level, but not guaranteed and\n            //unlikely to work in other AMD implementations.\n            setTimeout(function () {\n                main(undef, deps, callback, relName);\n            }, 4);\n        }\n\n        return req;\n    };\n\n    /**\n     * Just drops the config on the floor, but returns req in case\n     * the config return value is used.\n     */\n    req.config = function (cfg) {\n        return req(cfg);\n    };\n\n    /**\n     * Expose module registry for debugging and tooling\n     */\n    requirejs._defined = defined;\n\n    define = function (name, deps, callback) {\n\n        //This module may not have dependencies\n        if (!deps.splice) {\n            //deps is not an array, so probably means\n            //an object literal or factory function for\n            //the value. Adjust args.\n            callback = deps;\n            deps = [];\n        }\n\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n            waiting[name] = [name, deps, callback];\n        }\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n}());\n\nS2.requirejs = requirejs;S2.require = require;S2.define = define;\n}\n}());\nS2.define(\"almond\", function(){});\n\n/* global jQuery:false, $:false */\nS2.define('jquery',[],function () {\n  var _$ = jQuery || $;\n\n  if (_$ == null && console && console.error) {\n    console.error(\n      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +\n      'found. Make sure that you are including jQuery before Select2 on your ' +\n      'web page.'\n    );\n  }\n\n  return _$;\n});\n\nS2.define('select2/utils',[\n  'jquery'\n], function ($) {\n  var Utils = {};\n\n  Utils.Extend = function (ChildClass, SuperClass) {\n    var __hasProp = {}.hasOwnProperty;\n\n    function BaseConstructor () {\n      this.constructor = ChildClass;\n    }\n\n    for (var key in SuperClass) {\n      if (__hasProp.call(SuperClass, key)) {\n        ChildClass[key] = SuperClass[key];\n      }\n    }\n\n    BaseConstructor.prototype = SuperClass.prototype;\n    ChildClass.prototype = new BaseConstructor();\n    ChildClass.__super__ = SuperClass.prototype;\n\n    return ChildClass;\n  };\n\n  function getMethods (theClass) {\n    var proto = theClass.prototype;\n\n    var methods = [];\n\n    for (var methodName in proto) {\n      var m = proto[methodName];\n\n      if (typeof m !== 'function') {\n        continue;\n      }\n\n      if (methodName === 'constructor') {\n        continue;\n      }\n\n      methods.push(methodName);\n    }\n\n    return methods;\n  }\n\n  Utils.Decorate = function (SuperClass, DecoratorClass) {\n    var decoratedMethods = getMethods(DecoratorClass);\n    var superMethods = getMethods(SuperClass);\n\n    function DecoratedClass () {\n      var unshift = Array.prototype.unshift;\n\n      var argCount = DecoratorClass.prototype.constructor.length;\n\n      var calledConstructor = SuperClass.prototype.constructor;\n\n      if (argCount > 0) {\n        unshift.call(arguments, SuperClass.prototype.constructor);\n\n        calledConstructor = DecoratorClass.prototype.constructor;\n      }\n\n      calledConstructor.apply(this, arguments);\n    }\n\n    DecoratorClass.displayName = SuperClass.displayName;\n\n    function ctr () {\n      this.constructor = DecoratedClass;\n    }\n\n    DecoratedClass.prototype = new ctr();\n\n    for (var m = 0; m < superMethods.length; m++) {\n        var superMethod = superMethods[m];\n\n        DecoratedClass.prototype[superMethod] =\n          SuperClass.prototype[superMethod];\n    }\n\n    var calledMethod = function (methodName) {\n      // Stub out the original method if it's not decorating an actual method\n      var originalMethod = function () {};\n\n      if (methodName in DecoratedClass.prototype) {\n        originalMethod = DecoratedClass.prototype[methodName];\n      }\n\n      var decoratedMethod = DecoratorClass.prototype[methodName];\n\n      return function () {\n        var unshift = Array.prototype.unshift;\n\n        unshift.call(arguments, originalMethod);\n\n        return decoratedMethod.apply(this, arguments);\n      };\n    };\n\n    for (var d = 0; d < decoratedMethods.length; d++) {\n      var decoratedMethod = decoratedMethods[d];\n\n      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n    }\n\n    return DecoratedClass;\n  };\n\n  var Observable = function () {\n    this.listeners = {};\n  };\n\n  Observable.prototype.on = function (event, callback) {\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.listeners[event].push(callback);\n    } else {\n      this.listeners[event] = [callback];\n    }\n  };\n\n  Observable.prototype.trigger = function (event) {\n    var slice = Array.prototype.slice;\n\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.invoke(this.listeners[event], slice.call(arguments, 1));\n    }\n\n    if ('*' in this.listeners) {\n      this.invoke(this.listeners['*'], arguments);\n    }\n  };\n\n  Observable.prototype.invoke = function (listeners, params) {\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      listeners[i].apply(this, params);\n    }\n  };\n\n  Utils.Observable = Observable;\n\n  Utils.generateChars = function (length) {\n    var chars = '';\n\n    for (var i = 0; i < length; i++) {\n      var randomChar = Math.floor(Math.random() * 36);\n      chars += randomChar.toString(36);\n    }\n\n    return chars;\n  };\n\n  Utils.bind = function (func, context) {\n    return function () {\n      func.apply(context, arguments);\n    };\n  };\n\n  Utils._convertData = function (data) {\n    for (var originalKey in data) {\n      var keys = originalKey.split('-');\n\n      var dataLevel = data;\n\n      if (keys.length === 1) {\n        continue;\n      }\n\n      for (var k = 0; k < keys.length; k++) {\n        var key = keys[k];\n\n        // Lowercase the first letter\n        // By default, dash-separated becomes camelCase\n        key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n        if (!(key in dataLevel)) {\n          dataLevel[key] = {};\n        }\n\n        if (k == keys.length - 1) {\n          dataLevel[key] = data[originalKey];\n        }\n\n        dataLevel = dataLevel[key];\n      }\n\n      delete data[originalKey];\n    }\n\n    return data;\n  };\n\n  Utils.hasScroll = function (index, el) {\n    // Adapted from the function created by @ShadowScripter\n    // and adapted by @BillBarry on the Stack Exchange Code Review website.\n    // The original code can be found at\n    // http://codereview.stackexchange.com/q/13338\n    // and was designed to be used with the Sizzle selector engine.\n\n    var $el = $(el);\n    var overflowX = el.style.overflowX;\n    var overflowY = el.style.overflowY;\n\n    //Check both x and y declarations\n    if (overflowX === overflowY &&\n        (overflowY === 'hidden' || overflowY === 'visible')) {\n      return false;\n    }\n\n    if (overflowX === 'scroll' || overflowY === 'scroll') {\n      return true;\n    }\n\n    return ($el.innerHeight() < el.scrollHeight ||\n      $el.innerWidth() < el.scrollWidth);\n  };\n\n  Utils.escapeMarkup = function (markup) {\n    var replaceMap = {\n      '\\\\': '&#92;',\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '/': '&#47;'\n    };\n\n    // Do not try to escape the markup if it's not a string\n    if (typeof markup !== 'string') {\n      return markup;\n    }\n\n    return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n      return replaceMap[match];\n    });\n  };\n\n  // Append an array of jQuery nodes to a given element.\n  Utils.appendMany = function ($element, $nodes) {\n    // jQuery 1.7.x does not support $.fn.append() with an array\n    // Fall back to a jQuery object collection using $.fn.add()\n    if ($.fn.jquery.substr(0, 3) === '1.7') {\n      var $jqNodes = $();\n\n      $.map($nodes, function (node) {\n        $jqNodes = $jqNodes.add(node);\n      });\n\n      $nodes = $jqNodes;\n    }\n\n    $element.append($nodes);\n  };\n\n  return Utils;\n});\n\nS2.define('select2/results',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Results ($element, options, dataAdapter) {\n    this.$element = $element;\n    this.data = dataAdapter;\n    this.options = options;\n\n    Results.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Results, Utils.Observable);\n\n  Results.prototype.render = function () {\n    var $results = $(\n      '<ul class=\"select2-results__options\" role=\"tree\"></ul>'\n    );\n\n    if (this.options.get('multiple')) {\n      $results.attr('aria-multiselectable', 'true');\n    }\n\n    this.$results = $results;\n\n    return $results;\n  };\n\n  Results.prototype.clear = function () {\n    this.$results.empty();\n  };\n\n  Results.prototype.displayMessage = function (params) {\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    this.clear();\n    this.hideLoading();\n\n    var $message = $(\n      '<li role=\"treeitem\" class=\"select2-results__option\"></li>'\n    );\n\n    var message = this.options.get('translations').get(params.message);\n\n    $message.append(\n      escapeMarkup(\n        message(params.args)\n      )\n    );\n\n    this.$results.append($message);\n  };\n\n  Results.prototype.append = function (data) {\n    this.hideLoading();\n\n    var $options = [];\n\n    if (data.results == null || data.results.length === 0) {\n      if (this.$results.children().length === 0) {\n        this.trigger('results:message', {\n          message: 'noResults'\n        });\n      }\n\n      return;\n    }\n\n    data.results = this.sort(data.results);\n\n    for (var d = 0; d < data.results.length; d++) {\n      var item = data.results[d];\n\n      var $option = this.option(item);\n\n      $options.push($option);\n    }\n\n    this.$results.append($options);\n  };\n\n  Results.prototype.position = function ($results, $dropdown) {\n    var $resultsContainer = $dropdown.find('.select2-results');\n    $resultsContainer.append($results);\n  };\n\n  Results.prototype.sort = function (data) {\n    var sorter = this.options.get('sorter');\n\n    return sorter(data);\n  };\n\n  Results.prototype.setClasses = function () {\n    var self = this;\n\n    this.data.current(function (selected) {\n      var selectedIds = $.map(selected, function (s) {\n        return s.id.toString();\n      });\n\n      var $options = self.$results\n        .find('.select2-results__option[aria-selected]');\n\n      $options.each(function () {\n        var $option = $(this);\n\n        var item = $.data(this, 'data');\n\n        // id needs to be converted to a string when comparing\n        var id = '' + item.id;\n\n        if ((item.element != null && item.element.selected) ||\n            (item.element == null && $.inArray(id, selectedIds) > -1)) {\n          $option.attr('aria-selected', 'true');\n        } else {\n          $option.attr('aria-selected', 'false');\n        }\n      });\n\n      var $selected = $options.filter('[aria-selected=true]');\n\n      // Check if there are any selected options\n      if ($selected.length > 0) {\n        // If there are selected options, highlight the first\n        $selected.first().trigger('mouseenter');\n      } else {\n        // If there are no selected options, highlight the first option\n        // in the dropdown\n        $options.first().trigger('mouseenter');\n      }\n    });\n  };\n\n  Results.prototype.showLoading = function (params) {\n    this.hideLoading();\n\n    var loadingMore = this.options.get('translations').get('searching');\n\n    var loading = {\n      disabled: true,\n      loading: true,\n      text: loadingMore(params)\n    };\n    var $loading = this.option(loading);\n    $loading.className += ' loading-results';\n\n    this.$results.prepend($loading);\n  };\n\n  Results.prototype.hideLoading = function () {\n    this.$results.find('.loading-results').remove();\n  };\n\n  Results.prototype.option = function (data) {\n    var option = document.createElement('li');\n    option.className = 'select2-results__option';\n\n    var attrs = {\n      'role': 'treeitem',\n      'aria-selected': 'false'\n    };\n\n    if (data.disabled) {\n      delete attrs['aria-selected'];\n      attrs['aria-disabled'] = 'true';\n    }\n\n    if (data.id == null) {\n      delete attrs['aria-selected'];\n    }\n\n    if (data._resultId != null) {\n      option.id = data._resultId;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    if (data.children) {\n      attrs.role = 'group';\n      attrs['aria-label'] = data.text;\n      delete attrs['aria-selected'];\n    }\n\n    for (var attr in attrs) {\n      var val = attrs[attr];\n\n      option.setAttribute(attr, val);\n    }\n\n    if (data.children) {\n      var $option = $(option);\n\n      var label = document.createElement('strong');\n      label.className = 'select2-results__group';\n\n      var $label = $(label);\n      this.template(data, label);\n\n      var $children = [];\n\n      for (var c = 0; c < data.children.length; c++) {\n        var child = data.children[c];\n\n        var $child = this.option(child);\n\n        $children.push($child);\n      }\n\n      var $childrenContainer = $('<ul></ul>', {\n        'class': 'select2-results__options select2-results__options--nested'\n      });\n\n      $childrenContainer.append($children);\n\n      $option.append(label);\n      $option.append($childrenContainer);\n    } else {\n      this.template(data, option);\n    }\n\n    $.data(option, 'data', data);\n\n    return option;\n  };\n\n  Results.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-results';\n\n    this.$results.attr('id', id);\n\n    container.on('results:all', function (params) {\n      self.clear();\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('results:append', function (params) {\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('query', function (params) {\n      self.showLoading(params);\n    });\n\n    container.on('select', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('unselect', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expended=\"true\"\n      self.$results.attr('aria-expanded', 'true');\n      self.$results.attr('aria-hidden', 'false');\n\n      self.setClasses();\n      self.ensureHighlightVisible();\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expended=\"false\"\n      self.$results.attr('aria-expanded', 'false');\n      self.$results.attr('aria-hidden', 'true');\n      self.$results.removeAttr('aria-activedescendant');\n    });\n\n    container.on('results:toggle', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      $highlighted.trigger('mouseup');\n    });\n\n    container.on('results:select', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      var data = $highlighted.data('data');\n\n      if ($highlighted.attr('aria-selected') == 'true') {\n        self.trigger('close');\n      } else {\n        self.trigger('select', {\n          data: data\n        });\n      }\n    });\n\n    container.on('results:previous', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      // If we are already at te top, don't move further\n      if (currentIndex === 0) {\n        return;\n      }\n\n      var nextIndex = currentIndex - 1;\n\n      // If none are highlighted, highlight the first\n      if ($highlighted.length === 0) {\n        nextIndex = 0;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top;\n      var nextTop = $next.offset().top;\n      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextTop - currentOffset < 0) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:next', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      var nextIndex = currentIndex + 1;\n\n      // If we are at the last option, stay there\n      if (nextIndex >= $options.length) {\n        return;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var nextBottom = $next.offset().top + $next.outerHeight(false);\n      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextBottom > currentOffset) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      params.element.addClass('select2-results__option--highlighted');\n    });\n\n    container.on('results:message', function (params) {\n      self.displayMessage(params);\n    });\n\n    if ($.fn.mousewheel) {\n      this.$results.on('mousewheel', function (e) {\n        var top = self.$results.scrollTop();\n\n        var bottom = (\n          self.$results.get(0).scrollHeight -\n          self.$results.scrollTop() +\n          e.deltaY\n        );\n\n        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n        if (isAtTop) {\n          self.$results.scrollTop(0);\n\n          e.preventDefault();\n          e.stopPropagation();\n        } else if (isAtBottom) {\n          self.$results.scrollTop(\n            self.$results.get(0).scrollHeight - self.$results.height()\n          );\n\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      });\n    }\n\n    this.$results.on('mouseup', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var $this = $(this);\n\n      var data = $this.data('data');\n\n      if ($this.attr('aria-selected') === 'true') {\n        if (self.options.get('multiple')) {\n          self.trigger('unselect', {\n            originalEvent: evt,\n            data: data\n          });\n        } else {\n          self.trigger('close');\n        }\n\n        return;\n      }\n\n      self.trigger('select', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n\n    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var data = $(this).data('data');\n\n      self.getHighlightedResults()\n          .removeClass('select2-results__option--highlighted');\n\n      self.trigger('results:focus', {\n        data: data,\n        element: $(this)\n      });\n    });\n  };\n\n  Results.prototype.getHighlightedResults = function () {\n    var $highlighted = this.$results\n    .find('.select2-results__option--highlighted');\n\n    return $highlighted;\n  };\n\n  Results.prototype.destroy = function () {\n    this.$results.remove();\n  };\n\n  Results.prototype.ensureHighlightVisible = function () {\n    var $highlighted = this.getHighlightedResults();\n\n    if ($highlighted.length === 0) {\n      return;\n    }\n\n    var $options = this.$results.find('[aria-selected]');\n\n    var currentIndex = $options.index($highlighted);\n\n    var currentOffset = this.$results.offset().top;\n    var nextTop = $highlighted.offset().top;\n    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n\n    var offsetDelta = nextTop - currentOffset;\n    nextOffset -= $highlighted.outerHeight(false) * 2;\n\n    if (currentIndex <= 2) {\n      this.$results.scrollTop(0);\n    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n      this.$results.scrollTop(nextOffset);\n    }\n  };\n\n  Results.prototype.template = function (result, container) {\n    var template = this.options.get('templateResult');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    var content = template(result);\n\n    if (content == null) {\n      container.style.display = 'none';\n    } else if (typeof content === 'string') {\n      container.innerHTML = escapeMarkup(content);\n    } else {\n      $(container).append(content);\n    }\n  };\n\n  return Results;\n});\n\nS2.define('select2/keys',[\n\n], function () {\n  var KEYS = {\n    BACKSPACE: 8,\n    TAB: 9,\n    ENTER: 13,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    ESC: 27,\n    SPACE: 32,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    END: 35,\n    HOME: 36,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    DELETE: 46\n  };\n\n  return KEYS;\n});\n\nS2.define('select2/selection/base',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function BaseSelection ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    BaseSelection.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseSelection, Utils.Observable);\n\n  BaseSelection.prototype.render = function () {\n    var $selection = $(\n      '<span class=\"select2-selection\" role=\"combobox\" ' +\n      'aria-autocomplete=\"list\" aria-haspopup=\"true\" aria-expanded=\"false\">' +\n      '</span>'\n    );\n\n    this._tabindex = 0;\n\n    if (this.$element.data('old-tabindex') != null) {\n      this._tabindex = this.$element.data('old-tabindex');\n    } else if (this.$element.attr('tabindex') != null) {\n      this._tabindex = this.$element.attr('tabindex');\n    }\n\n    $selection.attr('title', this.$element.attr('title'));\n    $selection.attr('tabindex', this._tabindex);\n\n    this.$selection = $selection;\n\n    return $selection;\n  };\n\n  BaseSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-container';\n    var resultsId = container.id + '-results';\n\n    this.container = container;\n\n    this.$selection.on('focus', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('blur', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      if (evt.which === KEYS.SPACE) {\n        evt.preventDefault();\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      self.$selection.attr('aria-activedescendant', params.data._resultId);\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expanded=\"true\"\n      self.$selection.attr('aria-expanded', 'true');\n      self.$selection.attr('aria-owns', resultsId);\n\n      self._attachCloseHandler(container);\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expanded=\"false\"\n      self.$selection.attr('aria-expanded', 'false');\n      self.$selection.removeAttr('aria-activedescendant');\n      self.$selection.removeAttr('aria-owns');\n\n      self.$selection.focus();\n\n      self._detachCloseHandler(container);\n    });\n\n    container.on('enable', function () {\n      self.$selection.attr('tabindex', self._tabindex);\n    });\n\n    container.on('disable', function () {\n      self.$selection.attr('tabindex', '-1');\n    });\n  };\n\n  BaseSelection.prototype._attachCloseHandler = function (container) {\n    var self = this;\n\n    $(document.body).on('mousedown.select2.' + container.id, function (e) {\n      var $target = $(e.target);\n\n      var $select = $target.closest('.select2');\n\n      var $all = $('.select2.select2-container--open');\n\n      $all.each(function () {\n        var $this = $(this);\n\n        if (this == $select[0]) {\n          return;\n        }\n\n        var $element = $this.data('element');\n\n        $element.select2('close');\n      });\n    });\n  };\n\n  BaseSelection.prototype._detachCloseHandler = function (container) {\n    $(document.body).off('mousedown.select2.' + container.id);\n  };\n\n  BaseSelection.prototype.position = function ($selection, $container) {\n    var $selectionContainer = $container.find('.selection');\n    $selectionContainer.append($selection);\n  };\n\n  BaseSelection.prototype.destroy = function () {\n    this._detachCloseHandler(this.container);\n  };\n\n  BaseSelection.prototype.update = function (data) {\n    throw new Error('The `update` method must be defined in child classes.');\n  };\n\n  return BaseSelection;\n});\n\nS2.define('select2/selection/single',[\n  'jquery',\n  './base',\n  '../utils',\n  '../keys'\n], function ($, BaseSelection, Utils, KEYS) {\n  function SingleSelection () {\n    SingleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(SingleSelection, BaseSelection);\n\n  SingleSelection.prototype.render = function () {\n    var $selection = SingleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--single');\n\n    $selection.html(\n      '<span class=\"select2-selection__rendered\"></span>' +\n      '<span class=\"select2-selection__arrow\" role=\"presentation\">' +\n        '<b role=\"presentation\"></b>' +\n      '</span>'\n    );\n\n    return $selection;\n  };\n\n  SingleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    SingleSelection.__super__.bind.apply(this, arguments);\n\n    var id = container.id + '-container';\n\n    this.$selection.find('.select2-selection__rendered').attr('id', id);\n    this.$selection.attr('aria-labelledby', id);\n\n    this.$selection.on('mousedown', function (evt) {\n      // Only respond to left clicks\n      if (evt.which !== 1) {\n        return;\n      }\n\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('focus', function (evt) {\n      // User focuses on the container\n    });\n\n    this.$selection.on('blur', function (evt) {\n      // User exits the container\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n  };\n\n  SingleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  SingleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  SingleSelection.prototype.selectionContainer = function () {\n    return $('<span></span>');\n  };\n\n  SingleSelection.prototype.update = function (data) {\n    if (data.length === 0) {\n      this.clear();\n      return;\n    }\n\n    var selection = data[0];\n\n    var formatted = this.display(selection);\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    $rendered.empty().append(formatted);\n    $rendered.prop('title', selection.title || selection.text);\n  };\n\n  return SingleSelection;\n});\n\nS2.define('select2/selection/multiple',[\n  'jquery',\n  './base',\n  '../utils'\n], function ($, BaseSelection, Utils) {\n  function MultipleSelection ($element, options) {\n    MultipleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(MultipleSelection, BaseSelection);\n\n  MultipleSelection.prototype.render = function () {\n    var $selection = MultipleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--multiple');\n\n    $selection.html(\n      '<ul class=\"select2-selection__rendered\"></ul>'\n    );\n\n    return $selection;\n  };\n\n  MultipleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    MultipleSelection.__super__.bind.apply(this, arguments);\n\n    this.$selection.on('click', function (evt) {\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('click', '.select2-selection__choice__remove',\n      function (evt) {\n      var $remove = $(this);\n      var $selection = $remove.parent();\n\n      var data = $selection.data('data');\n\n      self.trigger('unselect', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n  };\n\n  MultipleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  MultipleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  MultipleSelection.prototype.selectionContainer = function () {\n    var $container = $(\n      '<li class=\"select2-selection__choice\">' +\n        '<span class=\"select2-selection__choice__remove\" role=\"presentation\">' +\n          '&times;' +\n        '</span>' +\n      '</li>'\n    );\n\n    return $container;\n  };\n\n  MultipleSelection.prototype.update = function (data) {\n    this.clear();\n\n    if (data.length === 0) {\n      return;\n    }\n\n    var $selections = [];\n\n    for (var d = 0; d < data.length; d++) {\n      var selection = data[d];\n\n      var formatted = this.display(selection);\n      var $selection = this.selectionContainer();\n\n      $selection.append(formatted);\n      $selection.prop('title', selection.title || selection.text);\n\n      $selection.data('data', selection);\n\n      $selections.push($selection);\n    }\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n\n    Utils.appendMany($rendered, $selections);\n  };\n\n  return MultipleSelection;\n});\n\nS2.define('select2/selection/placeholder',[\n  '../utils'\n], function (Utils) {\n  function Placeholder (decorated, $element, options) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options);\n  }\n\n  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n    var $placeholder = this.selectionContainer();\n\n    $placeholder.html(this.display(placeholder));\n    $placeholder.addClass('select2-selection__placeholder')\n                .removeClass('select2-selection__choice');\n\n    return $placeholder;\n  };\n\n  Placeholder.prototype.update = function (decorated, data) {\n    var singlePlaceholder = (\n      data.length == 1 && data[0].id != this.placeholder.id\n    );\n    var multipleSelections = data.length > 1;\n\n    if (multipleSelections || singlePlaceholder) {\n      return decorated.call(this, data);\n    }\n\n    this.clear();\n\n    var $placeholder = this.createPlaceholder(this.placeholder);\n\n    this.$selection.find('.select2-selection__rendered').append($placeholder);\n  };\n\n  return Placeholder;\n});\n\nS2.define('select2/selection/allowClear',[\n  'jquery',\n  '../keys'\n], function ($, KEYS) {\n  function AllowClear () { }\n\n  AllowClear.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    if (this.placeholder == null) {\n      if (this.options.get('debug') && window.console && console.error) {\n        console.error(\n          'Select2: The `allowClear` option should be used in combination ' +\n          'with the `placeholder` option.'\n        );\n      }\n    }\n\n    this.$selection.on('mousedown', '.select2-selection__clear',\n      function (evt) {\n        self._handleClear(evt);\n    });\n\n    container.on('keypress', function (evt) {\n      self._handleKeyboardClear(evt, container);\n    });\n  };\n\n  AllowClear.prototype._handleClear = function (_, evt) {\n    // Ignore the event if it is disabled\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    var $clear = this.$selection.find('.select2-selection__clear');\n\n    // Ignore the event if nothing has been selected\n    if ($clear.length === 0) {\n      return;\n    }\n\n    evt.stopPropagation();\n\n    var data = $clear.data('data');\n\n    for (var d = 0; d < data.length; d++) {\n      var unselectData = {\n        data: data[d]\n      };\n\n      // Trigger the `unselect` event, so people can prevent it from being\n      // cleared.\n      this.trigger('unselect', unselectData);\n\n      // If the event was prevented, don't clear it out.\n      if (unselectData.prevented) {\n        return;\n      }\n    }\n\n    this.$element.val(this.placeholder.id).trigger('change');\n\n    this.trigger('toggle');\n  };\n\n  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n    if (container.isOpen()) {\n      return;\n    }\n\n    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n      this._handleClear(evt);\n    }\n  };\n\n  AllowClear.prototype.update = function (decorated, data) {\n    decorated.call(this, data);\n\n    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||\n        data.length === 0) {\n      return;\n    }\n\n    var $remove = $(\n      '<span class=\"select2-selection__clear\">' +\n        '&times;' +\n      '</span>'\n    );\n    $remove.data('data', data);\n\n    this.$selection.find('.select2-selection__rendered').prepend($remove);\n  };\n\n  return AllowClear;\n});\n\nS2.define('select2/selection/search',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function Search (decorated, $element, options) {\n    decorated.call(this, $element, options);\n  }\n\n  Search.prototype.render = function (decorated) {\n    var $search = $(\n      '<li class=\"select2-search select2-search--inline\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</li>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    var $rendered = decorated.call(this);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n      self.$search.focus();\n    });\n\n    container.on('enable', function () {\n      self.$search.prop('disabled', false);\n    });\n\n    container.on('disable', function () {\n      self.$search.prop('disabled', true);\n    });\n\n    this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n      evt.stopPropagation();\n\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n\n      var key = evt.which;\n\n      if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n        var $previousChoice = self.$searchContainer\n          .prev('.select2-selection__choice');\n\n        if ($previousChoice.length > 0) {\n          var item = $previousChoice.data('data');\n\n          self.searchRemoveChoice(item);\n\n          evt.preventDefault();\n        }\n      }\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$selection.on('input', '.select2-search--inline', function (evt) {\n      // Unbind the duplicated `keyup` event\n      self.$selection.off('keyup.search');\n    });\n\n    this.$selection.on('keyup.search input', '.select2-search--inline',\n        function (evt) {\n      self.handleSearch(evt);\n    });\n  };\n\n  Search.prototype.createPlaceholder = function (decorated, placeholder) {\n    this.$search.attr('placeholder', placeholder.text);\n  };\n\n  Search.prototype.update = function (decorated, data) {\n    this.$search.attr('placeholder', '');\n\n    decorated.call(this, data);\n\n    this.$selection.find('.select2-selection__rendered')\n                   .append(this.$searchContainer);\n\n    this.resizeSearch();\n  };\n\n  Search.prototype.handleSearch = function () {\n    this.resizeSearch();\n\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.searchRemoveChoice = function (decorated, item) {\n    this.trigger('unselect', {\n      data: item\n    });\n\n    this.trigger('open');\n\n    this.$search.val(item.text + ' ');\n  };\n\n  Search.prototype.resizeSearch = function () {\n    this.$search.css('width', '25px');\n\n    var width = '';\n\n    if (this.$search.attr('placeholder') !== '') {\n      width = this.$selection.find('.select2-selection__rendered').innerWidth();\n    } else {\n      var minimumWidth = this.$search.val().length + 1;\n\n      width = (minimumWidth * 0.75) + 'em';\n    }\n\n    this.$search.css('width', width);\n  };\n\n  return Search;\n});\n\nS2.define('select2/selection/eventRelay',[\n  'jquery'\n], function ($) {\n  function EventRelay () { }\n\n  EventRelay.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n    var relayEvents = [\n      'open', 'opening',\n      'close', 'closing',\n      'select', 'selecting',\n      'unselect', 'unselecting'\n    ];\n\n    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];\n\n    decorated.call(this, container, $container);\n\n    container.on('*', function (name, params) {\n      // Ignore events that should not be relayed\n      if ($.inArray(name, relayEvents) === -1) {\n        return;\n      }\n\n      // The parameters should always be an object\n      params = params || {};\n\n      // Generate the jQuery event for the Select2 event\n      var evt = $.Event('select2:' + name, {\n        params: params\n      });\n\n      self.$element.trigger(evt);\n\n      // Only handle preventable events if it was one\n      if ($.inArray(name, preventableEvents) === -1) {\n        return;\n      }\n\n      params.prevented = evt.isDefaultPrevented();\n    });\n  };\n\n  return EventRelay;\n});\n\nS2.define('select2/translation',[\n  'jquery',\n  'require'\n], function ($, require) {\n  function Translation (dict) {\n    this.dict = dict || {};\n  }\n\n  Translation.prototype.all = function () {\n    return this.dict;\n  };\n\n  Translation.prototype.get = function (key) {\n    return this.dict[key];\n  };\n\n  Translation.prototype.extend = function (translation) {\n    this.dict = $.extend({}, translation.all(), this.dict);\n  };\n\n  // Static functions\n\n  Translation._cache = {};\n\n  Translation.loadPath = function (path) {\n    if (!(path in Translation._cache)) {\n      var translations = require(path);\n\n      Translation._cache[path] = translations;\n    }\n\n    return new Translation(Translation._cache[path]);\n  };\n\n  return Translation;\n});\n\nS2.define('select2/diacritics',[\n\n], function () {\n  var diacritics = {\n    '\\u24B6': 'A',\n    '\\uFF21': 'A',\n    '\\u00C0': 'A',\n    '\\u00C1': 'A',\n    '\\u00C2': 'A',\n    '\\u1EA6': 'A',\n    '\\u1EA4': 'A',\n    '\\u1EAA': 'A',\n    '\\u1EA8': 'A',\n    '\\u00C3': 'A',\n    '\\u0100': 'A',\n    '\\u0102': 'A',\n    '\\u1EB0': 'A',\n    '\\u1EAE': 'A',\n    '\\u1EB4': 'A',\n    '\\u1EB2': 'A',\n    '\\u0226': 'A',\n    '\\u01E0': 'A',\n    '\\u00C4': 'A',\n    '\\u01DE': 'A',\n    '\\u1EA2': 'A',\n    '\\u00C5': 'A',\n    '\\u01FA': 'A',\n    '\\u01CD': 'A',\n    '\\u0200': 'A',\n    '\\u0202': 'A',\n    '\\u1EA0': 'A',\n    '\\u1EAC': 'A',\n    '\\u1EB6': 'A',\n    '\\u1E00': 'A',\n    '\\u0104': 'A',\n    '\\u023A': 'A',\n    '\\u2C6F': 'A',\n    '\\uA732': 'AA',\n    '\\u00C6': 'AE',\n    '\\u01FC': 'AE',\n    '\\u01E2': 'AE',\n    '\\uA734': 'AO',\n    '\\uA736': 'AU',\n    '\\uA738': 'AV',\n    '\\uA73A': 'AV',\n    '\\uA73C': 'AY',\n    '\\u24B7': 'B',\n    '\\uFF22': 'B',\n    '\\u1E02': 'B',\n    '\\u1E04': 'B',\n    '\\u1E06': 'B',\n    '\\u0243': 'B',\n    '\\u0182': 'B',\n    '\\u0181': 'B',\n    '\\u24B8': 'C',\n    '\\uFF23': 'C',\n    '\\u0106': 'C',\n    '\\u0108': 'C',\n    '\\u010A': 'C',\n    '\\u010C': 'C',\n    '\\u00C7': 'C',\n    '\\u1E08': 'C',\n    '\\u0187': 'C',\n    '\\u023B': 'C',\n    '\\uA73E': 'C',\n    '\\u24B9': 'D',\n    '\\uFF24': 'D',\n    '\\u1E0A': 'D',\n    '\\u010E': 'D',\n    '\\u1E0C': 'D',\n    '\\u1E10': 'D',\n    '\\u1E12': 'D',\n    '\\u1E0E': 'D',\n    '\\u0110': 'D',\n    '\\u018B': 'D',\n    '\\u018A': 'D',\n    '\\u0189': 'D',\n    '\\uA779': 'D',\n    '\\u01F1': 'DZ',\n    '\\u01C4': 'DZ',\n    '\\u01F2': 'Dz',\n    '\\u01C5': 'Dz',\n    '\\u24BA': 'E',\n    '\\uFF25': 'E',\n    '\\u00C8': 'E',\n    '\\u00C9': 'E',\n    '\\u00CA': 'E',\n    '\\u1EC0': 'E',\n    '\\u1EBE': 'E',\n    '\\u1EC4': 'E',\n    '\\u1EC2': 'E',\n    '\\u1EBC': 'E',\n    '\\u0112': 'E',\n    '\\u1E14': 'E',\n    '\\u1E16': 'E',\n    '\\u0114': 'E',\n    '\\u0116': 'E',\n    '\\u00CB': 'E',\n    '\\u1EBA': 'E',\n    '\\u011A': 'E',\n    '\\u0204': 'E',\n    '\\u0206': 'E',\n    '\\u1EB8': 'E',\n    '\\u1EC6': 'E',\n    '\\u0228': 'E',\n    '\\u1E1C': 'E',\n    '\\u0118': 'E',\n    '\\u1E18': 'E',\n    '\\u1E1A': 'E',\n    '\\u0190': 'E',\n    '\\u018E': 'E',\n    '\\u24BB': 'F',\n    '\\uFF26': 'F',\n    '\\u1E1E': 'F',\n    '\\u0191': 'F',\n    '\\uA77B': 'F',\n    '\\u24BC': 'G',\n    '\\uFF27': 'G',\n    '\\u01F4': 'G',\n    '\\u011C': 'G',\n    '\\u1E20': 'G',\n    '\\u011E': 'G',\n    '\\u0120': 'G',\n    '\\u01E6': 'G',\n    '\\u0122': 'G',\n    '\\u01E4': 'G',\n    '\\u0193': 'G',\n    '\\uA7A0': 'G',\n    '\\uA77D': 'G',\n    '\\uA77E': 'G',\n    '\\u24BD': 'H',\n    '\\uFF28': 'H',\n    '\\u0124': 'H',\n    '\\u1E22': 'H',\n    '\\u1E26': 'H',\n    '\\u021E': 'H',\n    '\\u1E24': 'H',\n    '\\u1E28': 'H',\n    '\\u1E2A': 'H',\n    '\\u0126': 'H',\n    '\\u2C67': 'H',\n    '\\u2C75': 'H',\n    '\\uA78D': 'H',\n    '\\u24BE': 'I',\n    '\\uFF29': 'I',\n    '\\u00CC': 'I',\n    '\\u00CD': 'I',\n    '\\u00CE': 'I',\n    '\\u0128': 'I',\n    '\\u012A': 'I',\n    '\\u012C': 'I',\n    '\\u0130': 'I',\n    '\\u00CF': 'I',\n    '\\u1E2E': 'I',\n    '\\u1EC8': 'I',\n    '\\u01CF': 'I',\n    '\\u0208': 'I',\n    '\\u020A': 'I',\n    '\\u1ECA': 'I',\n    '\\u012E': 'I',\n    '\\u1E2C': 'I',\n    '\\u0197': 'I',\n    '\\u24BF': 'J',\n    '\\uFF2A': 'J',\n    '\\u0134': 'J',\n    '\\u0248': 'J',\n    '\\u24C0': 'K',\n    '\\uFF2B': 'K',\n    '\\u1E30': 'K',\n    '\\u01E8': 'K',\n    '\\u1E32': 'K',\n    '\\u0136': 'K',\n    '\\u1E34': 'K',\n    '\\u0198': 'K',\n    '\\u2C69': 'K',\n    '\\uA740': 'K',\n    '\\uA742': 'K',\n    '\\uA744': 'K',\n    '\\uA7A2': 'K',\n    '\\u24C1': 'L',\n    '\\uFF2C': 'L',\n    '\\u013F': 'L',\n    '\\u0139': 'L',\n    '\\u013D': 'L',\n    '\\u1E36': 'L',\n    '\\u1E38': 'L',\n    '\\u013B': 'L',\n    '\\u1E3C': 'L',\n    '\\u1E3A': 'L',\n    '\\u0141': 'L',\n    '\\u023D': 'L',\n    '\\u2C62': 'L',\n    '\\u2C60': 'L',\n    '\\uA748': 'L',\n    '\\uA746': 'L',\n    '\\uA780': 'L',\n    '\\u01C7': 'LJ',\n    '\\u01C8': 'Lj',\n    '\\u24C2': 'M',\n    '\\uFF2D': 'M',\n    '\\u1E3E': 'M',\n    '\\u1E40': 'M',\n    '\\u1E42': 'M',\n    '\\u2C6E': 'M',\n    '\\u019C': 'M',\n    '\\u24C3': 'N',\n    '\\uFF2E': 'N',\n    '\\u01F8': 'N',\n    '\\u0143': 'N',\n    '\\u00D1': 'N',\n    '\\u1E44': 'N',\n    '\\u0147': 'N',\n    '\\u1E46': 'N',\n    '\\u0145': 'N',\n    '\\u1E4A': 'N',\n    '\\u1E48': 'N',\n    '\\u0220': 'N',\n    '\\u019D': 'N',\n    '\\uA790': 'N',\n    '\\uA7A4': 'N',\n    '\\u01CA': 'NJ',\n    '\\u01CB': 'Nj',\n    '\\u24C4': 'O',\n    '\\uFF2F': 'O',\n    '\\u00D2': 'O',\n    '\\u00D3': 'O',\n    '\\u00D4': 'O',\n    '\\u1ED2': 'O',\n    '\\u1ED0': 'O',\n    '\\u1ED6': 'O',\n    '\\u1ED4': 'O',\n    '\\u00D5': 'O',\n    '\\u1E4C': 'O',\n    '\\u022C': 'O',\n    '\\u1E4E': 'O',\n    '\\u014C': 'O',\n    '\\u1E50': 'O',\n    '\\u1E52': 'O',\n    '\\u014E': 'O',\n    '\\u022E': 'O',\n    '\\u0230': 'O',\n    '\\u00D6': 'O',\n    '\\u022A': 'O',\n    '\\u1ECE': 'O',\n    '\\u0150': 'O',\n    '\\u01D1': 'O',\n    '\\u020C': 'O',\n    '\\u020E': 'O',\n    '\\u01A0': 'O',\n    '\\u1EDC': 'O',\n    '\\u1EDA': 'O',\n    '\\u1EE0': 'O',\n    '\\u1EDE': 'O',\n    '\\u1EE2': 'O',\n    '\\u1ECC': 'O',\n    '\\u1ED8': 'O',\n    '\\u01EA': 'O',\n    '\\u01EC': 'O',\n    '\\u00D8': 'O',\n    '\\u01FE': 'O',\n    '\\u0186': 'O',\n    '\\u019F': 'O',\n    '\\uA74A': 'O',\n    '\\uA74C': 'O',\n    '\\u01A2': 'OI',\n    '\\uA74E': 'OO',\n    '\\u0222': 'OU',\n    '\\u24C5': 'P',\n    '\\uFF30': 'P',\n    '\\u1E54': 'P',\n    '\\u1E56': 'P',\n    '\\u01A4': 'P',\n    '\\u2C63': 'P',\n    '\\uA750': 'P',\n    '\\uA752': 'P',\n    '\\uA754': 'P',\n    '\\u24C6': 'Q',\n    '\\uFF31': 'Q',\n    '\\uA756': 'Q',\n    '\\uA758': 'Q',\n    '\\u024A': 'Q',\n    '\\u24C7': 'R',\n    '\\uFF32': 'R',\n    '\\u0154': 'R',\n    '\\u1E58': 'R',\n    '\\u0158': 'R',\n    '\\u0210': 'R',\n    '\\u0212': 'R',\n    '\\u1E5A': 'R',\n    '\\u1E5C': 'R',\n    '\\u0156': 'R',\n    '\\u1E5E': 'R',\n    '\\u024C': 'R',\n    '\\u2C64': 'R',\n    '\\uA75A': 'R',\n    '\\uA7A6': 'R',\n    '\\uA782': 'R',\n    '\\u24C8': 'S',\n    '\\uFF33': 'S',\n    '\\u1E9E': 'S',\n    '\\u015A': 'S',\n    '\\u1E64': 'S',\n    '\\u015C': 'S',\n    '\\u1E60': 'S',\n    '\\u0160': 'S',\n    '\\u1E66': 'S',\n    '\\u1E62': 'S',\n    '\\u1E68': 'S',\n    '\\u0218': 'S',\n    '\\u015E': 'S',\n    '\\u2C7E': 'S',\n    '\\uA7A8': 'S',\n    '\\uA784': 'S',\n    '\\u24C9': 'T',\n    '\\uFF34': 'T',\n    '\\u1E6A': 'T',\n    '\\u0164': 'T',\n    '\\u1E6C': 'T',\n    '\\u021A': 'T',\n    '\\u0162': 'T',\n    '\\u1E70': 'T',\n    '\\u1E6E': 'T',\n    '\\u0166': 'T',\n    '\\u01AC': 'T',\n    '\\u01AE': 'T',\n    '\\u023E': 'T',\n    '\\uA786': 'T',\n    '\\uA728': 'TZ',\n    '\\u24CA': 'U',\n    '\\uFF35': 'U',\n    '\\u00D9': 'U',\n    '\\u00DA': 'U',\n    '\\u00DB': 'U',\n    '\\u0168': 'U',\n    '\\u1E78': 'U',\n    '\\u016A': 'U',\n    '\\u1E7A': 'U',\n    '\\u016C': 'U',\n    '\\u00DC': 'U',\n    '\\u01DB': 'U',\n    '\\u01D7': 'U',\n    '\\u01D5': 'U',\n    '\\u01D9': 'U',\n    '\\u1EE6': 'U',\n    '\\u016E': 'U',\n    '\\u0170': 'U',\n    '\\u01D3': 'U',\n    '\\u0214': 'U',\n    '\\u0216': 'U',\n    '\\u01AF': 'U',\n    '\\u1EEA': 'U',\n    '\\u1EE8': 'U',\n    '\\u1EEE': 'U',\n    '\\u1EEC': 'U',\n    '\\u1EF0': 'U',\n    '\\u1EE4': 'U',\n    '\\u1E72': 'U',\n    '\\u0172': 'U',\n    '\\u1E76': 'U',\n    '\\u1E74': 'U',\n    '\\u0244': 'U',\n    '\\u24CB': 'V',\n    '\\uFF36': 'V',\n    '\\u1E7C': 'V',\n    '\\u1E7E': 'V',\n    '\\u01B2': 'V',\n    '\\uA75E': 'V',\n    '\\u0245': 'V',\n    '\\uA760': 'VY',\n    '\\u24CC': 'W',\n    '\\uFF37': 'W',\n    '\\u1E80': 'W',\n    '\\u1E82': 'W',\n    '\\u0174': 'W',\n    '\\u1E86': 'W',\n    '\\u1E84': 'W',\n    '\\u1E88': 'W',\n    '\\u2C72': 'W',\n    '\\u24CD': 'X',\n    '\\uFF38': 'X',\n    '\\u1E8A': 'X',\n    '\\u1E8C': 'X',\n    '\\u24CE': 'Y',\n    '\\uFF39': 'Y',\n    '\\u1EF2': 'Y',\n    '\\u00DD': 'Y',\n    '\\u0176': 'Y',\n    '\\u1EF8': 'Y',\n    '\\u0232': 'Y',\n    '\\u1E8E': 'Y',\n    '\\u0178': 'Y',\n    '\\u1EF6': 'Y',\n    '\\u1EF4': 'Y',\n    '\\u01B3': 'Y',\n    '\\u024E': 'Y',\n    '\\u1EFE': 'Y',\n    '\\u24CF': 'Z',\n    '\\uFF3A': 'Z',\n    '\\u0179': 'Z',\n    '\\u1E90': 'Z',\n    '\\u017B': 'Z',\n    '\\u017D': 'Z',\n    '\\u1E92': 'Z',\n    '\\u1E94': 'Z',\n    '\\u01B5': 'Z',\n    '\\u0224': 'Z',\n    '\\u2C7F': 'Z',\n    '\\u2C6B': 'Z',\n    '\\uA762': 'Z',\n    '\\u24D0': 'a',\n    '\\uFF41': 'a',\n    '\\u1E9A': 'a',\n    '\\u00E0': 'a',\n    '\\u00E1': 'a',\n    '\\u00E2': 'a',\n    '\\u1EA7': 'a',\n    '\\u1EA5': 'a',\n    '\\u1EAB': 'a',\n    '\\u1EA9': 'a',\n    '\\u00E3': 'a',\n    '\\u0101': 'a',\n    '\\u0103': 'a',\n    '\\u1EB1': 'a',\n    '\\u1EAF': 'a',\n    '\\u1EB5': 'a',\n    '\\u1EB3': 'a',\n    '\\u0227': 'a',\n    '\\u01E1': 'a',\n    '\\u00E4': 'a',\n    '\\u01DF': 'a',\n    '\\u1EA3': 'a',\n    '\\u00E5': 'a',\n    '\\u01FB': 'a',\n    '\\u01CE': 'a',\n    '\\u0201': 'a',\n    '\\u0203': 'a',\n    '\\u1EA1': 'a',\n    '\\u1EAD': 'a',\n    '\\u1EB7': 'a',\n    '\\u1E01': 'a',\n    '\\u0105': 'a',\n    '\\u2C65': 'a',\n    '\\u0250': 'a',\n    '\\uA733': 'aa',\n    '\\u00E6': 'ae',\n    '\\u01FD': 'ae',\n    '\\u01E3': 'ae',\n    '\\uA735': 'ao',\n    '\\uA737': 'au',\n    '\\uA739': 'av',\n    '\\uA73B': 'av',\n    '\\uA73D': 'ay',\n    '\\u24D1': 'b',\n    '\\uFF42': 'b',\n    '\\u1E03': 'b',\n    '\\u1E05': 'b',\n    '\\u1E07': 'b',\n    '\\u0180': 'b',\n    '\\u0183': 'b',\n    '\\u0253': 'b',\n    '\\u24D2': 'c',\n    '\\uFF43': 'c',\n    '\\u0107': 'c',\n    '\\u0109': 'c',\n    '\\u010B': 'c',\n    '\\u010D': 'c',\n    '\\u00E7': 'c',\n    '\\u1E09': 'c',\n    '\\u0188': 'c',\n    '\\u023C': 'c',\n    '\\uA73F': 'c',\n    '\\u2184': 'c',\n    '\\u24D3': 'd',\n    '\\uFF44': 'd',\n    '\\u1E0B': 'd',\n    '\\u010F': 'd',\n    '\\u1E0D': 'd',\n    '\\u1E11': 'd',\n    '\\u1E13': 'd',\n    '\\u1E0F': 'd',\n    '\\u0111': 'd',\n    '\\u018C': 'd',\n    '\\u0256': 'd',\n    '\\u0257': 'd',\n    '\\uA77A': 'd',\n    '\\u01F3': 'dz',\n    '\\u01C6': 'dz',\n    '\\u24D4': 'e',\n    '\\uFF45': 'e',\n    '\\u00E8': 'e',\n    '\\u00E9': 'e',\n    '\\u00EA': 'e',\n    '\\u1EC1': 'e',\n    '\\u1EBF': 'e',\n    '\\u1EC5': 'e',\n    '\\u1EC3': 'e',\n    '\\u1EBD': 'e',\n    '\\u0113': 'e',\n    '\\u1E15': 'e',\n    '\\u1E17': 'e',\n    '\\u0115': 'e',\n    '\\u0117': 'e',\n    '\\u00EB': 'e',\n    '\\u1EBB': 'e',\n    '\\u011B': 'e',\n    '\\u0205': 'e',\n    '\\u0207': 'e',\n    '\\u1EB9': 'e',\n    '\\u1EC7': 'e',\n    '\\u0229': 'e',\n    '\\u1E1D': 'e',\n    '\\u0119': 'e',\n    '\\u1E19': 'e',\n    '\\u1E1B': 'e',\n    '\\u0247': 'e',\n    '\\u025B': 'e',\n    '\\u01DD': 'e',\n    '\\u24D5': 'f',\n    '\\uFF46': 'f',\n    '\\u1E1F': 'f',\n    '\\u0192': 'f',\n    '\\uA77C': 'f',\n    '\\u24D6': 'g',\n    '\\uFF47': 'g',\n    '\\u01F5': 'g',\n    '\\u011D': 'g',\n    '\\u1E21': 'g',\n    '\\u011F': 'g',\n    '\\u0121': 'g',\n    '\\u01E7': 'g',\n    '\\u0123': 'g',\n    '\\u01E5': 'g',\n    '\\u0260': 'g',\n    '\\uA7A1': 'g',\n    '\\u1D79': 'g',\n    '\\uA77F': 'g',\n    '\\u24D7': 'h',\n    '\\uFF48': 'h',\n    '\\u0125': 'h',\n    '\\u1E23': 'h',\n    '\\u1E27': 'h',\n    '\\u021F': 'h',\n    '\\u1E25': 'h',\n    '\\u1E29': 'h',\n    '\\u1E2B': 'h',\n    '\\u1E96': 'h',\n    '\\u0127': 'h',\n    '\\u2C68': 'h',\n    '\\u2C76': 'h',\n    '\\u0265': 'h',\n    '\\u0195': 'hv',\n    '\\u24D8': 'i',\n    '\\uFF49': 'i',\n    '\\u00EC': 'i',\n    '\\u00ED': 'i',\n    '\\u00EE': 'i',\n    '\\u0129': 'i',\n    '\\u012B': 'i',\n    '\\u012D': 'i',\n    '\\u00EF': 'i',\n    '\\u1E2F': 'i',\n    '\\u1EC9': 'i',\n    '\\u01D0': 'i',\n    '\\u0209': 'i',\n    '\\u020B': 'i',\n    '\\u1ECB': 'i',\n    '\\u012F': 'i',\n    '\\u1E2D': 'i',\n    '\\u0268': 'i',\n    '\\u0131': 'i',\n    '\\u24D9': 'j',\n    '\\uFF4A': 'j',\n    '\\u0135': 'j',\n    '\\u01F0': 'j',\n    '\\u0249': 'j',\n    '\\u24DA': 'k',\n    '\\uFF4B': 'k',\n    '\\u1E31': 'k',\n    '\\u01E9': 'k',\n    '\\u1E33': 'k',\n    '\\u0137': 'k',\n    '\\u1E35': 'k',\n    '\\u0199': 'k',\n    '\\u2C6A': 'k',\n    '\\uA741': 'k',\n    '\\uA743': 'k',\n    '\\uA745': 'k',\n    '\\uA7A3': 'k',\n    '\\u24DB': 'l',\n    '\\uFF4C': 'l',\n    '\\u0140': 'l',\n    '\\u013A': 'l',\n    '\\u013E': 'l',\n    '\\u1E37': 'l',\n    '\\u1E39': 'l',\n    '\\u013C': 'l',\n    '\\u1E3D': 'l',\n    '\\u1E3B': 'l',\n    '\\u017F': 'l',\n    '\\u0142': 'l',\n    '\\u019A': 'l',\n    '\\u026B': 'l',\n    '\\u2C61': 'l',\n    '\\uA749': 'l',\n    '\\uA781': 'l',\n    '\\uA747': 'l',\n    '\\u01C9': 'lj',\n    '\\u24DC': 'm',\n    '\\uFF4D': 'm',\n    '\\u1E3F': 'm',\n    '\\u1E41': 'm',\n    '\\u1E43': 'm',\n    '\\u0271': 'm',\n    '\\u026F': 'm',\n    '\\u24DD': 'n',\n    '\\uFF4E': 'n',\n    '\\u01F9': 'n',\n    '\\u0144': 'n',\n    '\\u00F1': 'n',\n    '\\u1E45': 'n',\n    '\\u0148': 'n',\n    '\\u1E47': 'n',\n    '\\u0146': 'n',\n    '\\u1E4B': 'n',\n    '\\u1E49': 'n',\n    '\\u019E': 'n',\n    '\\u0272': 'n',\n    '\\u0149': 'n',\n    '\\uA791': 'n',\n    '\\uA7A5': 'n',\n    '\\u01CC': 'nj',\n    '\\u24DE': 'o',\n    '\\uFF4F': 'o',\n    '\\u00F2': 'o',\n    '\\u00F3': 'o',\n    '\\u00F4': 'o',\n    '\\u1ED3': 'o',\n    '\\u1ED1': 'o',\n    '\\u1ED7': 'o',\n    '\\u1ED5': 'o',\n    '\\u00F5': 'o',\n    '\\u1E4D': 'o',\n    '\\u022D': 'o',\n    '\\u1E4F': 'o',\n    '\\u014D': 'o',\n    '\\u1E51': 'o',\n    '\\u1E53': 'o',\n    '\\u014F': 'o',\n    '\\u022F': 'o',\n    '\\u0231': 'o',\n    '\\u00F6': 'o',\n    '\\u022B': 'o',\n    '\\u1ECF': 'o',\n    '\\u0151': 'o',\n    '\\u01D2': 'o',\n    '\\u020D': 'o',\n    '\\u020F': 'o',\n    '\\u01A1': 'o',\n    '\\u1EDD': 'o',\n    '\\u1EDB': 'o',\n    '\\u1EE1': 'o',\n    '\\u1EDF': 'o',\n    '\\u1EE3': 'o',\n    '\\u1ECD': 'o',\n    '\\u1ED9': 'o',\n    '\\u01EB': 'o',\n    '\\u01ED': 'o',\n    '\\u00F8': 'o',\n    '\\u01FF': 'o',\n    '\\u0254': 'o',\n    '\\uA74B': 'o',\n    '\\uA74D': 'o',\n    '\\u0275': 'o',\n    '\\u01A3': 'oi',\n    '\\u0223': 'ou',\n    '\\uA74F': 'oo',\n    '\\u24DF': 'p',\n    '\\uFF50': 'p',\n    '\\u1E55': 'p',\n    '\\u1E57': 'p',\n    '\\u01A5': 'p',\n    '\\u1D7D': 'p',\n    '\\uA751': 'p',\n    '\\uA753': 'p',\n    '\\uA755': 'p',\n    '\\u24E0': 'q',\n    '\\uFF51': 'q',\n    '\\u024B': 'q',\n    '\\uA757': 'q',\n    '\\uA759': 'q',\n    '\\u24E1': 'r',\n    '\\uFF52': 'r',\n    '\\u0155': 'r',\n    '\\u1E59': 'r',\n    '\\u0159': 'r',\n    '\\u0211': 'r',\n    '\\u0213': 'r',\n    '\\u1E5B': 'r',\n    '\\u1E5D': 'r',\n    '\\u0157': 'r',\n    '\\u1E5F': 'r',\n    '\\u024D': 'r',\n    '\\u027D': 'r',\n    '\\uA75B': 'r',\n    '\\uA7A7': 'r',\n    '\\uA783': 'r',\n    '\\u24E2': 's',\n    '\\uFF53': 's',\n    '\\u00DF': 's',\n    '\\u015B': 's',\n    '\\u1E65': 's',\n    '\\u015D': 's',\n    '\\u1E61': 's',\n    '\\u0161': 's',\n    '\\u1E67': 's',\n    '\\u1E63': 's',\n    '\\u1E69': 's',\n    '\\u0219': 's',\n    '\\u015F': 's',\n    '\\u023F': 's',\n    '\\uA7A9': 's',\n    '\\uA785': 's',\n    '\\u1E9B': 's',\n    '\\u24E3': 't',\n    '\\uFF54': 't',\n    '\\u1E6B': 't',\n    '\\u1E97': 't',\n    '\\u0165': 't',\n    '\\u1E6D': 't',\n    '\\u021B': 't',\n    '\\u0163': 't',\n    '\\u1E71': 't',\n    '\\u1E6F': 't',\n    '\\u0167': 't',\n    '\\u01AD': 't',\n    '\\u0288': 't',\n    '\\u2C66': 't',\n    '\\uA787': 't',\n    '\\uA729': 'tz',\n    '\\u24E4': 'u',\n    '\\uFF55': 'u',\n    '\\u00F9': 'u',\n    '\\u00FA': 'u',\n    '\\u00FB': 'u',\n    '\\u0169': 'u',\n    '\\u1E79': 'u',\n    '\\u016B': 'u',\n    '\\u1E7B': 'u',\n    '\\u016D': 'u',\n    '\\u00FC': 'u',\n    '\\u01DC': 'u',\n    '\\u01D8': 'u',\n    '\\u01D6': 'u',\n    '\\u01DA': 'u',\n    '\\u1EE7': 'u',\n    '\\u016F': 'u',\n    '\\u0171': 'u',\n    '\\u01D4': 'u',\n    '\\u0215': 'u',\n    '\\u0217': 'u',\n    '\\u01B0': 'u',\n    '\\u1EEB': 'u',\n    '\\u1EE9': 'u',\n    '\\u1EEF': 'u',\n    '\\u1EED': 'u',\n    '\\u1EF1': 'u',\n    '\\u1EE5': 'u',\n    '\\u1E73': 'u',\n    '\\u0173': 'u',\n    '\\u1E77': 'u',\n    '\\u1E75': 'u',\n    '\\u0289': 'u',\n    '\\u24E5': 'v',\n    '\\uFF56': 'v',\n    '\\u1E7D': 'v',\n    '\\u1E7F': 'v',\n    '\\u028B': 'v',\n    '\\uA75F': 'v',\n    '\\u028C': 'v',\n    '\\uA761': 'vy',\n    '\\u24E6': 'w',\n    '\\uFF57': 'w',\n    '\\u1E81': 'w',\n    '\\u1E83': 'w',\n    '\\u0175': 'w',\n    '\\u1E87': 'w',\n    '\\u1E85': 'w',\n    '\\u1E98': 'w',\n    '\\u1E89': 'w',\n    '\\u2C73': 'w',\n    '\\u24E7': 'x',\n    '\\uFF58': 'x',\n    '\\u1E8B': 'x',\n    '\\u1E8D': 'x',\n    '\\u24E8': 'y',\n    '\\uFF59': 'y',\n    '\\u1EF3': 'y',\n    '\\u00FD': 'y',\n    '\\u0177': 'y',\n    '\\u1EF9': 'y',\n    '\\u0233': 'y',\n    '\\u1E8F': 'y',\n    '\\u00FF': 'y',\n    '\\u1EF7': 'y',\n    '\\u1E99': 'y',\n    '\\u1EF5': 'y',\n    '\\u01B4': 'y',\n    '\\u024F': 'y',\n    '\\u1EFF': 'y',\n    '\\u24E9': 'z',\n    '\\uFF5A': 'z',\n    '\\u017A': 'z',\n    '\\u1E91': 'z',\n    '\\u017C': 'z',\n    '\\u017E': 'z',\n    '\\u1E93': 'z',\n    '\\u1E95': 'z',\n    '\\u01B6': 'z',\n    '\\u0225': 'z',\n    '\\u0240': 'z',\n    '\\u2C6C': 'z',\n    '\\uA763': 'z',\n    '\\u0386': '\\u0391',\n    '\\u0388': '\\u0395',\n    '\\u0389': '\\u0397',\n    '\\u038A': '\\u0399',\n    '\\u03AA': '\\u0399',\n    '\\u038C': '\\u039F',\n    '\\u038E': '\\u03A5',\n    '\\u03AB': '\\u03A5',\n    '\\u038F': '\\u03A9',\n    '\\u03AC': '\\u03B1',\n    '\\u03AD': '\\u03B5',\n    '\\u03AE': '\\u03B7',\n    '\\u03AF': '\\u03B9',\n    '\\u03CA': '\\u03B9',\n    '\\u0390': '\\u03B9',\n    '\\u03CC': '\\u03BF',\n    '\\u03CD': '\\u03C5',\n    '\\u03CB': '\\u03C5',\n    '\\u03B0': '\\u03C5',\n    '\\u03C9': '\\u03C9',\n    '\\u03C2': '\\u03C3'\n  };\n\n  return diacritics;\n});\n\nS2.define('select2/data/base',[\n  '../utils'\n], function (Utils) {\n  function BaseAdapter ($element, options) {\n    BaseAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseAdapter, Utils.Observable);\n\n  BaseAdapter.prototype.current = function (callback) {\n    throw new Error('The `current` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.query = function (params, callback) {\n    throw new Error('The `query` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.bind = function (container, $container) {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.destroy = function () {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.generateResultId = function (container, data) {\n    var id = container.id + '-result-';\n\n    id += Utils.generateChars(4);\n\n    if (data.id != null) {\n      id += '-' + data.id.toString();\n    } else {\n      id += '-' + Utils.generateChars(4);\n    }\n    return id;\n  };\n\n  return BaseAdapter;\n});\n\nS2.define('select2/data/select',[\n  './base',\n  '../utils',\n  'jquery'\n], function (BaseAdapter, Utils, $) {\n  function SelectAdapter ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    SelectAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(SelectAdapter, BaseAdapter);\n\n  SelectAdapter.prototype.current = function (callback) {\n    var data = [];\n    var self = this;\n\n    this.$element.find(':selected').each(function () {\n      var $option = $(this);\n\n      var option = self.item($option);\n\n      data.push(option);\n    });\n\n    callback(data);\n  };\n\n  SelectAdapter.prototype.select = function (data) {\n    var self = this;\n\n    data.selected = true;\n\n    // If data.element is a DOM node, use it instead\n    if ($(data.element).is('option')) {\n      data.element.selected = true;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    if (this.$element.prop('multiple')) {\n      this.current(function (currentData) {\n        var val = [];\n\n        data = [data];\n        data.push.apply(data, currentData);\n\n        for (var d = 0; d < data.length; d++) {\n          var id = data[d].id;\n\n          if ($.inArray(id, val) === -1) {\n            val.push(id);\n          }\n        }\n\n        self.$element.val(val);\n        self.$element.trigger('change');\n      });\n    } else {\n      var val = data.id;\n\n      this.$element.val(val);\n      this.$element.trigger('change');\n    }\n  };\n\n  SelectAdapter.prototype.unselect = function (data) {\n    var self = this;\n\n    if (!this.$element.prop('multiple')) {\n      return;\n    }\n\n    data.selected = false;\n\n    if ($(data.element).is('option')) {\n      data.element.selected = false;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    this.current(function (currentData) {\n      var val = [];\n\n      for (var d = 0; d < currentData.length; d++) {\n        var id = currentData[d].id;\n\n        if (id !== data.id && $.inArray(id, val) === -1) {\n          val.push(id);\n        }\n      }\n\n      self.$element.val(val);\n\n      self.$element.trigger('change');\n    });\n  };\n\n  SelectAdapter.prototype.bind = function (container, $container) {\n    var self = this;\n\n    this.container = container;\n\n    container.on('select', function (params) {\n      self.select(params.data);\n    });\n\n    container.on('unselect', function (params) {\n      self.unselect(params.data);\n    });\n  };\n\n  SelectAdapter.prototype.destroy = function () {\n    // Remove anything added to child elements\n    this.$element.find('*').each(function () {\n      // Remove any custom data set by Select2\n      $.removeData(this, 'data');\n    });\n  };\n\n  SelectAdapter.prototype.query = function (params, callback) {\n    var data = [];\n    var self = this;\n\n    var $options = this.$element.children();\n\n    $options.each(function () {\n      var $option = $(this);\n\n      if (!$option.is('option') && !$option.is('optgroup')) {\n        return;\n      }\n\n      var option = self.item($option);\n\n      var matches = self.matches(params, option);\n\n      if (matches !== null) {\n        data.push(matches);\n      }\n    });\n\n    callback({\n      results: data\n    });\n  };\n\n  SelectAdapter.prototype.addOptions = function ($options) {\n    Utils.appendMany(this.$element, $options);\n  };\n\n  SelectAdapter.prototype.option = function (data) {\n    var option;\n\n    if (data.children) {\n      option = document.createElement('optgroup');\n      option.label = data.text;\n    } else {\n      option = document.createElement('option');\n\n      if (option.textContent !== undefined) {\n        option.textContent = data.text;\n      } else {\n        option.innerText = data.text;\n      }\n    }\n\n    if (data.id) {\n      option.value = data.id;\n    }\n\n    if (data.disabled) {\n      option.disabled = true;\n    }\n\n    if (data.selected) {\n      option.selected = true;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    var $option = $(option);\n\n    var normalizedData = this._normalizeItem(data);\n    normalizedData.element = option;\n\n    // Override the option's data with the combined data\n    $.data(option, 'data', normalizedData);\n\n    return $option;\n  };\n\n  SelectAdapter.prototype.item = function ($option) {\n    var data = {};\n\n    data = $.data($option[0], 'data');\n\n    if (data != null) {\n      return data;\n    }\n\n    if ($option.is('option')) {\n      data = {\n        id: $option.val(),\n        text: $option.text(),\n        disabled: $option.prop('disabled'),\n        selected: $option.prop('selected'),\n        title: $option.prop('title')\n      };\n    } else if ($option.is('optgroup')) {\n      data = {\n        text: $option.prop('label'),\n        children: [],\n        title: $option.prop('title')\n      };\n\n      var $children = $option.children('option');\n      var children = [];\n\n      for (var c = 0; c < $children.length; c++) {\n        var $child = $($children[c]);\n\n        var child = this.item($child);\n\n        children.push(child);\n      }\n\n      data.children = children;\n    }\n\n    data = this._normalizeItem(data);\n    data.element = $option[0];\n\n    $.data($option[0], 'data', data);\n\n    return data;\n  };\n\n  SelectAdapter.prototype._normalizeItem = function (item) {\n    if (!$.isPlainObject(item)) {\n      item = {\n        id: item,\n        text: item\n      };\n    }\n\n    item = $.extend({}, {\n      text: ''\n    }, item);\n\n    var defaults = {\n      selected: false,\n      disabled: false\n    };\n\n    if (item.id != null) {\n      item.id = item.id.toString();\n    }\n\n    if (item.text != null) {\n      item.text = item.text.toString();\n    }\n\n    if (item._resultId == null && item.id && this.container != null) {\n      item._resultId = this.generateResultId(this.container, item);\n    }\n\n    return $.extend({}, defaults, item);\n  };\n\n  SelectAdapter.prototype.matches = function (params, data) {\n    var matcher = this.options.get('matcher');\n\n    return matcher(params, data);\n  };\n\n  return SelectAdapter;\n});\n\nS2.define('select2/data/array',[\n  './select',\n  '../utils',\n  'jquery'\n], function (SelectAdapter, Utils, $) {\n  function ArrayAdapter ($element, options) {\n    var data = options.get('data') || [];\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n\n    this.addOptions(this.convertToOptions(data));\n  }\n\n  Utils.Extend(ArrayAdapter, SelectAdapter);\n\n  ArrayAdapter.prototype.select = function (data) {\n    var $option = this.$element.find('option').filter(function (i, elm) {\n      return elm.value == data.id.toString();\n    });\n\n    if ($option.length === 0) {\n      $option = this.option(data);\n\n      this.addOptions($option);\n    }\n\n    ArrayAdapter.__super__.select.call(this, data);\n  };\n\n  ArrayAdapter.prototype.convertToOptions = function (data) {\n    var self = this;\n\n    var $existing = this.$element.find('option');\n    var existingIds = $existing.map(function () {\n      return self.item($(this)).id;\n    }).get();\n\n    var $options = [];\n\n    // Filter out all items except for the one passed in the argument\n    function onlyItem (item) {\n      return function () {\n        return $(this).val() == item.id;\n      };\n    }\n\n    for (var d = 0; d < data.length; d++) {\n      var item = this._normalizeItem(data[d]);\n\n      // Skip items which were pre-loaded, only merge the data\n      if ($.inArray(item.id, existingIds) >= 0) {\n        var $existingOption = $existing.filter(onlyItem(item));\n\n        var existingData = this.item($existingOption);\n        var newData = $.extend(true, {}, existingData, item);\n\n        var $newOption = this.option(existingData);\n\n        $existingOption.replaceWith($newOption);\n\n        continue;\n      }\n\n      var $option = this.option(item);\n\n      if (item.children) {\n        var $children = this.convertToOptions(item.children);\n\n        Utils.appendMany($option, $children);\n      }\n\n      $options.push($option);\n    }\n\n    return $options;\n  };\n\n  return ArrayAdapter;\n});\n\nS2.define('select2/data/ajax',[\n  './array',\n  '../utils',\n  'jquery'\n], function (ArrayAdapter, Utils, $) {\n  function AjaxAdapter ($element, options) {\n    this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n    if (this.ajaxOptions.processResults != null) {\n      this.processResults = this.ajaxOptions.processResults;\n    }\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n  }\n\n  Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n  AjaxAdapter.prototype._applyDefaults = function (options) {\n    var defaults = {\n      data: function (params) {\n        return {\n          q: params.term\n        };\n      },\n      transport: function (params, success, failure) {\n        var $request = $.ajax(params);\n\n        $request.then(success);\n        $request.fail(failure);\n\n        return $request;\n      }\n    };\n\n    return $.extend({}, defaults, options, true);\n  };\n\n  AjaxAdapter.prototype.processResults = function (results) {\n    return results;\n  };\n\n  AjaxAdapter.prototype.query = function (params, callback) {\n    var matches = [];\n    var self = this;\n\n    if (this._request != null) {\n      // JSONP requests cannot always be aborted\n      if ($.isFunction(this._request.abort)) {\n        this._request.abort();\n      }\n\n      this._request = null;\n    }\n\n    var options = $.extend({\n      type: 'GET'\n    }, this.ajaxOptions);\n\n    if (typeof options.url === 'function') {\n      options.url = options.url(params);\n    }\n\n    if (typeof options.data === 'function') {\n      options.data = options.data(params);\n    }\n\n    function request () {\n      var $request = options.transport(options, function (data) {\n        var results = self.processResults(data, params);\n\n        if (self.options.get('debug') && window.console && console.error) {\n          // Check to make sure that the response included a `results` key.\n          if (!results || !results.results || !$.isArray(results.results)) {\n            console.error(\n              'Select2: The AJAX results did not return an array in the ' +\n              '`results` key of the response.'\n            );\n          }\n        }\n\n        callback(results);\n      }, function () {\n        // TODO: Handle AJAX errors\n      });\n\n      self._request = $request;\n    }\n\n    if (this.ajaxOptions.delay && params.term !== '') {\n      if (this._queryTimeout) {\n        window.clearTimeout(this._queryTimeout);\n      }\n\n      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n    } else {\n      request();\n    }\n  };\n\n  return AjaxAdapter;\n});\n\nS2.define('select2/data/tags',[\n  'jquery'\n], function ($) {\n  function Tags (decorated, $element, options) {\n    var tags = options.get('tags');\n\n    var createTag = options.get('createTag');\n\n    if (createTag !== undefined) {\n      this.createTag = createTag;\n    }\n\n    decorated.call(this, $element, options);\n\n    if ($.isArray(tags)) {\n      for (var t = 0; t < tags.length; t++) {\n        var tag = tags[t];\n        var item = this._normalizeItem(tag);\n\n        var $option = this.option(item);\n\n        this.$element.append($option);\n      }\n    }\n  }\n\n  Tags.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    this._removeOldTags();\n\n    if (params.term == null || params.page != null) {\n      decorated.call(this, params, callback);\n      return;\n    }\n\n    function wrapper (obj, child) {\n      var data = obj.results;\n\n      for (var i = 0; i < data.length; i++) {\n        var option = data[i];\n\n        var checkChildren = (\n          option.children != null &&\n          !wrapper({\n            results: option.children\n          }, true)\n        );\n\n        var checkText = option.text === params.term;\n\n        if (checkText || checkChildren) {\n          if (child) {\n            return false;\n          }\n\n          obj.data = data;\n          callback(obj);\n\n          return;\n        }\n      }\n\n      if (child) {\n        return true;\n      }\n\n      var tag = self.createTag(params);\n\n      if (tag != null) {\n        var $option = self.option(tag);\n        $option.attr('data-select2-tag', true);\n\n        self.addOptions([$option]);\n\n        self.insertTag(data, tag);\n      }\n\n      obj.results = data;\n\n      callback(obj);\n    }\n\n    decorated.call(this, params, wrapper);\n  };\n\n  Tags.prototype.createTag = function (decorated, params) {\n    var term = $.trim(params.term);\n\n    if (term === '') {\n      return null;\n    }\n\n    return {\n      id: term,\n      text: term\n    };\n  };\n\n  Tags.prototype.insertTag = function (_, data, tag) {\n    data.unshift(tag);\n  };\n\n  Tags.prototype._removeOldTags = function (_) {\n    var tag = this._lastTag;\n\n    var $options = this.$element.find('option[data-select2-tag]');\n\n    $options.each(function () {\n      if (this.selected) {\n        return;\n      }\n\n      $(this).remove();\n    });\n  };\n\n  return Tags;\n});\n\nS2.define('select2/data/tokenizer',[\n  'jquery'\n], function ($) {\n  function Tokenizer (decorated, $element, options) {\n    var tokenizer = options.get('tokenizer');\n\n    if (tokenizer !== undefined) {\n      this.tokenizer = tokenizer;\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  Tokenizer.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    this.$search =  container.dropdown.$search || container.selection.$search ||\n      $container.find('.select2-search__field');\n  };\n\n  Tokenizer.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    function select (data) {\n      self.select(data);\n    }\n\n    params.term = params.term || '';\n\n    var tokenData = this.tokenizer(params, this.options, select);\n\n    if (tokenData.term !== params.term) {\n      // Replace the search term if we have the search box\n      if (this.$search.length) {\n        this.$search.val(tokenData.term);\n        this.$search.focus();\n      }\n\n      params.term = tokenData.term;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n    var separators = options.get('tokenSeparators') || [];\n    var term = params.term;\n    var i = 0;\n\n    var createTag = this.createTag || function (params) {\n      return {\n        id: params.term,\n        text: params.term\n      };\n    };\n\n    while (i < term.length) {\n      var termChar = term[i];\n\n      if ($.inArray(termChar, separators) === -1) {\n        i++;\n\n        continue;\n      }\n\n      var part = term.substr(0, i);\n      var partParams = $.extend({}, params, {\n        term: part\n      });\n\n      var data = createTag(partParams);\n\n      callback(data);\n\n      // Reset the term to not include the tokenized portion\n      term = term.substr(i + 1) || '';\n      i = 0;\n    }\n\n    return {\n      term: term\n    };\n  };\n\n  return Tokenizer;\n});\n\nS2.define('select2/data/minimumInputLength',[\n\n], function () {\n  function MinimumInputLength (decorated, $e, options) {\n    this.minimumInputLength = options.get('minimumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MinimumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (params.term.length < this.minimumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooShort',\n        args: {\n          minimum: this.minimumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MinimumInputLength;\n});\n\nS2.define('select2/data/maximumInputLength',[\n\n], function () {\n  function MaximumInputLength (decorated, $e, options) {\n    this.maximumInputLength = options.get('maximumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (this.maximumInputLength > 0 &&\n        params.term.length > this.maximumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooLong',\n        args: {\n          maximum: this.maximumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MaximumInputLength;\n});\n\nS2.define('select2/data/maximumSelectionLength',[\n\n], function (){\n  function MaximumSelectionLength (decorated, $e, options) {\n    this.maximumSelectionLength = options.get('maximumSelectionLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumSelectionLength.prototype.query =\n    function (decorated, params, callback) {\n      var self = this;\n\n      this.current(function (currentData) {\n        var count = currentData != null ? currentData.length : 0;\n        if (self.maximumSelectionLength > 0 &&\n          count >= self.maximumSelectionLength) {\n          self.trigger('results:message', {\n            message: 'maximumSelected',\n            args: {\n              maximum: self.maximumSelectionLength\n            }\n          });\n          return;\n        }\n        decorated.call(self, params, callback);\n      });\n  };\n\n  return MaximumSelectionLength;\n});\n\nS2.define('select2/dropdown',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Dropdown ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    Dropdown.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Dropdown, Utils.Observable);\n\n  Dropdown.prototype.render = function () {\n    var $dropdown = $(\n      '<span class=\"select2-dropdown\">' +\n        '<span class=\"select2-results\"></span>' +\n      '</span>'\n    );\n\n    $dropdown.attr('dir', this.options.get('dir'));\n\n    this.$dropdown = $dropdown;\n\n    return $dropdown;\n  };\n\n  Dropdown.prototype.position = function ($dropdown, $container) {\n    // Should be implmented in subclasses\n  };\n\n  Dropdown.prototype.destroy = function () {\n    // Remove the dropdown from the DOM\n    this.$dropdown.remove();\n  };\n\n  return Dropdown;\n});\n\nS2.define('select2/dropdown/search',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function Search () { }\n\n  Search.prototype.render = function (decorated) {\n    var $rendered = decorated.call(this);\n\n    var $search = $(\n      '<span class=\"select2-search select2-search--dropdown\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</span>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    $rendered.prepend($search);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    this.$search.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$search.on('input', function (evt) {\n      // Unbind the duplicated `keyup` event\n      $(this).off('keyup');\n    });\n\n    this.$search.on('keyup input', function (evt) {\n      self.handleSearch(evt);\n    });\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n\n      window.setTimeout(function () {\n        self.$search.focus();\n      }, 0);\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n    });\n\n    container.on('results:all', function (params) {\n      if (params.query.term == null || params.query.term === '') {\n        var showSearch = self.showSearch(params);\n\n        if (showSearch) {\n          self.$searchContainer.removeClass('select2-search--hide');\n        } else {\n          self.$searchContainer.addClass('select2-search--hide');\n        }\n      }\n    });\n  };\n\n  Search.prototype.handleSearch = function (evt) {\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.showSearch = function (_, params) {\n    return true;\n  };\n\n  return Search;\n});\n\nS2.define('select2/dropdown/hidePlaceholder',[\n\n], function () {\n  function HidePlaceholder (decorated, $element, options, dataAdapter) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  HidePlaceholder.prototype.append = function (decorated, data) {\n    data.results = this.removePlaceholder(data.results);\n\n    decorated.call(this, data);\n  };\n\n  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n    var modifiedData = data.slice(0);\n\n    for (var d = data.length - 1; d >= 0; d--) {\n      var item = data[d];\n\n      if (this.placeholder.id === item.id) {\n        modifiedData.splice(d, 1);\n      }\n    }\n\n    return modifiedData;\n  };\n\n  return HidePlaceholder;\n});\n\nS2.define('select2/dropdown/infiniteScroll',[\n  'jquery'\n], function ($) {\n  function InfiniteScroll (decorated, $element, options, dataAdapter) {\n    this.lastParams = {};\n\n    decorated.call(this, $element, options, dataAdapter);\n\n    this.$loadingMore = this.createLoadingMore();\n    this.loading = false;\n  }\n\n  InfiniteScroll.prototype.append = function (decorated, data) {\n    this.$loadingMore.remove();\n    this.loading = false;\n\n    decorated.call(this, data);\n\n    if (this.showLoadingMore(data)) {\n      this.$results.append(this.$loadingMore);\n    }\n  };\n\n  InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('query', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    container.on('query:append', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    this.$results.on('scroll', function () {\n      var isLoadMoreVisible = $.contains(\n        document.documentElement,\n        self.$loadingMore[0]\n      );\n\n      if (self.loading || !isLoadMoreVisible) {\n        return;\n      }\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var loadingMoreOffset = self.$loadingMore.offset().top +\n        self.$loadingMore.outerHeight(false);\n\n      if (currentOffset + 50 >= loadingMoreOffset) {\n        self.loadMore();\n      }\n    });\n  };\n\n  InfiniteScroll.prototype.loadMore = function () {\n    this.loading = true;\n\n    var params = $.extend({}, {page: 1}, this.lastParams);\n\n    params.page++;\n\n    this.trigger('query:append', params);\n  };\n\n  InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n    return data.pagination && data.pagination.more;\n  };\n\n  InfiniteScroll.prototype.createLoadingMore = function () {\n    var $option = $(\n      '<li class=\"option load-more\" role=\"treeitem\"></li>'\n    );\n\n    var message = this.options.get('translations').get('loadingMore');\n\n    $option.html(message(this.lastParams));\n\n    return $option;\n  };\n\n  return InfiniteScroll;\n});\n\nS2.define('select2/dropdown/attachBody',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function AttachBody (decorated, $element, options) {\n    this.$dropdownParent = options.get('dropdownParent') || document.body;\n\n    decorated.call(this, $element, options);\n  }\n\n  AttachBody.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    var setupResultsEvents = false;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self._showDropdown();\n      self._attachPositioningHandler(container);\n\n      if (!setupResultsEvents) {\n        setupResultsEvents = true;\n\n        container.on('results:all', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n\n        container.on('results:append', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n      }\n    });\n\n    container.on('close', function () {\n      self._hideDropdown();\n      self._detachPositioningHandler(container);\n    });\n\n    this.$dropdownContainer.on('mousedown', function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n    // Clone all of the container classes\n    $dropdown.attr('class', $container.attr('class'));\n\n    $dropdown.removeClass('select2');\n    $dropdown.addClass('select2-container--open');\n\n    $dropdown.css({\n      position: 'absolute',\n      top: -999999\n    });\n\n    this.$container = $container;\n  };\n\n  AttachBody.prototype.render = function (decorated) {\n    var $container = $('<span></span>');\n\n    var $dropdown = decorated.call(this);\n    $container.append($dropdown);\n\n    this.$dropdownContainer = $container;\n\n    return $container;\n  };\n\n  AttachBody.prototype._hideDropdown = function (decorated) {\n    this.$dropdownContainer.detach();\n  };\n\n  AttachBody.prototype._attachPositioningHandler = function (container) {\n    var self = this;\n\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.each(function () {\n      $(this).data('select2-scroll-position', {\n        x: $(this).scrollLeft(),\n        y: $(this).scrollTop()\n      });\n    });\n\n    $watchers.on(scrollEvent, function (ev) {\n      var position = $(this).data('select2-scroll-position');\n      $(this).scrollTop(position.y);\n    });\n\n    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,\n      function (e) {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n  };\n\n  AttachBody.prototype._detachPositioningHandler = function (container) {\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.off(scrollEvent);\n\n    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n  };\n\n  AttachBody.prototype._positionDropdown = function () {\n    var $window = $(window);\n\n    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');\n    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');\n\n    var newDirection = null;\n\n    var position = this.$container.position();\n    var offset = this.$container.offset();\n\n    offset.bottom = offset.top + this.$container.outerHeight(false);\n\n    var container = {\n      height: this.$container.outerHeight(false)\n    };\n\n    container.top = offset.top;\n    container.bottom = offset.top + container.height;\n\n    var dropdown = {\n      height: this.$dropdown.outerHeight(false)\n    };\n\n    var viewport = {\n      top: $window.scrollTop(),\n      bottom: $window.scrollTop() + $window.height()\n    };\n\n    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);\n    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);\n\n    var css = {\n      left: offset.left,\n      top: container.bottom\n    };\n\n    if (!isCurrentlyAbove && !isCurrentlyBelow) {\n      newDirection = 'below';\n    }\n\n    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n      newDirection = 'above';\n    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n      newDirection = 'below';\n    }\n\n    if (newDirection == 'above' ||\n      (isCurrentlyAbove && newDirection !== 'below')) {\n      css.top = container.top - dropdown.height;\n    }\n\n    if (newDirection != null) {\n      this.$dropdown\n        .removeClass('select2-dropdown--below select2-dropdown--above')\n        .addClass('select2-dropdown--' + newDirection);\n      this.$container\n        .removeClass('select2-container--below select2-container--above')\n        .addClass('select2-container--' + newDirection);\n    }\n\n    this.$dropdownContainer.css(css);\n  };\n\n  AttachBody.prototype._resizeDropdown = function () {\n    this.$dropdownContainer.width();\n\n    var css = {\n      width: this.$container.outerWidth(false) + 'px'\n    };\n\n    if (this.options.get('dropdownAutoWidth')) {\n      css.minWidth = css.width;\n      css.width = 'auto';\n    }\n\n    this.$dropdown.css(css);\n  };\n\n  AttachBody.prototype._showDropdown = function (decorated) {\n    this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n    this._positionDropdown();\n    this._resizeDropdown();\n  };\n\n  return AttachBody;\n});\n\nS2.define('select2/dropdown/minimumResultsForSearch',[\n\n], function () {\n  function countResults (data) {\n    var count = 0;\n\n    for (var d = 0; d < data.length; d++) {\n      var item = data[d];\n\n      if (item.children) {\n        count += countResults(item.children);\n      } else {\n        count++;\n      }\n    }\n\n    return count;\n  }\n\n  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {\n    this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n    if (this.minimumResultsForSearch < 0) {\n      this.minimumResultsForSearch = Infinity;\n    }\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n    if (countResults(params.data.results) < this.minimumResultsForSearch) {\n      return false;\n    }\n\n    return decorated.call(this, params);\n  };\n\n  return MinimumResultsForSearch;\n});\n\nS2.define('select2/dropdown/selectOnClose',[\n\n], function () {\n  function SelectOnClose () { }\n\n  SelectOnClose.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('close', function () {\n      self._handleSelectOnClose();\n    });\n  };\n\n  SelectOnClose.prototype._handleSelectOnClose = function () {\n    var $highlightedResults = this.getHighlightedResults();\n\n    if ($highlightedResults.length < 1) {\n      return;\n    }\n\n    this.trigger('select', {\n        data: $highlightedResults.data('data')\n    });\n  };\n\n  return SelectOnClose;\n});\n\nS2.define('select2/dropdown/closeOnSelect',[\n\n], function () {\n  function CloseOnSelect () { }\n\n  CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('select', function (evt) {\n      self._selectTriggered(evt);\n    });\n\n    container.on('unselect', function (evt) {\n      self._selectTriggered(evt);\n    });\n  };\n\n  CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n    var originalEvent = evt.originalEvent;\n\n    // Don't close if the control key is being held\n    if (originalEvent && originalEvent.ctrlKey) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  return CloseOnSelect;\n});\n\nS2.define('select2/i18n/en',[],function () {\n  // English\n  return {\n    errorLoading: function () {\n      return 'The results could not be loaded.';\n    },\n    inputTooLong: function (args) {\n      var overChars = args.input.length - args.maximum;\n\n      var message = 'Please delete ' + overChars + ' character';\n\n      if (overChars != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    inputTooShort: function (args) {\n      var remainingChars = args.minimum - args.input.length;\n\n      var message = 'Please enter ' + remainingChars + ' or more characters';\n\n      return message;\n    },\n    loadingMore: function () {\n      return 'Loading more results…';\n    },\n    maximumSelected: function (args) {\n      var message = 'You can only select ' + args.maximum + ' item';\n\n      if (args.maximum != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    noResults: function () {\n      return 'No results found';\n    },\n    searching: function () {\n      return 'Searching…';\n    }\n  };\n});\n\nS2.define('select2/defaults',[\n  'jquery',\n  'require',\n\n  './results',\n\n  './selection/single',\n  './selection/multiple',\n  './selection/placeholder',\n  './selection/allowClear',\n  './selection/search',\n  './selection/eventRelay',\n\n  './utils',\n  './translation',\n  './diacritics',\n\n  './data/select',\n  './data/array',\n  './data/ajax',\n  './data/tags',\n  './data/tokenizer',\n  './data/minimumInputLength',\n  './data/maximumInputLength',\n  './data/maximumSelectionLength',\n\n  './dropdown',\n  './dropdown/search',\n  './dropdown/hidePlaceholder',\n  './dropdown/infiniteScroll',\n  './dropdown/attachBody',\n  './dropdown/minimumResultsForSearch',\n  './dropdown/selectOnClose',\n  './dropdown/closeOnSelect',\n\n  './i18n/en'\n], function ($, require,\n\n             ResultsList,\n\n             SingleSelection, MultipleSelection, Placeholder, AllowClear,\n             SelectionSearch, EventRelay,\n\n             Utils, Translation, DIACRITICS,\n\n             SelectData, ArrayData, AjaxData, Tags, Tokenizer,\n             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,\n\n             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,\n             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,\n\n             EnglishTranslation) {\n  function Defaults () {\n    this.reset();\n  }\n\n  Defaults.prototype.apply = function (options) {\n    options = $.extend({}, this.defaults, options);\n\n    if (options.dataAdapter == null) {\n      if (options.ajax != null) {\n        options.dataAdapter = AjaxData;\n      } else if (options.data != null) {\n        options.dataAdapter = ArrayData;\n      } else {\n        options.dataAdapter = SelectData;\n      }\n\n      if (options.minimumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MinimumInputLength\n        );\n      }\n\n      if (options.maximumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumInputLength\n        );\n      }\n\n      if (options.maximumSelectionLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumSelectionLength\n        );\n      }\n\n      if (options.tags) {\n        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n      }\n\n      if (options.tokenSeparators != null || options.tokenizer != null) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Tokenizer\n        );\n      }\n\n      if (options.query != null) {\n        var Query = require(options.amdBase + 'compat/query');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Query\n        );\n      }\n\n      if (options.initSelection != null) {\n        var InitSelection = require(options.amdBase + 'compat/initSelection');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          InitSelection\n        );\n      }\n    }\n\n    if (options.resultsAdapter == null) {\n      options.resultsAdapter = ResultsList;\n\n      if (options.ajax != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          InfiniteScroll\n        );\n      }\n\n      if (options.placeholder != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          HidePlaceholder\n        );\n      }\n\n      if (options.selectOnClose) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          SelectOnClose\n        );\n      }\n    }\n\n    if (options.dropdownAdapter == null) {\n      if (options.multiple) {\n        options.dropdownAdapter = Dropdown;\n      } else {\n        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n\n        options.dropdownAdapter = SearchableDropdown;\n      }\n\n      if (options.minimumResultsForSearch !== 0) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          MinimumResultsForSearch\n        );\n      }\n\n      if (options.closeOnSelect) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          CloseOnSelect\n        );\n      }\n\n      if (\n        options.dropdownCssClass != null ||\n        options.dropdownCss != null ||\n        options.adaptDropdownCssClass != null\n      ) {\n        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');\n\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          DropdownCSS\n        );\n      }\n\n      options.dropdownAdapter = Utils.Decorate(\n        options.dropdownAdapter,\n        AttachBody\n      );\n    }\n\n    if (options.selectionAdapter == null) {\n      if (options.multiple) {\n        options.selectionAdapter = MultipleSelection;\n      } else {\n        options.selectionAdapter = SingleSelection;\n      }\n\n      // Add the placeholder mixin if a placeholder was specified\n      if (options.placeholder != null) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          Placeholder\n        );\n      }\n\n      if (options.allowClear) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          AllowClear\n        );\n      }\n\n      if (options.multiple) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          SelectionSearch\n        );\n      }\n\n      if (\n        options.containerCssClass != null ||\n        options.containerCss != null ||\n        options.adaptContainerCssClass != null\n      ) {\n        var ContainerCSS = require(options.amdBase + 'compat/containerCss');\n\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          ContainerCSS\n        );\n      }\n\n      options.selectionAdapter = Utils.Decorate(\n        options.selectionAdapter,\n        EventRelay\n      );\n    }\n\n    if (typeof options.language === 'string') {\n      // Check if the language is specified with a region\n      if (options.language.indexOf('-') > 0) {\n        // Extract the region information if it is included\n        var languageParts = options.language.split('-');\n        var baseLanguage = languageParts[0];\n\n        options.language = [options.language, baseLanguage];\n      } else {\n        options.language = [options.language];\n      }\n    }\n\n    if ($.isArray(options.language)) {\n      var languages = new Translation();\n      options.language.push('en');\n\n      var languageNames = options.language;\n\n      for (var l = 0; l < languageNames.length; l++) {\n        var name = languageNames[l];\n        var language = {};\n\n        try {\n          // Try to load it with the original name\n          language = Translation.loadPath(name);\n        } catch (e) {\n          try {\n            // If we couldn't load it, check if it wasn't the full path\n            name = this.defaults.amdLanguageBase + name;\n            language = Translation.loadPath(name);\n          } catch (ex) {\n            // The translation could not be loaded at all. Sometimes this is\n            // because of a configuration problem, other times this can be\n            // because of how Select2 helps load all possible translation files.\n            if (options.debug && window.console && console.warn) {\n              console.warn(\n                'Select2: The language file for \"' + name + '\" could not be ' +\n                'automatically loaded. A fallback will be used instead.'\n              );\n            }\n\n            continue;\n          }\n        }\n\n        languages.extend(language);\n      }\n\n      options.translations = languages;\n    } else {\n      var baseTranslation = Translation.loadPath(\n        this.defaults.amdLanguageBase + 'en'\n      );\n      var customTranslation = new Translation(options.language);\n\n      customTranslation.extend(baseTranslation);\n\n      options.translations = customTranslation;\n    }\n\n    return options;\n  };\n\n  Defaults.prototype.reset = function () {\n    function stripDiacritics (text) {\n      // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n      function match(a) {\n        return DIACRITICS[a] || a;\n      }\n\n      return text.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function matcher (params, data) {\n      // Always return the object if there is nothing to compare\n      if ($.trim(params.term) === '') {\n        return data;\n      }\n\n      // Do a recursive check for options with children\n      if (data.children && data.children.length > 0) {\n        // Clone the data object if there are children\n        // This is required as we modify the object to remove any non-matches\n        var match = $.extend(true, {}, data);\n\n        // Check each child of the option\n        for (var c = data.children.length - 1; c >= 0; c--) {\n          var child = data.children[c];\n\n          var matches = matcher(params, child);\n\n          // If there wasn't a match, remove the object in the array\n          if (matches == null) {\n            match.children.splice(c, 1);\n          }\n        }\n\n        // If any children matched, return the new object\n        if (match.children.length > 0) {\n          return match;\n        }\n\n        // If there were no matching children, check just the plain object\n        return matcher(params, match);\n      }\n\n      var original = stripDiacritics(data.text).toUpperCase();\n      var term = stripDiacritics(params.term).toUpperCase();\n\n      // Check if the text contains the term\n      if (original.indexOf(term) > -1) {\n        return data;\n      }\n\n      // If it doesn't contain the term, don't return anything\n      return null;\n    }\n\n    this.defaults = {\n      amdBase: './',\n      amdLanguageBase: './i18n/',\n      closeOnSelect: true,\n      debug: false,\n      dropdownAutoWidth: false,\n      escapeMarkup: Utils.escapeMarkup,\n      language: EnglishTranslation,\n      matcher: matcher,\n      minimumInputLength: 0,\n      maximumInputLength: 0,\n      maximumSelectionLength: 0,\n      minimumResultsForSearch: 0,\n      selectOnClose: false,\n      sorter: function (data) {\n        return data;\n      },\n      templateResult: function (result) {\n        return result.text;\n      },\n      templateSelection: function (selection) {\n        return selection.text;\n      },\n      theme: 'default',\n      width: 'resolve'\n    };\n  };\n\n  Defaults.prototype.set = function (key, value) {\n    var camelKey = $.camelCase(key);\n\n    var data = {};\n    data[camelKey] = value;\n\n    var convertedData = Utils._convertData(data);\n\n    $.extend(this.defaults, convertedData);\n  };\n\n  var defaults = new Defaults();\n\n  return defaults;\n});\n\nS2.define('select2/options',[\n  'require',\n  'jquery',\n  './defaults',\n  './utils'\n], function (require, $, Defaults, Utils) {\n  function Options (options, $element) {\n    this.options = options;\n\n    if ($element != null) {\n      this.fromElement($element);\n    }\n\n    this.options = Defaults.apply(this.options);\n\n    if ($element && $element.is('input')) {\n      var InputCompat = require(this.get('amdBase') + 'compat/inputData');\n\n      this.options.dataAdapter = Utils.Decorate(\n        this.options.dataAdapter,\n        InputCompat\n      );\n    }\n  }\n\n  Options.prototype.fromElement = function ($e) {\n    var excludedData = ['select2'];\n\n    if (this.options.multiple == null) {\n      this.options.multiple = $e.prop('multiple');\n    }\n\n    if (this.options.disabled == null) {\n      this.options.disabled = $e.prop('disabled');\n    }\n\n    if (this.options.language == null) {\n      if ($e.prop('lang')) {\n        this.options.language = $e.prop('lang').toLowerCase();\n      } else if ($e.closest('[lang]').prop('lang')) {\n        this.options.language = $e.closest('[lang]').prop('lang');\n      }\n    }\n\n    if (this.options.dir == null) {\n      if ($e.prop('dir')) {\n        this.options.dir = $e.prop('dir');\n      } else if ($e.closest('[dir]').prop('dir')) {\n        this.options.dir = $e.closest('[dir]').prop('dir');\n      } else {\n        this.options.dir = 'ltr';\n      }\n    }\n\n    $e.prop('disabled', this.options.disabled);\n    $e.prop('multiple', this.options.multiple);\n\n    if ($e.data('select2Tags')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-select2-tags` attribute has been changed to ' +\n          'use the `data-data` and `data-tags=\"true\"` attributes and will be ' +\n          'removed in future versions of Select2.'\n        );\n      }\n\n      $e.data('data', $e.data('select2Tags'));\n      $e.data('tags', true);\n    }\n\n    if ($e.data('ajaxUrl')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-ajax-url` attribute has been changed to ' +\n          '`data-ajax--url` and support for the old attribute will be removed' +\n          ' in future versions of Select2.'\n        );\n      }\n\n      $e.attr('ajax--url', $e.data('ajaxUrl'));\n      $e.data('ajax--url', $e.data('ajaxUrl'));\n    }\n\n    var dataset = {};\n\n    // Prefer the element's `dataset` attribute if it exists\n    // jQuery 1.x does not correctly handle data attributes with multiple dashes\n    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n      dataset = $.extend(true, {}, $e[0].dataset, $e.data());\n    } else {\n      dataset = $e.data();\n    }\n\n    var data = $.extend(true, {}, dataset);\n\n    data = Utils._convertData(data);\n\n    for (var key in data) {\n      if ($.inArray(key, excludedData) > -1) {\n        continue;\n      }\n\n      if ($.isPlainObject(this.options[key])) {\n        $.extend(this.options[key], data[key]);\n      } else {\n        this.options[key] = data[key];\n      }\n    }\n\n    return this;\n  };\n\n  Options.prototype.get = function (key) {\n    return this.options[key];\n  };\n\n  Options.prototype.set = function (key, val) {\n    this.options[key] = val;\n  };\n\n  return Options;\n});\n\nS2.define('select2/core',[\n  'jquery',\n  './options',\n  './utils',\n  './keys'\n], function ($, Options, Utils, KEYS) {\n  var Select2 = function ($element, options) {\n    if ($element.data('select2') != null) {\n      $element.data('select2').destroy();\n    }\n\n    this.$element = $element;\n\n    this.id = this._generateId($element);\n\n    options = options || {};\n\n    this.options = new Options(options, $element);\n\n    Select2.__super__.constructor.call(this);\n\n    // Set up the tabindex\n\n    var tabindex = $element.attr('tabindex') || 0;\n    $element.data('old-tabindex', tabindex);\n    $element.attr('tabindex', '-1');\n\n    // Set up containers and adapters\n\n    var DataAdapter = this.options.get('dataAdapter');\n    this.dataAdapter = new DataAdapter($element, this.options);\n\n    var $container = this.render();\n\n    this._placeContainer($container);\n\n    var SelectionAdapter = this.options.get('selectionAdapter');\n    this.selection = new SelectionAdapter($element, this.options);\n    this.$selection = this.selection.render();\n\n    this.selection.position(this.$selection, $container);\n\n    var DropdownAdapter = this.options.get('dropdownAdapter');\n    this.dropdown = new DropdownAdapter($element, this.options);\n    this.$dropdown = this.dropdown.render();\n\n    this.dropdown.position(this.$dropdown, $container);\n\n    var ResultsAdapter = this.options.get('resultsAdapter');\n    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n    this.$results = this.results.render();\n\n    this.results.position(this.$results, this.$dropdown);\n\n    // Bind events\n\n    var self = this;\n\n    // Bind the container to all of the adapters\n    this._bindAdapters();\n\n    // Register any DOM event handlers\n    this._registerDomEvents();\n\n    // Register any internal event handlers\n    this._registerDataEvents();\n    this._registerSelectionEvents();\n    this._registerDropdownEvents();\n    this._registerResultsEvents();\n    this._registerEvents();\n\n    // Set the initial state\n    this.dataAdapter.current(function (initialData) {\n      self.trigger('selection:update', {\n        data: initialData\n      });\n    });\n\n    // Hide the original select\n    $element.addClass('select2-hidden-accessible');\n\t$element.attr('aria-hidden', 'true');\n\t\n    // Synchronize any monitored attributes\n    this._syncAttributes();\n\n    $element.data('select2', this);\n  };\n\n  Utils.Extend(Select2, Utils.Observable);\n\n  Select2.prototype._generateId = function ($element) {\n    var id = '';\n\n    if ($element.attr('id') != null) {\n      id = $element.attr('id');\n    } else if ($element.attr('name') != null) {\n      id = $element.attr('name') + '-' + Utils.generateChars(2);\n    } else {\n      id = Utils.generateChars(4);\n    }\n\n    id = 'select2-' + id;\n\n    return id;\n  };\n\n  Select2.prototype._placeContainer = function ($container) {\n    $container.insertAfter(this.$element);\n\n    var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n    if (width != null) {\n      $container.css('width', width);\n    }\n  };\n\n  Select2.prototype._resolveWidth = function ($element, method) {\n    var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n    if (method == 'resolve') {\n      var styleWidth = this._resolveWidth($element, 'style');\n\n      if (styleWidth != null) {\n        return styleWidth;\n      }\n\n      return this._resolveWidth($element, 'element');\n    }\n\n    if (method == 'element') {\n      var elementWidth = $element.outerWidth(false);\n\n      if (elementWidth <= 0) {\n        return 'auto';\n      }\n\n      return elementWidth + 'px';\n    }\n\n    if (method == 'style') {\n      var style = $element.attr('style');\n\n      if (typeof(style) !== 'string') {\n        return null;\n      }\n\n      var attrs = style.split(';');\n\n      for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n        var attr = attrs[i].replace(/\\s/g, '');\n        var matches = attr.match(WIDTH);\n\n        if (matches !== null && matches.length >= 1) {\n          return matches[1];\n        }\n      }\n\n      return null;\n    }\n\n    return method;\n  };\n\n  Select2.prototype._bindAdapters = function () {\n    this.dataAdapter.bind(this, this.$container);\n    this.selection.bind(this, this.$container);\n\n    this.dropdown.bind(this, this.$container);\n    this.results.bind(this, this.$container);\n  };\n\n  Select2.prototype._registerDomEvents = function () {\n    var self = this;\n\n    this.$element.on('change.select2', function () {\n      self.dataAdapter.current(function (data) {\n        self.trigger('selection:update', {\n          data: data\n        });\n      });\n    });\n\n    this._sync = Utils.bind(this._syncAttributes, this);\n\n    if (this.$element[0].attachEvent) {\n      this.$element[0].attachEvent('onpropertychange', this._sync);\n    }\n\n    var observer = window.MutationObserver ||\n      window.WebKitMutationObserver ||\n      window.MozMutationObserver\n    ;\n\n    if (observer != null) {\n      this._observer = new observer(function (mutations) {\n        $.each(mutations, self._sync);\n      });\n      this._observer.observe(this.$element[0], {\n        attributes: true,\n        subtree: false\n      });\n    } else if (this.$element[0].addEventListener) {\n      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);\n    }\n  };\n\n  Select2.prototype._registerDataEvents = function () {\n    var self = this;\n\n    this.dataAdapter.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerSelectionEvents = function () {\n    var self = this;\n    var nonRelayEvents = ['toggle'];\n\n    this.selection.on('toggle', function () {\n      self.toggleDropdown();\n    });\n\n    this.selection.on('*', function (name, params) {\n      if ($.inArray(name, nonRelayEvents) !== -1) {\n        return;\n      }\n\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerDropdownEvents = function () {\n    var self = this;\n\n    this.dropdown.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerResultsEvents = function () {\n    var self = this;\n\n    this.results.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerEvents = function () {\n    var self = this;\n\n    this.on('open', function () {\n      self.$container.addClass('select2-container--open');\n    });\n\n    this.on('close', function () {\n      self.$container.removeClass('select2-container--open');\n    });\n\n    this.on('enable', function () {\n      self.$container.removeClass('select2-container--disabled');\n    });\n\n    this.on('disable', function () {\n      self.$container.addClass('select2-container--disabled');\n    });\n\n    this.on('focus', function () {\n      self.$container.addClass('select2-container--focus');\n    });\n\n    this.on('blur', function () {\n      self.$container.removeClass('select2-container--focus');\n    });\n\n    this.on('query', function (params) {\n      if (!self.isOpen()) {\n        self.trigger('open');\n      }\n\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:all', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('query:append', function (params) {\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:append', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('keypress', function (evt) {\n      var key = evt.which;\n\n      if (self.isOpen()) {\n        if (key === KEYS.ENTER) {\n          self.trigger('results:select');\n\n          evt.preventDefault();\n        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {\n          self.trigger('results:toggle');\n\n          evt.preventDefault();\n        } else if (key === KEYS.UP) {\n          self.trigger('results:previous');\n\n          evt.preventDefault();\n        } else if (key === KEYS.DOWN) {\n          self.trigger('results:next');\n\n          evt.preventDefault();\n        } else if (key === KEYS.ESC || key === KEYS.TAB) {\n          self.close();\n\n          evt.preventDefault();\n        }\n      } else {\n        if (key === KEYS.ENTER || key === KEYS.SPACE ||\n            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {\n          self.open();\n\n          evt.preventDefault();\n        }\n      }\n    });\n  };\n\n  Select2.prototype._syncAttributes = function () {\n    this.options.set('disabled', this.$element.prop('disabled'));\n\n    if (this.options.get('disabled')) {\n      if (this.isOpen()) {\n        this.close();\n      }\n\n      this.trigger('disable');\n    } else {\n      this.trigger('enable');\n    }\n  };\n\n  /**\n   * Override the trigger method to automatically trigger pre-events when\n   * there are events that can be prevented.\n   */\n  Select2.prototype.trigger = function (name, args) {\n    var actualTrigger = Select2.__super__.trigger;\n    var preTriggerMap = {\n      'open': 'opening',\n      'close': 'closing',\n      'select': 'selecting',\n      'unselect': 'unselecting'\n    };\n\n    if (name in preTriggerMap) {\n      var preTriggerName = preTriggerMap[name];\n      var preTriggerArgs = {\n        prevented: false,\n        name: name,\n        args: args\n      };\n\n      actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n      if (preTriggerArgs.prevented) {\n        args.prevented = true;\n\n        return;\n      }\n    }\n\n    actualTrigger.call(this, name, args);\n  };\n\n  Select2.prototype.toggleDropdown = function () {\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  Select2.prototype.open = function () {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.trigger('query', {});\n\n    this.trigger('open');\n  };\n\n  Select2.prototype.close = function () {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  Select2.prototype.isOpen = function () {\n    return this.$container.hasClass('select2-container--open');\n  };\n\n  Select2.prototype.enable = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"enable\")` method has been deprecated and will' +\n        ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' +\n        ' instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      args = [true];\n    }\n\n    var disabled = !args[0];\n\n    this.$element.prop('disabled', disabled);\n  };\n\n  Select2.prototype.data = function () {\n    if (this.options.get('debug') &&\n        arguments.length > 0 && window.console && console.warn) {\n      console.warn(\n        'Select2: Data can no longer be set using `select2(\"data\")`. You ' +\n        'should consider setting the value instead using `$element.val()`.'\n      );\n    }\n\n    var data = [];\n\n    this.dataAdapter.current(function (currentData) {\n      data = currentData;\n    });\n\n    return data;\n  };\n\n  Select2.prototype.val = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"val\")` method has been deprecated and will be' +\n        ' removed in later Select2 versions. Use $element.val() instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      return this.$element.val();\n    }\n\n    var newVal = args[0];\n\n    if ($.isArray(newVal)) {\n      newVal = $.map(newVal, function (obj) {\n        return obj.toString();\n      });\n    }\n\n    this.$element.val(newVal).trigger('change');\n  };\n\n  Select2.prototype.destroy = function () {\n    this.$container.remove();\n\n    if (this.$element[0].detachEvent) {\n      this.$element[0].detachEvent('onpropertychange', this._sync);\n    }\n\n    if (this._observer != null) {\n      this._observer.disconnect();\n      this._observer = null;\n    } else if (this.$element[0].removeEventListener) {\n      this.$element[0]\n        .removeEventListener('DOMAttrModified', this._sync, false);\n    }\n\n    this._sync = null;\n\n    this.$element.off('.select2');\n    this.$element.attr('tabindex', this.$element.data('old-tabindex'));\n\n    this.$element.removeClass('select2-hidden-accessible');\n\tthis.$element.attr('aria-hidden', 'false');\n    this.$element.removeData('select2');\n\n    this.dataAdapter.destroy();\n    this.selection.destroy();\n    this.dropdown.destroy();\n    this.results.destroy();\n\n    this.dataAdapter = null;\n    this.selection = null;\n    this.dropdown = null;\n    this.results = null;\n  };\n\n  Select2.prototype.render = function () {\n    var $container = $(\n      '<span class=\"select2 select2-container\">' +\n        '<span class=\"selection\"></span>' +\n        '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' +\n      '</span>'\n    );\n\n    $container.attr('dir', this.options.get('dir'));\n\n    this.$container = $container;\n\n    this.$container.addClass('select2-container--' + this.options.get('theme'));\n\n    $container.data('element', this.$element);\n\n    return $container;\n  };\n\n  return Select2;\n});\n\nS2.define('select2/compat/utils',[\n  'jquery'\n], function ($) {\n  function syncCssClasses ($dest, $src, adapter) {\n    var classes, replacements = [], adapted;\n\n    classes = $.trim($dest.attr('class'));\n\n    if (classes) {\n      classes = '' + classes; // for IE which returns object\n\n      $(classes.split(/\\s+/)).each(function () {\n        // Save all Select2 classes\n        if (this.indexOf('select2-') === 0) {\n          replacements.push(this);\n        }\n      });\n    }\n\n    classes = $.trim($src.attr('class'));\n\n    if (classes) {\n      classes = '' + classes; // for IE which returns object\n\n      $(classes.split(/\\s+/)).each(function () {\n        // Only adapt non-Select2 classes\n        if (this.indexOf('select2-') !== 0) {\n          adapted = adapter(this);\n\n          if (adapted != null) {\n            replacements.push(adapted);\n          }\n        }\n      });\n    }\n\n    $dest.attr('class', replacements.join(' '));\n  }\n\n  return {\n    syncCssClasses: syncCssClasses\n  };\n});\n\nS2.define('select2/compat/containerCss',[\n  'jquery',\n  './utils'\n], function ($, CompatUtils) {\n  // No-op CSS adapter that discards all classes by default\n  function _containerAdapter (clazz) {\n    return null;\n  }\n\n  function ContainerCSS () { }\n\n  ContainerCSS.prototype.render = function (decorated) {\n    var $container = decorated.call(this);\n\n    var containerCssClass = this.options.get('containerCssClass') || '';\n\n    if ($.isFunction(containerCssClass)) {\n      containerCssClass = containerCssClass(this.$element);\n    }\n\n    var containerCssAdapter = this.options.get('adaptContainerCssClass');\n    containerCssAdapter = containerCssAdapter || _containerAdapter;\n\n    if (containerCssClass.indexOf(':all:') !== -1) {\n      containerCssClass = containerCssClass.replace(':all', '');\n\n      var _cssAdapter = containerCssAdapter;\n\n      containerCssAdapter = function (clazz) {\n        var adapted = _cssAdapter(clazz);\n\n        if (adapted != null) {\n          // Append the old one along with the adapted one\n          return adapted + ' ' + clazz;\n        }\n\n        return clazz;\n      };\n    }\n\n    var containerCss = this.options.get('containerCss') || {};\n\n    if ($.isFunction(containerCss)) {\n      containerCss = containerCss(this.$element);\n    }\n\n    CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);\n\n    $container.css(containerCss);\n    $container.addClass(containerCssClass);\n\n    return $container;\n  };\n\n  return ContainerCSS;\n});\n\nS2.define('select2/compat/dropdownCss',[\n  'jquery',\n  './utils'\n], function ($, CompatUtils) {\n  // No-op CSS adapter that discards all classes by default\n  function _dropdownAdapter (clazz) {\n    return null;\n  }\n\n  function DropdownCSS () { }\n\n  DropdownCSS.prototype.render = function (decorated) {\n    var $dropdown = decorated.call(this);\n\n    var dropdownCssClass = this.options.get('dropdownCssClass') || '';\n\n    if ($.isFunction(dropdownCssClass)) {\n      dropdownCssClass = dropdownCssClass(this.$element);\n    }\n\n    var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');\n    dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;\n\n    if (dropdownCssClass.indexOf(':all:') !== -1) {\n      dropdownCssClass = dropdownCssClass.replace(':all', '');\n\n      var _cssAdapter = dropdownCssAdapter;\n\n      dropdownCssAdapter = function (clazz) {\n        var adapted = _cssAdapter(clazz);\n\n        if (adapted != null) {\n          // Append the old one along with the adapted one\n          return adapted + ' ' + clazz;\n        }\n\n        return clazz;\n      };\n    }\n\n    var dropdownCss = this.options.get('dropdownCss') || {};\n\n    if ($.isFunction(dropdownCss)) {\n      dropdownCss = dropdownCss(this.$element);\n    }\n\n    CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);\n\n    $dropdown.css(dropdownCss);\n    $dropdown.addClass(dropdownCssClass);\n\n    return $dropdown;\n  };\n\n  return DropdownCSS;\n});\n\nS2.define('select2/compat/initSelection',[\n  'jquery'\n], function ($) {\n  function InitSelection (decorated, $element, options) {\n    if (options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `initSelection` option has been deprecated in favor' +\n        ' of a custom data adapter that overrides the `current` method. ' +\n        'This method is now called multiple times instead of a single ' +\n        'time when the instance is initialized. Support will be removed ' +\n        'for the `initSelection` option in future versions of Select2'\n      );\n    }\n\n    this.initSelection = options.get('initSelection');\n    this._isInitialized = false;\n\n    decorated.call(this, $element, options);\n  }\n\n  InitSelection.prototype.current = function (decorated, callback) {\n    var self = this;\n\n    if (this._isInitialized) {\n      decorated.call(this, callback);\n\n      return;\n    }\n\n    this.initSelection.call(null, this.$element, function (data) {\n      self._isInitialized = true;\n\n      if (!$.isArray(data)) {\n        data = [data];\n      }\n\n      callback(data);\n    });\n  };\n\n  return InitSelection;\n});\n\nS2.define('select2/compat/inputData',[\n  'jquery'\n], function ($) {\n  function InputData (decorated, $element, options) {\n    this._currentData = [];\n    this._valueSeparator = options.get('valueSeparator') || ',';\n\n    if ($element.prop('type') === 'hidden') {\n      if (options.get('debug') && console && console.warn) {\n        console.warn(\n          'Select2: Using a hidden input with Select2 is no longer ' +\n          'supported and may stop working in the future. It is recommended ' +\n          'to use a `<select>` element instead.'\n        );\n      }\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  InputData.prototype.current = function (_, callback) {\n    function getSelected (data, selectedIds) {\n      var selected = [];\n\n      if (data.selected || $.inArray(data.id, selectedIds) !== -1) {\n        data.selected = true;\n        selected.push(data);\n      } else {\n        data.selected = false;\n      }\n\n      if (data.children) {\n        selected.push.apply(selected, getSelected(data.children, selectedIds));\n      }\n\n      return selected;\n    }\n\n    var selected = [];\n\n    for (var d = 0; d < this._currentData.length; d++) {\n      var data = this._currentData[d];\n\n      selected.push.apply(\n        selected,\n        getSelected(\n          data,\n          this.$element.val().split(\n            this._valueSeparator\n          )\n        )\n      );\n    }\n\n    callback(selected);\n  };\n\n  InputData.prototype.select = function (_, data) {\n    if (!this.options.get('multiple')) {\n      this.current(function (allData) {\n        $.map(allData, function (data) {\n          data.selected = false;\n        });\n      });\n\n      this.$element.val(data.id);\n      this.$element.trigger('change');\n    } else {\n      var value = this.$element.val();\n      value += this._valueSeparator + data.id;\n\n      this.$element.val(value);\n      this.$element.trigger('change');\n    }\n  };\n\n  InputData.prototype.unselect = function (_, data) {\n    var self = this;\n\n    data.selected = false;\n\n    this.current(function (allData) {\n      var values = [];\n\n      for (var d = 0; d < allData.length; d++) {\n        var item = allData[d];\n\n        if (data.id == item.id) {\n          continue;\n        }\n\n        values.push(item.id);\n      }\n\n      self.$element.val(values.join(self._valueSeparator));\n      self.$element.trigger('change');\n    });\n  };\n\n  InputData.prototype.query = function (_, params, callback) {\n    var results = [];\n\n    for (var d = 0; d < this._currentData.length; d++) {\n      var data = this._currentData[d];\n\n      var matches = this.matches(params, data);\n\n      if (matches !== null) {\n        results.push(matches);\n      }\n    }\n\n    callback({\n      results: results\n    });\n  };\n\n  InputData.prototype.addOptions = function (_, $options) {\n    var options = $.map($options, function ($option) {\n      return $.data($option[0], 'data');\n    });\n\n    this._currentData.push.apply(this._currentData, options);\n  };\n\n  return InputData;\n});\n\nS2.define('select2/compat/matcher',[\n  'jquery'\n], function ($) {\n  function oldMatcher (matcher) {\n    function wrappedMatcher (params, data) {\n      var match = $.extend(true, {}, data);\n\n      if (params.term == null || $.trim(params.term) === '') {\n        return match;\n      }\n\n      if (data.children) {\n        for (var c = data.children.length - 1; c >= 0; c--) {\n          var child = data.children[c];\n\n          // Check if the child object matches\n          // The old matcher returned a boolean true or false\n          var doesMatch = matcher(params.term, child.text, child);\n\n          // If the child didn't match, pop it off\n          if (!doesMatch) {\n            match.children.splice(c, 1);\n          }\n        }\n\n        if (match.children.length > 0) {\n          return match;\n        }\n      }\n\n      if (matcher(params.term, data.text, data)) {\n        return match;\n      }\n\n      return null;\n    }\n\n    return wrappedMatcher;\n  }\n\n  return oldMatcher;\n});\n\nS2.define('select2/compat/query',[\n\n], function () {\n  function Query (decorated, $element, options) {\n    if (options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `query` option has been deprecated in favor of a ' +\n        'custom data adapter that overrides the `query` method. Support ' +\n        'will be removed for the `query` option in future versions of ' +\n        'Select2.'\n      );\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  Query.prototype.query = function (_, params, callback) {\n    params.callback = callback;\n\n    var query = this.options.get('query');\n\n    query.call(null, params);\n  };\n\n  return Query;\n});\n\nS2.define('select2/dropdown/attachContainer',[\n\n], function () {\n  function AttachContainer (decorated, $element, options) {\n    decorated.call(this, $element, options);\n  }\n\n  AttachContainer.prototype.position =\n    function (decorated, $dropdown, $container) {\n    var $dropdownContainer = $container.find('.dropdown-wrapper');\n    $dropdownContainer.append($dropdown);\n\n    $dropdown.addClass('select2-dropdown--below');\n    $container.addClass('select2-container--below');\n  };\n\n  return AttachContainer;\n});\n\nS2.define('select2/dropdown/stopPropagation',[\n\n], function () {\n  function StopPropagation () { }\n\n  StopPropagation.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    var stoppedEvents = [\n    'blur',\n    'change',\n    'click',\n    'dblclick',\n    'focus',\n    'focusin',\n    'focusout',\n    'input',\n    'keydown',\n    'keyup',\n    'keypress',\n    'mousedown',\n    'mouseenter',\n    'mouseleave',\n    'mousemove',\n    'mouseover',\n    'mouseup',\n    'search',\n    'touchend',\n    'touchstart'\n    ];\n\n    this.$dropdown.on(stoppedEvents.join(' '), function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  return StopPropagation;\n});\n\nS2.define('select2/selection/stopPropagation',[\n\n], function () {\n  function StopPropagation () { }\n\n  StopPropagation.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    var stoppedEvents = [\n      'blur',\n      'change',\n      'click',\n      'dblclick',\n      'focus',\n      'focusin',\n      'focusout',\n      'input',\n      'keydown',\n      'keyup',\n      'keypress',\n      'mousedown',\n      'mouseenter',\n      'mouseleave',\n      'mousemove',\n      'mouseover',\n      'mouseup',\n      'search',\n      'touchend',\n      'touchstart'\n    ];\n\n    this.$selection.on(stoppedEvents.join(' '), function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  return StopPropagation;\n});\n\nS2.define('jquery.select2',[\n  'jquery',\n  'require',\n\n  './select2/core',\n  './select2/defaults'\n], function ($, require, Select2, Defaults) {\n  // Force jQuery.mousewheel to be loaded if it hasn't already\n  require('jquery.mousewheel');\n\n  if ($.fn.select2 == null) {\n    // All methods that should return the element\n    var thisMethods = ['open', 'close', 'destroy'];\n\n    $.fn.select2 = function (options) {\n      options = options || {};\n\n      if (typeof options === 'object') {\n        this.each(function () {\n          var instanceOptions = $.extend({}, options, true);\n\n          var instance = new Select2($(this), instanceOptions);\n        });\n\n        return this;\n      } else if (typeof options === 'string') {\n        var instance = this.data('select2');\n\n        if (instance == null && window.console && console.error) {\n          console.error(\n            'The select2(\\'' + options + '\\') method was called on an ' +\n            'element that is not using Select2.'\n          );\n        }\n\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        var ret = instance[options](args);\n\n        // Check if we should be returning `this`\n        if ($.inArray(options, thisMethods) > -1) {\n          return this;\n        }\n\n        return ret;\n      } else {\n        throw new Error('Invalid arguments for Select2: ' + options);\n      }\n    };\n  }\n\n  if ($.fn.select2.defaults == null) {\n    $.fn.select2.defaults = Defaults;\n  }\n\n  return Select2;\n});\n\n/*!\n * jQuery Mousewheel 3.1.12\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n(function (factory) {\n    if ( typeof S2.define === 'function' && S2.define.amd ) {\n        // AMD. Register as an anonymous module.\n        S2.define('jquery.mousewheel',['jquery'], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS style for Browserify\n        module.exports = factory;\n    } else {\n        // Browser globals\n        factory(jQuery);\n    }\n}(function ($) {\n\n    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\n        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\n                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n        slice  = Array.prototype.slice,\n        nullLowestDeltaTimeout, lowestDelta;\n\n    if ( $.event.fixHooks ) {\n        for ( var i = toFix.length; i; ) {\n            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\n        }\n    }\n\n    var special = $.event.special.mousewheel = {\n        version: '3.1.12',\n\n        setup: function() {\n            if ( this.addEventListener ) {\n                for ( var i = toBind.length; i; ) {\n                    this.addEventListener( toBind[--i], handler, false );\n                }\n            } else {\n                this.onmousewheel = handler;\n            }\n            // Store the line height and page height for this particular element\n            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\n            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\n        },\n\n        teardown: function() {\n            if ( this.removeEventListener ) {\n                for ( var i = toBind.length; i; ) {\n                    this.removeEventListener( toBind[--i], handler, false );\n                }\n            } else {\n                this.onmousewheel = null;\n            }\n            // Clean up the data we added to the element\n            $.removeData(this, 'mousewheel-line-height');\n            $.removeData(this, 'mousewheel-page-height');\n        },\n\n        getLineHeight: function(elem) {\n            var $elem = $(elem),\n                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();\n            if (!$parent.length) {\n                $parent = $('body');\n            }\n            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;\n        },\n\n        getPageHeight: function(elem) {\n            return $(elem).height();\n        },\n\n        settings: {\n            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below\n            normalizeOffset: true  // calls getBoundingClientRect for each event\n        }\n    };\n\n    $.fn.extend({\n        mousewheel: function(fn) {\n            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\n        },\n\n        unmousewheel: function(fn) {\n            return this.unbind('mousewheel', fn);\n        }\n    });\n\n\n    function handler(event) {\n        var orgEvent   = event || window.event,\n            args       = slice.call(arguments, 1),\n            delta      = 0,\n            deltaX     = 0,\n            deltaY     = 0,\n            absDelta   = 0,\n            offsetX    = 0,\n            offsetY    = 0;\n        event = $.event.fix(orgEvent);\n        event.type = 'mousewheel';\n\n        // Old school scrollwheel delta\n        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }\n        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }\n        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }\n        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\n\n        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n            deltaX = deltaY * -1;\n            deltaY = 0;\n        }\n\n        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n        delta = deltaY === 0 ? deltaX : deltaY;\n\n        // New school wheel delta (wheel event)\n        if ( 'deltaY' in orgEvent ) {\n            deltaY = orgEvent.deltaY * -1;\n            delta  = deltaY;\n        }\n        if ( 'deltaX' in orgEvent ) {\n            deltaX = orgEvent.deltaX;\n            if ( deltaY === 0 ) { delta  = deltaX * -1; }\n        }\n\n        // No change actually happened, no reason to go any further\n        if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n        // Need to convert lines and pages to pixels if we aren't already in pixels\n        // There are three delta modes:\n        //   * deltaMode 0 is by pixels, nothing to do\n        //   * deltaMode 1 is by lines\n        //   * deltaMode 2 is by pages\n        if ( orgEvent.deltaMode === 1 ) {\n            var lineHeight = $.data(this, 'mousewheel-line-height');\n            delta  *= lineHeight;\n            deltaY *= lineHeight;\n            deltaX *= lineHeight;\n        } else if ( orgEvent.deltaMode === 2 ) {\n            var pageHeight = $.data(this, 'mousewheel-page-height');\n            delta  *= pageHeight;\n            deltaY *= pageHeight;\n            deltaX *= pageHeight;\n        }\n\n        // Store lowest absolute delta to normalize the delta values\n        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n        if ( !lowestDelta || absDelta < lowestDelta ) {\n            lowestDelta = absDelta;\n\n            // Adjust older deltas if necessary\n            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n                lowestDelta /= 40;\n            }\n        }\n\n        // Adjust older deltas if necessary\n        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n            // Divide all the things by 40!\n            delta  /= 40;\n            deltaX /= 40;\n            deltaY /= 40;\n        }\n\n        // Get a whole, normalized value for the deltas\n        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);\n        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n        // Normalise offsetX and offsetY properties\n        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {\n            var boundingRect = this.getBoundingClientRect();\n            offsetX = event.clientX - boundingRect.left;\n            offsetY = event.clientY - boundingRect.top;\n        }\n\n        // Add information to the event object\n        event.deltaX = deltaX;\n        event.deltaY = deltaY;\n        event.deltaFactor = lowestDelta;\n        event.offsetX = offsetX;\n        event.offsetY = offsetY;\n        // Go ahead and set deltaMode to 0 since we converted to pixels\n        // Although this is a little odd since we overwrite the deltaX/Y\n        // properties with normalized deltas.\n        event.deltaMode = 0;\n\n        // Add event and delta to the front of the arguments\n        args.unshift(event, delta, deltaX, deltaY);\n\n        // Clearout lowestDelta after sometime to better\n        // handle multiple device types that give different\n        // a different lowestDelta\n        // Ex: trackpad = 3 and mouse wheel = 120\n        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n        return ($.event.dispatch || $.event.handle).apply(this, args);\n    }\n\n    function nullLowestDelta() {\n        lowestDelta = null;\n    }\n\n    function shouldAdjustOldDeltas(orgEvent, absDelta) {\n        // If this is an older event and the delta is divisable by 120,\n        // then we are assuming that the browser is treating this as an\n        // older mouse wheel event and that we should divide the deltas\n        // by 40 to try and get a more usable deltaFactor.\n        // Side note, this actually impacts the reported scroll distance\n        // in older browsers and can cause scrolling to be slower than native.\n        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n    }\n\n}));\n\n  // Return the AMD loader configuration so it can be used outside of this file\n  return {\n    define: S2.define,\n    require: S2.require\n  };\n}());\n\n  // Autoload the jQuery bindings\n  // We know that all of the modules exist above this, so we're safe\n  var select2 = S2.require('jquery.select2');\n\n  // Hold the AMD module references on the jQuery function that was just loaded\n  // This allows Select2 to use the internal loader outside of this file, such\n  // as in the language files.\n  jQuery.fn.select2.amd = S2;\n\n  // Return the Select2 instance for anyone who is importing it.\n  return select2;\n}));\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/select2/select2.js",
    "content": "/*!\n * Select2 4.0.0\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\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 exports === 'object') {\n    // Node/CommonJS\n    factory(require('jquery'));\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n}(function (jQuery) {\n  // This is needed so we can catch the AMD loader configuration and use it\n  // The inner file should be wrapped (by `banner.start.js`) in a function that\n  // returns the AMD loader references.\n  var S2 =\n(function () {\n  // Restore the Select2 AMD loader so it can be used\n  // Needed mostly in the language files, where the loader is not inserted\n  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n    var S2 = jQuery.fn.select2.amd;\n  }\nvar S2;(function () { if (!S2 || !S2.requirejs) {\nif (!S2) { S2 = {}; } else { require = S2; }\n/**\n * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*jslint sloppy: true */\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n    var main, req, makeMap, handlers,\n        defined = {},\n        waiting = {},\n        config = {},\n        defining = {},\n        hasOwn = Object.prototype.hasOwnProperty,\n        aps = [].slice,\n        jsSuffixRegExp = /\\.js$/;\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    /**\n     * Given a relative module name, like ./something, normalize it to\n     * a real name that can be mapped to a path.\n     * @param {String} name the relative name\n     * @param {String} baseName a real name that the name arg is relative\n     * to.\n     * @returns {String} normalized name\n     */\n    function normalize(name, baseName) {\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n            foundI, foundStarMap, starI, i, j, part,\n            baseParts = baseName && baseName.split(\"/\"),\n            map = config.map,\n            starMap = (map && map['*']) || {};\n\n        //Adjust any relative paths.\n        if (name && name.charAt(0) === \".\") {\n            //If have a base name, try to normalize against it,\n            //otherwise, assume it is a top-level require that will\n            //be relative to baseUrl in the end.\n            if (baseName) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that \"directory\" and not name of the baseName's\n                //module. For instance, baseName of \"one/two/three\", maps to\n                //\"one/two/three.js\", but we want the directory, \"one/two\" for\n                //this normalization.\n                baseParts = baseParts.slice(0, baseParts.length - 1);\n                name = name.split('/');\n                lastIndex = name.length - 1;\n\n                // Node .js allowance:\n                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n                }\n\n                name = baseParts.concat(name);\n\n                //start trimDots\n                for (i = 0; i < name.length; i += 1) {\n                    part = name[i];\n                    if (part === \".\") {\n                        name.splice(i, 1);\n                        i -= 1;\n                    } else if (part === \"..\") {\n                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {\n                            //End of the line. Keep at least one non-dot\n                            //path segment at the front so it can be mapped\n                            //correctly to disk. Otherwise, there is likely\n                            //no path mapping for a path starting with '..'.\n                            //This can still fail, but catches the most reasonable\n                            //uses of ..\n                            break;\n                        } else if (i > 0) {\n                            name.splice(i - 1, 2);\n                            i -= 2;\n                        }\n                    }\n                }\n                //end trimDots\n\n                name = name.join(\"/\");\n            } else if (name.indexOf('./') === 0) {\n                // No baseName, so this is ID is resolved relative\n                // to baseUrl, pull off the leading dot.\n                name = name.substring(2);\n            }\n        }\n\n        //Apply map config if available.\n        if ((baseParts || starMap) && map) {\n            nameParts = name.split('/');\n\n            for (i = nameParts.length; i > 0; i -= 1) {\n                nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                if (baseParts) {\n                    //Find the longest baseName segment match in the config.\n                    //So, do joins on the biggest to smallest lengths of baseParts.\n                    for (j = baseParts.length; j > 0; j -= 1) {\n                        mapValue = map[baseParts.slice(0, j).join('/')];\n\n                        //baseName segment has  config, find if it has one for\n                        //this name.\n                        if (mapValue) {\n                            mapValue = mapValue[nameSegment];\n                            if (mapValue) {\n                                //Match, update name to the new value.\n                                foundMap = mapValue;\n                                foundI = i;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (foundMap) {\n                    break;\n                }\n\n                //Check for a star map match, but just hold on to it,\n                //if there is a shorter segment match later in a matching\n                //config, then favor over this star map.\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\n                    foundStarMap = starMap[nameSegment];\n                    starI = i;\n                }\n            }\n\n            if (!foundMap && foundStarMap) {\n                foundMap = foundStarMap;\n                foundI = starI;\n            }\n\n            if (foundMap) {\n                nameParts.splice(0, foundI, foundMap);\n                name = nameParts.join('/');\n            }\n        }\n\n        return name;\n    }\n\n    function makeRequire(relName, forceSync) {\n        return function () {\n            //A version of a require function that passes a moduleName\n            //value for items that may need to\n            //look up paths relative to the moduleName\n            return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));\n        };\n    }\n\n    function makeNormalize(relName) {\n        return function (name) {\n            return normalize(name, relName);\n        };\n    }\n\n    function makeLoad(depName) {\n        return function (value) {\n            defined[depName] = value;\n        };\n    }\n\n    function callDep(name) {\n        if (hasProp(waiting, name)) {\n            var args = waiting[name];\n            delete waiting[name];\n            defining[name] = true;\n            main.apply(undef, args);\n        }\n\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\n            throw new Error('No ' + name);\n        }\n        return defined[name];\n    }\n\n    //Turns a plugin!resource to [plugin, resource]\n    //with the plugin being undefined if the name\n    //did not have a plugin prefix.\n    function splitPrefix(name) {\n        var prefix,\n            index = name ? name.indexOf('!') : -1;\n        if (index > -1) {\n            prefix = name.substring(0, index);\n            name = name.substring(index + 1, name.length);\n        }\n        return [prefix, name];\n    }\n\n    /**\n     * Makes a name map, normalizing the name, and using a plugin\n     * for normalization if necessary. Grabs a ref to plugin\n     * too, as an optimization.\n     */\n    makeMap = function (name, relName) {\n        var plugin,\n            parts = splitPrefix(name),\n            prefix = parts[0];\n\n        name = parts[1];\n\n        if (prefix) {\n            prefix = normalize(prefix, relName);\n            plugin = callDep(prefix);\n        }\n\n        //Normalize according\n        if (prefix) {\n            if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relName));\n            } else {\n                name = normalize(name, relName);\n            }\n        } else {\n            name = normalize(name, relName);\n            parts = splitPrefix(name);\n            prefix = parts[0];\n            name = parts[1];\n            if (prefix) {\n                plugin = callDep(prefix);\n            }\n        }\n\n        //Using ridiculous property names for space reasons\n        return {\n            f: prefix ? prefix + '!' + name : name, //fullName\n            n: name,\n            pr: prefix,\n            p: plugin\n        };\n    };\n\n    function makeConfig(name) {\n        return function () {\n            return (config && config.config && config.config[name]) || {};\n        };\n    }\n\n    handlers = {\n        require: function (name) {\n            return makeRequire(name);\n        },\n        exports: function (name) {\n            var e = defined[name];\n            if (typeof e !== 'undefined') {\n                return e;\n            } else {\n                return (defined[name] = {});\n            }\n        },\n        module: function (name) {\n            return {\n                id: name,\n                uri: '',\n                exports: defined[name],\n                config: makeConfig(name)\n            };\n        }\n    };\n\n    main = function (name, deps, callback, relName) {\n        var cjsModule, depName, ret, map, i,\n            args = [],\n            callbackType = typeof callback,\n            usingExports;\n\n        //Use name if no relName\n        relName = relName || name;\n\n        //Call the callback to define the module, if necessary.\n        if (callbackType === 'undefined' || callbackType === 'function') {\n            //Pull out the defined dependencies and pass the ordered\n            //values to the callback.\n            //Default to [require, exports, module] if no deps\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n            for (i = 0; i < deps.length; i += 1) {\n                map = makeMap(deps[i], relName);\n                depName = map.f;\n\n                //Fast path CommonJS standard dependencies.\n                if (depName === \"require\") {\n                    args[i] = handlers.require(name);\n                } else if (depName === \"exports\") {\n                    //CommonJS module spec 1.1\n                    args[i] = handlers.exports(name);\n                    usingExports = true;\n                } else if (depName === \"module\") {\n                    //CommonJS module spec 1.1\n                    cjsModule = args[i] = handlers.module(name);\n                } else if (hasProp(defined, depName) ||\n                           hasProp(waiting, depName) ||\n                           hasProp(defining, depName)) {\n                    args[i] = callDep(depName);\n                } else if (map.p) {\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                    args[i] = defined[depName];\n                } else {\n                    throw new Error(name + ' missing ' + depName);\n                }\n            }\n\n            ret = callback ? callback.apply(defined[name], args) : undefined;\n\n            if (name) {\n                //If setting exports via \"module\" is in play,\n                //favor that over return value and exports. After that,\n                //favor a non-undefined return value over exports use.\n                if (cjsModule && cjsModule.exports !== undef &&\n                        cjsModule.exports !== defined[name]) {\n                    defined[name] = cjsModule.exports;\n                } else if (ret !== undef || !usingExports) {\n                    //Use the return value from the function.\n                    defined[name] = ret;\n                }\n            }\n        } else if (name) {\n            //May just be an object definition for the module. Only\n            //worry about defining if have a module name.\n            defined[name] = callback;\n        }\n    };\n\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n        if (typeof deps === \"string\") {\n            if (handlers[deps]) {\n                //callback in this case is really relName\n                return handlers[deps](callback);\n            }\n            //Just return the module wanted. In this scenario, the\n            //deps arg is the module name, and second arg (if passed)\n            //is just the relName.\n            //Normalize module name, if it contains . or ..\n            return callDep(makeMap(deps, callback).f);\n        } else if (!deps.splice) {\n            //deps is a config object, not an array.\n            config = deps;\n            if (config.deps) {\n                req(config.deps, config.callback);\n            }\n            if (!callback) {\n                return;\n            }\n\n            if (callback.splice) {\n                //callback is an array, which means it is a dependency list.\n                //Adjust args if there are dependencies\n                deps = callback;\n                callback = relName;\n                relName = null;\n            } else {\n                deps = undef;\n            }\n        }\n\n        //Support require(['a'])\n        callback = callback || function () {};\n\n        //If relName is a function, it is an errback handler,\n        //so remove it.\n        if (typeof relName === 'function') {\n            relName = forceSync;\n            forceSync = alt;\n        }\n\n        //Simulate async callback;\n        if (forceSync) {\n            main(undef, deps, callback, relName);\n        } else {\n            //Using a non-zero value because of concern for what old browsers\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n            //If want a value immediately, use require('id') instead -- something\n            //that works in almond on the global level, but not guaranteed and\n            //unlikely to work in other AMD implementations.\n            setTimeout(function () {\n                main(undef, deps, callback, relName);\n            }, 4);\n        }\n\n        return req;\n    };\n\n    /**\n     * Just drops the config on the floor, but returns req in case\n     * the config return value is used.\n     */\n    req.config = function (cfg) {\n        return req(cfg);\n    };\n\n    /**\n     * Expose module registry for debugging and tooling\n     */\n    requirejs._defined = defined;\n\n    define = function (name, deps, callback) {\n\n        //This module may not have dependencies\n        if (!deps.splice) {\n            //deps is not an array, so probably means\n            //an object literal or factory function for\n            //the value. Adjust args.\n            callback = deps;\n            deps = [];\n        }\n\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n            waiting[name] = [name, deps, callback];\n        }\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n}());\n\nS2.requirejs = requirejs;S2.require = require;S2.define = define;\n}\n}());\nS2.define(\"almond\", function(){});\n\n/* global jQuery:false, $:false */\nS2.define('jquery',[],function () {\n  var _$ = jQuery || $;\n\n  if (_$ == null && console && console.error) {\n    console.error(\n      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +\n      'found. Make sure that you are including jQuery before Select2 on your ' +\n      'web page.'\n    );\n  }\n\n  return _$;\n});\n\nS2.define('select2/utils',[\n  'jquery'\n], function ($) {\n  var Utils = {};\n\n  Utils.Extend = function (ChildClass, SuperClass) {\n    var __hasProp = {}.hasOwnProperty;\n\n    function BaseConstructor () {\n      this.constructor = ChildClass;\n    }\n\n    for (var key in SuperClass) {\n      if (__hasProp.call(SuperClass, key)) {\n        ChildClass[key] = SuperClass[key];\n      }\n    }\n\n    BaseConstructor.prototype = SuperClass.prototype;\n    ChildClass.prototype = new BaseConstructor();\n    ChildClass.__super__ = SuperClass.prototype;\n\n    return ChildClass;\n  };\n\n  function getMethods (theClass) {\n    var proto = theClass.prototype;\n\n    var methods = [];\n\n    for (var methodName in proto) {\n      var m = proto[methodName];\n\n      if (typeof m !== 'function') {\n        continue;\n      }\n\n      if (methodName === 'constructor') {\n        continue;\n      }\n\n      methods.push(methodName);\n    }\n\n    return methods;\n  }\n\n  Utils.Decorate = function (SuperClass, DecoratorClass) {\n    var decoratedMethods = getMethods(DecoratorClass);\n    var superMethods = getMethods(SuperClass);\n\n    function DecoratedClass () {\n      var unshift = Array.prototype.unshift;\n\n      var argCount = DecoratorClass.prototype.constructor.length;\n\n      var calledConstructor = SuperClass.prototype.constructor;\n\n      if (argCount > 0) {\n        unshift.call(arguments, SuperClass.prototype.constructor);\n\n        calledConstructor = DecoratorClass.prototype.constructor;\n      }\n\n      calledConstructor.apply(this, arguments);\n    }\n\n    DecoratorClass.displayName = SuperClass.displayName;\n\n    function ctr () {\n      this.constructor = DecoratedClass;\n    }\n\n    DecoratedClass.prototype = new ctr();\n\n    for (var m = 0; m < superMethods.length; m++) {\n        var superMethod = superMethods[m];\n\n        DecoratedClass.prototype[superMethod] =\n          SuperClass.prototype[superMethod];\n    }\n\n    var calledMethod = function (methodName) {\n      // Stub out the original method if it's not decorating an actual method\n      var originalMethod = function () {};\n\n      if (methodName in DecoratedClass.prototype) {\n        originalMethod = DecoratedClass.prototype[methodName];\n      }\n\n      var decoratedMethod = DecoratorClass.prototype[methodName];\n\n      return function () {\n        var unshift = Array.prototype.unshift;\n\n        unshift.call(arguments, originalMethod);\n\n        return decoratedMethod.apply(this, arguments);\n      };\n    };\n\n    for (var d = 0; d < decoratedMethods.length; d++) {\n      var decoratedMethod = decoratedMethods[d];\n\n      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n    }\n\n    return DecoratedClass;\n  };\n\n  var Observable = function () {\n    this.listeners = {};\n  };\n\n  Observable.prototype.on = function (event, callback) {\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.listeners[event].push(callback);\n    } else {\n      this.listeners[event] = [callback];\n    }\n  };\n\n  Observable.prototype.trigger = function (event) {\n    var slice = Array.prototype.slice;\n\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.invoke(this.listeners[event], slice.call(arguments, 1));\n    }\n\n    if ('*' in this.listeners) {\n      this.invoke(this.listeners['*'], arguments);\n    }\n  };\n\n  Observable.prototype.invoke = function (listeners, params) {\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      listeners[i].apply(this, params);\n    }\n  };\n\n  Utils.Observable = Observable;\n\n  Utils.generateChars = function (length) {\n    var chars = '';\n\n    for (var i = 0; i < length; i++) {\n      var randomChar = Math.floor(Math.random() * 36);\n      chars += randomChar.toString(36);\n    }\n\n    return chars;\n  };\n\n  Utils.bind = function (func, context) {\n    return function () {\n      func.apply(context, arguments);\n    };\n  };\n\n  Utils._convertData = function (data) {\n    for (var originalKey in data) {\n      var keys = originalKey.split('-');\n\n      var dataLevel = data;\n\n      if (keys.length === 1) {\n        continue;\n      }\n\n      for (var k = 0; k < keys.length; k++) {\n        var key = keys[k];\n\n        // Lowercase the first letter\n        // By default, dash-separated becomes camelCase\n        key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n        if (!(key in dataLevel)) {\n          dataLevel[key] = {};\n        }\n\n        if (k == keys.length - 1) {\n          dataLevel[key] = data[originalKey];\n        }\n\n        dataLevel = dataLevel[key];\n      }\n\n      delete data[originalKey];\n    }\n\n    return data;\n  };\n\n  Utils.hasScroll = function (index, el) {\n    // Adapted from the function created by @ShadowScripter\n    // and adapted by @BillBarry on the Stack Exchange Code Review website.\n    // The original code can be found at\n    // http://codereview.stackexchange.com/q/13338\n    // and was designed to be used with the Sizzle selector engine.\n\n    var $el = $(el);\n    var overflowX = el.style.overflowX;\n    var overflowY = el.style.overflowY;\n\n    //Check both x and y declarations\n    if (overflowX === overflowY &&\n        (overflowY === 'hidden' || overflowY === 'visible')) {\n      return false;\n    }\n\n    if (overflowX === 'scroll' || overflowY === 'scroll') {\n      return true;\n    }\n\n    return ($el.innerHeight() < el.scrollHeight ||\n      $el.innerWidth() < el.scrollWidth);\n  };\n\n  Utils.escapeMarkup = function (markup) {\n    var replaceMap = {\n      '\\\\': '&#92;',\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '/': '&#47;'\n    };\n\n    // Do not try to escape the markup if it's not a string\n    if (typeof markup !== 'string') {\n      return markup;\n    }\n\n    return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n      return replaceMap[match];\n    });\n  };\n\n  // Append an array of jQuery nodes to a given element.\n  Utils.appendMany = function ($element, $nodes) {\n    // jQuery 1.7.x does not support $.fn.append() with an array\n    // Fall back to a jQuery object collection using $.fn.add()\n    if ($.fn.jquery.substr(0, 3) === '1.7') {\n      var $jqNodes = $();\n\n      $.map($nodes, function (node) {\n        $jqNodes = $jqNodes.add(node);\n      });\n\n      $nodes = $jqNodes;\n    }\n\n    $element.append($nodes);\n  };\n\n  return Utils;\n});\n\nS2.define('select2/results',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Results ($element, options, dataAdapter) {\n    this.$element = $element;\n    this.data = dataAdapter;\n    this.options = options;\n\n    Results.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Results, Utils.Observable);\n\n  Results.prototype.render = function () {\n    var $results = $(\n      '<ul class=\"select2-results__options\" role=\"tree\"></ul>'\n    );\n\n    if (this.options.get('multiple')) {\n      $results.attr('aria-multiselectable', 'true');\n    }\n\n    this.$results = $results;\n\n    return $results;\n  };\n\n  Results.prototype.clear = function () {\n    this.$results.empty();\n  };\n\n  Results.prototype.displayMessage = function (params) {\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    this.clear();\n    this.hideLoading();\n\n    var $message = $(\n      '<li role=\"treeitem\" class=\"select2-results__option\"></li>'\n    );\n\n    var message = this.options.get('translations').get(params.message);\n\n    $message.append(\n      escapeMarkup(\n        message(params.args)\n      )\n    );\n\n    this.$results.append($message);\n  };\n\n  Results.prototype.append = function (data) {\n    this.hideLoading();\n\n    var $options = [];\n\n    if (data.results == null || data.results.length === 0) {\n      if (this.$results.children().length === 0) {\n        this.trigger('results:message', {\n          message: 'noResults'\n        });\n      }\n\n      return;\n    }\n\n    data.results = this.sort(data.results);\n\n    for (var d = 0; d < data.results.length; d++) {\n      var item = data.results[d];\n\n      var $option = this.option(item);\n\n      $options.push($option);\n    }\n\n    this.$results.append($options);\n  };\n\n  Results.prototype.position = function ($results, $dropdown) {\n    var $resultsContainer = $dropdown.find('.select2-results');\n    $resultsContainer.append($results);\n  };\n\n  Results.prototype.sort = function (data) {\n    var sorter = this.options.get('sorter');\n\n    return sorter(data);\n  };\n\n  Results.prototype.setClasses = function () {\n    var self = this;\n\n    this.data.current(function (selected) {\n      var selectedIds = $.map(selected, function (s) {\n        return s.id.toString();\n      });\n\n      var $options = self.$results\n        .find('.select2-results__option[aria-selected]');\n\n      $options.each(function () {\n        var $option = $(this);\n\n        var item = $.data(this, 'data');\n\n        // id needs to be converted to a string when comparing\n        var id = '' + item.id;\n\n        if ((item.element != null && item.element.selected) ||\n            (item.element == null && $.inArray(id, selectedIds) > -1)) {\n          $option.attr('aria-selected', 'true');\n        } else {\n          $option.attr('aria-selected', 'false');\n        }\n      });\n\n      var $selected = $options.filter('[aria-selected=true]');\n\n      // Check if there are any selected options\n      if ($selected.length > 0) {\n        // If there are selected options, highlight the first\n        $selected.first().trigger('mouseenter');\n      } else {\n        // If there are no selected options, highlight the first option\n        // in the dropdown\n        $options.first().trigger('mouseenter');\n      }\n    });\n  };\n\n  Results.prototype.showLoading = function (params) {\n    this.hideLoading();\n\n    var loadingMore = this.options.get('translations').get('searching');\n\n    var loading = {\n      disabled: true,\n      loading: true,\n      text: loadingMore(params)\n    };\n    var $loading = this.option(loading);\n    $loading.className += ' loading-results';\n\n    this.$results.prepend($loading);\n  };\n\n  Results.prototype.hideLoading = function () {\n    this.$results.find('.loading-results').remove();\n  };\n\n  Results.prototype.option = function (data) {\n    var option = document.createElement('li');\n    option.className = 'select2-results__option';\n\n    var attrs = {\n      'role': 'treeitem',\n      'aria-selected': 'false'\n    };\n\n    if (data.disabled) {\n      delete attrs['aria-selected'];\n      attrs['aria-disabled'] = 'true';\n    }\n\n    if (data.id == null) {\n      delete attrs['aria-selected'];\n    }\n\n    if (data._resultId != null) {\n      option.id = data._resultId;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    if (data.children) {\n      attrs.role = 'group';\n      attrs['aria-label'] = data.text;\n      delete attrs['aria-selected'];\n    }\n\n    for (var attr in attrs) {\n      var val = attrs[attr];\n\n      option.setAttribute(attr, val);\n    }\n\n    if (data.children) {\n      var $option = $(option);\n\n      var label = document.createElement('strong');\n      label.className = 'select2-results__group';\n\n      var $label = $(label);\n      this.template(data, label);\n\n      var $children = [];\n\n      for (var c = 0; c < data.children.length; c++) {\n        var child = data.children[c];\n\n        var $child = this.option(child);\n\n        $children.push($child);\n      }\n\n      var $childrenContainer = $('<ul></ul>', {\n        'class': 'select2-results__options select2-results__options--nested'\n      });\n\n      $childrenContainer.append($children);\n\n      $option.append(label);\n      $option.append($childrenContainer);\n    } else {\n      this.template(data, option);\n    }\n\n    $.data(option, 'data', data);\n\n    return option;\n  };\n\n  Results.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-results';\n\n    this.$results.attr('id', id);\n\n    container.on('results:all', function (params) {\n      self.clear();\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('results:append', function (params) {\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('query', function (params) {\n      self.showLoading(params);\n    });\n\n    container.on('select', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('unselect', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expended=\"true\"\n      self.$results.attr('aria-expanded', 'true');\n      self.$results.attr('aria-hidden', 'false');\n\n      self.setClasses();\n      self.ensureHighlightVisible();\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expended=\"false\"\n      self.$results.attr('aria-expanded', 'false');\n      self.$results.attr('aria-hidden', 'true');\n      self.$results.removeAttr('aria-activedescendant');\n    });\n\n    container.on('results:toggle', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      $highlighted.trigger('mouseup');\n    });\n\n    container.on('results:select', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      var data = $highlighted.data('data');\n\n      if ($highlighted.attr('aria-selected') == 'true') {\n        self.trigger('close');\n      } else {\n        self.trigger('select', {\n          data: data\n        });\n      }\n    });\n\n    container.on('results:previous', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      // If we are already at te top, don't move further\n      if (currentIndex === 0) {\n        return;\n      }\n\n      var nextIndex = currentIndex - 1;\n\n      // If none are highlighted, highlight the first\n      if ($highlighted.length === 0) {\n        nextIndex = 0;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top;\n      var nextTop = $next.offset().top;\n      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextTop - currentOffset < 0) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:next', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('[aria-selected]');\n\n      var currentIndex = $options.index($highlighted);\n\n      var nextIndex = currentIndex + 1;\n\n      // If we are at the last option, stay there\n      if (nextIndex >= $options.length) {\n        return;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var nextBottom = $next.offset().top + $next.outerHeight(false);\n      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextBottom > currentOffset) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      params.element.addClass('select2-results__option--highlighted');\n    });\n\n    container.on('results:message', function (params) {\n      self.displayMessage(params);\n    });\n\n    if ($.fn.mousewheel) {\n      this.$results.on('mousewheel', function (e) {\n        var top = self.$results.scrollTop();\n\n        var bottom = (\n          self.$results.get(0).scrollHeight -\n          self.$results.scrollTop() +\n          e.deltaY\n        );\n\n        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n        if (isAtTop) {\n          self.$results.scrollTop(0);\n\n          e.preventDefault();\n          e.stopPropagation();\n        } else if (isAtBottom) {\n          self.$results.scrollTop(\n            self.$results.get(0).scrollHeight - self.$results.height()\n          );\n\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      });\n    }\n\n    this.$results.on('mouseup', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var $this = $(this);\n\n      var data = $this.data('data');\n\n      if ($this.attr('aria-selected') === 'true') {\n        if (self.options.get('multiple')) {\n          self.trigger('unselect', {\n            originalEvent: evt,\n            data: data\n          });\n        } else {\n          self.trigger('close');\n        }\n\n        return;\n      }\n\n      self.trigger('select', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n\n    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',\n      function (evt) {\n      var data = $(this).data('data');\n\n      self.getHighlightedResults()\n          .removeClass('select2-results__option--highlighted');\n\n      self.trigger('results:focus', {\n        data: data,\n        element: $(this)\n      });\n    });\n  };\n\n  Results.prototype.getHighlightedResults = function () {\n    var $highlighted = this.$results\n    .find('.select2-results__option--highlighted');\n\n    return $highlighted;\n  };\n\n  Results.prototype.destroy = function () {\n    this.$results.remove();\n  };\n\n  Results.prototype.ensureHighlightVisible = function () {\n    var $highlighted = this.getHighlightedResults();\n\n    if ($highlighted.length === 0) {\n      return;\n    }\n\n    var $options = this.$results.find('[aria-selected]');\n\n    var currentIndex = $options.index($highlighted);\n\n    var currentOffset = this.$results.offset().top;\n    var nextTop = $highlighted.offset().top;\n    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n\n    var offsetDelta = nextTop - currentOffset;\n    nextOffset -= $highlighted.outerHeight(false) * 2;\n\n    if (currentIndex <= 2) {\n      this.$results.scrollTop(0);\n    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n      this.$results.scrollTop(nextOffset);\n    }\n  };\n\n  Results.prototype.template = function (result, container) {\n    var template = this.options.get('templateResult');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    var content = template(result);\n\n    if (content == null) {\n      container.style.display = 'none';\n    } else if (typeof content === 'string') {\n      container.innerHTML = escapeMarkup(content);\n    } else {\n      $(container).append(content);\n    }\n  };\n\n  return Results;\n});\n\nS2.define('select2/keys',[\n\n], function () {\n  var KEYS = {\n    BACKSPACE: 8,\n    TAB: 9,\n    ENTER: 13,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    ESC: 27,\n    SPACE: 32,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    END: 35,\n    HOME: 36,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    DELETE: 46\n  };\n\n  return KEYS;\n});\n\nS2.define('select2/selection/base',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function BaseSelection ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    BaseSelection.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseSelection, Utils.Observable);\n\n  BaseSelection.prototype.render = function () {\n    var $selection = $(\n      '<span class=\"select2-selection\" role=\"combobox\" ' +\n      'aria-autocomplete=\"list\" aria-haspopup=\"true\" aria-expanded=\"false\">' +\n      '</span>'\n    );\n\n    this._tabindex = 0;\n\n    if (this.$element.data('old-tabindex') != null) {\n      this._tabindex = this.$element.data('old-tabindex');\n    } else if (this.$element.attr('tabindex') != null) {\n      this._tabindex = this.$element.attr('tabindex');\n    }\n\n    $selection.attr('title', this.$element.attr('title'));\n    $selection.attr('tabindex', this._tabindex);\n\n    this.$selection = $selection;\n\n    return $selection;\n  };\n\n  BaseSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-container';\n    var resultsId = container.id + '-results';\n\n    this.container = container;\n\n    this.$selection.on('focus', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('blur', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      if (evt.which === KEYS.SPACE) {\n        evt.preventDefault();\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      self.$selection.attr('aria-activedescendant', params.data._resultId);\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expanded=\"true\"\n      self.$selection.attr('aria-expanded', 'true');\n      self.$selection.attr('aria-owns', resultsId);\n\n      self._attachCloseHandler(container);\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expanded=\"false\"\n      self.$selection.attr('aria-expanded', 'false');\n      self.$selection.removeAttr('aria-activedescendant');\n      self.$selection.removeAttr('aria-owns');\n\n      self.$selection.focus();\n\n      self._detachCloseHandler(container);\n    });\n\n    container.on('enable', function () {\n      self.$selection.attr('tabindex', self._tabindex);\n    });\n\n    container.on('disable', function () {\n      self.$selection.attr('tabindex', '-1');\n    });\n  };\n\n  BaseSelection.prototype._attachCloseHandler = function (container) {\n    var self = this;\n\n    $(document.body).on('mousedown.select2.' + container.id, function (e) {\n      var $target = $(e.target);\n\n      var $select = $target.closest('.select2');\n\n      var $all = $('.select2.select2-container--open');\n\n      $all.each(function () {\n        var $this = $(this);\n\n        if (this == $select[0]) {\n          return;\n        }\n\n        var $element = $this.data('element');\n\n        $element.select2('close');\n      });\n    });\n  };\n\n  BaseSelection.prototype._detachCloseHandler = function (container) {\n    $(document.body).off('mousedown.select2.' + container.id);\n  };\n\n  BaseSelection.prototype.position = function ($selection, $container) {\n    var $selectionContainer = $container.find('.selection');\n    $selectionContainer.append($selection);\n  };\n\n  BaseSelection.prototype.destroy = function () {\n    this._detachCloseHandler(this.container);\n  };\n\n  BaseSelection.prototype.update = function (data) {\n    throw new Error('The `update` method must be defined in child classes.');\n  };\n\n  return BaseSelection;\n});\n\nS2.define('select2/selection/single',[\n  'jquery',\n  './base',\n  '../utils',\n  '../keys'\n], function ($, BaseSelection, Utils, KEYS) {\n  function SingleSelection () {\n    SingleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(SingleSelection, BaseSelection);\n\n  SingleSelection.prototype.render = function () {\n    var $selection = SingleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--single');\n\n    $selection.html(\n      '<span class=\"select2-selection__rendered\"></span>' +\n      '<span class=\"select2-selection__arrow\" role=\"presentation\">' +\n        '<b role=\"presentation\"></b>' +\n      '</span>'\n    );\n\n    return $selection;\n  };\n\n  SingleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    SingleSelection.__super__.bind.apply(this, arguments);\n\n    var id = container.id + '-container';\n\n    this.$selection.find('.select2-selection__rendered').attr('id', id);\n    this.$selection.attr('aria-labelledby', id);\n\n    this.$selection.on('mousedown', function (evt) {\n      // Only respond to left clicks\n      if (evt.which !== 1) {\n        return;\n      }\n\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('focus', function (evt) {\n      // User focuses on the container\n    });\n\n    this.$selection.on('blur', function (evt) {\n      // User exits the container\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n  };\n\n  SingleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  SingleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  SingleSelection.prototype.selectionContainer = function () {\n    return $('<span></span>');\n  };\n\n  SingleSelection.prototype.update = function (data) {\n    if (data.length === 0) {\n      this.clear();\n      return;\n    }\n\n    var selection = data[0];\n\n    var formatted = this.display(selection);\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    $rendered.empty().append(formatted);\n    $rendered.prop('title', selection.title || selection.text);\n  };\n\n  return SingleSelection;\n});\n\nS2.define('select2/selection/multiple',[\n  'jquery',\n  './base',\n  '../utils'\n], function ($, BaseSelection, Utils) {\n  function MultipleSelection ($element, options) {\n    MultipleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(MultipleSelection, BaseSelection);\n\n  MultipleSelection.prototype.render = function () {\n    var $selection = MultipleSelection.__super__.render.call(this);\n\n    $selection.addClass('select2-selection--multiple');\n\n    $selection.html(\n      '<ul class=\"select2-selection__rendered\"></ul>'\n    );\n\n    return $selection;\n  };\n\n  MultipleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    MultipleSelection.__super__.bind.apply(this, arguments);\n\n    this.$selection.on('click', function (evt) {\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('click', '.select2-selection__choice__remove',\n      function (evt) {\n      var $remove = $(this);\n      var $selection = $remove.parent();\n\n      var data = $selection.data('data');\n\n      self.trigger('unselect', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n  };\n\n  MultipleSelection.prototype.clear = function () {\n    this.$selection.find('.select2-selection__rendered').empty();\n  };\n\n  MultipleSelection.prototype.display = function (data) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data));\n  };\n\n  MultipleSelection.prototype.selectionContainer = function () {\n    var $container = $(\n      '<li class=\"select2-selection__choice\">' +\n        '<span class=\"select2-selection__choice__remove\" role=\"presentation\">' +\n          '&times;' +\n        '</span>' +\n      '</li>'\n    );\n\n    return $container;\n  };\n\n  MultipleSelection.prototype.update = function (data) {\n    this.clear();\n\n    if (data.length === 0) {\n      return;\n    }\n\n    var $selections = [];\n\n    for (var d = 0; d < data.length; d++) {\n      var selection = data[d];\n\n      var formatted = this.display(selection);\n      var $selection = this.selectionContainer();\n\n      $selection.append(formatted);\n      $selection.prop('title', selection.title || selection.text);\n\n      $selection.data('data', selection);\n\n      $selections.push($selection);\n    }\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n\n    Utils.appendMany($rendered, $selections);\n  };\n\n  return MultipleSelection;\n});\n\nS2.define('select2/selection/placeholder',[\n  '../utils'\n], function (Utils) {\n  function Placeholder (decorated, $element, options) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options);\n  }\n\n  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n    var $placeholder = this.selectionContainer();\n\n    $placeholder.html(this.display(placeholder));\n    $placeholder.addClass('select2-selection__placeholder')\n                .removeClass('select2-selection__choice');\n\n    return $placeholder;\n  };\n\n  Placeholder.prototype.update = function (decorated, data) {\n    var singlePlaceholder = (\n      data.length == 1 && data[0].id != this.placeholder.id\n    );\n    var multipleSelections = data.length > 1;\n\n    if (multipleSelections || singlePlaceholder) {\n      return decorated.call(this, data);\n    }\n\n    this.clear();\n\n    var $placeholder = this.createPlaceholder(this.placeholder);\n\n    this.$selection.find('.select2-selection__rendered').append($placeholder);\n  };\n\n  return Placeholder;\n});\n\nS2.define('select2/selection/allowClear',[\n  'jquery',\n  '../keys'\n], function ($, KEYS) {\n  function AllowClear () { }\n\n  AllowClear.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    if (this.placeholder == null) {\n      if (this.options.get('debug') && window.console && console.error) {\n        console.error(\n          'Select2: The `allowClear` option should be used in combination ' +\n          'with the `placeholder` option.'\n        );\n      }\n    }\n\n    this.$selection.on('mousedown', '.select2-selection__clear',\n      function (evt) {\n        self._handleClear(evt);\n    });\n\n    container.on('keypress', function (evt) {\n      self._handleKeyboardClear(evt, container);\n    });\n  };\n\n  AllowClear.prototype._handleClear = function (_, evt) {\n    // Ignore the event if it is disabled\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    var $clear = this.$selection.find('.select2-selection__clear');\n\n    // Ignore the event if nothing has been selected\n    if ($clear.length === 0) {\n      return;\n    }\n\n    evt.stopPropagation();\n\n    var data = $clear.data('data');\n\n    for (var d = 0; d < data.length; d++) {\n      var unselectData = {\n        data: data[d]\n      };\n\n      // Trigger the `unselect` event, so people can prevent it from being\n      // cleared.\n      this.trigger('unselect', unselectData);\n\n      // If the event was prevented, don't clear it out.\n      if (unselectData.prevented) {\n        return;\n      }\n    }\n\n    this.$element.val(this.placeholder.id).trigger('change');\n\n    this.trigger('toggle');\n  };\n\n  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n    if (container.isOpen()) {\n      return;\n    }\n\n    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n      this._handleClear(evt);\n    }\n  };\n\n  AllowClear.prototype.update = function (decorated, data) {\n    decorated.call(this, data);\n\n    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||\n        data.length === 0) {\n      return;\n    }\n\n    var $remove = $(\n      '<span class=\"select2-selection__clear\">' +\n        '&times;' +\n      '</span>'\n    );\n    $remove.data('data', data);\n\n    this.$selection.find('.select2-selection__rendered').prepend($remove);\n  };\n\n  return AllowClear;\n});\n\nS2.define('select2/selection/search',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function Search (decorated, $element, options) {\n    decorated.call(this, $element, options);\n  }\n\n  Search.prototype.render = function (decorated) {\n    var $search = $(\n      '<li class=\"select2-search select2-search--inline\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</li>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    var $rendered = decorated.call(this);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n      self.$search.focus();\n    });\n\n    container.on('enable', function () {\n      self.$search.prop('disabled', false);\n    });\n\n    container.on('disable', function () {\n      self.$search.prop('disabled', true);\n    });\n\n    this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n      self.trigger('blur', evt);\n    });\n\n    this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n      evt.stopPropagation();\n\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n\n      var key = evt.which;\n\n      if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n        var $previousChoice = self.$searchContainer\n          .prev('.select2-selection__choice');\n\n        if ($previousChoice.length > 0) {\n          var item = $previousChoice.data('data');\n\n          self.searchRemoveChoice(item);\n\n          evt.preventDefault();\n        }\n      }\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$selection.on('input', '.select2-search--inline', function (evt) {\n      // Unbind the duplicated `keyup` event\n      self.$selection.off('keyup.search');\n    });\n\n    this.$selection.on('keyup.search input', '.select2-search--inline',\n        function (evt) {\n      self.handleSearch(evt);\n    });\n  };\n\n  Search.prototype.createPlaceholder = function (decorated, placeholder) {\n    this.$search.attr('placeholder', placeholder.text);\n  };\n\n  Search.prototype.update = function (decorated, data) {\n    this.$search.attr('placeholder', '');\n\n    decorated.call(this, data);\n\n    this.$selection.find('.select2-selection__rendered')\n                   .append(this.$searchContainer);\n\n    this.resizeSearch();\n  };\n\n  Search.prototype.handleSearch = function () {\n    this.resizeSearch();\n\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.searchRemoveChoice = function (decorated, item) {\n    this.trigger('unselect', {\n      data: item\n    });\n\n    this.trigger('open');\n\n    this.$search.val(item.text + ' ');\n  };\n\n  Search.prototype.resizeSearch = function () {\n    this.$search.css('width', '25px');\n\n    var width = '';\n\n    if (this.$search.attr('placeholder') !== '') {\n      width = this.$selection.find('.select2-selection__rendered').innerWidth();\n    } else {\n      var minimumWidth = this.$search.val().length + 1;\n\n      width = (minimumWidth * 0.75) + 'em';\n    }\n\n    this.$search.css('width', width);\n  };\n\n  return Search;\n});\n\nS2.define('select2/selection/eventRelay',[\n  'jquery'\n], function ($) {\n  function EventRelay () { }\n\n  EventRelay.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n    var relayEvents = [\n      'open', 'opening',\n      'close', 'closing',\n      'select', 'selecting',\n      'unselect', 'unselecting'\n    ];\n\n    var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];\n\n    decorated.call(this, container, $container);\n\n    container.on('*', function (name, params) {\n      // Ignore events that should not be relayed\n      if ($.inArray(name, relayEvents) === -1) {\n        return;\n      }\n\n      // The parameters should always be an object\n      params = params || {};\n\n      // Generate the jQuery event for the Select2 event\n      var evt = $.Event('select2:' + name, {\n        params: params\n      });\n\n      self.$element.trigger(evt);\n\n      // Only handle preventable events if it was one\n      if ($.inArray(name, preventableEvents) === -1) {\n        return;\n      }\n\n      params.prevented = evt.isDefaultPrevented();\n    });\n  };\n\n  return EventRelay;\n});\n\nS2.define('select2/translation',[\n  'jquery',\n  'require'\n], function ($, require) {\n  function Translation (dict) {\n    this.dict = dict || {};\n  }\n\n  Translation.prototype.all = function () {\n    return this.dict;\n  };\n\n  Translation.prototype.get = function (key) {\n    return this.dict[key];\n  };\n\n  Translation.prototype.extend = function (translation) {\n    this.dict = $.extend({}, translation.all(), this.dict);\n  };\n\n  // Static functions\n\n  Translation._cache = {};\n\n  Translation.loadPath = function (path) {\n    if (!(path in Translation._cache)) {\n      var translations = require(path);\n\n      Translation._cache[path] = translations;\n    }\n\n    return new Translation(Translation._cache[path]);\n  };\n\n  return Translation;\n});\n\nS2.define('select2/diacritics',[\n\n], function () {\n  var diacritics = {\n    '\\u24B6': 'A',\n    '\\uFF21': 'A',\n    '\\u00C0': 'A',\n    '\\u00C1': 'A',\n    '\\u00C2': 'A',\n    '\\u1EA6': 'A',\n    '\\u1EA4': 'A',\n    '\\u1EAA': 'A',\n    '\\u1EA8': 'A',\n    '\\u00C3': 'A',\n    '\\u0100': 'A',\n    '\\u0102': 'A',\n    '\\u1EB0': 'A',\n    '\\u1EAE': 'A',\n    '\\u1EB4': 'A',\n    '\\u1EB2': 'A',\n    '\\u0226': 'A',\n    '\\u01E0': 'A',\n    '\\u00C4': 'A',\n    '\\u01DE': 'A',\n    '\\u1EA2': 'A',\n    '\\u00C5': 'A',\n    '\\u01FA': 'A',\n    '\\u01CD': 'A',\n    '\\u0200': 'A',\n    '\\u0202': 'A',\n    '\\u1EA0': 'A',\n    '\\u1EAC': 'A',\n    '\\u1EB6': 'A',\n    '\\u1E00': 'A',\n    '\\u0104': 'A',\n    '\\u023A': 'A',\n    '\\u2C6F': 'A',\n    '\\uA732': 'AA',\n    '\\u00C6': 'AE',\n    '\\u01FC': 'AE',\n    '\\u01E2': 'AE',\n    '\\uA734': 'AO',\n    '\\uA736': 'AU',\n    '\\uA738': 'AV',\n    '\\uA73A': 'AV',\n    '\\uA73C': 'AY',\n    '\\u24B7': 'B',\n    '\\uFF22': 'B',\n    '\\u1E02': 'B',\n    '\\u1E04': 'B',\n    '\\u1E06': 'B',\n    '\\u0243': 'B',\n    '\\u0182': 'B',\n    '\\u0181': 'B',\n    '\\u24B8': 'C',\n    '\\uFF23': 'C',\n    '\\u0106': 'C',\n    '\\u0108': 'C',\n    '\\u010A': 'C',\n    '\\u010C': 'C',\n    '\\u00C7': 'C',\n    '\\u1E08': 'C',\n    '\\u0187': 'C',\n    '\\u023B': 'C',\n    '\\uA73E': 'C',\n    '\\u24B9': 'D',\n    '\\uFF24': 'D',\n    '\\u1E0A': 'D',\n    '\\u010E': 'D',\n    '\\u1E0C': 'D',\n    '\\u1E10': 'D',\n    '\\u1E12': 'D',\n    '\\u1E0E': 'D',\n    '\\u0110': 'D',\n    '\\u018B': 'D',\n    '\\u018A': 'D',\n    '\\u0189': 'D',\n    '\\uA779': 'D',\n    '\\u01F1': 'DZ',\n    '\\u01C4': 'DZ',\n    '\\u01F2': 'Dz',\n    '\\u01C5': 'Dz',\n    '\\u24BA': 'E',\n    '\\uFF25': 'E',\n    '\\u00C8': 'E',\n    '\\u00C9': 'E',\n    '\\u00CA': 'E',\n    '\\u1EC0': 'E',\n    '\\u1EBE': 'E',\n    '\\u1EC4': 'E',\n    '\\u1EC2': 'E',\n    '\\u1EBC': 'E',\n    '\\u0112': 'E',\n    '\\u1E14': 'E',\n    '\\u1E16': 'E',\n    '\\u0114': 'E',\n    '\\u0116': 'E',\n    '\\u00CB': 'E',\n    '\\u1EBA': 'E',\n    '\\u011A': 'E',\n    '\\u0204': 'E',\n    '\\u0206': 'E',\n    '\\u1EB8': 'E',\n    '\\u1EC6': 'E',\n    '\\u0228': 'E',\n    '\\u1E1C': 'E',\n    '\\u0118': 'E',\n    '\\u1E18': 'E',\n    '\\u1E1A': 'E',\n    '\\u0190': 'E',\n    '\\u018E': 'E',\n    '\\u24BB': 'F',\n    '\\uFF26': 'F',\n    '\\u1E1E': 'F',\n    '\\u0191': 'F',\n    '\\uA77B': 'F',\n    '\\u24BC': 'G',\n    '\\uFF27': 'G',\n    '\\u01F4': 'G',\n    '\\u011C': 'G',\n    '\\u1E20': 'G',\n    '\\u011E': 'G',\n    '\\u0120': 'G',\n    '\\u01E6': 'G',\n    '\\u0122': 'G',\n    '\\u01E4': 'G',\n    '\\u0193': 'G',\n    '\\uA7A0': 'G',\n    '\\uA77D': 'G',\n    '\\uA77E': 'G',\n    '\\u24BD': 'H',\n    '\\uFF28': 'H',\n    '\\u0124': 'H',\n    '\\u1E22': 'H',\n    '\\u1E26': 'H',\n    '\\u021E': 'H',\n    '\\u1E24': 'H',\n    '\\u1E28': 'H',\n    '\\u1E2A': 'H',\n    '\\u0126': 'H',\n    '\\u2C67': 'H',\n    '\\u2C75': 'H',\n    '\\uA78D': 'H',\n    '\\u24BE': 'I',\n    '\\uFF29': 'I',\n    '\\u00CC': 'I',\n    '\\u00CD': 'I',\n    '\\u00CE': 'I',\n    '\\u0128': 'I',\n    '\\u012A': 'I',\n    '\\u012C': 'I',\n    '\\u0130': 'I',\n    '\\u00CF': 'I',\n    '\\u1E2E': 'I',\n    '\\u1EC8': 'I',\n    '\\u01CF': 'I',\n    '\\u0208': 'I',\n    '\\u020A': 'I',\n    '\\u1ECA': 'I',\n    '\\u012E': 'I',\n    '\\u1E2C': 'I',\n    '\\u0197': 'I',\n    '\\u24BF': 'J',\n    '\\uFF2A': 'J',\n    '\\u0134': 'J',\n    '\\u0248': 'J',\n    '\\u24C0': 'K',\n    '\\uFF2B': 'K',\n    '\\u1E30': 'K',\n    '\\u01E8': 'K',\n    '\\u1E32': 'K',\n    '\\u0136': 'K',\n    '\\u1E34': 'K',\n    '\\u0198': 'K',\n    '\\u2C69': 'K',\n    '\\uA740': 'K',\n    '\\uA742': 'K',\n    '\\uA744': 'K',\n    '\\uA7A2': 'K',\n    '\\u24C1': 'L',\n    '\\uFF2C': 'L',\n    '\\u013F': 'L',\n    '\\u0139': 'L',\n    '\\u013D': 'L',\n    '\\u1E36': 'L',\n    '\\u1E38': 'L',\n    '\\u013B': 'L',\n    '\\u1E3C': 'L',\n    '\\u1E3A': 'L',\n    '\\u0141': 'L',\n    '\\u023D': 'L',\n    '\\u2C62': 'L',\n    '\\u2C60': 'L',\n    '\\uA748': 'L',\n    '\\uA746': 'L',\n    '\\uA780': 'L',\n    '\\u01C7': 'LJ',\n    '\\u01C8': 'Lj',\n    '\\u24C2': 'M',\n    '\\uFF2D': 'M',\n    '\\u1E3E': 'M',\n    '\\u1E40': 'M',\n    '\\u1E42': 'M',\n    '\\u2C6E': 'M',\n    '\\u019C': 'M',\n    '\\u24C3': 'N',\n    '\\uFF2E': 'N',\n    '\\u01F8': 'N',\n    '\\u0143': 'N',\n    '\\u00D1': 'N',\n    '\\u1E44': 'N',\n    '\\u0147': 'N',\n    '\\u1E46': 'N',\n    '\\u0145': 'N',\n    '\\u1E4A': 'N',\n    '\\u1E48': 'N',\n    '\\u0220': 'N',\n    '\\u019D': 'N',\n    '\\uA790': 'N',\n    '\\uA7A4': 'N',\n    '\\u01CA': 'NJ',\n    '\\u01CB': 'Nj',\n    '\\u24C4': 'O',\n    '\\uFF2F': 'O',\n    '\\u00D2': 'O',\n    '\\u00D3': 'O',\n    '\\u00D4': 'O',\n    '\\u1ED2': 'O',\n    '\\u1ED0': 'O',\n    '\\u1ED6': 'O',\n    '\\u1ED4': 'O',\n    '\\u00D5': 'O',\n    '\\u1E4C': 'O',\n    '\\u022C': 'O',\n    '\\u1E4E': 'O',\n    '\\u014C': 'O',\n    '\\u1E50': 'O',\n    '\\u1E52': 'O',\n    '\\u014E': 'O',\n    '\\u022E': 'O',\n    '\\u0230': 'O',\n    '\\u00D6': 'O',\n    '\\u022A': 'O',\n    '\\u1ECE': 'O',\n    '\\u0150': 'O',\n    '\\u01D1': 'O',\n    '\\u020C': 'O',\n    '\\u020E': 'O',\n    '\\u01A0': 'O',\n    '\\u1EDC': 'O',\n    '\\u1EDA': 'O',\n    '\\u1EE0': 'O',\n    '\\u1EDE': 'O',\n    '\\u1EE2': 'O',\n    '\\u1ECC': 'O',\n    '\\u1ED8': 'O',\n    '\\u01EA': 'O',\n    '\\u01EC': 'O',\n    '\\u00D8': 'O',\n    '\\u01FE': 'O',\n    '\\u0186': 'O',\n    '\\u019F': 'O',\n    '\\uA74A': 'O',\n    '\\uA74C': 'O',\n    '\\u01A2': 'OI',\n    '\\uA74E': 'OO',\n    '\\u0222': 'OU',\n    '\\u24C5': 'P',\n    '\\uFF30': 'P',\n    '\\u1E54': 'P',\n    '\\u1E56': 'P',\n    '\\u01A4': 'P',\n    '\\u2C63': 'P',\n    '\\uA750': 'P',\n    '\\uA752': 'P',\n    '\\uA754': 'P',\n    '\\u24C6': 'Q',\n    '\\uFF31': 'Q',\n    '\\uA756': 'Q',\n    '\\uA758': 'Q',\n    '\\u024A': 'Q',\n    '\\u24C7': 'R',\n    '\\uFF32': 'R',\n    '\\u0154': 'R',\n    '\\u1E58': 'R',\n    '\\u0158': 'R',\n    '\\u0210': 'R',\n    '\\u0212': 'R',\n    '\\u1E5A': 'R',\n    '\\u1E5C': 'R',\n    '\\u0156': 'R',\n    '\\u1E5E': 'R',\n    '\\u024C': 'R',\n    '\\u2C64': 'R',\n    '\\uA75A': 'R',\n    '\\uA7A6': 'R',\n    '\\uA782': 'R',\n    '\\u24C8': 'S',\n    '\\uFF33': 'S',\n    '\\u1E9E': 'S',\n    '\\u015A': 'S',\n    '\\u1E64': 'S',\n    '\\u015C': 'S',\n    '\\u1E60': 'S',\n    '\\u0160': 'S',\n    '\\u1E66': 'S',\n    '\\u1E62': 'S',\n    '\\u1E68': 'S',\n    '\\u0218': 'S',\n    '\\u015E': 'S',\n    '\\u2C7E': 'S',\n    '\\uA7A8': 'S',\n    '\\uA784': 'S',\n    '\\u24C9': 'T',\n    '\\uFF34': 'T',\n    '\\u1E6A': 'T',\n    '\\u0164': 'T',\n    '\\u1E6C': 'T',\n    '\\u021A': 'T',\n    '\\u0162': 'T',\n    '\\u1E70': 'T',\n    '\\u1E6E': 'T',\n    '\\u0166': 'T',\n    '\\u01AC': 'T',\n    '\\u01AE': 'T',\n    '\\u023E': 'T',\n    '\\uA786': 'T',\n    '\\uA728': 'TZ',\n    '\\u24CA': 'U',\n    '\\uFF35': 'U',\n    '\\u00D9': 'U',\n    '\\u00DA': 'U',\n    '\\u00DB': 'U',\n    '\\u0168': 'U',\n    '\\u1E78': 'U',\n    '\\u016A': 'U',\n    '\\u1E7A': 'U',\n    '\\u016C': 'U',\n    '\\u00DC': 'U',\n    '\\u01DB': 'U',\n    '\\u01D7': 'U',\n    '\\u01D5': 'U',\n    '\\u01D9': 'U',\n    '\\u1EE6': 'U',\n    '\\u016E': 'U',\n    '\\u0170': 'U',\n    '\\u01D3': 'U',\n    '\\u0214': 'U',\n    '\\u0216': 'U',\n    '\\u01AF': 'U',\n    '\\u1EEA': 'U',\n    '\\u1EE8': 'U',\n    '\\u1EEE': 'U',\n    '\\u1EEC': 'U',\n    '\\u1EF0': 'U',\n    '\\u1EE4': 'U',\n    '\\u1E72': 'U',\n    '\\u0172': 'U',\n    '\\u1E76': 'U',\n    '\\u1E74': 'U',\n    '\\u0244': 'U',\n    '\\u24CB': 'V',\n    '\\uFF36': 'V',\n    '\\u1E7C': 'V',\n    '\\u1E7E': 'V',\n    '\\u01B2': 'V',\n    '\\uA75E': 'V',\n    '\\u0245': 'V',\n    '\\uA760': 'VY',\n    '\\u24CC': 'W',\n    '\\uFF37': 'W',\n    '\\u1E80': 'W',\n    '\\u1E82': 'W',\n    '\\u0174': 'W',\n    '\\u1E86': 'W',\n    '\\u1E84': 'W',\n    '\\u1E88': 'W',\n    '\\u2C72': 'W',\n    '\\u24CD': 'X',\n    '\\uFF38': 'X',\n    '\\u1E8A': 'X',\n    '\\u1E8C': 'X',\n    '\\u24CE': 'Y',\n    '\\uFF39': 'Y',\n    '\\u1EF2': 'Y',\n    '\\u00DD': 'Y',\n    '\\u0176': 'Y',\n    '\\u1EF8': 'Y',\n    '\\u0232': 'Y',\n    '\\u1E8E': 'Y',\n    '\\u0178': 'Y',\n    '\\u1EF6': 'Y',\n    '\\u1EF4': 'Y',\n    '\\u01B3': 'Y',\n    '\\u024E': 'Y',\n    '\\u1EFE': 'Y',\n    '\\u24CF': 'Z',\n    '\\uFF3A': 'Z',\n    '\\u0179': 'Z',\n    '\\u1E90': 'Z',\n    '\\u017B': 'Z',\n    '\\u017D': 'Z',\n    '\\u1E92': 'Z',\n    '\\u1E94': 'Z',\n    '\\u01B5': 'Z',\n    '\\u0224': 'Z',\n    '\\u2C7F': 'Z',\n    '\\u2C6B': 'Z',\n    '\\uA762': 'Z',\n    '\\u24D0': 'a',\n    '\\uFF41': 'a',\n    '\\u1E9A': 'a',\n    '\\u00E0': 'a',\n    '\\u00E1': 'a',\n    '\\u00E2': 'a',\n    '\\u1EA7': 'a',\n    '\\u1EA5': 'a',\n    '\\u1EAB': 'a',\n    '\\u1EA9': 'a',\n    '\\u00E3': 'a',\n    '\\u0101': 'a',\n    '\\u0103': 'a',\n    '\\u1EB1': 'a',\n    '\\u1EAF': 'a',\n    '\\u1EB5': 'a',\n    '\\u1EB3': 'a',\n    '\\u0227': 'a',\n    '\\u01E1': 'a',\n    '\\u00E4': 'a',\n    '\\u01DF': 'a',\n    '\\u1EA3': 'a',\n    '\\u00E5': 'a',\n    '\\u01FB': 'a',\n    '\\u01CE': 'a',\n    '\\u0201': 'a',\n    '\\u0203': 'a',\n    '\\u1EA1': 'a',\n    '\\u1EAD': 'a',\n    '\\u1EB7': 'a',\n    '\\u1E01': 'a',\n    '\\u0105': 'a',\n    '\\u2C65': 'a',\n    '\\u0250': 'a',\n    '\\uA733': 'aa',\n    '\\u00E6': 'ae',\n    '\\u01FD': 'ae',\n    '\\u01E3': 'ae',\n    '\\uA735': 'ao',\n    '\\uA737': 'au',\n    '\\uA739': 'av',\n    '\\uA73B': 'av',\n    '\\uA73D': 'ay',\n    '\\u24D1': 'b',\n    '\\uFF42': 'b',\n    '\\u1E03': 'b',\n    '\\u1E05': 'b',\n    '\\u1E07': 'b',\n    '\\u0180': 'b',\n    '\\u0183': 'b',\n    '\\u0253': 'b',\n    '\\u24D2': 'c',\n    '\\uFF43': 'c',\n    '\\u0107': 'c',\n    '\\u0109': 'c',\n    '\\u010B': 'c',\n    '\\u010D': 'c',\n    '\\u00E7': 'c',\n    '\\u1E09': 'c',\n    '\\u0188': 'c',\n    '\\u023C': 'c',\n    '\\uA73F': 'c',\n    '\\u2184': 'c',\n    '\\u24D3': 'd',\n    '\\uFF44': 'd',\n    '\\u1E0B': 'd',\n    '\\u010F': 'd',\n    '\\u1E0D': 'd',\n    '\\u1E11': 'd',\n    '\\u1E13': 'd',\n    '\\u1E0F': 'd',\n    '\\u0111': 'd',\n    '\\u018C': 'd',\n    '\\u0256': 'd',\n    '\\u0257': 'd',\n    '\\uA77A': 'd',\n    '\\u01F3': 'dz',\n    '\\u01C6': 'dz',\n    '\\u24D4': 'e',\n    '\\uFF45': 'e',\n    '\\u00E8': 'e',\n    '\\u00E9': 'e',\n    '\\u00EA': 'e',\n    '\\u1EC1': 'e',\n    '\\u1EBF': 'e',\n    '\\u1EC5': 'e',\n    '\\u1EC3': 'e',\n    '\\u1EBD': 'e',\n    '\\u0113': 'e',\n    '\\u1E15': 'e',\n    '\\u1E17': 'e',\n    '\\u0115': 'e',\n    '\\u0117': 'e',\n    '\\u00EB': 'e',\n    '\\u1EBB': 'e',\n    '\\u011B': 'e',\n    '\\u0205': 'e',\n    '\\u0207': 'e',\n    '\\u1EB9': 'e',\n    '\\u1EC7': 'e',\n    '\\u0229': 'e',\n    '\\u1E1D': 'e',\n    '\\u0119': 'e',\n    '\\u1E19': 'e',\n    '\\u1E1B': 'e',\n    '\\u0247': 'e',\n    '\\u025B': 'e',\n    '\\u01DD': 'e',\n    '\\u24D5': 'f',\n    '\\uFF46': 'f',\n    '\\u1E1F': 'f',\n    '\\u0192': 'f',\n    '\\uA77C': 'f',\n    '\\u24D6': 'g',\n    '\\uFF47': 'g',\n    '\\u01F5': 'g',\n    '\\u011D': 'g',\n    '\\u1E21': 'g',\n    '\\u011F': 'g',\n    '\\u0121': 'g',\n    '\\u01E7': 'g',\n    '\\u0123': 'g',\n    '\\u01E5': 'g',\n    '\\u0260': 'g',\n    '\\uA7A1': 'g',\n    '\\u1D79': 'g',\n    '\\uA77F': 'g',\n    '\\u24D7': 'h',\n    '\\uFF48': 'h',\n    '\\u0125': 'h',\n    '\\u1E23': 'h',\n    '\\u1E27': 'h',\n    '\\u021F': 'h',\n    '\\u1E25': 'h',\n    '\\u1E29': 'h',\n    '\\u1E2B': 'h',\n    '\\u1E96': 'h',\n    '\\u0127': 'h',\n    '\\u2C68': 'h',\n    '\\u2C76': 'h',\n    '\\u0265': 'h',\n    '\\u0195': 'hv',\n    '\\u24D8': 'i',\n    '\\uFF49': 'i',\n    '\\u00EC': 'i',\n    '\\u00ED': 'i',\n    '\\u00EE': 'i',\n    '\\u0129': 'i',\n    '\\u012B': 'i',\n    '\\u012D': 'i',\n    '\\u00EF': 'i',\n    '\\u1E2F': 'i',\n    '\\u1EC9': 'i',\n    '\\u01D0': 'i',\n    '\\u0209': 'i',\n    '\\u020B': 'i',\n    '\\u1ECB': 'i',\n    '\\u012F': 'i',\n    '\\u1E2D': 'i',\n    '\\u0268': 'i',\n    '\\u0131': 'i',\n    '\\u24D9': 'j',\n    '\\uFF4A': 'j',\n    '\\u0135': 'j',\n    '\\u01F0': 'j',\n    '\\u0249': 'j',\n    '\\u24DA': 'k',\n    '\\uFF4B': 'k',\n    '\\u1E31': 'k',\n    '\\u01E9': 'k',\n    '\\u1E33': 'k',\n    '\\u0137': 'k',\n    '\\u1E35': 'k',\n    '\\u0199': 'k',\n    '\\u2C6A': 'k',\n    '\\uA741': 'k',\n    '\\uA743': 'k',\n    '\\uA745': 'k',\n    '\\uA7A3': 'k',\n    '\\u24DB': 'l',\n    '\\uFF4C': 'l',\n    '\\u0140': 'l',\n    '\\u013A': 'l',\n    '\\u013E': 'l',\n    '\\u1E37': 'l',\n    '\\u1E39': 'l',\n    '\\u013C': 'l',\n    '\\u1E3D': 'l',\n    '\\u1E3B': 'l',\n    '\\u017F': 'l',\n    '\\u0142': 'l',\n    '\\u019A': 'l',\n    '\\u026B': 'l',\n    '\\u2C61': 'l',\n    '\\uA749': 'l',\n    '\\uA781': 'l',\n    '\\uA747': 'l',\n    '\\u01C9': 'lj',\n    '\\u24DC': 'm',\n    '\\uFF4D': 'm',\n    '\\u1E3F': 'm',\n    '\\u1E41': 'm',\n    '\\u1E43': 'm',\n    '\\u0271': 'm',\n    '\\u026F': 'm',\n    '\\u24DD': 'n',\n    '\\uFF4E': 'n',\n    '\\u01F9': 'n',\n    '\\u0144': 'n',\n    '\\u00F1': 'n',\n    '\\u1E45': 'n',\n    '\\u0148': 'n',\n    '\\u1E47': 'n',\n    '\\u0146': 'n',\n    '\\u1E4B': 'n',\n    '\\u1E49': 'n',\n    '\\u019E': 'n',\n    '\\u0272': 'n',\n    '\\u0149': 'n',\n    '\\uA791': 'n',\n    '\\uA7A5': 'n',\n    '\\u01CC': 'nj',\n    '\\u24DE': 'o',\n    '\\uFF4F': 'o',\n    '\\u00F2': 'o',\n    '\\u00F3': 'o',\n    '\\u00F4': 'o',\n    '\\u1ED3': 'o',\n    '\\u1ED1': 'o',\n    '\\u1ED7': 'o',\n    '\\u1ED5': 'o',\n    '\\u00F5': 'o',\n    '\\u1E4D': 'o',\n    '\\u022D': 'o',\n    '\\u1E4F': 'o',\n    '\\u014D': 'o',\n    '\\u1E51': 'o',\n    '\\u1E53': 'o',\n    '\\u014F': 'o',\n    '\\u022F': 'o',\n    '\\u0231': 'o',\n    '\\u00F6': 'o',\n    '\\u022B': 'o',\n    '\\u1ECF': 'o',\n    '\\u0151': 'o',\n    '\\u01D2': 'o',\n    '\\u020D': 'o',\n    '\\u020F': 'o',\n    '\\u01A1': 'o',\n    '\\u1EDD': 'o',\n    '\\u1EDB': 'o',\n    '\\u1EE1': 'o',\n    '\\u1EDF': 'o',\n    '\\u1EE3': 'o',\n    '\\u1ECD': 'o',\n    '\\u1ED9': 'o',\n    '\\u01EB': 'o',\n    '\\u01ED': 'o',\n    '\\u00F8': 'o',\n    '\\u01FF': 'o',\n    '\\u0254': 'o',\n    '\\uA74B': 'o',\n    '\\uA74D': 'o',\n    '\\u0275': 'o',\n    '\\u01A3': 'oi',\n    '\\u0223': 'ou',\n    '\\uA74F': 'oo',\n    '\\u24DF': 'p',\n    '\\uFF50': 'p',\n    '\\u1E55': 'p',\n    '\\u1E57': 'p',\n    '\\u01A5': 'p',\n    '\\u1D7D': 'p',\n    '\\uA751': 'p',\n    '\\uA753': 'p',\n    '\\uA755': 'p',\n    '\\u24E0': 'q',\n    '\\uFF51': 'q',\n    '\\u024B': 'q',\n    '\\uA757': 'q',\n    '\\uA759': 'q',\n    '\\u24E1': 'r',\n    '\\uFF52': 'r',\n    '\\u0155': 'r',\n    '\\u1E59': 'r',\n    '\\u0159': 'r',\n    '\\u0211': 'r',\n    '\\u0213': 'r',\n    '\\u1E5B': 'r',\n    '\\u1E5D': 'r',\n    '\\u0157': 'r',\n    '\\u1E5F': 'r',\n    '\\u024D': 'r',\n    '\\u027D': 'r',\n    '\\uA75B': 'r',\n    '\\uA7A7': 'r',\n    '\\uA783': 'r',\n    '\\u24E2': 's',\n    '\\uFF53': 's',\n    '\\u00DF': 's',\n    '\\u015B': 's',\n    '\\u1E65': 's',\n    '\\u015D': 's',\n    '\\u1E61': 's',\n    '\\u0161': 's',\n    '\\u1E67': 's',\n    '\\u1E63': 's',\n    '\\u1E69': 's',\n    '\\u0219': 's',\n    '\\u015F': 's',\n    '\\u023F': 's',\n    '\\uA7A9': 's',\n    '\\uA785': 's',\n    '\\u1E9B': 's',\n    '\\u24E3': 't',\n    '\\uFF54': 't',\n    '\\u1E6B': 't',\n    '\\u1E97': 't',\n    '\\u0165': 't',\n    '\\u1E6D': 't',\n    '\\u021B': 't',\n    '\\u0163': 't',\n    '\\u1E71': 't',\n    '\\u1E6F': 't',\n    '\\u0167': 't',\n    '\\u01AD': 't',\n    '\\u0288': 't',\n    '\\u2C66': 't',\n    '\\uA787': 't',\n    '\\uA729': 'tz',\n    '\\u24E4': 'u',\n    '\\uFF55': 'u',\n    '\\u00F9': 'u',\n    '\\u00FA': 'u',\n    '\\u00FB': 'u',\n    '\\u0169': 'u',\n    '\\u1E79': 'u',\n    '\\u016B': 'u',\n    '\\u1E7B': 'u',\n    '\\u016D': 'u',\n    '\\u00FC': 'u',\n    '\\u01DC': 'u',\n    '\\u01D8': 'u',\n    '\\u01D6': 'u',\n    '\\u01DA': 'u',\n    '\\u1EE7': 'u',\n    '\\u016F': 'u',\n    '\\u0171': 'u',\n    '\\u01D4': 'u',\n    '\\u0215': 'u',\n    '\\u0217': 'u',\n    '\\u01B0': 'u',\n    '\\u1EEB': 'u',\n    '\\u1EE9': 'u',\n    '\\u1EEF': 'u',\n    '\\u1EED': 'u',\n    '\\u1EF1': 'u',\n    '\\u1EE5': 'u',\n    '\\u1E73': 'u',\n    '\\u0173': 'u',\n    '\\u1E77': 'u',\n    '\\u1E75': 'u',\n    '\\u0289': 'u',\n    '\\u24E5': 'v',\n    '\\uFF56': 'v',\n    '\\u1E7D': 'v',\n    '\\u1E7F': 'v',\n    '\\u028B': 'v',\n    '\\uA75F': 'v',\n    '\\u028C': 'v',\n    '\\uA761': 'vy',\n    '\\u24E6': 'w',\n    '\\uFF57': 'w',\n    '\\u1E81': 'w',\n    '\\u1E83': 'w',\n    '\\u0175': 'w',\n    '\\u1E87': 'w',\n    '\\u1E85': 'w',\n    '\\u1E98': 'w',\n    '\\u1E89': 'w',\n    '\\u2C73': 'w',\n    '\\u24E7': 'x',\n    '\\uFF58': 'x',\n    '\\u1E8B': 'x',\n    '\\u1E8D': 'x',\n    '\\u24E8': 'y',\n    '\\uFF59': 'y',\n    '\\u1EF3': 'y',\n    '\\u00FD': 'y',\n    '\\u0177': 'y',\n    '\\u1EF9': 'y',\n    '\\u0233': 'y',\n    '\\u1E8F': 'y',\n    '\\u00FF': 'y',\n    '\\u1EF7': 'y',\n    '\\u1E99': 'y',\n    '\\u1EF5': 'y',\n    '\\u01B4': 'y',\n    '\\u024F': 'y',\n    '\\u1EFF': 'y',\n    '\\u24E9': 'z',\n    '\\uFF5A': 'z',\n    '\\u017A': 'z',\n    '\\u1E91': 'z',\n    '\\u017C': 'z',\n    '\\u017E': 'z',\n    '\\u1E93': 'z',\n    '\\u1E95': 'z',\n    '\\u01B6': 'z',\n    '\\u0225': 'z',\n    '\\u0240': 'z',\n    '\\u2C6C': 'z',\n    '\\uA763': 'z',\n    '\\u0386': '\\u0391',\n    '\\u0388': '\\u0395',\n    '\\u0389': '\\u0397',\n    '\\u038A': '\\u0399',\n    '\\u03AA': '\\u0399',\n    '\\u038C': '\\u039F',\n    '\\u038E': '\\u03A5',\n    '\\u03AB': '\\u03A5',\n    '\\u038F': '\\u03A9',\n    '\\u03AC': '\\u03B1',\n    '\\u03AD': '\\u03B5',\n    '\\u03AE': '\\u03B7',\n    '\\u03AF': '\\u03B9',\n    '\\u03CA': '\\u03B9',\n    '\\u0390': '\\u03B9',\n    '\\u03CC': '\\u03BF',\n    '\\u03CD': '\\u03C5',\n    '\\u03CB': '\\u03C5',\n    '\\u03B0': '\\u03C5',\n    '\\u03C9': '\\u03C9',\n    '\\u03C2': '\\u03C3'\n  };\n\n  return diacritics;\n});\n\nS2.define('select2/data/base',[\n  '../utils'\n], function (Utils) {\n  function BaseAdapter ($element, options) {\n    BaseAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseAdapter, Utils.Observable);\n\n  BaseAdapter.prototype.current = function (callback) {\n    throw new Error('The `current` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.query = function (params, callback) {\n    throw new Error('The `query` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.bind = function (container, $container) {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.destroy = function () {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.generateResultId = function (container, data) {\n    var id = container.id + '-result-';\n\n    id += Utils.generateChars(4);\n\n    if (data.id != null) {\n      id += '-' + data.id.toString();\n    } else {\n      id += '-' + Utils.generateChars(4);\n    }\n    return id;\n  };\n\n  return BaseAdapter;\n});\n\nS2.define('select2/data/select',[\n  './base',\n  '../utils',\n  'jquery'\n], function (BaseAdapter, Utils, $) {\n  function SelectAdapter ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    SelectAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(SelectAdapter, BaseAdapter);\n\n  SelectAdapter.prototype.current = function (callback) {\n    var data = [];\n    var self = this;\n\n    this.$element.find(':selected').each(function () {\n      var $option = $(this);\n\n      var option = self.item($option);\n\n      data.push(option);\n    });\n\n    callback(data);\n  };\n\n  SelectAdapter.prototype.select = function (data) {\n    var self = this;\n\n    data.selected = true;\n\n    // If data.element is a DOM node, use it instead\n    if ($(data.element).is('option')) {\n      data.element.selected = true;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    if (this.$element.prop('multiple')) {\n      this.current(function (currentData) {\n        var val = [];\n\n        data = [data];\n        data.push.apply(data, currentData);\n\n        for (var d = 0; d < data.length; d++) {\n          var id = data[d].id;\n\n          if ($.inArray(id, val) === -1) {\n            val.push(id);\n          }\n        }\n\n        self.$element.val(val);\n        self.$element.trigger('change');\n      });\n    } else {\n      var val = data.id;\n\n      this.$element.val(val);\n      this.$element.trigger('change');\n    }\n  };\n\n  SelectAdapter.prototype.unselect = function (data) {\n    var self = this;\n\n    if (!this.$element.prop('multiple')) {\n      return;\n    }\n\n    data.selected = false;\n\n    if ($(data.element).is('option')) {\n      data.element.selected = false;\n\n      this.$element.trigger('change');\n\n      return;\n    }\n\n    this.current(function (currentData) {\n      var val = [];\n\n      for (var d = 0; d < currentData.length; d++) {\n        var id = currentData[d].id;\n\n        if (id !== data.id && $.inArray(id, val) === -1) {\n          val.push(id);\n        }\n      }\n\n      self.$element.val(val);\n\n      self.$element.trigger('change');\n    });\n  };\n\n  SelectAdapter.prototype.bind = function (container, $container) {\n    var self = this;\n\n    this.container = container;\n\n    container.on('select', function (params) {\n      self.select(params.data);\n    });\n\n    container.on('unselect', function (params) {\n      self.unselect(params.data);\n    });\n  };\n\n  SelectAdapter.prototype.destroy = function () {\n    // Remove anything added to child elements\n    this.$element.find('*').each(function () {\n      // Remove any custom data set by Select2\n      $.removeData(this, 'data');\n    });\n  };\n\n  SelectAdapter.prototype.query = function (params, callback) {\n    var data = [];\n    var self = this;\n\n    var $options = this.$element.children();\n\n    $options.each(function () {\n      var $option = $(this);\n\n      if (!$option.is('option') && !$option.is('optgroup')) {\n        return;\n      }\n\n      var option = self.item($option);\n\n      var matches = self.matches(params, option);\n\n      if (matches !== null) {\n        data.push(matches);\n      }\n    });\n\n    callback({\n      results: data\n    });\n  };\n\n  SelectAdapter.prototype.addOptions = function ($options) {\n    Utils.appendMany(this.$element, $options);\n  };\n\n  SelectAdapter.prototype.option = function (data) {\n    var option;\n\n    if (data.children) {\n      option = document.createElement('optgroup');\n      option.label = data.text;\n    } else {\n      option = document.createElement('option');\n\n      if (option.textContent !== undefined) {\n        option.textContent = data.text;\n      } else {\n        option.innerText = data.text;\n      }\n    }\n\n    if (data.id) {\n      option.value = data.id;\n    }\n\n    if (data.disabled) {\n      option.disabled = true;\n    }\n\n    if (data.selected) {\n      option.selected = true;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    var $option = $(option);\n\n    var normalizedData = this._normalizeItem(data);\n    normalizedData.element = option;\n\n    // Override the option's data with the combined data\n    $.data(option, 'data', normalizedData);\n\n    return $option;\n  };\n\n  SelectAdapter.prototype.item = function ($option) {\n    var data = {};\n\n    data = $.data($option[0], 'data');\n\n    if (data != null) {\n      return data;\n    }\n\n    if ($option.is('option')) {\n      data = {\n        id: $option.val(),\n        text: $option.text(),\n        disabled: $option.prop('disabled'),\n        selected: $option.prop('selected'),\n        title: $option.prop('title')\n      };\n    } else if ($option.is('optgroup')) {\n      data = {\n        text: $option.prop('label'),\n        children: [],\n        title: $option.prop('title')\n      };\n\n      var $children = $option.children('option');\n      var children = [];\n\n      for (var c = 0; c < $children.length; c++) {\n        var $child = $($children[c]);\n\n        var child = this.item($child);\n\n        children.push(child);\n      }\n\n      data.children = children;\n    }\n\n    data = this._normalizeItem(data);\n    data.element = $option[0];\n\n    $.data($option[0], 'data', data);\n\n    return data;\n  };\n\n  SelectAdapter.prototype._normalizeItem = function (item) {\n    if (!$.isPlainObject(item)) {\n      item = {\n        id: item,\n        text: item\n      };\n    }\n\n    item = $.extend({}, {\n      text: ''\n    }, item);\n\n    var defaults = {\n      selected: false,\n      disabled: false\n    };\n\n    if (item.id != null) {\n      item.id = item.id.toString();\n    }\n\n    if (item.text != null) {\n      item.text = item.text.toString();\n    }\n\n    if (item._resultId == null && item.id && this.container != null) {\n      item._resultId = this.generateResultId(this.container, item);\n    }\n\n    return $.extend({}, defaults, item);\n  };\n\n  SelectAdapter.prototype.matches = function (params, data) {\n    var matcher = this.options.get('matcher');\n\n    return matcher(params, data);\n  };\n\n  return SelectAdapter;\n});\n\nS2.define('select2/data/array',[\n  './select',\n  '../utils',\n  'jquery'\n], function (SelectAdapter, Utils, $) {\n  function ArrayAdapter ($element, options) {\n    var data = options.get('data') || [];\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n\n    this.addOptions(this.convertToOptions(data));\n  }\n\n  Utils.Extend(ArrayAdapter, SelectAdapter);\n\n  ArrayAdapter.prototype.select = function (data) {\n    var $option = this.$element.find('option').filter(function (i, elm) {\n      return elm.value == data.id.toString();\n    });\n\n    if ($option.length === 0) {\n      $option = this.option(data);\n\n      this.addOptions($option);\n    }\n\n    ArrayAdapter.__super__.select.call(this, data);\n  };\n\n  ArrayAdapter.prototype.convertToOptions = function (data) {\n    var self = this;\n\n    var $existing = this.$element.find('option');\n    var existingIds = $existing.map(function () {\n      return self.item($(this)).id;\n    }).get();\n\n    var $options = [];\n\n    // Filter out all items except for the one passed in the argument\n    function onlyItem (item) {\n      return function () {\n        return $(this).val() == item.id;\n      };\n    }\n\n    for (var d = 0; d < data.length; d++) {\n      var item = this._normalizeItem(data[d]);\n\n      // Skip items which were pre-loaded, only merge the data\n      if ($.inArray(item.id, existingIds) >= 0) {\n        var $existingOption = $existing.filter(onlyItem(item));\n\n        var existingData = this.item($existingOption);\n        var newData = $.extend(true, {}, existingData, item);\n\n        var $newOption = this.option(existingData);\n\n        $existingOption.replaceWith($newOption);\n\n        continue;\n      }\n\n      var $option = this.option(item);\n\n      if (item.children) {\n        var $children = this.convertToOptions(item.children);\n\n        Utils.appendMany($option, $children);\n      }\n\n      $options.push($option);\n    }\n\n    return $options;\n  };\n\n  return ArrayAdapter;\n});\n\nS2.define('select2/data/ajax',[\n  './array',\n  '../utils',\n  'jquery'\n], function (ArrayAdapter, Utils, $) {\n  function AjaxAdapter ($element, options) {\n    this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n    if (this.ajaxOptions.processResults != null) {\n      this.processResults = this.ajaxOptions.processResults;\n    }\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n  }\n\n  Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n  AjaxAdapter.prototype._applyDefaults = function (options) {\n    var defaults = {\n      data: function (params) {\n        return {\n          q: params.term\n        };\n      },\n      transport: function (params, success, failure) {\n        var $request = $.ajax(params);\n\n        $request.then(success);\n        $request.fail(failure);\n\n        return $request;\n      }\n    };\n\n    return $.extend({}, defaults, options, true);\n  };\n\n  AjaxAdapter.prototype.processResults = function (results) {\n    return results;\n  };\n\n  AjaxAdapter.prototype.query = function (params, callback) {\n    var matches = [];\n    var self = this;\n\n    if (this._request != null) {\n      // JSONP requests cannot always be aborted\n      if ($.isFunction(this._request.abort)) {\n        this._request.abort();\n      }\n\n      this._request = null;\n    }\n\n    var options = $.extend({\n      type: 'GET'\n    }, this.ajaxOptions);\n\n    if (typeof options.url === 'function') {\n      options.url = options.url(params);\n    }\n\n    if (typeof options.data === 'function') {\n      options.data = options.data(params);\n    }\n\n    function request () {\n      var $request = options.transport(options, function (data) {\n        var results = self.processResults(data, params);\n\n        if (self.options.get('debug') && window.console && console.error) {\n          // Check to make sure that the response included a `results` key.\n          if (!results || !results.results || !$.isArray(results.results)) {\n            console.error(\n              'Select2: The AJAX results did not return an array in the ' +\n              '`results` key of the response.'\n            );\n          }\n        }\n\n        callback(results);\n      }, function () {\n        // TODO: Handle AJAX errors\n      });\n\n      self._request = $request;\n    }\n\n    if (this.ajaxOptions.delay && params.term !== '') {\n      if (this._queryTimeout) {\n        window.clearTimeout(this._queryTimeout);\n      }\n\n      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n    } else {\n      request();\n    }\n  };\n\n  return AjaxAdapter;\n});\n\nS2.define('select2/data/tags',[\n  'jquery'\n], function ($) {\n  function Tags (decorated, $element, options) {\n    var tags = options.get('tags');\n\n    var createTag = options.get('createTag');\n\n    if (createTag !== undefined) {\n      this.createTag = createTag;\n    }\n\n    decorated.call(this, $element, options);\n\n    if ($.isArray(tags)) {\n      for (var t = 0; t < tags.length; t++) {\n        var tag = tags[t];\n        var item = this._normalizeItem(tag);\n\n        var $option = this.option(item);\n\n        this.$element.append($option);\n      }\n    }\n  }\n\n  Tags.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    this._removeOldTags();\n\n    if (params.term == null || params.page != null) {\n      decorated.call(this, params, callback);\n      return;\n    }\n\n    function wrapper (obj, child) {\n      var data = obj.results;\n\n      for (var i = 0; i < data.length; i++) {\n        var option = data[i];\n\n        var checkChildren = (\n          option.children != null &&\n          !wrapper({\n            results: option.children\n          }, true)\n        );\n\n        var checkText = option.text === params.term;\n\n        if (checkText || checkChildren) {\n          if (child) {\n            return false;\n          }\n\n          obj.data = data;\n          callback(obj);\n\n          return;\n        }\n      }\n\n      if (child) {\n        return true;\n      }\n\n      var tag = self.createTag(params);\n\n      if (tag != null) {\n        var $option = self.option(tag);\n        $option.attr('data-select2-tag', true);\n\n        self.addOptions([$option]);\n\n        self.insertTag(data, tag);\n      }\n\n      obj.results = data;\n\n      callback(obj);\n    }\n\n    decorated.call(this, params, wrapper);\n  };\n\n  Tags.prototype.createTag = function (decorated, params) {\n    var term = $.trim(params.term);\n\n    if (term === '') {\n      return null;\n    }\n\n    return {\n      id: term,\n      text: term\n    };\n  };\n\n  Tags.prototype.insertTag = function (_, data, tag) {\n    data.unshift(tag);\n  };\n\n  Tags.prototype._removeOldTags = function (_) {\n    var tag = this._lastTag;\n\n    var $options = this.$element.find('option[data-select2-tag]');\n\n    $options.each(function () {\n      if (this.selected) {\n        return;\n      }\n\n      $(this).remove();\n    });\n  };\n\n  return Tags;\n});\n\nS2.define('select2/data/tokenizer',[\n  'jquery'\n], function ($) {\n  function Tokenizer (decorated, $element, options) {\n    var tokenizer = options.get('tokenizer');\n\n    if (tokenizer !== undefined) {\n      this.tokenizer = tokenizer;\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  Tokenizer.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    this.$search =  container.dropdown.$search || container.selection.$search ||\n      $container.find('.select2-search__field');\n  };\n\n  Tokenizer.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    function select (data) {\n      self.select(data);\n    }\n\n    params.term = params.term || '';\n\n    var tokenData = this.tokenizer(params, this.options, select);\n\n    if (tokenData.term !== params.term) {\n      // Replace the search term if we have the search box\n      if (this.$search.length) {\n        this.$search.val(tokenData.term);\n        this.$search.focus();\n      }\n\n      params.term = tokenData.term;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n    var separators = options.get('tokenSeparators') || [];\n    var term = params.term;\n    var i = 0;\n\n    var createTag = this.createTag || function (params) {\n      return {\n        id: params.term,\n        text: params.term\n      };\n    };\n\n    while (i < term.length) {\n      var termChar = term[i];\n\n      if ($.inArray(termChar, separators) === -1) {\n        i++;\n\n        continue;\n      }\n\n      var part = term.substr(0, i);\n      var partParams = $.extend({}, params, {\n        term: part\n      });\n\n      var data = createTag(partParams);\n\n      callback(data);\n\n      // Reset the term to not include the tokenized portion\n      term = term.substr(i + 1) || '';\n      i = 0;\n    }\n\n    return {\n      term: term\n    };\n  };\n\n  return Tokenizer;\n});\n\nS2.define('select2/data/minimumInputLength',[\n\n], function () {\n  function MinimumInputLength (decorated, $e, options) {\n    this.minimumInputLength = options.get('minimumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MinimumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (params.term.length < this.minimumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooShort',\n        args: {\n          minimum: this.minimumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MinimumInputLength;\n});\n\nS2.define('select2/data/maximumInputLength',[\n\n], function () {\n  function MaximumInputLength (decorated, $e, options) {\n    this.maximumInputLength = options.get('maximumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (this.maximumInputLength > 0 &&\n        params.term.length > this.maximumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooLong',\n        args: {\n          maximum: this.maximumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MaximumInputLength;\n});\n\nS2.define('select2/data/maximumSelectionLength',[\n\n], function (){\n  function MaximumSelectionLength (decorated, $e, options) {\n    this.maximumSelectionLength = options.get('maximumSelectionLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumSelectionLength.prototype.query =\n    function (decorated, params, callback) {\n      var self = this;\n\n      this.current(function (currentData) {\n        var count = currentData != null ? currentData.length : 0;\n        if (self.maximumSelectionLength > 0 &&\n          count >= self.maximumSelectionLength) {\n          self.trigger('results:message', {\n            message: 'maximumSelected',\n            args: {\n              maximum: self.maximumSelectionLength\n            }\n          });\n          return;\n        }\n        decorated.call(self, params, callback);\n      });\n  };\n\n  return MaximumSelectionLength;\n});\n\nS2.define('select2/dropdown',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Dropdown ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    Dropdown.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Dropdown, Utils.Observable);\n\n  Dropdown.prototype.render = function () {\n    var $dropdown = $(\n      '<span class=\"select2-dropdown\">' +\n        '<span class=\"select2-results\"></span>' +\n      '</span>'\n    );\n\n    $dropdown.attr('dir', this.options.get('dir'));\n\n    this.$dropdown = $dropdown;\n\n    return $dropdown;\n  };\n\n  Dropdown.prototype.position = function ($dropdown, $container) {\n    // Should be implmented in subclasses\n  };\n\n  Dropdown.prototype.destroy = function () {\n    // Remove the dropdown from the DOM\n    this.$dropdown.remove();\n  };\n\n  return Dropdown;\n});\n\nS2.define('select2/dropdown/search',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function Search () { }\n\n  Search.prototype.render = function (decorated) {\n    var $rendered = decorated.call(this);\n\n    var $search = $(\n      '<span class=\"select2-search select2-search--dropdown\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\"' +\n        ' spellcheck=\"false\" role=\"textbox\" />' +\n      '</span>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    $rendered.prepend($search);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    this.$search.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$search.on('input', function (evt) {\n      // Unbind the duplicated `keyup` event\n      $(this).off('keyup');\n    });\n\n    this.$search.on('keyup input', function (evt) {\n      self.handleSearch(evt);\n    });\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n\n      self.$search.focus();\n\n      window.setTimeout(function () {\n        self.$search.focus();\n      }, 0);\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n\n      self.$search.val('');\n    });\n\n    container.on('results:all', function (params) {\n      if (params.query.term == null || params.query.term === '') {\n        var showSearch = self.showSearch(params);\n\n        if (showSearch) {\n          self.$searchContainer.removeClass('select2-search--hide');\n        } else {\n          self.$searchContainer.addClass('select2-search--hide');\n        }\n      }\n    });\n  };\n\n  Search.prototype.handleSearch = function (evt) {\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.showSearch = function (_, params) {\n    return true;\n  };\n\n  return Search;\n});\n\nS2.define('select2/dropdown/hidePlaceholder',[\n\n], function () {\n  function HidePlaceholder (decorated, $element, options, dataAdapter) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  HidePlaceholder.prototype.append = function (decorated, data) {\n    data.results = this.removePlaceholder(data.results);\n\n    decorated.call(this, data);\n  };\n\n  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n    var modifiedData = data.slice(0);\n\n    for (var d = data.length - 1; d >= 0; d--) {\n      var item = data[d];\n\n      if (this.placeholder.id === item.id) {\n        modifiedData.splice(d, 1);\n      }\n    }\n\n    return modifiedData;\n  };\n\n  return HidePlaceholder;\n});\n\nS2.define('select2/dropdown/infiniteScroll',[\n  'jquery'\n], function ($) {\n  function InfiniteScroll (decorated, $element, options, dataAdapter) {\n    this.lastParams = {};\n\n    decorated.call(this, $element, options, dataAdapter);\n\n    this.$loadingMore = this.createLoadingMore();\n    this.loading = false;\n  }\n\n  InfiniteScroll.prototype.append = function (decorated, data) {\n    this.$loadingMore.remove();\n    this.loading = false;\n\n    decorated.call(this, data);\n\n    if (this.showLoadingMore(data)) {\n      this.$results.append(this.$loadingMore);\n    }\n  };\n\n  InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('query', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    container.on('query:append', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    this.$results.on('scroll', function () {\n      var isLoadMoreVisible = $.contains(\n        document.documentElement,\n        self.$loadingMore[0]\n      );\n\n      if (self.loading || !isLoadMoreVisible) {\n        return;\n      }\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var loadingMoreOffset = self.$loadingMore.offset().top +\n        self.$loadingMore.outerHeight(false);\n\n      if (currentOffset + 50 >= loadingMoreOffset) {\n        self.loadMore();\n      }\n    });\n  };\n\n  InfiniteScroll.prototype.loadMore = function () {\n    this.loading = true;\n\n    var params = $.extend({}, {page: 1}, this.lastParams);\n\n    params.page++;\n\n    this.trigger('query:append', params);\n  };\n\n  InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n    return data.pagination && data.pagination.more;\n  };\n\n  InfiniteScroll.prototype.createLoadingMore = function () {\n    var $option = $(\n      '<li class=\"option load-more\" role=\"treeitem\"></li>'\n    );\n\n    var message = this.options.get('translations').get('loadingMore');\n\n    $option.html(message(this.lastParams));\n\n    return $option;\n  };\n\n  return InfiniteScroll;\n});\n\nS2.define('select2/dropdown/attachBody',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function AttachBody (decorated, $element, options) {\n    this.$dropdownParent = options.get('dropdownParent') || document.body;\n\n    decorated.call(this, $element, options);\n  }\n\n  AttachBody.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    var setupResultsEvents = false;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self._showDropdown();\n      self._attachPositioningHandler(container);\n\n      if (!setupResultsEvents) {\n        setupResultsEvents = true;\n\n        container.on('results:all', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n\n        container.on('results:append', function () {\n          self._positionDropdown();\n          self._resizeDropdown();\n        });\n      }\n    });\n\n    container.on('close', function () {\n      self._hideDropdown();\n      self._detachPositioningHandler(container);\n    });\n\n    this.$dropdownContainer.on('mousedown', function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n    // Clone all of the container classes\n    $dropdown.attr('class', $container.attr('class'));\n\n    $dropdown.removeClass('select2');\n    $dropdown.addClass('select2-container--open');\n\n    $dropdown.css({\n      position: 'absolute',\n      top: -999999\n    });\n\n    this.$container = $container;\n  };\n\n  AttachBody.prototype.render = function (decorated) {\n    var $container = $('<span></span>');\n\n    var $dropdown = decorated.call(this);\n    $container.append($dropdown);\n\n    this.$dropdownContainer = $container;\n\n    return $container;\n  };\n\n  AttachBody.prototype._hideDropdown = function (decorated) {\n    this.$dropdownContainer.detach();\n  };\n\n  AttachBody.prototype._attachPositioningHandler = function (container) {\n    var self = this;\n\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.each(function () {\n      $(this).data('select2-scroll-position', {\n        x: $(this).scrollLeft(),\n        y: $(this).scrollTop()\n      });\n    });\n\n    $watchers.on(scrollEvent, function (ev) {\n      var position = $(this).data('select2-scroll-position');\n      $(this).scrollTop(position.y);\n    });\n\n    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,\n      function (e) {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n  };\n\n  AttachBody.prototype._detachPositioningHandler = function (container) {\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.off(scrollEvent);\n\n    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n  };\n\n  AttachBody.prototype._positionDropdown = function () {\n    var $window = $(window);\n\n    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');\n    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');\n\n    var newDirection = null;\n\n    var position = this.$container.position();\n    var offset = this.$container.offset();\n\n    offset.bottom = offset.top + this.$container.outerHeight(false);\n\n    var container = {\n      height: this.$container.outerHeight(false)\n    };\n\n    container.top = offset.top;\n    container.bottom = offset.top + container.height;\n\n    var dropdown = {\n      height: this.$dropdown.outerHeight(false)\n    };\n\n    var viewport = {\n      top: $window.scrollTop(),\n      bottom: $window.scrollTop() + $window.height()\n    };\n\n    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);\n    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);\n\n    var css = {\n      left: offset.left,\n      top: container.bottom\n    };\n\n    if (!isCurrentlyAbove && !isCurrentlyBelow) {\n      newDirection = 'below';\n    }\n\n    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n      newDirection = 'above';\n    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n      newDirection = 'below';\n    }\n\n    if (newDirection == 'above' ||\n      (isCurrentlyAbove && newDirection !== 'below')) {\n      css.top = container.top - dropdown.height;\n    }\n\n    if (newDirection != null) {\n      this.$dropdown\n        .removeClass('select2-dropdown--below select2-dropdown--above')\n        .addClass('select2-dropdown--' + newDirection);\n      this.$container\n        .removeClass('select2-container--below select2-container--above')\n        .addClass('select2-container--' + newDirection);\n    }\n\n    this.$dropdownContainer.css(css);\n  };\n\n  AttachBody.prototype._resizeDropdown = function () {\n    this.$dropdownContainer.width();\n\n    var css = {\n      width: this.$container.outerWidth(false) + 'px'\n    };\n\n    if (this.options.get('dropdownAutoWidth')) {\n      css.minWidth = css.width;\n      css.width = 'auto';\n    }\n\n    this.$dropdown.css(css);\n  };\n\n  AttachBody.prototype._showDropdown = function (decorated) {\n    this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n    this._positionDropdown();\n    this._resizeDropdown();\n  };\n\n  return AttachBody;\n});\n\nS2.define('select2/dropdown/minimumResultsForSearch',[\n\n], function () {\n  function countResults (data) {\n    var count = 0;\n\n    for (var d = 0; d < data.length; d++) {\n      var item = data[d];\n\n      if (item.children) {\n        count += countResults(item.children);\n      } else {\n        count++;\n      }\n    }\n\n    return count;\n  }\n\n  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {\n    this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n    if (this.minimumResultsForSearch < 0) {\n      this.minimumResultsForSearch = Infinity;\n    }\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n    if (countResults(params.data.results) < this.minimumResultsForSearch) {\n      return false;\n    }\n\n    return decorated.call(this, params);\n  };\n\n  return MinimumResultsForSearch;\n});\n\nS2.define('select2/dropdown/selectOnClose',[\n\n], function () {\n  function SelectOnClose () { }\n\n  SelectOnClose.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('close', function () {\n      self._handleSelectOnClose();\n    });\n  };\n\n  SelectOnClose.prototype._handleSelectOnClose = function () {\n    var $highlightedResults = this.getHighlightedResults();\n\n    if ($highlightedResults.length < 1) {\n      return;\n    }\n\n    this.trigger('select', {\n        data: $highlightedResults.data('data')\n    });\n  };\n\n  return SelectOnClose;\n});\n\nS2.define('select2/dropdown/closeOnSelect',[\n\n], function () {\n  function CloseOnSelect () { }\n\n  CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('select', function (evt) {\n      self._selectTriggered(evt);\n    });\n\n    container.on('unselect', function (evt) {\n      self._selectTriggered(evt);\n    });\n  };\n\n  CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n    var originalEvent = evt.originalEvent;\n\n    // Don't close if the control key is being held\n    if (originalEvent && originalEvent.ctrlKey) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  return CloseOnSelect;\n});\n\nS2.define('select2/i18n/en',[],function () {\n  // English\n  return {\n    errorLoading: function () {\n      return 'The results could not be loaded.';\n    },\n    inputTooLong: function (args) {\n      var overChars = args.input.length - args.maximum;\n\n      var message = 'Please delete ' + overChars + ' character';\n\n      if (overChars != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    inputTooShort: function (args) {\n      var remainingChars = args.minimum - args.input.length;\n\n      var message = 'Please enter ' + remainingChars + ' or more characters';\n\n      return message;\n    },\n    loadingMore: function () {\n      return 'Loading more results…';\n    },\n    maximumSelected: function (args) {\n      var message = 'You can only select ' + args.maximum + ' item';\n\n      if (args.maximum != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    noResults: function () {\n      return 'No results found';\n    },\n    searching: function () {\n      return 'Searching…';\n    }\n  };\n});\n\nS2.define('select2/defaults',[\n  'jquery',\n  'require',\n\n  './results',\n\n  './selection/single',\n  './selection/multiple',\n  './selection/placeholder',\n  './selection/allowClear',\n  './selection/search',\n  './selection/eventRelay',\n\n  './utils',\n  './translation',\n  './diacritics',\n\n  './data/select',\n  './data/array',\n  './data/ajax',\n  './data/tags',\n  './data/tokenizer',\n  './data/minimumInputLength',\n  './data/maximumInputLength',\n  './data/maximumSelectionLength',\n\n  './dropdown',\n  './dropdown/search',\n  './dropdown/hidePlaceholder',\n  './dropdown/infiniteScroll',\n  './dropdown/attachBody',\n  './dropdown/minimumResultsForSearch',\n  './dropdown/selectOnClose',\n  './dropdown/closeOnSelect',\n\n  './i18n/en'\n], function ($, require,\n\n             ResultsList,\n\n             SingleSelection, MultipleSelection, Placeholder, AllowClear,\n             SelectionSearch, EventRelay,\n\n             Utils, Translation, DIACRITICS,\n\n             SelectData, ArrayData, AjaxData, Tags, Tokenizer,\n             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,\n\n             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,\n             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,\n\n             EnglishTranslation) {\n  function Defaults () {\n    this.reset();\n  }\n\n  Defaults.prototype.apply = function (options) {\n    options = $.extend({}, this.defaults, options);\n\n    if (options.dataAdapter == null) {\n      if (options.ajax != null) {\n        options.dataAdapter = AjaxData;\n      } else if (options.data != null) {\n        options.dataAdapter = ArrayData;\n      } else {\n        options.dataAdapter = SelectData;\n      }\n\n      if (options.minimumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MinimumInputLength\n        );\n      }\n\n      if (options.maximumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumInputLength\n        );\n      }\n\n      if (options.maximumSelectionLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumSelectionLength\n        );\n      }\n\n      if (options.tags) {\n        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n      }\n\n      if (options.tokenSeparators != null || options.tokenizer != null) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Tokenizer\n        );\n      }\n\n      if (options.query != null) {\n        var Query = require(options.amdBase + 'compat/query');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Query\n        );\n      }\n\n      if (options.initSelection != null) {\n        var InitSelection = require(options.amdBase + 'compat/initSelection');\n\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          InitSelection\n        );\n      }\n    }\n\n    if (options.resultsAdapter == null) {\n      options.resultsAdapter = ResultsList;\n\n      if (options.ajax != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          InfiniteScroll\n        );\n      }\n\n      if (options.placeholder != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          HidePlaceholder\n        );\n      }\n\n      if (options.selectOnClose) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          SelectOnClose\n        );\n      }\n    }\n\n    if (options.dropdownAdapter == null) {\n      if (options.multiple) {\n        options.dropdownAdapter = Dropdown;\n      } else {\n        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n\n        options.dropdownAdapter = SearchableDropdown;\n      }\n\n      if (options.minimumResultsForSearch !== 0) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          MinimumResultsForSearch\n        );\n      }\n\n      if (options.closeOnSelect) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          CloseOnSelect\n        );\n      }\n\n      if (\n        options.dropdownCssClass != null ||\n        options.dropdownCss != null ||\n        options.adaptDropdownCssClass != null\n      ) {\n        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');\n\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          DropdownCSS\n        );\n      }\n\n      options.dropdownAdapter = Utils.Decorate(\n        options.dropdownAdapter,\n        AttachBody\n      );\n    }\n\n    if (options.selectionAdapter == null) {\n      if (options.multiple) {\n        options.selectionAdapter = MultipleSelection;\n      } else {\n        options.selectionAdapter = SingleSelection;\n      }\n\n      // Add the placeholder mixin if a placeholder was specified\n      if (options.placeholder != null) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          Placeholder\n        );\n      }\n\n      if (options.allowClear) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          AllowClear\n        );\n      }\n\n      if (options.multiple) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          SelectionSearch\n        );\n      }\n\n      if (\n        options.containerCssClass != null ||\n        options.containerCss != null ||\n        options.adaptContainerCssClass != null\n      ) {\n        var ContainerCSS = require(options.amdBase + 'compat/containerCss');\n\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          ContainerCSS\n        );\n      }\n\n      options.selectionAdapter = Utils.Decorate(\n        options.selectionAdapter,\n        EventRelay\n      );\n    }\n\n    if (typeof options.language === 'string') {\n      // Check if the language is specified with a region\n      if (options.language.indexOf('-') > 0) {\n        // Extract the region information if it is included\n        var languageParts = options.language.split('-');\n        var baseLanguage = languageParts[0];\n\n        options.language = [options.language, baseLanguage];\n      } else {\n        options.language = [options.language];\n      }\n    }\n\n    if ($.isArray(options.language)) {\n      var languages = new Translation();\n      options.language.push('en');\n\n      var languageNames = options.language;\n\n      for (var l = 0; l < languageNames.length; l++) {\n        var name = languageNames[l];\n        var language = {};\n\n        try {\n          // Try to load it with the original name\n          language = Translation.loadPath(name);\n        } catch (e) {\n          try {\n            // If we couldn't load it, check if it wasn't the full path\n            name = this.defaults.amdLanguageBase + name;\n            language = Translation.loadPath(name);\n          } catch (ex) {\n            // The translation could not be loaded at all. Sometimes this is\n            // because of a configuration problem, other times this can be\n            // because of how Select2 helps load all possible translation files.\n            if (options.debug && window.console && console.warn) {\n              console.warn(\n                'Select2: The language file for \"' + name + '\" could not be ' +\n                'automatically loaded. A fallback will be used instead.'\n              );\n            }\n\n            continue;\n          }\n        }\n\n        languages.extend(language);\n      }\n\n      options.translations = languages;\n    } else {\n      var baseTranslation = Translation.loadPath(\n        this.defaults.amdLanguageBase + 'en'\n      );\n      var customTranslation = new Translation(options.language);\n\n      customTranslation.extend(baseTranslation);\n\n      options.translations = customTranslation;\n    }\n\n    return options;\n  };\n\n  Defaults.prototype.reset = function () {\n    function stripDiacritics (text) {\n      // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n      function match(a) {\n        return DIACRITICS[a] || a;\n      }\n\n      return text.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function matcher (params, data) {\n      // Always return the object if there is nothing to compare\n      if ($.trim(params.term) === '') {\n        return data;\n      }\n\n      // Do a recursive check for options with children\n      if (data.children && data.children.length > 0) {\n        // Clone the data object if there are children\n        // This is required as we modify the object to remove any non-matches\n        var match = $.extend(true, {}, data);\n\n        // Check each child of the option\n        for (var c = data.children.length - 1; c >= 0; c--) {\n          var child = data.children[c];\n\n          var matches = matcher(params, child);\n\n          // If there wasn't a match, remove the object in the array\n          if (matches == null) {\n            match.children.splice(c, 1);\n          }\n        }\n\n        // If any children matched, return the new object\n        if (match.children.length > 0) {\n          return match;\n        }\n\n        // If there were no matching children, check just the plain object\n        return matcher(params, match);\n      }\n\n      var original = stripDiacritics(data.text).toUpperCase();\n      var term = stripDiacritics(params.term).toUpperCase();\n\n      // Check if the text contains the term\n      if (original.indexOf(term) > -1) {\n        return data;\n      }\n\n      // If it doesn't contain the term, don't return anything\n      return null;\n    }\n\n    this.defaults = {\n      amdBase: './',\n      amdLanguageBase: './i18n/',\n      closeOnSelect: true,\n      debug: false,\n      dropdownAutoWidth: false,\n      escapeMarkup: Utils.escapeMarkup,\n      language: EnglishTranslation,\n      matcher: matcher,\n      minimumInputLength: 0,\n      maximumInputLength: 0,\n      maximumSelectionLength: 0,\n      minimumResultsForSearch: 0,\n      selectOnClose: false,\n      sorter: function (data) {\n        return data;\n      },\n      templateResult: function (result) {\n        return result.text;\n      },\n      templateSelection: function (selection) {\n        return selection.text;\n      },\n      theme: 'default',\n      width: 'resolve'\n    };\n  };\n\n  Defaults.prototype.set = function (key, value) {\n    var camelKey = $.camelCase(key);\n\n    var data = {};\n    data[camelKey] = value;\n\n    var convertedData = Utils._convertData(data);\n\n    $.extend(this.defaults, convertedData);\n  };\n\n  var defaults = new Defaults();\n\n  return defaults;\n});\n\nS2.define('select2/options',[\n  'require',\n  'jquery',\n  './defaults',\n  './utils'\n], function (require, $, Defaults, Utils) {\n  function Options (options, $element) {\n    this.options = options;\n\n    if ($element != null) {\n      this.fromElement($element);\n    }\n\n    this.options = Defaults.apply(this.options);\n\n    if ($element && $element.is('input')) {\n      var InputCompat = require(this.get('amdBase') + 'compat/inputData');\n\n      this.options.dataAdapter = Utils.Decorate(\n        this.options.dataAdapter,\n        InputCompat\n      );\n    }\n  }\n\n  Options.prototype.fromElement = function ($e) {\n    var excludedData = ['select2'];\n\n    if (this.options.multiple == null) {\n      this.options.multiple = $e.prop('multiple');\n    }\n\n    if (this.options.disabled == null) {\n      this.options.disabled = $e.prop('disabled');\n    }\n\n    if (this.options.language == null) {\n      if ($e.prop('lang')) {\n        this.options.language = $e.prop('lang').toLowerCase();\n      } else if ($e.closest('[lang]').prop('lang')) {\n        this.options.language = $e.closest('[lang]').prop('lang');\n      }\n    }\n\n    if (this.options.dir == null) {\n      if ($e.prop('dir')) {\n        this.options.dir = $e.prop('dir');\n      } else if ($e.closest('[dir]').prop('dir')) {\n        this.options.dir = $e.closest('[dir]').prop('dir');\n      } else {\n        this.options.dir = 'ltr';\n      }\n    }\n\n    $e.prop('disabled', this.options.disabled);\n    $e.prop('multiple', this.options.multiple);\n\n    if ($e.data('select2Tags')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-select2-tags` attribute has been changed to ' +\n          'use the `data-data` and `data-tags=\"true\"` attributes and will be ' +\n          'removed in future versions of Select2.'\n        );\n      }\n\n      $e.data('data', $e.data('select2Tags'));\n      $e.data('tags', true);\n    }\n\n    if ($e.data('ajaxUrl')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-ajax-url` attribute has been changed to ' +\n          '`data-ajax--url` and support for the old attribute will be removed' +\n          ' in future versions of Select2.'\n        );\n      }\n\n      $e.attr('ajax--url', $e.data('ajaxUrl'));\n      $e.data('ajax--url', $e.data('ajaxUrl'));\n    }\n\n    var dataset = {};\n\n    // Prefer the element's `dataset` attribute if it exists\n    // jQuery 1.x does not correctly handle data attributes with multiple dashes\n    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n      dataset = $.extend(true, {}, $e[0].dataset, $e.data());\n    } else {\n      dataset = $e.data();\n    }\n\n    var data = $.extend(true, {}, dataset);\n\n    data = Utils._convertData(data);\n\n    for (var key in data) {\n      if ($.inArray(key, excludedData) > -1) {\n        continue;\n      }\n\n      if ($.isPlainObject(this.options[key])) {\n        $.extend(this.options[key], data[key]);\n      } else {\n        this.options[key] = data[key];\n      }\n    }\n\n    return this;\n  };\n\n  Options.prototype.get = function (key) {\n    return this.options[key];\n  };\n\n  Options.prototype.set = function (key, val) {\n    this.options[key] = val;\n  };\n\n  return Options;\n});\n\nS2.define('select2/core',[\n  'jquery',\n  './options',\n  './utils',\n  './keys'\n], function ($, Options, Utils, KEYS) {\n  var Select2 = function ($element, options) {\n    if ($element.data('select2') != null) {\n      $element.data('select2').destroy();\n    }\n\n    this.$element = $element;\n\n    this.id = this._generateId($element);\n\n    options = options || {};\n\n    this.options = new Options(options, $element);\n\n    Select2.__super__.constructor.call(this);\n\n    // Set up the tabindex\n\n    var tabindex = $element.attr('tabindex') || 0;\n    $element.data('old-tabindex', tabindex);\n    $element.attr('tabindex', '-1');\n\n    // Set up containers and adapters\n\n    var DataAdapter = this.options.get('dataAdapter');\n    this.dataAdapter = new DataAdapter($element, this.options);\n\n    var $container = this.render();\n\n    this._placeContainer($container);\n\n    var SelectionAdapter = this.options.get('selectionAdapter');\n    this.selection = new SelectionAdapter($element, this.options);\n    this.$selection = this.selection.render();\n\n    this.selection.position(this.$selection, $container);\n\n    var DropdownAdapter = this.options.get('dropdownAdapter');\n    this.dropdown = new DropdownAdapter($element, this.options);\n    this.$dropdown = this.dropdown.render();\n\n    this.dropdown.position(this.$dropdown, $container);\n\n    var ResultsAdapter = this.options.get('resultsAdapter');\n    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n    this.$results = this.results.render();\n\n    this.results.position(this.$results, this.$dropdown);\n\n    // Bind events\n\n    var self = this;\n\n    // Bind the container to all of the adapters\n    this._bindAdapters();\n\n    // Register any DOM event handlers\n    this._registerDomEvents();\n\n    // Register any internal event handlers\n    this._registerDataEvents();\n    this._registerSelectionEvents();\n    this._registerDropdownEvents();\n    this._registerResultsEvents();\n    this._registerEvents();\n\n    // Set the initial state\n    this.dataAdapter.current(function (initialData) {\n      self.trigger('selection:update', {\n        data: initialData\n      });\n    });\n\n    // Hide the original select\n    $element.addClass('select2-hidden-accessible');\n\t$element.attr('aria-hidden', 'true');\n\t\n    // Synchronize any monitored attributes\n    this._syncAttributes();\n\n    $element.data('select2', this);\n  };\n\n  Utils.Extend(Select2, Utils.Observable);\n\n  Select2.prototype._generateId = function ($element) {\n    var id = '';\n\n    if ($element.attr('id') != null) {\n      id = $element.attr('id');\n    } else if ($element.attr('name') != null) {\n      id = $element.attr('name') + '-' + Utils.generateChars(2);\n    } else {\n      id = Utils.generateChars(4);\n    }\n\n    id = 'select2-' + id;\n\n    return id;\n  };\n\n  Select2.prototype._placeContainer = function ($container) {\n    $container.insertAfter(this.$element);\n\n    var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n    if (width != null) {\n      $container.css('width', width);\n    }\n  };\n\n  Select2.prototype._resolveWidth = function ($element, method) {\n    var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n    if (method == 'resolve') {\n      var styleWidth = this._resolveWidth($element, 'style');\n\n      if (styleWidth != null) {\n        return styleWidth;\n      }\n\n      return this._resolveWidth($element, 'element');\n    }\n\n    if (method == 'element') {\n      var elementWidth = $element.outerWidth(false);\n\n      if (elementWidth <= 0) {\n        return 'auto';\n      }\n\n      return elementWidth + 'px';\n    }\n\n    if (method == 'style') {\n      var style = $element.attr('style');\n\n      if (typeof(style) !== 'string') {\n        return null;\n      }\n\n      var attrs = style.split(';');\n\n      for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n        var attr = attrs[i].replace(/\\s/g, '');\n        var matches = attr.match(WIDTH);\n\n        if (matches !== null && matches.length >= 1) {\n          return matches[1];\n        }\n      }\n\n      return null;\n    }\n\n    return method;\n  };\n\n  Select2.prototype._bindAdapters = function () {\n    this.dataAdapter.bind(this, this.$container);\n    this.selection.bind(this, this.$container);\n\n    this.dropdown.bind(this, this.$container);\n    this.results.bind(this, this.$container);\n  };\n\n  Select2.prototype._registerDomEvents = function () {\n    var self = this;\n\n    this.$element.on('change.select2', function () {\n      self.dataAdapter.current(function (data) {\n        self.trigger('selection:update', {\n          data: data\n        });\n      });\n    });\n\n    this._sync = Utils.bind(this._syncAttributes, this);\n\n    if (this.$element[0].attachEvent) {\n      this.$element[0].attachEvent('onpropertychange', this._sync);\n    }\n\n    var observer = window.MutationObserver ||\n      window.WebKitMutationObserver ||\n      window.MozMutationObserver\n    ;\n\n    if (observer != null) {\n      this._observer = new observer(function (mutations) {\n        $.each(mutations, self._sync);\n      });\n      this._observer.observe(this.$element[0], {\n        attributes: true,\n        subtree: false\n      });\n    } else if (this.$element[0].addEventListener) {\n      this.$element[0].addEventListener('DOMAttrModified', self._sync, false);\n    }\n  };\n\n  Select2.prototype._registerDataEvents = function () {\n    var self = this;\n\n    this.dataAdapter.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerSelectionEvents = function () {\n    var self = this;\n    var nonRelayEvents = ['toggle'];\n\n    this.selection.on('toggle', function () {\n      self.toggleDropdown();\n    });\n\n    this.selection.on('*', function (name, params) {\n      if ($.inArray(name, nonRelayEvents) !== -1) {\n        return;\n      }\n\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerDropdownEvents = function () {\n    var self = this;\n\n    this.dropdown.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerResultsEvents = function () {\n    var self = this;\n\n    this.results.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerEvents = function () {\n    var self = this;\n\n    this.on('open', function () {\n      self.$container.addClass('select2-container--open');\n    });\n\n    this.on('close', function () {\n      self.$container.removeClass('select2-container--open');\n    });\n\n    this.on('enable', function () {\n      self.$container.removeClass('select2-container--disabled');\n    });\n\n    this.on('disable', function () {\n      self.$container.addClass('select2-container--disabled');\n    });\n\n    this.on('focus', function () {\n      self.$container.addClass('select2-container--focus');\n    });\n\n    this.on('blur', function () {\n      self.$container.removeClass('select2-container--focus');\n    });\n\n    this.on('query', function (params) {\n      if (!self.isOpen()) {\n        self.trigger('open');\n      }\n\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:all', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('query:append', function (params) {\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:append', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('keypress', function (evt) {\n      var key = evt.which;\n\n      if (self.isOpen()) {\n        if (key === KEYS.ENTER) {\n          self.trigger('results:select');\n\n          evt.preventDefault();\n        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {\n          self.trigger('results:toggle');\n\n          evt.preventDefault();\n        } else if (key === KEYS.UP) {\n          self.trigger('results:previous');\n\n          evt.preventDefault();\n        } else if (key === KEYS.DOWN) {\n          self.trigger('results:next');\n\n          evt.preventDefault();\n        } else if (key === KEYS.ESC || key === KEYS.TAB) {\n          self.close();\n\n          evt.preventDefault();\n        }\n      } else {\n        if (key === KEYS.ENTER || key === KEYS.SPACE ||\n            ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) {\n          self.open();\n\n          evt.preventDefault();\n        }\n      }\n    });\n  };\n\n  Select2.prototype._syncAttributes = function () {\n    this.options.set('disabled', this.$element.prop('disabled'));\n\n    if (this.options.get('disabled')) {\n      if (this.isOpen()) {\n        this.close();\n      }\n\n      this.trigger('disable');\n    } else {\n      this.trigger('enable');\n    }\n  };\n\n  /**\n   * Override the trigger method to automatically trigger pre-events when\n   * there are events that can be prevented.\n   */\n  Select2.prototype.trigger = function (name, args) {\n    var actualTrigger = Select2.__super__.trigger;\n    var preTriggerMap = {\n      'open': 'opening',\n      'close': 'closing',\n      'select': 'selecting',\n      'unselect': 'unselecting'\n    };\n\n    if (name in preTriggerMap) {\n      var preTriggerName = preTriggerMap[name];\n      var preTriggerArgs = {\n        prevented: false,\n        name: name,\n        args: args\n      };\n\n      actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n      if (preTriggerArgs.prevented) {\n        args.prevented = true;\n\n        return;\n      }\n    }\n\n    actualTrigger.call(this, name, args);\n  };\n\n  Select2.prototype.toggleDropdown = function () {\n    if (this.options.get('disabled')) {\n      return;\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  Select2.prototype.open = function () {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.trigger('query', {});\n\n    this.trigger('open');\n  };\n\n  Select2.prototype.close = function () {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.trigger('close');\n  };\n\n  Select2.prototype.isOpen = function () {\n    return this.$container.hasClass('select2-container--open');\n  };\n\n  Select2.prototype.enable = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"enable\")` method has been deprecated and will' +\n        ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' +\n        ' instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      args = [true];\n    }\n\n    var disabled = !args[0];\n\n    this.$element.prop('disabled', disabled);\n  };\n\n  Select2.prototype.data = function () {\n    if (this.options.get('debug') &&\n        arguments.length > 0 && window.console && console.warn) {\n      console.warn(\n        'Select2: Data can no longer be set using `select2(\"data\")`. You ' +\n        'should consider setting the value instead using `$element.val()`.'\n      );\n    }\n\n    var data = [];\n\n    this.dataAdapter.current(function (currentData) {\n      data = currentData;\n    });\n\n    return data;\n  };\n\n  Select2.prototype.val = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"val\")` method has been deprecated and will be' +\n        ' removed in later Select2 versions. Use $element.val() instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      return this.$element.val();\n    }\n\n    var newVal = args[0];\n\n    if ($.isArray(newVal)) {\n      newVal = $.map(newVal, function (obj) {\n        return obj.toString();\n      });\n    }\n\n    this.$element.val(newVal).trigger('change');\n  };\n\n  Select2.prototype.destroy = function () {\n    this.$container.remove();\n\n    if (this.$element[0].detachEvent) {\n      this.$element[0].detachEvent('onpropertychange', this._sync);\n    }\n\n    if (this._observer != null) {\n      this._observer.disconnect();\n      this._observer = null;\n    } else if (this.$element[0].removeEventListener) {\n      this.$element[0]\n        .removeEventListener('DOMAttrModified', this._sync, false);\n    }\n\n    this._sync = null;\n\n    this.$element.off('.select2');\n    this.$element.attr('tabindex', this.$element.data('old-tabindex'));\n\n    this.$element.removeClass('select2-hidden-accessible');\n\tthis.$element.attr('aria-hidden', 'false');\n    this.$element.removeData('select2');\n\n    this.dataAdapter.destroy();\n    this.selection.destroy();\n    this.dropdown.destroy();\n    this.results.destroy();\n\n    this.dataAdapter = null;\n    this.selection = null;\n    this.dropdown = null;\n    this.results = null;\n  };\n\n  Select2.prototype.render = function () {\n    var $container = $(\n      '<span class=\"select2 select2-container\">' +\n        '<span class=\"selection\"></span>' +\n        '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' +\n      '</span>'\n    );\n\n    $container.attr('dir', this.options.get('dir'));\n\n    this.$container = $container;\n\n    this.$container.addClass('select2-container--' + this.options.get('theme'));\n\n    $container.data('element', this.$element);\n\n    return $container;\n  };\n\n  return Select2;\n});\n\nS2.define('jquery.select2',[\n  'jquery',\n  'require',\n\n  './select2/core',\n  './select2/defaults'\n], function ($, require, Select2, Defaults) {\n  // Force jQuery.mousewheel to be loaded if it hasn't already\n  require('jquery.mousewheel');\n\n  if ($.fn.select2 == null) {\n    // All methods that should return the element\n    var thisMethods = ['open', 'close', 'destroy'];\n\n    $.fn.select2 = function (options) {\n      options = options || {};\n\n      if (typeof options === 'object') {\n        this.each(function () {\n          var instanceOptions = $.extend({}, options, true);\n\n          var instance = new Select2($(this), instanceOptions);\n        });\n\n        return this;\n      } else if (typeof options === 'string') {\n        var instance = this.data('select2');\n\n        if (instance == null && window.console && console.error) {\n          console.error(\n            'The select2(\\'' + options + '\\') method was called on an ' +\n            'element that is not using Select2.'\n          );\n        }\n\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        var ret = instance[options](args);\n\n        // Check if we should be returning `this`\n        if ($.inArray(options, thisMethods) > -1) {\n          return this;\n        }\n\n        return ret;\n      } else {\n        throw new Error('Invalid arguments for Select2: ' + options);\n      }\n    };\n  }\n\n  if ($.fn.select2.defaults == null) {\n    $.fn.select2.defaults = Defaults;\n  }\n\n  return Select2;\n});\n\nS2.define('jquery.mousewheel',[\n  'jquery'\n], function ($) {\n  // Used to shim jQuery.mousewheel for non-full builds.\n  return $;\n});\n\n  // Return the AMD loader configuration so it can be used outside of this file\n  return {\n    define: S2.define,\n    require: S2.require\n  };\n}());\n\n  // Autoload the jQuery bindings\n  // We know that all of the modules exist above this, so we're safe\n  var select2 = S2.require('jquery.select2');\n\n  // Hold the AMD module references on the jQuery function that was just loaded\n  // This allows Select2 to use the internal loader outside of this file, such\n  // as in the language files.\n  jQuery.fn.select2.amd = S2;\n\n  // Return the Select2 instance for anyone who is importing it.\n  return select2;\n}));\n"
  },
  {
    "path": "src/main/resources/static/admin/plugins/wangeditor-5.1.23/index.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.wangEditor = {}));\n})(this, (function (exports) { 'use strict';\n\n  /**\n   * @description browser polyfill\n   * @author wangfupeng\n   */\n  var _a;\n  // @ts-nocheck\n  // 必须是浏览器环境\n  if (typeof global === 'undefined') {\n      // 检查 IE 浏览器\n      if ('ActiveXObject' in window) {\n          var info = '抱歉，wangEditor V5+ 版本开始，不在支持 IE 浏览器';\n          info += '\\n Sorry, wangEditor V5+ versions do not support IE browser.';\n          console.error(info);\n      }\n      globalThisPolyfill();\n      AggregateErrorPolyfill();\n  }\n  else if (global && ((_a = global.navigator) === null || _a === void 0 ? void 0 : _a.userAgent.match('QQBrowser'))) {\n      // 兼容 QQ 浏览器 AggregateError 报错\n      globalThisPolyfill();\n      AggregateErrorPolyfill();\n  }\n  function globalThisPolyfill() {\n      // 部分浏览器不支持 globalThis\n      if (typeof globalThis === 'undefined') {\n          // @ts-ignore\n          window.globalThis = window;\n      }\n  }\n  function AggregateErrorPolyfill() {\n      if (typeof AggregateError === 'undefined') {\n          window.AggregateError = function (errors, msg) {\n              var err = new Error(msg);\n              err.errors = errors;\n              return err;\n          };\n      }\n  }\n\n  /**\n   * @description node polyfill\n   * @author wangfupeng\n   */\n  // @ts-nocheck\n  // 必须是 node 环境\n  if (typeof global === 'object') {\n      // 用于 nodejs ，避免报错\n      var globalProperty = Object.getOwnPropertyDescriptor(global, 'window');\n      // global.window 为空则直接写入\n      // 部分框架下已经定义了global.window且是不可写属性\n      if (!global.window || globalProperty.set) {\n          global.window = global;\n          global.requestAnimationFrame = function () { };\n          global.navigator = {\n              userAgent: '',\n          };\n          global.location = {\n              hostname: '0.0.0.0',\n              port: 0,\n              protocol: 'http:',\n          };\n          global.btoa = function () { };\n          global.crypto = {\n              getRandomValues: function (buffer) {\n                  return nodeCrypto.randomFillSync(buffer);\n              },\n          };\n      }\n      if (global.document != null) {\n          // SSR 环境下可能会报错 （issue 4409）\n          if (global.document.getElementsByTagName == null) {\n              global.document.getElementsByTagName = function () { return []; };\n          }\n      }\n  }\n\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  function createCommonjsModule$1(fn) {\n    var module = { exports: {} };\n  \treturn fn(module, module.exports), module.exports;\n  }\n\n  /*!\n   * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n   *\n   * Copyright (c) 2014-2017, Jon Schlinkert.\n   * Released under the MIT License.\n   */\n\n  function isObject$4(o) {\n    return Object.prototype.toString.call(o) === '[object Object]';\n  }\n\n  function isPlainObject$2(o) {\n    var ctor,prot;\n\n    if (isObject$4(o) === false) return false;\n\n    // If has modified constructor\n    ctor = o.constructor;\n    if (ctor === undefined) return true;\n\n    // If has modified prototype\n    prot = ctor.prototype;\n    if (isObject$4(prot) === false) return false;\n\n    // If constructor does not have an Object-specific method\n    if (prot.hasOwnProperty('isPrototypeOf') === false) {\n      return false;\n    }\n\n    // Most likely a plain Object\n    return true;\n  }\n\n  var isPlainObject_2 = isPlainObject$2;\n\n  var isPlainObject_1 = /*#__PURE__*/Object.defineProperty({\n  \tisPlainObject: isPlainObject_2\n  }, '__esModule', {value: true});\n\n  var _ref;\n\n  // Should be no imports here!\n  // Some things that should be evaluated before all else...\n  // We only want to know if non-polyfilled symbols are available\n  var hasSymbol = typeof Symbol !== \"undefined\" && typeof\n  /*#__PURE__*/\n  Symbol(\"x\") === \"symbol\";\n  var hasMap = typeof Map !== \"undefined\";\n  var hasSet = typeof Set !== \"undefined\";\n  var hasProxies = typeof Proxy !== \"undefined\" && typeof Proxy.revocable !== \"undefined\" && typeof Reflect !== \"undefined\";\n  /**\n   * The sentinel value returned by producers to replace the draft with undefined.\n   */\n\n  var NOTHING = hasSymbol ?\n  /*#__PURE__*/\n  Symbol.for(\"immer-nothing\") : (_ref = {}, _ref[\"immer-nothing\"] = true, _ref);\n  /**\n   * To let Immer treat your class instances as plain immutable objects\n   * (albeit with a custom prototype), you must define either an instance property\n   * or a static property on each of your custom classes.\n   *\n   * Otherwise, your class instance will never be drafted, which means it won't be\n   * safe to mutate in a produce callback.\n   */\n\n  var DRAFTABLE = hasSymbol ?\n  /*#__PURE__*/\n  Symbol.for(\"immer-draftable\") : \"__$immer_draftable\";\n  var DRAFT_STATE = hasSymbol ?\n  /*#__PURE__*/\n  Symbol.for(\"immer-state\") : \"__$immer_state\"; // Even a polyfilled Symbol might provide Symbol.iterator\n\n  var iteratorSymbol$1 = typeof Symbol != \"undefined\" && Symbol.iterator || \"@@iterator\";\n\n  var errors = {\n    0: \"Illegal state\",\n    1: \"Immer drafts cannot have computed properties\",\n    2: \"This object has been frozen and should not be mutated\",\n    3: function _(data) {\n      return \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" + data;\n    },\n    4: \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n    5: \"Immer forbids circular references\",\n    6: \"The first or second argument to `produce` must be a function\",\n    7: \"The third argument to `produce` must be a function or undefined\",\n    8: \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n    9: \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n    10: \"The given draft is already finalized\",\n    11: \"Object.defineProperty() cannot be used on an Immer draft\",\n    12: \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n    13: \"Immer only supports deleting array indices\",\n    14: \"Immer only supports setting array indices and the 'length' property\",\n    15: function _(path) {\n      return \"Cannot apply patch, path doesn't resolve: \" + path;\n    },\n    16: 'Sets cannot have \"replace\" patches.',\n    17: function _(op) {\n      return \"Unsupported patch operation: \" + op;\n    },\n    18: function _(plugin) {\n      return \"The plugin for '\" + plugin + \"' has not been loaded into Immer. To enable the plugin, import and call `enable\" + plugin + \"()` when initializing your application.\";\n    },\n    20: \"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available\",\n    21: function _(thing) {\n      return \"produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '\" + thing + \"'\";\n    },\n    22: function _(thing) {\n      return \"'current' expects a draft, got: \" + thing;\n    },\n    23: function _(thing) {\n      return \"'original' expects a draft, got: \" + thing;\n    },\n    24: \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n  };\n  function die(error) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    {\n      var e = errors[error];\n      var msg = !e ? \"unknown error nr: \" + error : typeof e === \"function\" ? e.apply(null, args) : e;\n      throw new Error(\"[Immer] \" + msg);\n    }\n  }\n\n  /** Returns true if the given value is an Immer draft */\n\n\n\n  function isDraft(value) {\n    return !!value && !!value[DRAFT_STATE];\n  }\n  /** Returns true if the given value can be drafted by Immer */\n\n\n\n  function isDraftable(value) {\n    if (!value) return false;\n    return isPlainObject$1(value) || Array.isArray(value) || !!value[DRAFTABLE] || !!value.constructor[DRAFTABLE] || isMap(value) || isSet(value);\n  }\n  var objectCtorString =\n  /*#__PURE__*/\n  Object.prototype.constructor.toString();\n\n\n  function isPlainObject$1(value) {\n    if (!value || typeof value !== \"object\") return false;\n    var proto = Object.getPrototypeOf(value);\n\n    if (proto === null) {\n      return true;\n    }\n\n    var Ctor = Object.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n    if (Ctor === Object) return true;\n    return typeof Ctor == \"function\" && Function.toString.call(Ctor) === objectCtorString;\n  }\n  function original(value) {\n    if (!isDraft(value)) die(23, value);\n    return value[DRAFT_STATE].base_;\n  }\n\n\n  var ownKeys$a = typeof Reflect !== \"undefined\" && Reflect.ownKeys ? Reflect.ownKeys : typeof Object.getOwnPropertySymbols !== \"undefined\" ? function (obj) {\n    return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj));\n  } :\n  /* istanbul ignore next */\n  Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || function getOwnPropertyDescriptors(target) {\n    // Polyfill needed for Hermes and IE, see https://github.com/facebook/hermes/issues/274\n    var res = {};\n    ownKeys$a(target).forEach(function (key) {\n      res[key] = Object.getOwnPropertyDescriptor(target, key);\n    });\n    return res;\n  };\n  function each$1(obj, iter, enumerableOnly) {\n    if (enumerableOnly === void 0) {\n      enumerableOnly = false;\n    }\n\n    if (getArchtype(obj) === 0\n    /* Object */\n    ) {\n        (enumerableOnly ? Object.keys : ownKeys$a)(obj).forEach(function (key) {\n          if (!enumerableOnly || typeof key !== \"symbol\") iter(key, obj[key], obj);\n        });\n      } else {\n      obj.forEach(function (entry, index) {\n        return iter(index, entry, obj);\n      });\n    }\n  }\n\n\n  function getArchtype(thing) {\n    /* istanbul ignore next */\n    var state = thing[DRAFT_STATE];\n    return state ? state.type_ > 3 ? state.type_ - 4 // cause Object and Array map back from 4 and 5\n    : state.type_ // others are the same\n    : Array.isArray(thing) ? 1\n    /* Array */\n    : isMap(thing) ? 2\n    /* Map */\n    : isSet(thing) ? 3\n    /* Set */\n    : 0\n    /* Object */\n    ;\n  }\n\n\n  function has(thing, prop) {\n    return getArchtype(thing) === 2\n    /* Map */\n    ? thing.has(prop) : Object.prototype.hasOwnProperty.call(thing, prop);\n  }\n\n\n  function get(thing, prop) {\n    // @ts-ignore\n    return getArchtype(thing) === 2\n    /* Map */\n    ? thing.get(prop) : thing[prop];\n  }\n\n\n  function set(thing, propOrOldValue, value) {\n    var t = getArchtype(thing);\n    if (t === 2\n    /* Map */\n    ) thing.set(propOrOldValue, value);else if (t === 3\n    /* Set */\n    ) {\n        thing.delete(propOrOldValue);\n        thing.add(value);\n      } else thing[propOrOldValue] = value;\n  }\n\n\n  function is$1(x, y) {\n    // From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n    if (x === y) {\n      return x !== 0 || 1 / x === 1 / y;\n    } else {\n      return x !== x && y !== y;\n    }\n  }\n\n\n  function isMap(target) {\n    return hasMap && target instanceof Map;\n  }\n\n\n  function isSet(target) {\n    return hasSet && target instanceof Set;\n  }\n\n\n  function latest(state) {\n    return state.copy_ || state.base_;\n  }\n\n\n  function shallowCopy(base) {\n    if (Array.isArray(base)) return Array.prototype.slice.call(base);\n    var descriptors = getOwnPropertyDescriptors(base);\n    delete descriptors[DRAFT_STATE];\n    var keys = ownKeys$a(descriptors);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n      var desc = descriptors[key];\n\n      if (desc.writable === false) {\n        desc.writable = true;\n        desc.configurable = true;\n      } // like object.assign, we will read any _own_, get/set accessors. This helps in dealing\n      // with libraries that trap values, like mobx or vue\n      // unlike object.assign, non-enumerables will be copied as well\n\n\n      if (desc.get || desc.set) descriptors[key] = {\n        configurable: true,\n        writable: true,\n        enumerable: desc.enumerable,\n        value: base[key]\n      };\n    }\n\n    return Object.create(Object.getPrototypeOf(base), descriptors);\n  }\n  function freeze(obj, deep) {\n    if (deep === void 0) {\n      deep = false;\n    }\n\n    if (isFrozen(obj) || isDraft(obj) || !isDraftable(obj)) return obj;\n\n    if (getArchtype(obj) > 1\n    /* Map or Set */\n    ) {\n        obj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections;\n      }\n\n    Object.freeze(obj);\n    if (deep) each$1(obj, function (key, value) {\n      return freeze(value, true);\n    }, true);\n    return obj;\n  }\n\n  function dontMutateFrozenCollections() {\n    die(2);\n  }\n\n  function isFrozen(obj) {\n    if (obj == null || typeof obj !== \"object\") return true; // See #600, IE dies on non-objects in Object.isFrozen\n\n    return Object.isFrozen(obj);\n  }\n\n  /** Plugin utilities */\n\n  var plugins = {};\n  function getPlugin(pluginKey) {\n    var plugin = plugins[pluginKey];\n\n    if (!plugin) {\n      die(18, pluginKey);\n    } // @ts-ignore\n\n\n    return plugin;\n  }\n  function loadPlugin(pluginKey, implementation) {\n    if (!plugins[pluginKey]) plugins[pluginKey] = implementation;\n  }\n\n  var currentScope;\n  function getCurrentScope() {\n    if ( !currentScope) die(0);\n    return currentScope;\n  }\n\n  function createScope(parent_, immer_) {\n    return {\n      drafts_: [],\n      parent_: parent_,\n      immer_: immer_,\n      // Whenever the modified draft contains a draft from another scope, we\n      // need to prevent auto-freezing so the unowned draft can be finalized.\n      canAutoFreeze_: true,\n      unfinalizedDrafts_: 0\n    };\n  }\n\n  function usePatchesInScope(scope, patchListener) {\n    if (patchListener) {\n      getPlugin(\"Patches\"); // assert we have the plugin\n\n      scope.patches_ = [];\n      scope.inversePatches_ = [];\n      scope.patchListener_ = patchListener;\n    }\n  }\n  function revokeScope(scope) {\n    leaveScope(scope);\n    scope.drafts_.forEach(revokeDraft); // @ts-ignore\n\n    scope.drafts_ = null;\n  }\n  function leaveScope(scope) {\n    if (scope === currentScope) {\n      currentScope = scope.parent_;\n    }\n  }\n  function enterScope(immer) {\n    return currentScope = createScope(currentScope, immer);\n  }\n\n  function revokeDraft(draft) {\n    var state = draft[DRAFT_STATE];\n    if (state.type_ === 0\n    /* ProxyObject */\n    || state.type_ === 1\n    /* ProxyArray */\n    ) state.revoke_();else state.revoked_ = true;\n  }\n\n  function processResult(result, scope) {\n    scope.unfinalizedDrafts_ = scope.drafts_.length;\n    var baseDraft = scope.drafts_[0];\n    var isReplaced = result !== undefined && result !== baseDraft;\n    if (!scope.immer_.useProxies_) getPlugin(\"ES5\").willFinalizeES5_(scope, result, isReplaced);\n\n    if (isReplaced) {\n      if (baseDraft[DRAFT_STATE].modified_) {\n        revokeScope(scope);\n        die(4);\n      }\n\n      if (isDraftable(result)) {\n        // Finalize the result in case it contains (or is) a subset of the draft.\n        result = finalize(scope, result);\n        if (!scope.parent_) maybeFreeze(scope, result);\n      }\n\n      if (scope.patches_) {\n        getPlugin(\"Patches\").generateReplacementPatches_(baseDraft[DRAFT_STATE], result, scope.patches_, scope.inversePatches_);\n      }\n    } else {\n      // Finalize the base draft.\n      result = finalize(scope, baseDraft, []);\n    }\n\n    revokeScope(scope);\n\n    if (scope.patches_) {\n      scope.patchListener_(scope.patches_, scope.inversePatches_);\n    }\n\n    return result !== NOTHING ? result : undefined;\n  }\n\n  function finalize(rootScope, value, path) {\n    // Don't recurse in tho recursive data structures\n    if (isFrozen(value)) return value;\n    var state = value[DRAFT_STATE]; // A plain object, might need freezing, might contain drafts\n\n    if (!state) {\n      each$1(value, function (key, childValue) {\n        return finalizeProperty(rootScope, state, value, key, childValue, path);\n      }, true // See #590, don't recurse into non-enumerable of non drafted objects\n      );\n      return value;\n    } // Never finalize drafts owned by another scope.\n\n\n    if (state.scope_ !== rootScope) return value; // Unmodified draft, return the (frozen) original\n\n    if (!state.modified_) {\n      maybeFreeze(rootScope, state.base_, true);\n      return state.base_;\n    } // Not finalized yet, let's do that now\n\n\n    if (!state.finalized_) {\n      state.finalized_ = true;\n      state.scope_.unfinalizedDrafts_--;\n      var result = // For ES5, create a good copy from the draft first, with added keys and without deleted keys.\n      state.type_ === 4\n      /* ES5Object */\n      || state.type_ === 5\n      /* ES5Array */\n      ? state.copy_ = shallowCopy(state.draft_) : state.copy_; // Finalize all children of the copy\n      // For sets we clone before iterating, otherwise we can get in endless loop due to modifying during iteration, see #628\n      // Although the original test case doesn't seem valid anyway, so if this in the way we can turn the next line\n      // back to each(result, ....)\n\n      each$1(state.type_ === 3\n      /* Set */\n      ? new Set(result) : result, function (key, childValue) {\n        return finalizeProperty(rootScope, state, result, key, childValue, path);\n      }); // everything inside is frozen, we can freeze here\n\n      maybeFreeze(rootScope, result, false); // first time finalizing, let's create those patches\n\n      if (path && rootScope.patches_) {\n        getPlugin(\"Patches\").generatePatches_(state, path, rootScope.patches_, rootScope.inversePatches_);\n      }\n    }\n\n    return state.copy_;\n  }\n\n  function finalizeProperty(rootScope, parentState, targetObject, prop, childValue, rootPath) {\n    if ( childValue === targetObject) die(5);\n\n    if (isDraft(childValue)) {\n      var path = rootPath && parentState && parentState.type_ !== 3\n      /* Set */\n      && // Set objects are atomic since they have no keys.\n      !has(parentState.assigned_, prop) // Skip deep patches for assigned keys.\n      ? rootPath.concat(prop) : undefined; // Drafts owned by `scope` are finalized here.\n\n      var res = finalize(rootScope, childValue, path);\n      set(targetObject, prop, res); // Drafts from another scope must prevented to be frozen\n      // if we got a draft back from finalize, we're in a nested produce and shouldn't freeze\n\n      if (isDraft(res)) {\n        rootScope.canAutoFreeze_ = false;\n      } else return;\n    } // Search new objects for unfinalized drafts. Frozen objects should never contain drafts.\n\n\n    if (isDraftable(childValue) && !isFrozen(childValue)) {\n      if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n        // optimization: if an object is not a draft, and we don't have to\n        // deepfreeze everything, and we are sure that no drafts are left in the remaining object\n        // cause we saw and finalized all drafts already; we can stop visiting the rest of the tree.\n        // This benefits especially adding large data tree's without further processing.\n        // See add-data.js perf test\n        return;\n      }\n\n      finalize(rootScope, childValue); // immer deep freezes plain objects, so if there is no parent state, we freeze as well\n\n      if (!parentState || !parentState.scope_.parent_) maybeFreeze(rootScope, childValue);\n    }\n  }\n\n  function maybeFreeze(scope, value, deep) {\n    if (deep === void 0) {\n      deep = false;\n    }\n\n    if (scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n      freeze(value, deep);\n    }\n  }\n\n  /**\n   * Returns a new draft of the `base` object.\n   *\n   * The second argument is the parent draft-state (used internally).\n   */\n\n  function createProxyProxy(base, parent) {\n    var isArray = Array.isArray(base);\n    var state = {\n      type_: isArray ? 1\n      /* ProxyArray */\n      : 0\n      /* ProxyObject */\n      ,\n      // Track which produce call this is associated with.\n      scope_: parent ? parent.scope_ : getCurrentScope(),\n      // True for both shallow and deep changes.\n      modified_: false,\n      // Used during finalization.\n      finalized_: false,\n      // Track which properties have been assigned (true) or deleted (false).\n      assigned_: {},\n      // The parent draft state.\n      parent_: parent,\n      // The base state.\n      base_: base,\n      // The base proxy.\n      draft_: null,\n      // The base copy with any updated values.\n      copy_: null,\n      // Called by the `produce` function.\n      revoke_: null,\n      isManual_: false\n    }; // the traps must target something, a bit like the 'real' base.\n    // but also, we need to be able to determine from the target what the relevant state is\n    // (to avoid creating traps per instance to capture the state in closure,\n    // and to avoid creating weird hidden properties as well)\n    // So the trick is to use 'state' as the actual 'target'! (and make sure we intercept everything)\n    // Note that in the case of an array, we put the state in an array to have better Reflect defaults ootb\n\n    var target = state;\n    var traps = objectTraps;\n\n    if (isArray) {\n      target = [state];\n      traps = arrayTraps;\n    }\n\n    var _Proxy$revocable = Proxy.revocable(target, traps),\n        revoke = _Proxy$revocable.revoke,\n        proxy = _Proxy$revocable.proxy;\n\n    state.draft_ = proxy;\n    state.revoke_ = revoke;\n    return proxy;\n  }\n  /**\n   * Object drafts\n   */\n\n  var objectTraps = {\n    get: function get(state, prop) {\n      if (prop === DRAFT_STATE) return state;\n      var source = latest(state);\n\n      if (!has(source, prop)) {\n        // non-existing or non-own property...\n        return readPropFromProto(state, source, prop);\n      }\n\n      var value = source[prop];\n\n      if (state.finalized_ || !isDraftable(value)) {\n        return value;\n      } // Check for existing draft in modified state.\n      // Assigned values are never drafted. This catches any drafts we created, too.\n\n\n      if (value === peek(state.base_, prop)) {\n        prepareCopy(state);\n        return state.copy_[prop] = createProxy(state.scope_.immer_, value, state);\n      }\n\n      return value;\n    },\n    has: function has(state, prop) {\n      return prop in latest(state);\n    },\n    ownKeys: function ownKeys(state) {\n      return Reflect.ownKeys(latest(state));\n    },\n    set: function set(state, prop\n    /* strictly not, but helps TS */\n    , value) {\n      var desc = getDescriptorFromProto(latest(state), prop);\n\n      if (desc === null || desc === void 0 ? void 0 : desc.set) {\n        // special case: if this write is captured by a setter, we have\n        // to trigger it with the correct context\n        desc.set.call(state.draft_, value);\n        return true;\n      }\n\n      if (!state.modified_) {\n        // the last check is because we need to be able to distinguish setting a non-existing to undefined (which is a change)\n        // from setting an existing property with value undefined to undefined (which is not a change)\n        var current = peek(latest(state), prop); // special case, if we assigning the original value to a draft, we can ignore the assignment\n\n        var currentState = current === null || current === void 0 ? void 0 : current[DRAFT_STATE];\n\n        if (currentState && currentState.base_ === value) {\n          state.copy_[prop] = value;\n          state.assigned_[prop] = false;\n          return true;\n        }\n\n        if (is$1(value, current) && (value !== undefined || has(state.base_, prop))) return true;\n        prepareCopy(state);\n        markChanged(state);\n      }\n\n      if (state.copy_[prop] === value && // special case: NaN\n      typeof value !== \"number\" && ( // special case: handle new props with value 'undefined'\n      value !== undefined || prop in state.copy_)) return true; // @ts-ignore\n\n      state.copy_[prop] = value;\n      state.assigned_[prop] = true;\n      return true;\n    },\n    deleteProperty: function deleteProperty(state, prop) {\n      // The `undefined` check is a fast path for pre-existing keys.\n      if (peek(state.base_, prop) !== undefined || prop in state.base_) {\n        state.assigned_[prop] = false;\n        prepareCopy(state);\n        markChanged(state);\n      } else {\n        // if an originally not assigned property was deleted\n        delete state.assigned_[prop];\n      } // @ts-ignore\n\n\n      if (state.copy_) delete state.copy_[prop];\n      return true;\n    },\n    // Note: We never coerce `desc.value` into an Immer draft, because we can't make\n    // the same guarantee in ES5 mode.\n    getOwnPropertyDescriptor: function getOwnPropertyDescriptor(state, prop) {\n      var owner = latest(state);\n      var desc = Reflect.getOwnPropertyDescriptor(owner, prop);\n      if (!desc) return desc;\n      return {\n        writable: true,\n        configurable: state.type_ !== 1\n        /* ProxyArray */\n        || prop !== \"length\",\n        enumerable: desc.enumerable,\n        value: owner[prop]\n      };\n    },\n    defineProperty: function defineProperty() {\n      die(11);\n    },\n    getPrototypeOf: function getPrototypeOf(state) {\n      return Object.getPrototypeOf(state.base_);\n    },\n    setPrototypeOf: function setPrototypeOf() {\n      die(12);\n    }\n  };\n  /**\n   * Array drafts\n   */\n\n  var arrayTraps = {};\n  each$1(objectTraps, function (key, fn) {\n    // @ts-ignore\n    arrayTraps[key] = function () {\n      arguments[0] = arguments[0][0];\n      return fn.apply(this, arguments);\n    };\n  });\n\n  arrayTraps.deleteProperty = function (state, prop) {\n    if ( isNaN(parseInt(prop))) die(13);\n    return objectTraps.deleteProperty.call(this, state[0], prop);\n  };\n\n  arrayTraps.set = function (state, prop, value) {\n    if ( prop !== \"length\" && isNaN(parseInt(prop))) die(14);\n    return objectTraps.set.call(this, state[0], prop, value, state[0]);\n  }; // Access a property without creating an Immer draft.\n\n\n  function peek(draft, prop) {\n    var state = draft[DRAFT_STATE];\n    var source = state ? latest(state) : draft;\n    return source[prop];\n  }\n\n  function readPropFromProto(state, source, prop) {\n    var _desc$get;\n\n    var desc = getDescriptorFromProto(source, prop);\n    return desc ? \"value\" in desc ? desc.value : // This is a very special case, if the prop is a getter defined by the\n    // prototype, we should invoke it with the draft as context!\n    (_desc$get = desc.get) === null || _desc$get === void 0 ? void 0 : _desc$get.call(state.draft_) : undefined;\n  }\n\n  function getDescriptorFromProto(source, prop) {\n    // 'in' checks proto!\n    if (!(prop in source)) return undefined;\n    var proto = Object.getPrototypeOf(source);\n\n    while (proto) {\n      var desc = Object.getOwnPropertyDescriptor(proto, prop);\n      if (desc) return desc;\n      proto = Object.getPrototypeOf(proto);\n    }\n\n    return undefined;\n  }\n\n  function markChanged(state) {\n    if (!state.modified_) {\n      state.modified_ = true;\n\n      if (state.parent_) {\n        markChanged(state.parent_);\n      }\n    }\n  }\n  function prepareCopy(state) {\n    if (!state.copy_) {\n      state.copy_ = shallowCopy(state.base_);\n    }\n  }\n\n  var Immer =\n  /*#__PURE__*/\n  function () {\n    function Immer(config) {\n      var _this = this;\n\n      this.useProxies_ = hasProxies;\n      this.autoFreeze_ = true;\n      /**\n       * The `produce` function takes a value and a \"recipe function\" (whose\n       * return value often depends on the base state). The recipe function is\n       * free to mutate its first argument however it wants. All mutations are\n       * only ever applied to a __copy__ of the base state.\n       *\n       * Pass only a function to create a \"curried producer\" which relieves you\n       * from passing the recipe function every time.\n       *\n       * Only plain objects and arrays are made mutable. All other objects are\n       * considered uncopyable.\n       *\n       * Note: This function is __bound__ to its `Immer` instance.\n       *\n       * @param {any} base - the initial state\n       * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n       * @param {Function} patchListener - optional function that will be called with all the patches produced here\n       * @returns {any} a new state, or the initial state if nothing was modified\n       */\n\n      this.produce = function (base, recipe, patchListener) {\n        // curried invocation\n        if (typeof base === \"function\" && typeof recipe !== \"function\") {\n          var defaultBase = recipe;\n          recipe = base;\n          var self = _this;\n          return function curriedProduce(base) {\n            var _this2 = this;\n\n            if (base === void 0) {\n              base = defaultBase;\n            }\n\n            for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n              args[_key - 1] = arguments[_key];\n            }\n\n            return self.produce(base, function (draft) {\n              var _recipe;\n\n              return (_recipe = recipe).call.apply(_recipe, [_this2, draft].concat(args));\n            }); // prettier-ignore\n          };\n        }\n\n        if (typeof recipe !== \"function\") die(6);\n        if (patchListener !== undefined && typeof patchListener !== \"function\") die(7);\n        var result; // Only plain objects, arrays, and \"immerable classes\" are drafted.\n\n        if (isDraftable(base)) {\n          var scope = enterScope(_this);\n          var proxy = createProxy(_this, base, undefined);\n          var hasError = true;\n\n          try {\n            result = recipe(proxy);\n            hasError = false;\n          } finally {\n            // finally instead of catch + rethrow better preserves original stack\n            if (hasError) revokeScope(scope);else leaveScope(scope);\n          }\n\n          if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n            return result.then(function (result) {\n              usePatchesInScope(scope, patchListener);\n              return processResult(result, scope);\n            }, function (error) {\n              revokeScope(scope);\n              throw error;\n            });\n          }\n\n          usePatchesInScope(scope, patchListener);\n          return processResult(result, scope);\n        } else if (!base || typeof base !== \"object\") {\n          result = recipe(base);\n          if (result === NOTHING) return undefined;\n          if (result === undefined) result = base;\n          if (_this.autoFreeze_) freeze(result, true);\n          return result;\n        } else die(21, base);\n      };\n\n      this.produceWithPatches = function (arg1, arg2, arg3) {\n        if (typeof arg1 === \"function\") {\n          return function (state) {\n            for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n              args[_key2 - 1] = arguments[_key2];\n            }\n\n            return _this.produceWithPatches(state, function (draft) {\n              return arg1.apply(void 0, [draft].concat(args));\n            });\n          };\n        }\n\n        var patches, inversePatches;\n\n        var nextState = _this.produce(arg1, arg2, function (p, ip) {\n          patches = p;\n          inversePatches = ip;\n        });\n\n        return [nextState, patches, inversePatches];\n      };\n\n      if (typeof (config === null || config === void 0 ? void 0 : config.useProxies) === \"boolean\") this.setUseProxies(config.useProxies);\n      if (typeof (config === null || config === void 0 ? void 0 : config.autoFreeze) === \"boolean\") this.setAutoFreeze(config.autoFreeze);\n    }\n\n    var _proto = Immer.prototype;\n\n    _proto.createDraft = function createDraft(base) {\n      if (!isDraftable(base)) die(8);\n      if (isDraft(base)) base = current(base);\n      var scope = enterScope(this);\n      var proxy = createProxy(this, base, undefined);\n      proxy[DRAFT_STATE].isManual_ = true;\n      leaveScope(scope);\n      return proxy;\n    };\n\n    _proto.finishDraft = function finishDraft(draft, patchListener) {\n      var state = draft && draft[DRAFT_STATE];\n\n      {\n        if (!state || !state.isManual_) die(9);\n        if (state.finalized_) die(10);\n      }\n\n      var scope = state.scope_;\n      usePatchesInScope(scope, patchListener);\n      return processResult(undefined, scope);\n    }\n    /**\n     * Pass true to automatically freeze all copies created by Immer.\n     *\n     * By default, auto-freezing is enabled.\n     */\n    ;\n\n    _proto.setAutoFreeze = function setAutoFreeze(value) {\n      this.autoFreeze_ = value;\n    }\n    /**\n     * Pass true to use the ES2015 `Proxy` class when creating drafts, which is\n     * always faster than using ES5 proxies.\n     *\n     * By default, feature detection is used, so calling this is rarely necessary.\n     */\n    ;\n\n    _proto.setUseProxies = function setUseProxies(value) {\n      if (value && !hasProxies) {\n        die(20);\n      }\n\n      this.useProxies_ = value;\n    };\n\n    _proto.applyPatches = function applyPatches(base, patches) {\n      // If a patch replaces the entire state, take that replacement as base\n      // before applying patches\n      var i;\n\n      for (i = patches.length - 1; i >= 0; i--) {\n        var patch = patches[i];\n\n        if (patch.path.length === 0 && patch.op === \"replace\") {\n          base = patch.value;\n          break;\n        }\n      } // If there was a patch that replaced the entire state, start from the\n      // patch after that.\n\n\n      if (i > -1) {\n        patches = patches.slice(i + 1);\n      }\n\n      var applyPatchesImpl = getPlugin(\"Patches\").applyPatches_;\n\n      if (isDraft(base)) {\n        // N.B: never hits if some patch a replacement, patches are never drafts\n        return applyPatchesImpl(base, patches);\n      } // Otherwise, produce a copy of the base state.\n\n\n      return this.produce(base, function (draft) {\n        return applyPatchesImpl(draft, patches);\n      });\n    };\n\n    return Immer;\n  }();\n  function createProxy(immer, value, parent) {\n    // precondition: createProxy should be guarded by isDraftable, so we know we can safely draft\n    var draft = isMap(value) ? getPlugin(\"MapSet\").proxyMap_(value, parent) : isSet(value) ? getPlugin(\"MapSet\").proxySet_(value, parent) : immer.useProxies_ ? createProxyProxy(value, parent) : getPlugin(\"ES5\").createES5Proxy_(value, parent);\n    var scope = parent ? parent.scope_ : getCurrentScope();\n    scope.drafts_.push(draft);\n    return draft;\n  }\n\n  function current(value) {\n    if (!isDraft(value)) die(22, value);\n    return currentImpl(value);\n  }\n\n  function currentImpl(value) {\n    if (!isDraftable(value)) return value;\n    var state = value[DRAFT_STATE];\n    var copy;\n    var archType = getArchtype(value);\n\n    if (state) {\n      if (!state.modified_ && (state.type_ < 4 || !getPlugin(\"ES5\").hasChanges_(state))) return state.base_; // Optimization: avoid generating new drafts during copying\n\n      state.finalized_ = true;\n      copy = copyHelper(value, archType);\n      state.finalized_ = false;\n    } else {\n      copy = copyHelper(value, archType);\n    }\n\n    each$1(copy, function (key, childValue) {\n      if (state && get(state.base_, key) === childValue) return; // no need to copy or search in something that didn't change\n\n      set(copy, key, currentImpl(childValue));\n    }); // In the future, we might consider freezing here, based on the current settings\n\n    return archType === 3\n    /* Set */\n    ? new Set(copy) : copy;\n  }\n\n  function copyHelper(value, archType) {\n    // creates a shallow copy, even if it is a map or set\n    switch (archType) {\n      case 2\n      /* Map */\n      :\n        return new Map(value);\n\n      case 3\n      /* Set */\n      :\n        // Set will be cloned as array temporarily, so that we can replace individual items\n        return Array.from(value);\n    }\n\n    return shallowCopy(value);\n  }\n\n  function enableES5() {\n    function willFinalizeES5_(scope, result, isReplaced) {\n      if (!isReplaced) {\n        if (scope.patches_) {\n          markChangesRecursively(scope.drafts_[0]);\n        } // This is faster when we don't care about which attributes changed.\n\n\n        markChangesSweep(scope.drafts_);\n      } // When a child draft is returned, look for changes.\n      else if (isDraft(result) && result[DRAFT_STATE].scope_ === scope) {\n          markChangesSweep(scope.drafts_);\n        }\n    }\n\n    function createES5Draft(isArray, base) {\n      if (isArray) {\n        var draft = new Array(base.length);\n\n        for (var i = 0; i < base.length; i++) {\n          Object.defineProperty(draft, \"\" + i, proxyProperty(i, true));\n        }\n\n        return draft;\n      } else {\n        var _descriptors = getOwnPropertyDescriptors(base);\n\n        delete _descriptors[DRAFT_STATE];\n        var keys = ownKeys$a(_descriptors);\n\n        for (var _i = 0; _i < keys.length; _i++) {\n          var key = keys[_i];\n          _descriptors[key] = proxyProperty(key, isArray || !!_descriptors[key].enumerable);\n        }\n\n        return Object.create(Object.getPrototypeOf(base), _descriptors);\n      }\n    }\n\n    function createES5Proxy_(base, parent) {\n      var isArray = Array.isArray(base);\n      var draft = createES5Draft(isArray, base);\n      var state = {\n        type_: isArray ? 5\n        /* ES5Array */\n        : 4\n        /* ES5Object */\n        ,\n        scope_: parent ? parent.scope_ : getCurrentScope(),\n        modified_: false,\n        finalized_: false,\n        assigned_: {},\n        parent_: parent,\n        // base is the object we are drafting\n        base_: base,\n        // draft is the draft object itself, that traps all reads and reads from either the base (if unmodified) or copy (if modified)\n        draft_: draft,\n        copy_: null,\n        revoked_: false,\n        isManual_: false\n      };\n      Object.defineProperty(draft, DRAFT_STATE, {\n        value: state,\n        // enumerable: false <- the default\n        writable: true\n      });\n      return draft;\n    } // property descriptors are recycled to make sure we don't create a get and set closure per property,\n    // but share them all instead\n\n\n    var descriptors = {};\n\n    function proxyProperty(prop, enumerable) {\n      var desc = descriptors[prop];\n\n      if (desc) {\n        desc.enumerable = enumerable;\n      } else {\n        descriptors[prop] = desc = {\n          configurable: true,\n          enumerable: enumerable,\n          get: function get() {\n            var state = this[DRAFT_STATE];\n            assertUnrevoked(state); // @ts-ignore\n\n            return objectTraps.get(state, prop);\n          },\n          set: function set(value) {\n            var state = this[DRAFT_STATE];\n            assertUnrevoked(state); // @ts-ignore\n\n            objectTraps.set(state, prop, value);\n          }\n        };\n      }\n\n      return desc;\n    } // This looks expensive, but only proxies are visited, and only objects without known changes are scanned.\n\n\n    function markChangesSweep(drafts) {\n      // The natural order of drafts in the `scope` array is based on when they\n      // were accessed. By processing drafts in reverse natural order, we have a\n      // better chance of processing leaf nodes first. When a leaf node is known to\n      // have changed, we can avoid any traversal of its ancestor nodes.\n      for (var i = drafts.length - 1; i >= 0; i--) {\n        var state = drafts[i][DRAFT_STATE];\n\n        if (!state.modified_) {\n          switch (state.type_) {\n            case 5\n            /* ES5Array */\n            :\n              if (hasArrayChanges(state)) markChanged(state);\n              break;\n\n            case 4\n            /* ES5Object */\n            :\n              if (hasObjectChanges(state)) markChanged(state);\n              break;\n          }\n        }\n      }\n    }\n\n    function markChangesRecursively(object) {\n      if (!object || typeof object !== \"object\") return;\n      var state = object[DRAFT_STATE];\n      if (!state) return;\n      var base_ = state.base_,\n          draft_ = state.draft_,\n          assigned_ = state.assigned_,\n          type_ = state.type_;\n\n      if (type_ === 4\n      /* ES5Object */\n      ) {\n          // Look for added keys.\n          // probably there is a faster way to detect changes, as sweep + recurse seems to do some\n          // unnecessary work.\n          // also: probably we can store the information we detect here, to speed up tree finalization!\n          each$1(draft_, function (key) {\n            if (key === DRAFT_STATE) return; // The `undefined` check is a fast path for pre-existing keys.\n\n            if (base_[key] === undefined && !has(base_, key)) {\n              assigned_[key] = true;\n              markChanged(state);\n            } else if (!assigned_[key]) {\n              // Only untouched properties trigger recursion.\n              markChangesRecursively(draft_[key]);\n            }\n          }); // Look for removed keys.\n\n          each$1(base_, function (key) {\n            // The `undefined` check is a fast path for pre-existing keys.\n            if (draft_[key] === undefined && !has(draft_, key)) {\n              assigned_[key] = false;\n              markChanged(state);\n            }\n          });\n        } else if (type_ === 5\n      /* ES5Array */\n      ) {\n          if (hasArrayChanges(state)) {\n            markChanged(state);\n            assigned_.length = true;\n          }\n\n          if (draft_.length < base_.length) {\n            for (var i = draft_.length; i < base_.length; i++) {\n              assigned_[i] = false;\n            }\n          } else {\n            for (var _i2 = base_.length; _i2 < draft_.length; _i2++) {\n              assigned_[_i2] = true;\n            }\n          } // Minimum count is enough, the other parts has been processed.\n\n\n          var min = Math.min(draft_.length, base_.length);\n\n          for (var _i3 = 0; _i3 < min; _i3++) {\n            // Only untouched indices trigger recursion.\n            if (assigned_[_i3] === undefined) markChangesRecursively(draft_[_i3]);\n          }\n        }\n    }\n\n    function hasObjectChanges(state) {\n      var base_ = state.base_,\n          draft_ = state.draft_; // Search for added keys and changed keys. Start at the back, because\n      // non-numeric keys are ordered by time of definition on the object.\n\n      var keys = ownKeys$a(draft_);\n\n      for (var i = keys.length - 1; i >= 0; i--) {\n        var key = keys[i];\n        if (key === DRAFT_STATE) continue;\n        var baseValue = base_[key]; // The `undefined` check is a fast path for pre-existing keys.\n\n        if (baseValue === undefined && !has(base_, key)) {\n          return true;\n        } // Once a base key is deleted, future changes go undetected, because its\n        // descriptor is erased. This branch detects any missed changes.\n        else {\n            var value = draft_[key];\n\n            var _state = value && value[DRAFT_STATE];\n\n            if (_state ? _state.base_ !== baseValue : !is$1(value, baseValue)) {\n              return true;\n            }\n          }\n      } // At this point, no keys were added or changed.\n      // Compare key count to determine if keys were deleted.\n\n\n      var baseIsDraft = !!base_[DRAFT_STATE];\n      return keys.length !== ownKeys$a(base_).length + (baseIsDraft ? 0 : 1); // + 1 to correct for DRAFT_STATE\n    }\n\n    function hasArrayChanges(state) {\n      var draft_ = state.draft_;\n      if (draft_.length !== state.base_.length) return true; // See #116\n      // If we first shorten the length, our array interceptors will be removed.\n      // If after that new items are added, result in the same original length,\n      // those last items will have no intercepting property.\n      // So if there is no own descriptor on the last position, we know that items were removed and added\n      // N.B.: splice, unshift, etc only shift values around, but not prop descriptors, so we only have to check\n      // the last one\n\n      var descriptor = Object.getOwnPropertyDescriptor(draft_, draft_.length - 1); // descriptor can be null, but only for newly created sparse arrays, eg. new Array(10)\n\n      if (descriptor && !descriptor.get) return true; // For all other cases, we don't have to compare, as they would have been picked up by the index setters\n\n      return false;\n    }\n\n    function hasChanges_(state) {\n      return state.type_ === 4\n      /* ES5Object */\n      ? hasObjectChanges(state) : hasArrayChanges(state);\n    }\n\n    function assertUnrevoked(state\n    /*ES5State | MapState | SetState*/\n    ) {\n      if (state.revoked_) die(3, JSON.stringify(latest(state)));\n    }\n\n    loadPlugin(\"ES5\", {\n      createES5Proxy_: createES5Proxy_,\n      willFinalizeES5_: willFinalizeES5_,\n      hasChanges_: hasChanges_\n    });\n  }\n\n  function enablePatches() {\n    var REPLACE = \"replace\";\n    var ADD = \"add\";\n    var REMOVE = \"remove\";\n\n    function generatePatches_(state, basePath, patches, inversePatches) {\n      switch (state.type_) {\n        case 0\n        /* ProxyObject */\n        :\n        case 4\n        /* ES5Object */\n        :\n        case 2\n        /* Map */\n        :\n          return generatePatchesFromAssigned(state, basePath, patches, inversePatches);\n\n        case 5\n        /* ES5Array */\n        :\n        case 1\n        /* ProxyArray */\n        :\n          return generateArrayPatches(state, basePath, patches, inversePatches);\n\n        case 3\n        /* Set */\n        :\n          return generateSetPatches(state, basePath, patches, inversePatches);\n      }\n    }\n\n    function generateArrayPatches(state, basePath, patches, inversePatches) {\n      var base_ = state.base_,\n          assigned_ = state.assigned_;\n      var copy_ = state.copy_; // Reduce complexity by ensuring `base` is never longer.\n\n      if (copy_.length < base_.length) {\n        var _ref = [copy_, base_];\n        base_ = _ref[0];\n        copy_ = _ref[1];\n        var _ref2 = [inversePatches, patches];\n        patches = _ref2[0];\n        inversePatches = _ref2[1];\n      } // Process replaced indices.\n\n\n      for (var i = 0; i < base_.length; i++) {\n        if (assigned_[i] && copy_[i] !== base_[i]) {\n          var path = basePath.concat([i]);\n          patches.push({\n            op: REPLACE,\n            path: path,\n            // Need to maybe clone it, as it can in fact be the original value\n            // due to the base/copy inversion at the start of this function\n            value: clonePatchValueIfNeeded(copy_[i])\n          });\n          inversePatches.push({\n            op: REPLACE,\n            path: path,\n            value: clonePatchValueIfNeeded(base_[i])\n          });\n        }\n      } // Process added indices.\n\n\n      for (var _i = base_.length; _i < copy_.length; _i++) {\n        var _path = basePath.concat([_i]);\n\n        patches.push({\n          op: ADD,\n          path: _path,\n          // Need to maybe clone it, as it can in fact be the original value\n          // due to the base/copy inversion at the start of this function\n          value: clonePatchValueIfNeeded(copy_[_i])\n        });\n      }\n\n      if (base_.length < copy_.length) {\n        inversePatches.push({\n          op: REPLACE,\n          path: basePath.concat([\"length\"]),\n          value: base_.length\n        });\n      }\n    } // This is used for both Map objects and normal objects.\n\n\n    function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {\n      var base_ = state.base_,\n          copy_ = state.copy_;\n      each$1(state.assigned_, function (key, assignedValue) {\n        var origValue = get(base_, key);\n        var value = get(copy_, key);\n        var op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;\n        if (origValue === value && op === REPLACE) return;\n        var path = basePath.concat(key);\n        patches.push(op === REMOVE ? {\n          op: op,\n          path: path\n        } : {\n          op: op,\n          path: path,\n          value: value\n        });\n        inversePatches.push(op === ADD ? {\n          op: REMOVE,\n          path: path\n        } : op === REMOVE ? {\n          op: ADD,\n          path: path,\n          value: clonePatchValueIfNeeded(origValue)\n        } : {\n          op: REPLACE,\n          path: path,\n          value: clonePatchValueIfNeeded(origValue)\n        });\n      });\n    }\n\n    function generateSetPatches(state, basePath, patches, inversePatches) {\n      var base_ = state.base_,\n          copy_ = state.copy_;\n      var i = 0;\n      base_.forEach(function (value) {\n        if (!copy_.has(value)) {\n          var path = basePath.concat([i]);\n          patches.push({\n            op: REMOVE,\n            path: path,\n            value: value\n          });\n          inversePatches.unshift({\n            op: ADD,\n            path: path,\n            value: value\n          });\n        }\n\n        i++;\n      });\n      i = 0;\n      copy_.forEach(function (value) {\n        if (!base_.has(value)) {\n          var path = basePath.concat([i]);\n          patches.push({\n            op: ADD,\n            path: path,\n            value: value\n          });\n          inversePatches.unshift({\n            op: REMOVE,\n            path: path,\n            value: value\n          });\n        }\n\n        i++;\n      });\n    }\n\n    function generateReplacementPatches_(rootState, replacement, patches, inversePatches) {\n      patches.push({\n        op: REPLACE,\n        path: [],\n        value: replacement === NOTHING ? undefined : replacement\n      });\n      inversePatches.push({\n        op: REPLACE,\n        path: [],\n        value: rootState.base_\n      });\n    }\n\n    function applyPatches_(draft, patches) {\n      patches.forEach(function (patch) {\n        var path = patch.path,\n            op = patch.op;\n        var base = draft;\n\n        for (var i = 0; i < path.length - 1; i++) {\n          var parentType = getArchtype(base);\n          var p = \"\" + path[i]; // See #738, avoid prototype pollution\n\n          if ((parentType === 0\n          /* Object */\n          || parentType === 1\n          /* Array */\n          ) && (p === \"__proto__\" || p === \"constructor\")) die(24);\n          if (typeof base === \"function\" && p === \"prototype\") die(24);\n          base = get(base, p);\n          if (typeof base !== \"object\") die(15, path.join(\"/\"));\n        }\n\n        var type = getArchtype(base);\n        var value = deepClonePatchValue(patch.value); // used to clone patch to ensure original patch is not modified, see #411\n\n        var key = path[path.length - 1];\n\n        switch (op) {\n          case REPLACE:\n            switch (type) {\n              case 2\n              /* Map */\n              :\n                return base.set(key, value);\n\n              /* istanbul ignore next */\n\n              case 3\n              /* Set */\n              :\n                die(16);\n\n              default:\n                // if value is an object, then it's assigned by reference\n                // in the following add or remove ops, the value field inside the patch will also be modifyed\n                // so we use value from the cloned patch\n                // @ts-ignore\n                return base[key] = value;\n            }\n\n          case ADD:\n            switch (type) {\n              case 1\n              /* Array */\n              :\n                return key === \"-\" ? base.push(value) : base.splice(key, 0, value);\n\n              case 2\n              /* Map */\n              :\n                return base.set(key, value);\n\n              case 3\n              /* Set */\n              :\n                return base.add(value);\n\n              default:\n                return base[key] = value;\n            }\n\n          case REMOVE:\n            switch (type) {\n              case 1\n              /* Array */\n              :\n                return base.splice(key, 1);\n\n              case 2\n              /* Map */\n              :\n                return base.delete(key);\n\n              case 3\n              /* Set */\n              :\n                return base.delete(patch.value);\n\n              default:\n                return delete base[key];\n            }\n\n          default:\n            die(17, op);\n        }\n      });\n      return draft;\n    }\n\n    function deepClonePatchValue(obj) {\n      if (!isDraftable(obj)) return obj;\n      if (Array.isArray(obj)) return obj.map(deepClonePatchValue);\n      if (isMap(obj)) return new Map(Array.from(obj.entries()).map(function (_ref3) {\n        var k = _ref3[0],\n            v = _ref3[1];\n        return [k, deepClonePatchValue(v)];\n      }));\n      if (isSet(obj)) return new Set(Array.from(obj).map(deepClonePatchValue));\n      var cloned = Object.create(Object.getPrototypeOf(obj));\n\n      for (var key in obj) {\n        cloned[key] = deepClonePatchValue(obj[key]);\n      }\n\n      if (has(obj, DRAFTABLE)) cloned[DRAFTABLE] = obj[DRAFTABLE];\n      return cloned;\n    }\n\n    function clonePatchValueIfNeeded(obj) {\n      if (isDraft(obj)) {\n        return deepClonePatchValue(obj);\n      } else return obj;\n    }\n\n    loadPlugin(\"Patches\", {\n      applyPatches_: applyPatches_,\n      generatePatches_: generatePatches_,\n      generateReplacementPatches_: generateReplacementPatches_\n    });\n  }\n\n  // types only!\n  function enableMapSet() {\n    /* istanbul ignore next */\n    var _extendStatics = function extendStatics(d, b) {\n      _extendStatics = Object.setPrototypeOf || {\n        __proto__: []\n      } instanceof Array && function (d, b) {\n        d.__proto__ = b;\n      } || function (d, b) {\n        for (var p in b) {\n          if (b.hasOwnProperty(p)) d[p] = b[p];\n        }\n      };\n\n      return _extendStatics(d, b);\n    }; // Ugly hack to resolve #502 and inherit built in Map / Set\n\n\n    function __extends(d, b) {\n      _extendStatics(d, b);\n\n      function __() {\n        this.constructor = d;\n      }\n\n      d.prototype = ( // @ts-ignore\n      __.prototype = b.prototype, new __());\n    }\n\n    var DraftMap = function (_super) {\n      __extends(DraftMap, _super); // Create class manually, cause #502\n\n\n      function DraftMap(target, parent) {\n        this[DRAFT_STATE] = {\n          type_: 2\n          /* Map */\n          ,\n          parent_: parent,\n          scope_: parent ? parent.scope_ : getCurrentScope(),\n          modified_: false,\n          finalized_: false,\n          copy_: undefined,\n          assigned_: undefined,\n          base_: target,\n          draft_: this,\n          isManual_: false,\n          revoked_: false\n        };\n        return this;\n      }\n\n      var p = DraftMap.prototype;\n      Object.defineProperty(p, \"size\", {\n        get: function get() {\n          return latest(this[DRAFT_STATE]).size;\n        } // enumerable: false,\n        // configurable: true\n\n      });\n\n      p.has = function (key) {\n        return latest(this[DRAFT_STATE]).has(key);\n      };\n\n      p.set = function (key, value) {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n\n        if (!latest(state).has(key) || latest(state).get(key) !== value) {\n          prepareMapCopy(state);\n          markChanged(state);\n          state.assigned_.set(key, true);\n          state.copy_.set(key, value);\n          state.assigned_.set(key, true);\n        }\n\n        return this;\n      };\n\n      p.delete = function (key) {\n        if (!this.has(key)) {\n          return false;\n        }\n\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n        prepareMapCopy(state);\n        markChanged(state);\n        state.assigned_.set(key, false);\n        state.copy_.delete(key);\n        return true;\n      };\n\n      p.clear = function () {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n\n        if (latest(state).size) {\n          prepareMapCopy(state);\n          markChanged(state);\n          state.assigned_ = new Map();\n          each$1(state.base_, function (key) {\n            state.assigned_.set(key, false);\n          });\n          state.copy_.clear();\n        }\n      };\n\n      p.forEach = function (cb, thisArg) {\n        var _this = this;\n\n        var state = this[DRAFT_STATE];\n        latest(state).forEach(function (_value, key, _map) {\n          cb.call(thisArg, _this.get(key), key, _this);\n        });\n      };\n\n      p.get = function (key) {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n        var value = latest(state).get(key);\n\n        if (state.finalized_ || !isDraftable(value)) {\n          return value;\n        }\n\n        if (value !== state.base_.get(key)) {\n          return value; // either already drafted or reassigned\n        } // despite what it looks, this creates a draft only once, see above condition\n\n\n        var draft = createProxy(state.scope_.immer_, value, state);\n        prepareMapCopy(state);\n        state.copy_.set(key, draft);\n        return draft;\n      };\n\n      p.keys = function () {\n        return latest(this[DRAFT_STATE]).keys();\n      };\n\n      p.values = function () {\n        var _this2 = this,\n            _ref;\n\n        var iterator = this.keys();\n        return _ref = {}, _ref[iteratorSymbol$1] = function () {\n          return _this2.values();\n        }, _ref.next = function next() {\n          var r = iterator.next();\n          /* istanbul ignore next */\n\n          if (r.done) return r;\n\n          var value = _this2.get(r.value);\n\n          return {\n            done: false,\n            value: value\n          };\n        }, _ref;\n      };\n\n      p.entries = function () {\n        var _this3 = this,\n            _ref2;\n\n        var iterator = this.keys();\n        return _ref2 = {}, _ref2[iteratorSymbol$1] = function () {\n          return _this3.entries();\n        }, _ref2.next = function next() {\n          var r = iterator.next();\n          /* istanbul ignore next */\n\n          if (r.done) return r;\n\n          var value = _this3.get(r.value);\n\n          return {\n            done: false,\n            value: [r.value, value]\n          };\n        }, _ref2;\n      };\n\n      p[iteratorSymbol$1] = function () {\n        return this.entries();\n      };\n\n      return DraftMap;\n    }(Map);\n\n    function proxyMap_(target, parent) {\n      // @ts-ignore\n      return new DraftMap(target, parent);\n    }\n\n    function prepareMapCopy(state) {\n      if (!state.copy_) {\n        state.assigned_ = new Map();\n        state.copy_ = new Map(state.base_);\n      }\n    }\n\n    var DraftSet = function (_super) {\n      __extends(DraftSet, _super); // Create class manually, cause #502\n\n\n      function DraftSet(target, parent) {\n        this[DRAFT_STATE] = {\n          type_: 3\n          /* Set */\n          ,\n          parent_: parent,\n          scope_: parent ? parent.scope_ : getCurrentScope(),\n          modified_: false,\n          finalized_: false,\n          copy_: undefined,\n          base_: target,\n          draft_: this,\n          drafts_: new Map(),\n          revoked_: false,\n          isManual_: false\n        };\n        return this;\n      }\n\n      var p = DraftSet.prototype;\n      Object.defineProperty(p, \"size\", {\n        get: function get() {\n          return latest(this[DRAFT_STATE]).size;\n        } // enumerable: true,\n\n      });\n\n      p.has = function (value) {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state); // bit of trickery here, to be able to recognize both the value, and the draft of its value\n\n        if (!state.copy_) {\n          return state.base_.has(value);\n        }\n\n        if (state.copy_.has(value)) return true;\n        if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value))) return true;\n        return false;\n      };\n\n      p.add = function (value) {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n\n        if (!this.has(value)) {\n          prepareSetCopy(state);\n          markChanged(state);\n          state.copy_.add(value);\n        }\n\n        return this;\n      };\n\n      p.delete = function (value) {\n        if (!this.has(value)) {\n          return false;\n        }\n\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n        prepareSetCopy(state);\n        markChanged(state);\n        return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) :\n        /* istanbul ignore next */\n        false);\n      };\n\n      p.clear = function () {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n\n        if (latest(state).size) {\n          prepareSetCopy(state);\n          markChanged(state);\n          state.copy_.clear();\n        }\n      };\n\n      p.values = function () {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n        prepareSetCopy(state);\n        return state.copy_.values();\n      };\n\n      p.entries = function entries() {\n        var state = this[DRAFT_STATE];\n        assertUnrevoked(state);\n        prepareSetCopy(state);\n        return state.copy_.entries();\n      };\n\n      p.keys = function () {\n        return this.values();\n      };\n\n      p[iteratorSymbol$1] = function () {\n        return this.values();\n      };\n\n      p.forEach = function forEach(cb, thisArg) {\n        var iterator = this.values();\n        var result = iterator.next();\n\n        while (!result.done) {\n          cb.call(thisArg, result.value, result.value, this);\n          result = iterator.next();\n        }\n      };\n\n      return DraftSet;\n    }(Set);\n\n    function proxySet_(target, parent) {\n      // @ts-ignore\n      return new DraftSet(target, parent);\n    }\n\n    function prepareSetCopy(state) {\n      if (!state.copy_) {\n        // create drafts for all entries to preserve insertion order\n        state.copy_ = new Set();\n        state.base_.forEach(function (value) {\n          if (isDraftable(value)) {\n            var draft = createProxy(state.scope_.immer_, value, state);\n            state.drafts_.set(value, draft);\n            state.copy_.add(draft);\n          } else {\n            state.copy_.add(value);\n          }\n        });\n      }\n    }\n\n    function assertUnrevoked(state\n    /*ES5State | MapState | SetState*/\n    ) {\n      if (state.revoked_) die(3, JSON.stringify(latest(state)));\n    }\n\n    loadPlugin(\"MapSet\", {\n      proxyMap_: proxyMap_,\n      proxySet_: proxySet_\n    });\n  }\n\n  function enableAllPlugins() {\n    enableES5();\n    enableMapSet();\n    enablePatches();\n  }\n\n  var immer$1 =\n  /*#__PURE__*/\n  new Immer();\n  /**\n   * The `produce` function takes a value and a \"recipe function\" (whose\n   * return value often depends on the base state). The recipe function is\n   * free to mutate its first argument however it wants. All mutations are\n   * only ever applied to a __copy__ of the base state.\n   *\n   * Pass only a function to create a \"curried producer\" which relieves you\n   * from passing the recipe function every time.\n   *\n   * Only plain objects and arrays are made mutable. All other objects are\n   * considered uncopyable.\n   *\n   * Note: This function is __bound__ to its `Immer` instance.\n   *\n   * @param {any} base - the initial state\n   * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n   * @param {Function} patchListener - optional function that will be called with all the patches produced here\n   * @returns {any} a new state, or the initial state if nothing was modified\n   */\n\n  var produce = immer$1.produce;\n  /**\n   * Like `produce`, but `produceWithPatches` always returns a tuple\n   * [nextState, patches, inversePatches] (instead of just the next state)\n   */\n\n  var produceWithPatches =\n  /*#__PURE__*/\n  immer$1.produceWithPatches.bind(immer$1);\n  /**\n   * Pass true to automatically freeze all copies created by Immer.\n   *\n   * Always freeze by default, even in production mode\n   */\n\n  var setAutoFreeze =\n  /*#__PURE__*/\n  immer$1.setAutoFreeze.bind(immer$1);\n  /**\n   * Pass true to use the ES2015 `Proxy` class when creating drafts, which is\n   * always faster than using ES5 proxies.\n   *\n   * By default, feature detection is used, so calling this is rarely necessary.\n   */\n\n  var setUseProxies =\n  /*#__PURE__*/\n  immer$1.setUseProxies.bind(immer$1);\n  /**\n   * Apply an array of Immer patches to the first argument.\n   *\n   * This function is a producer, which means copy-on-write is in effect.\n   */\n\n  var applyPatches =\n  /*#__PURE__*/\n  immer$1.applyPatches.bind(immer$1);\n  /**\n   * Create an Immer draft from the given base state, which may be a draft itself.\n   * The draft can be modified until you finalize it with the `finishDraft` function.\n   */\n\n  var createDraft =\n  /*#__PURE__*/\n  immer$1.createDraft.bind(immer$1);\n  /**\n   * Finalize an Immer draft from a `createDraft` call, returning the base state\n   * (if no changes were made) or a modified copy. The draft must *not* be\n   * mutated afterwards.\n   *\n   * Pass a function as the 2nd argument to generate Immer patches based on the\n   * changes that were made.\n   */\n\n  var finishDraft =\n  /*#__PURE__*/\n  immer$1.finishDraft.bind(immer$1);\n  /**\n   * This function is actually a no-op, but can be used to cast an immutable type\n   * to an draft type and make TypeScript happy\n   *\n   * @param value\n   */\n\n  function castDraft(value) {\n    return value;\n  }\n  /**\n   * This function is actually a no-op, but can be used to cast a mutable type\n   * to an immutable type and make TypeScript happy\n   * @param value\n   */\n\n  function castImmutable(value) {\n    return value;\n  }\n\n  var Immer_1 = Immer;\n  var applyPatches_1 = applyPatches;\n  var castDraft_1 = castDraft;\n  var castImmutable_1 = castImmutable;\n  var createDraft_1 = createDraft;\n  var current_1 = current;\n  var _default$2 = produce;\n  var enableAllPlugins_1 = enableAllPlugins;\n  var enableES5_1 = enableES5;\n  var enableMapSet_1 = enableMapSet;\n  var enablePatches_1 = enablePatches;\n  var finishDraft_1 = finishDraft;\n  var freeze_1 = freeze;\n  var immerable = DRAFTABLE;\n  var isDraft_1 = isDraft;\n  var isDraftable_1 = isDraftable;\n  var nothing = NOTHING;\n  var original_1 = original;\n  var produce_1 = produce;\n  var produceWithPatches_1 = produceWithPatches;\n  var setAutoFreeze_1 = setAutoFreeze;\n  var setUseProxies_1 = setUseProxies;\n\n\n  var immer_cjs_development = /*#__PURE__*/Object.defineProperty({\n  \tImmer: Immer_1,\n  \tapplyPatches: applyPatches_1,\n  \tcastDraft: castDraft_1,\n  \tcastImmutable: castImmutable_1,\n  \tcreateDraft: createDraft_1,\n  \tcurrent: current_1,\n  \tdefault: _default$2,\n  \tenableAllPlugins: enableAllPlugins_1,\n  \tenableES5: enableES5_1,\n  \tenableMapSet: enableMapSet_1,\n  \tenablePatches: enablePatches_1,\n  \tfinishDraft: finishDraft_1,\n  \tfreeze: freeze_1,\n  \timmerable: immerable,\n  \tisDraft: isDraft_1,\n  \tisDraftable: isDraftable_1,\n  \tnothing: nothing,\n  \toriginal: original_1,\n  \tproduce: produce_1,\n  \tproduceWithPatches: produceWithPatches_1,\n  \tsetAutoFreeze: setAutoFreeze_1,\n  \tsetUseProxies: setUseProxies_1\n  }, '__esModule', {value: true});\n\n  var require$$1$1 = immer_cjs_development;\n\n  var dist$8 = createCommonjsModule$1(function (module) {\n\n  {\n    module.exports = require$$1$1;\n  }\n  });\n\n  var isPlainObject = isPlainObject_1;\n\n  var immer = dist$8;\n\n  function unwrapExports (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var arrayLikeToArray = createCommonjsModule(function (module) {\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n\n    for (var i = 0, arr2 = new Array(len); i < len; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n\n  module.exports = _arrayLikeToArray;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(arrayLikeToArray);\n\n  var arrayWithoutHoles = createCommonjsModule(function (module) {\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return arrayLikeToArray(arr);\n  }\n\n  module.exports = _arrayWithoutHoles;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(arrayWithoutHoles);\n\n  var iterableToArray = createCommonjsModule(function (module) {\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n\n  module.exports = _iterableToArray;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(iterableToArray);\n\n  var unsupportedIterableToArray = createCommonjsModule(function (module) {\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n  }\n\n  module.exports = _unsupportedIterableToArray;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(unsupportedIterableToArray);\n\n  var nonIterableSpread = createCommonjsModule(function (module) {\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  module.exports = _nonIterableSpread;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(nonIterableSpread);\n\n  var toConsumableArray = createCommonjsModule(function (module) {\n  function _toConsumableArray(arr) {\n    return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n  }\n\n  module.exports = _toConsumableArray;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  var _toConsumableArray = unwrapExports(toConsumableArray);\n\n  var arrayWithHoles = createCommonjsModule(function (module) {\n  function _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n  }\n\n  module.exports = _arrayWithHoles;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(arrayWithHoles);\n\n  var iterableToArrayLimit = createCommonjsModule(function (module) {\n  function _iterableToArrayLimit(arr, i) {\n    var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n    if (_i == null) return;\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n\n    var _s, _e;\n\n    try {\n      for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  module.exports = _iterableToArrayLimit;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(iterableToArrayLimit);\n\n  var nonIterableRest = createCommonjsModule(function (module) {\n  function _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  module.exports = _nonIterableRest;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(nonIterableRest);\n\n  var slicedToArray = createCommonjsModule(function (module) {\n  function _slicedToArray(arr, i) {\n    return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n  }\n\n  module.exports = _slicedToArray;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  var _slicedToArray = unwrapExports(slicedToArray);\n\n  var defineProperty = createCommonjsModule(function (module) {\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  module.exports = _defineProperty;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  var _defineProperty = unwrapExports(defineProperty);\n\n  var DIRTY_PATHS = new WeakMap();\n  var FLUSHING = new WeakMap();\n  var NORMALIZING = new WeakMap();\n  var PATH_REFS = new WeakMap();\n  var POINT_REFS = new WeakMap();\n  var RANGE_REFS = new WeakMap();\n\n  function ownKeys$9(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$9(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$9(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$9(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n  function _createForOfIteratorHelper$7(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$7(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$7(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$7(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$7(o, minLen); }\n\n  function _arrayLikeToArray$7(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n  /**\n   * Create a new Slate `Editor` object.\n   */\n\n  var createEditor$1 = function createEditor() {\n    var editor = {\n      children: [],\n      operations: [],\n      selection: null,\n      marks: null,\n      isInline: function isInline() {\n        return false;\n      },\n      isVoid: function isVoid() {\n        return false;\n      },\n      onChange: function onChange() {},\n      apply: function apply(op) {\n        var _iterator = _createForOfIteratorHelper$7(Editor.pathRefs(editor)),\n            _step;\n\n        try {\n          for (_iterator.s(); !(_step = _iterator.n()).done;) {\n            var ref = _step.value;\n            PathRef.transform(ref, op);\n          }\n        } catch (err) {\n          _iterator.e(err);\n        } finally {\n          _iterator.f();\n        }\n\n        var _iterator2 = _createForOfIteratorHelper$7(Editor.pointRefs(editor)),\n            _step2;\n\n        try {\n          for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n            var _ref = _step2.value;\n            PointRef.transform(_ref, op);\n          }\n        } catch (err) {\n          _iterator2.e(err);\n        } finally {\n          _iterator2.f();\n        }\n\n        var _iterator3 = _createForOfIteratorHelper$7(Editor.rangeRefs(editor)),\n            _step3;\n\n        try {\n          for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n            var _ref2 = _step3.value;\n            RangeRef.transform(_ref2, op);\n          }\n        } catch (err) {\n          _iterator3.e(err);\n        } finally {\n          _iterator3.f();\n        }\n\n        var set = new Set();\n        var dirtyPaths = [];\n\n        var add = function add(path) {\n          if (path) {\n            var key = path.join(',');\n\n            if (!set.has(key)) {\n              set.add(key);\n              dirtyPaths.push(path);\n            }\n          }\n        };\n\n        var oldDirtyPaths = DIRTY_PATHS.get(editor) || [];\n        var newDirtyPaths = getDirtyPaths(op);\n\n        var _iterator4 = _createForOfIteratorHelper$7(oldDirtyPaths),\n            _step4;\n\n        try {\n          for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n            var path = _step4.value;\n            var newPath = Path.transform(path, op);\n            add(newPath);\n          }\n        } catch (err) {\n          _iterator4.e(err);\n        } finally {\n          _iterator4.f();\n        }\n\n        var _iterator5 = _createForOfIteratorHelper$7(newDirtyPaths),\n            _step5;\n\n        try {\n          for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n            var _path = _step5.value;\n            add(_path);\n          }\n        } catch (err) {\n          _iterator5.e(err);\n        } finally {\n          _iterator5.f();\n        }\n\n        DIRTY_PATHS.set(editor, dirtyPaths);\n        Transforms.transform(editor, op);\n        editor.operations.push(op);\n        Editor.normalize(editor); // Clear any formats applied to the cursor if the selection changes.\n\n        if (op.type === 'set_selection') {\n          editor.marks = null;\n        }\n\n        if (!FLUSHING.get(editor)) {\n          FLUSHING.set(editor, true);\n          Promise.resolve().then(function () {\n            FLUSHING.set(editor, false);\n            editor.onChange();\n            editor.operations = [];\n          });\n        }\n      },\n      addMark: function addMark(key, value) {\n        var selection = editor.selection;\n\n        if (selection) {\n          if (Range.isExpanded(selection)) {\n            Transforms.setNodes(editor, _defineProperty({}, key, value), {\n              match: Text.isText,\n              split: true\n            });\n          } else {\n            var marks = _objectSpread$9(_objectSpread$9({}, Editor.marks(editor) || {}), {}, _defineProperty({}, key, value));\n\n            editor.marks = marks;\n\n            if (!FLUSHING.get(editor)) {\n              editor.onChange();\n            }\n          }\n        }\n      },\n      deleteBackward: function deleteBackward(unit) {\n        var selection = editor.selection;\n\n        if (selection && Range.isCollapsed(selection)) {\n          Transforms[\"delete\"](editor, {\n            unit: unit,\n            reverse: true\n          });\n        }\n      },\n      deleteForward: function deleteForward(unit) {\n        var selection = editor.selection;\n\n        if (selection && Range.isCollapsed(selection)) {\n          Transforms[\"delete\"](editor, {\n            unit: unit\n          });\n        }\n      },\n      deleteFragment: function deleteFragment(direction) {\n        var selection = editor.selection;\n\n        if (selection && Range.isExpanded(selection)) {\n          Transforms[\"delete\"](editor, {\n            reverse: direction === 'backward'\n          });\n        }\n      },\n      getFragment: function getFragment() {\n        var selection = editor.selection;\n\n        if (selection) {\n          return Node$1.fragment(editor, selection);\n        }\n\n        return [];\n      },\n      insertBreak: function insertBreak() {\n        Transforms.splitNodes(editor, {\n          always: true\n        });\n      },\n      insertFragment: function insertFragment(fragment) {\n        Transforms.insertFragment(editor, fragment);\n      },\n      insertNode: function insertNode(node) {\n        Transforms.insertNodes(editor, node);\n      },\n      insertText: function insertText(text) {\n        var selection = editor.selection,\n            marks = editor.marks;\n\n        if (selection) {\n          if (marks) {\n            var node = _objectSpread$9({\n              text: text\n            }, marks);\n\n            Transforms.insertNodes(editor, node);\n          } else {\n            Transforms.insertText(editor, text);\n          }\n\n          editor.marks = null;\n        }\n      },\n      normalizeNode: function normalizeNode(entry) {\n        var _entry = _slicedToArray(entry, 2),\n            node = _entry[0],\n            path = _entry[1]; // There are no core normalizations for text nodes.\n\n\n        if (Text.isText(node)) {\n          return;\n        } // Ensure that block and inline nodes have at least one text child.\n\n\n        if (Element$1.isElement(node) && node.children.length === 0) {\n          var child = {\n            text: ''\n          };\n          Transforms.insertNodes(editor, child, {\n            at: path.concat(0),\n            voids: true\n          });\n          return;\n        } // Determine whether the node should have block or inline children.\n\n\n        var shouldHaveInlines = Editor.isEditor(node) ? false : Element$1.isElement(node) && (editor.isInline(node) || node.children.length === 0 || Text.isText(node.children[0]) || editor.isInline(node.children[0])); // Since we'll be applying operations while iterating, keep track of an\n        // index that accounts for any added/removed nodes.\n\n        var n = 0;\n\n        for (var i = 0; i < node.children.length; i++, n++) {\n          var currentNode = Node$1.get(editor, path);\n          if (Text.isText(currentNode)) continue;\n          var _child = node.children[i];\n          var prev = currentNode.children[n - 1];\n          var isLast = i === node.children.length - 1;\n          var isInlineOrText = Text.isText(_child) || Element$1.isElement(_child) && editor.isInline(_child); // Only allow block nodes in the top-level children and parent blocks\n          // that only contain block nodes. Similarly, only allow inline nodes in\n          // other inline nodes, or parent blocks that only contain inlines and\n          // text.\n\n          if (isInlineOrText !== shouldHaveInlines) {\n            Transforms.removeNodes(editor, {\n              at: path.concat(n),\n              voids: true\n            });\n            n--;\n          } else if (Element$1.isElement(_child)) {\n            // Ensure that inline nodes are surrounded by text nodes.\n            if (editor.isInline(_child)) {\n              if (prev == null || !Text.isText(prev)) {\n                var newChild = {\n                  text: ''\n                };\n                Transforms.insertNodes(editor, newChild, {\n                  at: path.concat(n),\n                  voids: true\n                });\n                n++;\n              } else if (isLast) {\n                var _newChild = {\n                  text: ''\n                };\n                Transforms.insertNodes(editor, _newChild, {\n                  at: path.concat(n + 1),\n                  voids: true\n                });\n                n++;\n              }\n            }\n          } else {\n            // Merge adjacent text nodes that are empty or match.\n            if (prev != null && Text.isText(prev)) {\n              if (Text.equals(_child, prev, {\n                loose: true\n              })) {\n                Transforms.mergeNodes(editor, {\n                  at: path.concat(n),\n                  voids: true\n                });\n                n--;\n              } else if (prev.text === '') {\n                Transforms.removeNodes(editor, {\n                  at: path.concat(n - 1),\n                  voids: true\n                });\n                n--;\n              } else if (_child.text === '') {\n                Transforms.removeNodes(editor, {\n                  at: path.concat(n),\n                  voids: true\n                });\n                n--;\n              }\n            }\n          }\n        }\n      },\n      removeMark: function removeMark(key) {\n        var selection = editor.selection;\n\n        if (selection) {\n          if (Range.isExpanded(selection)) {\n            Transforms.unsetNodes(editor, key, {\n              match: Text.isText,\n              split: true\n            });\n          } else {\n            var marks = _objectSpread$9({}, Editor.marks(editor) || {});\n\n            delete marks[key];\n            editor.marks = marks;\n\n            if (!FLUSHING.get(editor)) {\n              editor.onChange();\n            }\n          }\n        }\n      }\n    };\n    return editor;\n  };\n  /**\n   * Get the \"dirty\" paths generated from an operation.\n   */\n\n  var getDirtyPaths = function getDirtyPaths(op) {\n    switch (op.type) {\n      case 'insert_text':\n      case 'remove_text':\n      case 'set_node':\n        {\n          var path = op.path;\n          return Path.levels(path);\n        }\n\n      case 'insert_node':\n        {\n          var node = op.node,\n              _path2 = op.path;\n          var levels = Path.levels(_path2);\n          var descendants = Text.isText(node) ? [] : Array.from(Node$1.nodes(node), function (_ref3) {\n            var _ref4 = _slicedToArray(_ref3, 2),\n                p = _ref4[1];\n\n            return _path2.concat(p);\n          });\n          return [].concat(_toConsumableArray(levels), _toConsumableArray(descendants));\n        }\n\n      case 'merge_node':\n        {\n          var _path3 = op.path;\n          var ancestors = Path.ancestors(_path3);\n          var previousPath = Path.previous(_path3);\n          return [].concat(_toConsumableArray(ancestors), [previousPath]);\n        }\n\n      case 'move_node':\n        {\n          var _path4 = op.path,\n              newPath = op.newPath;\n\n          if (Path.equals(_path4, newPath)) {\n            return [];\n          }\n\n          var oldAncestors = [];\n          var newAncestors = [];\n\n          var _iterator6 = _createForOfIteratorHelper$7(Path.ancestors(_path4)),\n              _step6;\n\n          try {\n            for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n              var ancestor = _step6.value;\n              var p = Path.transform(ancestor, op);\n              oldAncestors.push(p);\n            }\n          } catch (err) {\n            _iterator6.e(err);\n          } finally {\n            _iterator6.f();\n          }\n\n          var _iterator7 = _createForOfIteratorHelper$7(Path.ancestors(newPath)),\n              _step7;\n\n          try {\n            for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n              var _ancestor = _step7.value;\n\n              var _p = Path.transform(_ancestor, op);\n\n              newAncestors.push(_p);\n            }\n          } catch (err) {\n            _iterator7.e(err);\n          } finally {\n            _iterator7.f();\n          }\n\n          var newParent = newAncestors[newAncestors.length - 1];\n          var newIndex = newPath[newPath.length - 1];\n          var resultPath = newParent.concat(newIndex);\n          return [].concat(oldAncestors, newAncestors, [resultPath]);\n        }\n\n      case 'remove_node':\n        {\n          var _path5 = op.path;\n\n          var _ancestors = Path.ancestors(_path5);\n\n          return _toConsumableArray(_ancestors);\n        }\n\n      case 'split_node':\n        {\n          var _path6 = op.path;\n\n          var _levels = Path.levels(_path6);\n\n          var nextPath = Path.next(_path6);\n          return [].concat(_toConsumableArray(_levels), [nextPath]);\n        }\n\n      default:\n        {\n          return [];\n        }\n    }\n  };\n\n  var objectWithoutPropertiesLoose = createCommonjsModule(function (module) {\n  function _objectWithoutPropertiesLoose(source, excluded) {\n    if (source == null) return {};\n    var target = {};\n    var sourceKeys = Object.keys(source);\n    var key, i;\n\n    for (i = 0; i < sourceKeys.length; i++) {\n      key = sourceKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      target[key] = source[key];\n    }\n\n    return target;\n  }\n\n  module.exports = _objectWithoutPropertiesLoose;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  unwrapExports(objectWithoutPropertiesLoose);\n\n  var objectWithoutProperties = createCommonjsModule(function (module) {\n  function _objectWithoutProperties(source, excluded) {\n    if (source == null) return {};\n    var target = objectWithoutPropertiesLoose(source, excluded);\n    var key, i;\n\n    if (Object.getOwnPropertySymbols) {\n      var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n      for (i = 0; i < sourceSymbolKeys.length; i++) {\n        key = sourceSymbolKeys[i];\n        if (excluded.indexOf(key) >= 0) continue;\n        if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n        target[key] = source[key];\n      }\n    }\n\n    return target;\n  }\n\n  module.exports = _objectWithoutProperties;\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  });\n\n  var _objectWithoutProperties = unwrapExports(objectWithoutProperties);\n\n  function _createForOfIteratorHelper$6(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$6(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$6(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$6(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$6(o, minLen); }\n\n  function _arrayLikeToArray$6(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n  // Character (grapheme cluster) boundaries are determined according to\n  // the default grapheme cluster boundary specification, extended grapheme clusters variant[1].\n  //\n  // References:\n  //\n  // [1] https://www.unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table\n  // [2] https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt\n  // [3] https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakTest.html\n  // [4] https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakTest.txt\n\n  /**\n   * Get the distance to the end of the first character in a string of text.\n   */\n  var getCharacterDistance = function getCharacterDistance(str) {\n    var isRTL = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    var isLTR = !isRTL;\n    var codepoints = isRTL ? codepointsIteratorRTL(str) : str;\n    var left = CodepointType.None;\n    var right = CodepointType.None;\n    var distance = 0; // Evaluation of these conditions are deferred.\n\n    var gb11 = null; // Is GB11 applicable?\n\n    var gb12Or13 = null; // Is GB12 or GB13 applicable?\n\n    var _iterator = _createForOfIteratorHelper$6(codepoints),\n        _step;\n\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var _char = _step.value;\n\n        var code = _char.codePointAt(0);\n\n        if (!code) break;\n        var type = getCodepointType(_char, code);\n\n        var _ref = isLTR ? [right, type] : [type, left];\n\n        var _ref2 = _slicedToArray(_ref, 2);\n\n        left = _ref2[0];\n        right = _ref2[1];\n\n        if (intersects(left, CodepointType.ZWJ) && intersects(right, CodepointType.ExtPict)) {\n          if (isLTR) {\n            gb11 = endsWithEmojiZWJ(str.substring(0, distance));\n          } else {\n            gb11 = endsWithEmojiZWJ(str.substring(0, str.length - distance));\n          }\n\n          if (!gb11) break;\n        }\n\n        if (intersects(left, CodepointType.RI) && intersects(right, CodepointType.RI)) {\n          if (gb12Or13 !== null) {\n            gb12Or13 = !gb12Or13;\n          } else {\n            if (isLTR) {\n              gb12Or13 = true;\n            } else {\n              gb12Or13 = endsWithOddNumberOfRIs(str.substring(0, str.length - distance));\n            }\n          }\n\n          if (!gb12Or13) break;\n        }\n\n        if (left !== CodepointType.None && right !== CodepointType.None && isBoundaryPair(left, right)) {\n          break;\n        }\n\n        distance += _char.length;\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n\n    return distance || 1;\n  };\n  var SPACE = /\\s/;\n  var PUNCTUATION = /[\\u0021-\\u0023\\u0025-\\u002A\\u002C-\\u002F\\u003A\\u003B\\u003F\\u0040\\u005B-\\u005D\\u005F\\u007B\\u007D\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]/;\n  var CHAMELEON = /['\\u2018\\u2019]/;\n  /**\n   * Get the distance to the end of the first word in a string of text.\n   */\n\n  var getWordDistance = function getWordDistance(text) {\n    var isRTL = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    var dist = 0;\n    var started = false;\n\n    while (text.length > 0) {\n      var charDist = getCharacterDistance(text, isRTL);\n\n      var _splitByCharacterDist = splitByCharacterDistance(text, charDist, isRTL),\n          _splitByCharacterDist2 = _slicedToArray(_splitByCharacterDist, 2),\n          _char2 = _splitByCharacterDist2[0],\n          remaining = _splitByCharacterDist2[1];\n\n      if (isWordCharacter(_char2, remaining, isRTL)) {\n        started = true;\n        dist += charDist;\n      } else if (!started) {\n        dist += charDist;\n      } else {\n        break;\n      }\n\n      text = remaining;\n    }\n\n    return dist;\n  };\n  /**\n   * Split a string in two parts at a given distance starting from the end when\n   * `isRTL` is set to `true`.\n   */\n\n  var splitByCharacterDistance = function splitByCharacterDistance(str, dist, isRTL) {\n    if (isRTL) {\n      var at = str.length - dist;\n      return [str.slice(at, str.length), str.slice(0, at)];\n    }\n\n    return [str.slice(0, dist), str.slice(dist)];\n  };\n  /**\n   * Check if a character is a word character. The `remaining` argument is used\n   * because sometimes you must read subsequent characters to truly determine it.\n   */\n\n  var isWordCharacter = function isWordCharacter(_char3, remaining) {\n    var isRTL = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    if (SPACE.test(_char3)) {\n      return false;\n    } // Chameleons count as word characters as long as they're in a word, so\n    // recurse to see if the next one is a word character or not.\n\n\n    if (CHAMELEON.test(_char3)) {\n      var charDist = getCharacterDistance(remaining, isRTL);\n\n      var _splitByCharacterDist3 = splitByCharacterDistance(remaining, charDist, isRTL),\n          _splitByCharacterDist4 = _slicedToArray(_splitByCharacterDist3, 2),\n          nextChar = _splitByCharacterDist4[0],\n          nextRemaining = _splitByCharacterDist4[1];\n\n      if (isWordCharacter(nextChar, nextRemaining, isRTL)) {\n        return true;\n      }\n    }\n\n    if (PUNCTUATION.test(_char3)) {\n      return false;\n    }\n\n    return true;\n  };\n  /**\n   * Iterate on codepoints from right to left.\n   */\n\n\n  var codepointsIteratorRTL = function* codepointsIteratorRTL(str) {\n    var end = str.length - 1;\n\n    for (var i = 0; i < str.length; i++) {\n      var char1 = str.charAt(end - i);\n\n      if (isLowSurrogate(char1.charCodeAt(0))) {\n        var char2 = str.charAt(end - i - 1);\n\n        if (isHighSurrogate(char2.charCodeAt(0))) {\n          yield char2 + char1;\n          i++;\n          continue;\n        }\n      }\n\n      yield char1;\n    }\n  };\n  /**\n   * Is `charCode` a high surrogate.\n   *\n   * https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates\n   */\n\n  var isHighSurrogate = function isHighSurrogate(charCode) {\n    return charCode >= 0xd800 && charCode <= 0xdbff;\n  };\n  /**\n   * Is `charCode` a low surrogate.\n   *\n   * https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates\n   */\n\n\n  var isLowSurrogate = function isLowSurrogate(charCode) {\n    return charCode >= 0xdc00 && charCode <= 0xdfff;\n  };\n\n  var CodepointType;\n\n  (function (CodepointType) {\n    CodepointType[CodepointType[\"None\"] = 0] = \"None\";\n    CodepointType[CodepointType[\"Extend\"] = 1] = \"Extend\";\n    CodepointType[CodepointType[\"ZWJ\"] = 2] = \"ZWJ\";\n    CodepointType[CodepointType[\"RI\"] = 4] = \"RI\";\n    CodepointType[CodepointType[\"Prepend\"] = 8] = \"Prepend\";\n    CodepointType[CodepointType[\"SpacingMark\"] = 16] = \"SpacingMark\";\n    CodepointType[CodepointType[\"L\"] = 32] = \"L\";\n    CodepointType[CodepointType[\"V\"] = 64] = \"V\";\n    CodepointType[CodepointType[\"T\"] = 128] = \"T\";\n    CodepointType[CodepointType[\"LV\"] = 256] = \"LV\";\n    CodepointType[CodepointType[\"LVT\"] = 512] = \"LVT\";\n    CodepointType[CodepointType[\"ExtPict\"] = 1024] = \"ExtPict\";\n    CodepointType[CodepointType[\"Any\"] = 2048] = \"Any\";\n  })(CodepointType || (CodepointType = {}));\n\n  var reExtend = /^(?:[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09BE\\u09C1-\\u09C4\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01\\u0B3C\\u0B3E\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B55-\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE\\u0BC0\\u0BCD\\u0BD7\\u0C00\\u0C04\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC2\\u0CC6\\u0CCC\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00\\u0D01\\u0D3B\\u0D3C\\u0D3E\\u0D41-\\u0D44\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D81\\u0DCA\\u0DCF\\u0DD2-\\u0DD4\\u0DD6\\u0DDF\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1AC0\\u1B00-\\u1B03\\u1B34-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u200C\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA82C\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9BD\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFF9E\\uFF9F]|\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD803[\\uDD24-\\uDD27\\uDEAB\\uDEAC\\uDF46-\\uDF50]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDC9-\\uDDCC\\uDDCF\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3B\\uDF3C\\uDF3E\\uDF40\\uDF57\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDC5E\\uDCB0\\uDCB3-\\uDCB8\\uDCBA\\uDCBD\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDAF\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD806[\\uDC2F-\\uDC37\\uDC39\\uDC3A\\uDD30\\uDD3B\\uDD3C\\uDD3E\\uDD43\\uDDD4-\\uDDD7\\uDDDA\\uDDDB\\uDDE0\\uDE01-\\uDE0A\\uDE33-\\uDE38\\uDE3B-\\uDE3E\\uDE47\\uDE51-\\uDE56\\uDE59-\\uDE5B\\uDE8A-\\uDE96\\uDE98\\uDE99]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6\\uDD31-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD45\\uDD47\\uDD90\\uDD91\\uDD95\\uDD97\\uDEF3\\uDEF4]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF4F\\uDF8F-\\uDF92\\uDFE4]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65\\uDD67-\\uDD69\\uDD6E-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A\\uDD30-\\uDD36\\uDEEC-\\uDEEF]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uD83C[\\uDFFB-\\uDFFF]|\\uDB40[\\uDC20-\\uDC7F\\uDD00-\\uDDEF])$/;\n  var rePrepend = /^(?:[\\u0600-\\u0605\\u06DD\\u070F\\u0890\\u0891\\u08E2\\u0D4E]|\\uD804[\\uDCBD\\uDCCD\\uDDC2\\uDDC3]|\\uD806[\\uDD3F\\uDD41\\uDE3A\\uDE84-\\uDE89]|\\uD807\\uDD46)$/;\n  var reSpacingMark = /^(?:[\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BF\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0\\u0CC1\\u0CC3\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0D02\\u0D03\\u0D3F\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D82\\u0D83\\u0DD0\\u0DD1\\u0DD8-\\u0DDE\\u0DF2\\u0DF3\\u0E33\\u0EB3\\u0F3E\\u0F3F\\u0F7F\\u1031\\u103B\\u103C\\u1056\\u1057\\u1084\\u1715\\u1734\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A6D-\\u1A72\\u1B04\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF7\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BE-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]|\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD45\\uDD46\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDDCE\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB1\\uDCB2\\uDCB9\\uDCBB\\uDCBC\\uDCBE\\uDCC1\\uDDB0\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF26]|\\uD806[\\uDC2C-\\uDC2E\\uDC38\\uDD31-\\uDD35\\uDD37\\uDD38\\uDD3D\\uDD40\\uDD42\\uDDD1-\\uDDD3\\uDDDC-\\uDDDF\\uDDE4\\uDE39\\uDE57\\uDE58\\uDE97]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4\\uDD8A-\\uDD8E\\uDD93\\uDD94\\uDD96\\uDEF5\\uDEF6]|\\uD81B[\\uDF51-\\uDF87\\uDFF0\\uDFF1]|\\uD834[\\uDD66\\uDD6D])$/;\n  var reL = /^[\\u1100-\\u115F\\uA960-\\uA97C]$/;\n  var reV = /^[\\u1160-\\u11A7\\uD7B0-\\uD7C6]$/;\n  var reT = /^[\\u11A8-\\u11FF\\uD7CB-\\uD7FB]$/;\n  var reLV = /^[\\uAC00\\uAC1C\\uAC38\\uAC54\\uAC70\\uAC8C\\uACA8\\uACC4\\uACE0\\uACFC\\uAD18\\uAD34\\uAD50\\uAD6C\\uAD88\\uADA4\\uADC0\\uADDC\\uADF8\\uAE14\\uAE30\\uAE4C\\uAE68\\uAE84\\uAEA0\\uAEBC\\uAED8\\uAEF4\\uAF10\\uAF2C\\uAF48\\uAF64\\uAF80\\uAF9C\\uAFB8\\uAFD4\\uAFF0\\uB00C\\uB028\\uB044\\uB060\\uB07C\\uB098\\uB0B4\\uB0D0\\uB0EC\\uB108\\uB124\\uB140\\uB15C\\uB178\\uB194\\uB1B0\\uB1CC\\uB1E8\\uB204\\uB220\\uB23C\\uB258\\uB274\\uB290\\uB2AC\\uB2C8\\uB2E4\\uB300\\uB31C\\uB338\\uB354\\uB370\\uB38C\\uB3A8\\uB3C4\\uB3E0\\uB3FC\\uB418\\uB434\\uB450\\uB46C\\uB488\\uB4A4\\uB4C0\\uB4DC\\uB4F8\\uB514\\uB530\\uB54C\\uB568\\uB584\\uB5A0\\uB5BC\\uB5D8\\uB5F4\\uB610\\uB62C\\uB648\\uB664\\uB680\\uB69C\\uB6B8\\uB6D4\\uB6F0\\uB70C\\uB728\\uB744\\uB760\\uB77C\\uB798\\uB7B4\\uB7D0\\uB7EC\\uB808\\uB824\\uB840\\uB85C\\uB878\\uB894\\uB8B0\\uB8CC\\uB8E8\\uB904\\uB920\\uB93C\\uB958\\uB974\\uB990\\uB9AC\\uB9C8\\uB9E4\\uBA00\\uBA1C\\uBA38\\uBA54\\uBA70\\uBA8C\\uBAA8\\uBAC4\\uBAE0\\uBAFC\\uBB18\\uBB34\\uBB50\\uBB6C\\uBB88\\uBBA4\\uBBC0\\uBBDC\\uBBF8\\uBC14\\uBC30\\uBC4C\\uBC68\\uBC84\\uBCA0\\uBCBC\\uBCD8\\uBCF4\\uBD10\\uBD2C\\uBD48\\uBD64\\uBD80\\uBD9C\\uBDB8\\uBDD4\\uBDF0\\uBE0C\\uBE28\\uBE44\\uBE60\\uBE7C\\uBE98\\uBEB4\\uBED0\\uBEEC\\uBF08\\uBF24\\uBF40\\uBF5C\\uBF78\\uBF94\\uBFB0\\uBFCC\\uBFE8\\uC004\\uC020\\uC03C\\uC058\\uC074\\uC090\\uC0AC\\uC0C8\\uC0E4\\uC100\\uC11C\\uC138\\uC154\\uC170\\uC18C\\uC1A8\\uC1C4\\uC1E0\\uC1FC\\uC218\\uC234\\uC250\\uC26C\\uC288\\uC2A4\\uC2C0\\uC2DC\\uC2F8\\uC314\\uC330\\uC34C\\uC368\\uC384\\uC3A0\\uC3BC\\uC3D8\\uC3F4\\uC410\\uC42C\\uC448\\uC464\\uC480\\uC49C\\uC4B8\\uC4D4\\uC4F0\\uC50C\\uC528\\uC544\\uC560\\uC57C\\uC598\\uC5B4\\uC5D0\\uC5EC\\uC608\\uC624\\uC640\\uC65C\\uC678\\uC694\\uC6B0\\uC6CC\\uC6E8\\uC704\\uC720\\uC73C\\uC758\\uC774\\uC790\\uC7AC\\uC7C8\\uC7E4\\uC800\\uC81C\\uC838\\uC854\\uC870\\uC88C\\uC8A8\\uC8C4\\uC8E0\\uC8FC\\uC918\\uC934\\uC950\\uC96C\\uC988\\uC9A4\\uC9C0\\uC9DC\\uC9F8\\uCA14\\uCA30\\uCA4C\\uCA68\\uCA84\\uCAA0\\uCABC\\uCAD8\\uCAF4\\uCB10\\uCB2C\\uCB48\\uCB64\\uCB80\\uCB9C\\uCBB8\\uCBD4\\uCBF0\\uCC0C\\uCC28\\uCC44\\uCC60\\uCC7C\\uCC98\\uCCB4\\uCCD0\\uCCEC\\uCD08\\uCD24\\uCD40\\uCD5C\\uCD78\\uCD94\\uCDB0\\uCDCC\\uCDE8\\uCE04\\uCE20\\uCE3C\\uCE58\\uCE74\\uCE90\\uCEAC\\uCEC8\\uCEE4\\uCF00\\uCF1C\\uCF38\\uCF54\\uCF70\\uCF8C\\uCFA8\\uCFC4\\uCFE0\\uCFFC\\uD018\\uD034\\uD050\\uD06C\\uD088\\uD0A4\\uD0C0\\uD0DC\\uD0F8\\uD114\\uD130\\uD14C\\uD168\\uD184\\uD1A0\\uD1BC\\uD1D8\\uD1F4\\uD210\\uD22C\\uD248\\uD264\\uD280\\uD29C\\uD2B8\\uD2D4\\uD2F0\\uD30C\\uD328\\uD344\\uD360\\uD37C\\uD398\\uD3B4\\uD3D0\\uD3EC\\uD408\\uD424\\uD440\\uD45C\\uD478\\uD494\\uD4B0\\uD4CC\\uD4E8\\uD504\\uD520\\uD53C\\uD558\\uD574\\uD590\\uD5AC\\uD5C8\\uD5E4\\uD600\\uD61C\\uD638\\uD654\\uD670\\uD68C\\uD6A8\\uD6C4\\uD6E0\\uD6FC\\uD718\\uD734\\uD750\\uD76C\\uD788]$/;\n  var reLVT = /^[\\uAC01-\\uAC1B\\uAC1D-\\uAC37\\uAC39-\\uAC53\\uAC55-\\uAC6F\\uAC71-\\uAC8B\\uAC8D-\\uACA7\\uACA9-\\uACC3\\uACC5-\\uACDF\\uACE1-\\uACFB\\uACFD-\\uAD17\\uAD19-\\uAD33\\uAD35-\\uAD4F\\uAD51-\\uAD6B\\uAD6D-\\uAD87\\uAD89-\\uADA3\\uADA5-\\uADBF\\uADC1-\\uADDB\\uADDD-\\uADF7\\uADF9-\\uAE13\\uAE15-\\uAE2F\\uAE31-\\uAE4B\\uAE4D-\\uAE67\\uAE69-\\uAE83\\uAE85-\\uAE9F\\uAEA1-\\uAEBB\\uAEBD-\\uAED7\\uAED9-\\uAEF3\\uAEF5-\\uAF0F\\uAF11-\\uAF2B\\uAF2D-\\uAF47\\uAF49-\\uAF63\\uAF65-\\uAF7F\\uAF81-\\uAF9B\\uAF9D-\\uAFB7\\uAFB9-\\uAFD3\\uAFD5-\\uAFEF\\uAFF1-\\uB00B\\uB00D-\\uB027\\uB029-\\uB043\\uB045-\\uB05F\\uB061-\\uB07B\\uB07D-\\uB097\\uB099-\\uB0B3\\uB0B5-\\uB0CF\\uB0D1-\\uB0EB\\uB0ED-\\uB107\\uB109-\\uB123\\uB125-\\uB13F\\uB141-\\uB15B\\uB15D-\\uB177\\uB179-\\uB193\\uB195-\\uB1AF\\uB1B1-\\uB1CB\\uB1CD-\\uB1E7\\uB1E9-\\uB203\\uB205-\\uB21F\\uB221-\\uB23B\\uB23D-\\uB257\\uB259-\\uB273\\uB275-\\uB28F\\uB291-\\uB2AB\\uB2AD-\\uB2C7\\uB2C9-\\uB2E3\\uB2E5-\\uB2FF\\uB301-\\uB31B\\uB31D-\\uB337\\uB339-\\uB353\\uB355-\\uB36F\\uB371-\\uB38B\\uB38D-\\uB3A7\\uB3A9-\\uB3C3\\uB3C5-\\uB3DF\\uB3E1-\\uB3FB\\uB3FD-\\uB417\\uB419-\\uB433\\uB435-\\uB44F\\uB451-\\uB46B\\uB46D-\\uB487\\uB489-\\uB4A3\\uB4A5-\\uB4BF\\uB4C1-\\uB4DB\\uB4DD-\\uB4F7\\uB4F9-\\uB513\\uB515-\\uB52F\\uB531-\\uB54B\\uB54D-\\uB567\\uB569-\\uB583\\uB585-\\uB59F\\uB5A1-\\uB5BB\\uB5BD-\\uB5D7\\uB5D9-\\uB5F3\\uB5F5-\\uB60F\\uB611-\\uB62B\\uB62D-\\uB647\\uB649-\\uB663\\uB665-\\uB67F\\uB681-\\uB69B\\uB69D-\\uB6B7\\uB6B9-\\uB6D3\\uB6D5-\\uB6EF\\uB6F1-\\uB70B\\uB70D-\\uB727\\uB729-\\uB743\\uB745-\\uB75F\\uB761-\\uB77B\\uB77D-\\uB797\\uB799-\\uB7B3\\uB7B5-\\uB7CF\\uB7D1-\\uB7EB\\uB7ED-\\uB807\\uB809-\\uB823\\uB825-\\uB83F\\uB841-\\uB85B\\uB85D-\\uB877\\uB879-\\uB893\\uB895-\\uB8AF\\uB8B1-\\uB8CB\\uB8CD-\\uB8E7\\uB8E9-\\uB903\\uB905-\\uB91F\\uB921-\\uB93B\\uB93D-\\uB957\\uB959-\\uB973\\uB975-\\uB98F\\uB991-\\uB9AB\\uB9AD-\\uB9C7\\uB9C9-\\uB9E3\\uB9E5-\\uB9FF\\uBA01-\\uBA1B\\uBA1D-\\uBA37\\uBA39-\\uBA53\\uBA55-\\uBA6F\\uBA71-\\uBA8B\\uBA8D-\\uBAA7\\uBAA9-\\uBAC3\\uBAC5-\\uBADF\\uBAE1-\\uBAFB\\uBAFD-\\uBB17\\uBB19-\\uBB33\\uBB35-\\uBB4F\\uBB51-\\uBB6B\\uBB6D-\\uBB87\\uBB89-\\uBBA3\\uBBA5-\\uBBBF\\uBBC1-\\uBBDB\\uBBDD-\\uBBF7\\uBBF9-\\uBC13\\uBC15-\\uBC2F\\uBC31-\\uBC4B\\uBC4D-\\uBC67\\uBC69-\\uBC83\\uBC85-\\uBC9F\\uBCA1-\\uBCBB\\uBCBD-\\uBCD7\\uBCD9-\\uBCF3\\uBCF5-\\uBD0F\\uBD11-\\uBD2B\\uBD2D-\\uBD47\\uBD49-\\uBD63\\uBD65-\\uBD7F\\uBD81-\\uBD9B\\uBD9D-\\uBDB7\\uBDB9-\\uBDD3\\uBDD5-\\uBDEF\\uBDF1-\\uBE0B\\uBE0D-\\uBE27\\uBE29-\\uBE43\\uBE45-\\uBE5F\\uBE61-\\uBE7B\\uBE7D-\\uBE97\\uBE99-\\uBEB3\\uBEB5-\\uBECF\\uBED1-\\uBEEB\\uBEED-\\uBF07\\uBF09-\\uBF23\\uBF25-\\uBF3F\\uBF41-\\uBF5B\\uBF5D-\\uBF77\\uBF79-\\uBF93\\uBF95-\\uBFAF\\uBFB1-\\uBFCB\\uBFCD-\\uBFE7\\uBFE9-\\uC003\\uC005-\\uC01F\\uC021-\\uC03B\\uC03D-\\uC057\\uC059-\\uC073\\uC075-\\uC08F\\uC091-\\uC0AB\\uC0AD-\\uC0C7\\uC0C9-\\uC0E3\\uC0E5-\\uC0FF\\uC101-\\uC11B\\uC11D-\\uC137\\uC139-\\uC153\\uC155-\\uC16F\\uC171-\\uC18B\\uC18D-\\uC1A7\\uC1A9-\\uC1C3\\uC1C5-\\uC1DF\\uC1E1-\\uC1FB\\uC1FD-\\uC217\\uC219-\\uC233\\uC235-\\uC24F\\uC251-\\uC26B\\uC26D-\\uC287\\uC289-\\uC2A3\\uC2A5-\\uC2BF\\uC2C1-\\uC2DB\\uC2DD-\\uC2F7\\uC2F9-\\uC313\\uC315-\\uC32F\\uC331-\\uC34B\\uC34D-\\uC367\\uC369-\\uC383\\uC385-\\uC39F\\uC3A1-\\uC3BB\\uC3BD-\\uC3D7\\uC3D9-\\uC3F3\\uC3F5-\\uC40F\\uC411-\\uC42B\\uC42D-\\uC447\\uC449-\\uC463\\uC465-\\uC47F\\uC481-\\uC49B\\uC49D-\\uC4B7\\uC4B9-\\uC4D3\\uC4D5-\\uC4EF\\uC4F1-\\uC50B\\uC50D-\\uC527\\uC529-\\uC543\\uC545-\\uC55F\\uC561-\\uC57B\\uC57D-\\uC597\\uC599-\\uC5B3\\uC5B5-\\uC5CF\\uC5D1-\\uC5EB\\uC5ED-\\uC607\\uC609-\\uC623\\uC625-\\uC63F\\uC641-\\uC65B\\uC65D-\\uC677\\uC679-\\uC693\\uC695-\\uC6AF\\uC6B1-\\uC6CB\\uC6CD-\\uC6E7\\uC6E9-\\uC703\\uC705-\\uC71F\\uC721-\\uC73B\\uC73D-\\uC757\\uC759-\\uC773\\uC775-\\uC78F\\uC791-\\uC7AB\\uC7AD-\\uC7C7\\uC7C9-\\uC7E3\\uC7E5-\\uC7FF\\uC801-\\uC81B\\uC81D-\\uC837\\uC839-\\uC853\\uC855-\\uC86F\\uC871-\\uC88B\\uC88D-\\uC8A7\\uC8A9-\\uC8C3\\uC8C5-\\uC8DF\\uC8E1-\\uC8FB\\uC8FD-\\uC917\\uC919-\\uC933\\uC935-\\uC94F\\uC951-\\uC96B\\uC96D-\\uC987\\uC989-\\uC9A3\\uC9A5-\\uC9BF\\uC9C1-\\uC9DB\\uC9DD-\\uC9F7\\uC9F9-\\uCA13\\uCA15-\\uCA2F\\uCA31-\\uCA4B\\uCA4D-\\uCA67\\uCA69-\\uCA83\\uCA85-\\uCA9F\\uCAA1-\\uCABB\\uCABD-\\uCAD7\\uCAD9-\\uCAF3\\uCAF5-\\uCB0F\\uCB11-\\uCB2B\\uCB2D-\\uCB47\\uCB49-\\uCB63\\uCB65-\\uCB7F\\uCB81-\\uCB9B\\uCB9D-\\uCBB7\\uCBB9-\\uCBD3\\uCBD5-\\uCBEF\\uCBF1-\\uCC0B\\uCC0D-\\uCC27\\uCC29-\\uCC43\\uCC45-\\uCC5F\\uCC61-\\uCC7B\\uCC7D-\\uCC97\\uCC99-\\uCCB3\\uCCB5-\\uCCCF\\uCCD1-\\uCCEB\\uCCED-\\uCD07\\uCD09-\\uCD23\\uCD25-\\uCD3F\\uCD41-\\uCD5B\\uCD5D-\\uCD77\\uCD79-\\uCD93\\uCD95-\\uCDAF\\uCDB1-\\uCDCB\\uCDCD-\\uCDE7\\uCDE9-\\uCE03\\uCE05-\\uCE1F\\uCE21-\\uCE3B\\uCE3D-\\uCE57\\uCE59-\\uCE73\\uCE75-\\uCE8F\\uCE91-\\uCEAB\\uCEAD-\\uCEC7\\uCEC9-\\uCEE3\\uCEE5-\\uCEFF\\uCF01-\\uCF1B\\uCF1D-\\uCF37\\uCF39-\\uCF53\\uCF55-\\uCF6F\\uCF71-\\uCF8B\\uCF8D-\\uCFA7\\uCFA9-\\uCFC3\\uCFC5-\\uCFDF\\uCFE1-\\uCFFB\\uCFFD-\\uD017\\uD019-\\uD033\\uD035-\\uD04F\\uD051-\\uD06B\\uD06D-\\uD087\\uD089-\\uD0A3\\uD0A5-\\uD0BF\\uD0C1-\\uD0DB\\uD0DD-\\uD0F7\\uD0F9-\\uD113\\uD115-\\uD12F\\uD131-\\uD14B\\uD14D-\\uD167\\uD169-\\uD183\\uD185-\\uD19F\\uD1A1-\\uD1BB\\uD1BD-\\uD1D7\\uD1D9-\\uD1F3\\uD1F5-\\uD20F\\uD211-\\uD22B\\uD22D-\\uD247\\uD249-\\uD263\\uD265-\\uD27F\\uD281-\\uD29B\\uD29D-\\uD2B7\\uD2B9-\\uD2D3\\uD2D5-\\uD2EF\\uD2F1-\\uD30B\\uD30D-\\uD327\\uD329-\\uD343\\uD345-\\uD35F\\uD361-\\uD37B\\uD37D-\\uD397\\uD399-\\uD3B3\\uD3B5-\\uD3CF\\uD3D1-\\uD3EB\\uD3ED-\\uD407\\uD409-\\uD423\\uD425-\\uD43F\\uD441-\\uD45B\\uD45D-\\uD477\\uD479-\\uD493\\uD495-\\uD4AF\\uD4B1-\\uD4CB\\uD4CD-\\uD4E7\\uD4E9-\\uD503\\uD505-\\uD51F\\uD521-\\uD53B\\uD53D-\\uD557\\uD559-\\uD573\\uD575-\\uD58F\\uD591-\\uD5AB\\uD5AD-\\uD5C7\\uD5C9-\\uD5E3\\uD5E5-\\uD5FF\\uD601-\\uD61B\\uD61D-\\uD637\\uD639-\\uD653\\uD655-\\uD66F\\uD671-\\uD68B\\uD68D-\\uD6A7\\uD6A9-\\uD6C3\\uD6C5-\\uD6DF\\uD6E1-\\uD6FB\\uD6FD-\\uD717\\uD719-\\uD733\\uD735-\\uD74F\\uD751-\\uD76B\\uD76D-\\uD787\\uD789-\\uD7A3]$/;\n  var reExtPict = /^(?:[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u2388\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2605\\u2607-\\u2612\\u2614-\\u2685\\u2690-\\u2705\\u2708-\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763-\\u2767\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC00-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDAD-\\uDDE5\\uDE01-\\uDE0F\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE3C-\\uDE3F\\uDE49-\\uDFFA]|\\uD83D[\\uDC00-\\uDD3D\\uDD46-\\uDE4F\\uDE80-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDCFF\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDEFF]|\\uD83F[\\uDC00-\\uDFFD])$/;\n\n  var getCodepointType = function getCodepointType(_char4, code) {\n    var type = CodepointType.Any;\n\n    if (_char4.search(reExtend) !== -1) {\n      type |= CodepointType.Extend;\n    }\n\n    if (code === 0x200d) {\n      type |= CodepointType.ZWJ;\n    }\n\n    if (code >= 0x1f1e6 && code <= 0x1f1ff) {\n      type |= CodepointType.RI;\n    }\n\n    if (_char4.search(rePrepend) !== -1) {\n      type |= CodepointType.Prepend;\n    }\n\n    if (_char4.search(reSpacingMark) !== -1) {\n      type |= CodepointType.SpacingMark;\n    }\n\n    if (_char4.search(reL) !== -1) {\n      type |= CodepointType.L;\n    }\n\n    if (_char4.search(reV) !== -1) {\n      type |= CodepointType.V;\n    }\n\n    if (_char4.search(reT) !== -1) {\n      type |= CodepointType.T;\n    }\n\n    if (_char4.search(reLV) !== -1) {\n      type |= CodepointType.LV;\n    }\n\n    if (_char4.search(reLVT) !== -1) {\n      type |= CodepointType.LVT;\n    }\n\n    if (_char4.search(reExtPict) !== -1) {\n      type |= CodepointType.ExtPict;\n    }\n\n    return type;\n  };\n\n  function intersects(x, y) {\n    return (x & y) !== 0;\n  }\n\n  var NonBoundaryPairs = [// GB6\n  [CodepointType.L, CodepointType.L | CodepointType.V | CodepointType.LV | CodepointType.LVT], // GB7\n  [CodepointType.LV | CodepointType.V, CodepointType.V | CodepointType.T], // GB8\n  [CodepointType.LVT | CodepointType.T, CodepointType.T], // GB9\n  [CodepointType.Any, CodepointType.Extend | CodepointType.ZWJ], // GB9a\n  [CodepointType.Any, CodepointType.SpacingMark], // GB9b\n  [CodepointType.Prepend, CodepointType.Any], // GB11\n  [CodepointType.ZWJ, CodepointType.ExtPict], // GB12 and GB13\n  [CodepointType.RI, CodepointType.RI]];\n\n  function isBoundaryPair(left, right) {\n    return NonBoundaryPairs.findIndex(function (r) {\n      return intersects(left, r[0]) && intersects(right, r[1]);\n    }) === -1;\n  }\n\n  var endingEmojiZWJ = /(?:[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u2388\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2605\\u2607-\\u2612\\u2614-\\u2685\\u2690-\\u2705\\u2708-\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763-\\u2767\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC00-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDAD-\\uDDE5\\uDE01-\\uDE0F\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE3C-\\uDE3F\\uDE49-\\uDFFA]|\\uD83D[\\uDC00-\\uDD3D\\uDD46-\\uDE4F\\uDE80-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDCFF\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDEFF]|\\uD83F[\\uDC00-\\uDFFD])(?:[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09BE\\u09C1-\\u09C4\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01\\u0B3C\\u0B3E\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B55-\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE\\u0BC0\\u0BCD\\u0BD7\\u0C00\\u0C04\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC2\\u0CC6\\u0CCC\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00\\u0D01\\u0D3B\\u0D3C\\u0D3E\\u0D41-\\u0D44\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D81\\u0DCA\\u0DCF\\u0DD2-\\u0DD4\\u0DD6\\u0DDF\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1AC0\\u1B00-\\u1B03\\u1B34-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u200C\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA82C\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9BD\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFF9E\\uFF9F]|\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD803[\\uDD24-\\uDD27\\uDEAB\\uDEAC\\uDF46-\\uDF50]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDC9-\\uDDCC\\uDDCF\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3B\\uDF3C\\uDF3E\\uDF40\\uDF57\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDC5E\\uDCB0\\uDCB3-\\uDCB8\\uDCBA\\uDCBD\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDAF\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD806[\\uDC2F-\\uDC37\\uDC39\\uDC3A\\uDD30\\uDD3B\\uDD3C\\uDD3E\\uDD43\\uDDD4-\\uDDD7\\uDDDA\\uDDDB\\uDDE0\\uDE01-\\uDE0A\\uDE33-\\uDE38\\uDE3B-\\uDE3E\\uDE47\\uDE51-\\uDE56\\uDE59-\\uDE5B\\uDE8A-\\uDE96\\uDE98\\uDE99]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6\\uDD31-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD45\\uDD47\\uDD90\\uDD91\\uDD95\\uDD97\\uDEF3\\uDEF4]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF4F\\uDF8F-\\uDF92\\uDFE4]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65\\uDD67-\\uDD69\\uDD6E-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A\\uDD30-\\uDD36\\uDEEC-\\uDEEF]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uD83C[\\uDFFB-\\uDFFF]|\\uDB40[\\uDC20-\\uDC7F\\uDD00-\\uDDEF])*\\u200D$/;\n\n  var endsWithEmojiZWJ = function endsWithEmojiZWJ(str) {\n    return str.search(endingEmojiZWJ) !== -1;\n  };\n\n  var endingRIs = /(?:\\uD83C[\\uDDE6-\\uDDFF])+$/g;\n\n  var endsWithOddNumberOfRIs = function endsWithOddNumberOfRIs(str) {\n    var match = str.match(endingRIs);\n\n    if (match === null) {\n      return false;\n    } else {\n      // A RI is represented by a surrogate pair.\n      var numRIs = match[0].length / 2;\n      return numRIs % 2 === 1;\n    }\n  };\n\n  /**\n   * Shared the function with isElementType utility\n   */\n\n  var isElement = function isElement(value) {\n    return isPlainObject.isPlainObject(value) && Node$1.isNodeList(value.children) && !Editor.isEditor(value);\n  };\n\n  var Element$1 = {\n    /**\n     * Check if a value implements the 'Ancestor' interface.\n     */\n    isAncestor: function isAncestor(value) {\n      return isPlainObject.isPlainObject(value) && Node$1.isNodeList(value.children);\n    },\n\n    /**\n     * Check if a value implements the `Element` interface.\n     */\n    isElement: isElement,\n\n    /**\n     * Check if a value is an array of `Element` objects.\n     */\n    isElementList: function isElementList(value) {\n      return Array.isArray(value) && value.every(function (val) {\n        return Element$1.isElement(val);\n      });\n    },\n\n    /**\n     * Check if a set of props is a partial of Element.\n     */\n    isElementProps: function isElementProps(props) {\n      return props.children !== undefined;\n    },\n\n    /**\n     * Check if a value implements the `Element` interface and has elementKey with selected value.\n     * Default it check to `type` key value\n     */\n    isElementType: function isElementType(value, elementVal) {\n      var elementKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'type';\n      return isElement(value) && value[elementKey] === elementVal;\n    },\n\n    /**\n     * Check if an element matches set of properties.\n     *\n     * Note: this checks custom properties, and it does not ensure that any\n     * children are equivalent.\n     */\n    matches: function matches(element, props) {\n      for (var key in props) {\n        if (key === 'children') {\n          continue;\n        }\n\n        if (element[key] !== props[key]) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  };\n\n  var _excluded$4 = [\"text\"],\n      _excluded2$3 = [\"text\"];\n\n  function ownKeys$8(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$8(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$8(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$8(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n  function _createForOfIteratorHelper$5(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$5(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$5(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$5(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$5(o, minLen); }\n\n  function _arrayLikeToArray$5(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n  var IS_EDITOR_CACHE = new WeakMap();\n  var Editor = {\n    /**\n     * Get the ancestor above a location in the document.\n     */\n    above: function above(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$voids = options.voids,\n          voids = _options$voids === void 0 ? false : _options$voids,\n          _options$mode = options.mode,\n          mode = _options$mode === void 0 ? 'lowest' : _options$mode,\n          _options$at = options.at,\n          at = _options$at === void 0 ? editor.selection : _options$at,\n          match = options.match;\n\n      if (!at) {\n        return;\n      }\n\n      var path = Editor.path(editor, at);\n      var reverse = mode === 'lowest';\n\n      var _iterator = _createForOfIteratorHelper$5(Editor.levels(editor, {\n        at: path,\n        voids: voids,\n        match: match,\n        reverse: reverse\n      })),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var _step$value = _slicedToArray(_step.value, 2),\n              n = _step$value[0],\n              p = _step$value[1];\n\n          if (!Text.isText(n) && !Path.equals(path, p)) {\n            return [n, p];\n          }\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    },\n\n    /**\n     * Add a custom property to the leaf text nodes in the current selection.\n     *\n     * If the selection is currently collapsed, the marks will be added to the\n     * `editor.marks` property instead, and applied when text is inserted next.\n     */\n    addMark: function addMark(editor, key, value) {\n      editor.addMark(key, value);\n    },\n\n    /**\n     * Get the point after a location.\n     */\n    after: function after(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var anchor = Editor.point(editor, at, {\n        edge: 'end'\n      });\n      var focus = Editor.end(editor, []);\n      var range = {\n        anchor: anchor,\n        focus: focus\n      };\n      var _options$distance = options.distance,\n          distance = _options$distance === void 0 ? 1 : _options$distance;\n      var d = 0;\n      var target;\n\n      var _iterator2 = _createForOfIteratorHelper$5(Editor.positions(editor, _objectSpread$8(_objectSpread$8({}, options), {}, {\n        at: range\n      }))),\n          _step2;\n\n      try {\n        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n          var p = _step2.value;\n\n          if (d > distance) {\n            break;\n          }\n\n          if (d !== 0) {\n            target = p;\n          }\n\n          d++;\n        }\n      } catch (err) {\n        _iterator2.e(err);\n      } finally {\n        _iterator2.f();\n      }\n\n      return target;\n    },\n\n    /**\n     * Get the point before a location.\n     */\n    before: function before(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var anchor = Editor.start(editor, []);\n      var focus = Editor.point(editor, at, {\n        edge: 'start'\n      });\n      var range = {\n        anchor: anchor,\n        focus: focus\n      };\n      var _options$distance2 = options.distance,\n          distance = _options$distance2 === void 0 ? 1 : _options$distance2;\n      var d = 0;\n      var target;\n\n      var _iterator3 = _createForOfIteratorHelper$5(Editor.positions(editor, _objectSpread$8(_objectSpread$8({}, options), {}, {\n        at: range,\n        reverse: true\n      }))),\n          _step3;\n\n      try {\n        for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n          var p = _step3.value;\n\n          if (d > distance) {\n            break;\n          }\n\n          if (d !== 0) {\n            target = p;\n          }\n\n          d++;\n        }\n      } catch (err) {\n        _iterator3.e(err);\n      } finally {\n        _iterator3.f();\n      }\n\n      return target;\n    },\n\n    /**\n     * Delete content in the editor backward from the current selection.\n     */\n    deleteBackward: function deleteBackward(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$unit = options.unit,\n          unit = _options$unit === void 0 ? 'character' : _options$unit;\n      editor.deleteBackward(unit);\n    },\n\n    /**\n     * Delete content in the editor forward from the current selection.\n     */\n    deleteForward: function deleteForward(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$unit2 = options.unit,\n          unit = _options$unit2 === void 0 ? 'character' : _options$unit2;\n      editor.deleteForward(unit);\n    },\n\n    /**\n     * Delete the content in the current selection.\n     */\n    deleteFragment: function deleteFragment(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$direction = options.direction,\n          direction = _options$direction === void 0 ? 'forward' : _options$direction;\n      editor.deleteFragment(direction);\n    },\n\n    /**\n     * Get the start and end points of a location.\n     */\n    edges: function edges(editor, at) {\n      return [Editor.start(editor, at), Editor.end(editor, at)];\n    },\n\n    /**\n     * Get the end point of a location.\n     */\n    end: function end(editor, at) {\n      return Editor.point(editor, at, {\n        edge: 'end'\n      });\n    },\n\n    /**\n     * Get the first node at a location.\n     */\n    first: function first(editor, at) {\n      var path = Editor.path(editor, at, {\n        edge: 'start'\n      });\n      return Editor.node(editor, path);\n    },\n\n    /**\n     * Get the fragment at a location.\n     */\n    fragment: function fragment(editor, at) {\n      var range = Editor.range(editor, at);\n      var fragment = Node$1.fragment(editor, range);\n      return fragment;\n    },\n\n    /**\n     * Check if a node has block children.\n     */\n    hasBlocks: function hasBlocks(editor, element) {\n      return element.children.some(function (n) {\n        return Editor.isBlock(editor, n);\n      });\n    },\n\n    /**\n     * Check if a node has inline and text children.\n     */\n    hasInlines: function hasInlines(editor, element) {\n      return element.children.some(function (n) {\n        return Text.isText(n) || Editor.isInline(editor, n);\n      });\n    },\n\n    /**\n     * Check if a node has text children.\n     */\n    hasTexts: function hasTexts(editor, element) {\n      return element.children.every(function (n) {\n        return Text.isText(n);\n      });\n    },\n\n    /**\n     * Insert a block break at the current selection.\n     *\n     * If the selection is currently expanded, it will be deleted first.\n     */\n    insertBreak: function insertBreak(editor) {\n      editor.insertBreak();\n    },\n\n    /**\n     * Insert a fragment at the current selection.\n     *\n     * If the selection is currently expanded, it will be deleted first.\n     */\n    insertFragment: function insertFragment(editor, fragment) {\n      editor.insertFragment(fragment);\n    },\n\n    /**\n     * Insert a node at the current selection.\n     *\n     * If the selection is currently expanded, it will be deleted first.\n     */\n    insertNode: function insertNode(editor, node) {\n      editor.insertNode(node);\n    },\n\n    /**\n     * Insert text at the current selection.\n     *\n     * If the selection is currently expanded, it will be deleted first.\n     */\n    insertText: function insertText(editor, text) {\n      editor.insertText(text);\n    },\n\n    /**\n     * Check if a value is a block `Element` object.\n     */\n    isBlock: function isBlock(editor, value) {\n      return Element$1.isElement(value) && !editor.isInline(value);\n    },\n\n    /**\n     * Check if a value is an `Editor` object.\n     */\n    isEditor: function isEditor(value) {\n      if (!isPlainObject.isPlainObject(value)) return false;\n      var cachedIsEditor = IS_EDITOR_CACHE.get(value);\n\n      if (cachedIsEditor !== undefined) {\n        return cachedIsEditor;\n      }\n\n      var isEditor = typeof value.addMark === 'function' && typeof value.apply === 'function' && typeof value.deleteBackward === 'function' && typeof value.deleteForward === 'function' && typeof value.deleteFragment === 'function' && typeof value.insertBreak === 'function' && typeof value.insertFragment === 'function' && typeof value.insertNode === 'function' && typeof value.insertText === 'function' && typeof value.isInline === 'function' && typeof value.isVoid === 'function' && typeof value.normalizeNode === 'function' && typeof value.onChange === 'function' && typeof value.removeMark === 'function' && (value.marks === null || isPlainObject.isPlainObject(value.marks)) && (value.selection === null || Range.isRange(value.selection)) && Node$1.isNodeList(value.children) && Operation.isOperationList(value.operations);\n      IS_EDITOR_CACHE.set(value, isEditor);\n      return isEditor;\n    },\n\n    /**\n     * Check if a point is the end point of a location.\n     */\n    isEnd: function isEnd(editor, point, at) {\n      var end = Editor.end(editor, at);\n      return Point.equals(point, end);\n    },\n\n    /**\n     * Check if a point is an edge of a location.\n     */\n    isEdge: function isEdge(editor, point, at) {\n      return Editor.isStart(editor, point, at) || Editor.isEnd(editor, point, at);\n    },\n\n    /**\n     * Check if an element is empty, accounting for void nodes.\n     */\n    isEmpty: function isEmpty(editor, element) {\n      var children = element.children;\n\n      var _children = _slicedToArray(children, 1),\n          first = _children[0];\n\n      return children.length === 0 || children.length === 1 && Text.isText(first) && first.text === '' && !editor.isVoid(element);\n    },\n\n    /**\n     * Check if a value is an inline `Element` object.\n     */\n    isInline: function isInline(editor, value) {\n      return Element$1.isElement(value) && editor.isInline(value);\n    },\n\n    /**\n     * Check if the editor is currently normalizing after each operation.\n     */\n    isNormalizing: function isNormalizing(editor) {\n      var isNormalizing = NORMALIZING.get(editor);\n      return isNormalizing === undefined ? true : isNormalizing;\n    },\n\n    /**\n     * Check if a point is the start point of a location.\n     */\n    isStart: function isStart(editor, point, at) {\n      // PERF: If the offset isn't `0` we know it's not the start.\n      if (point.offset !== 0) {\n        return false;\n      }\n\n      var start = Editor.start(editor, at);\n      return Point.equals(point, start);\n    },\n\n    /**\n     * Check if a value is a void `Element` object.\n     */\n    isVoid: function isVoid(editor, value) {\n      return Element$1.isElement(value) && editor.isVoid(value);\n    },\n\n    /**\n     * Get the last node at a location.\n     */\n    last: function last(editor, at) {\n      var path = Editor.path(editor, at, {\n        edge: 'end'\n      });\n      return Editor.node(editor, path);\n    },\n\n    /**\n     * Get the leaf text node at a location.\n     */\n    leaf: function leaf(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var path = Editor.path(editor, at, options);\n      var node = Node$1.leaf(editor, path);\n      return [node, path];\n    },\n\n    /**\n     * Iterate through all of the levels at a location.\n     */\n    levels: function* levels(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$at2 = options.at,\n          at = _options$at2 === void 0 ? editor.selection : _options$at2,\n          _options$reverse = options.reverse,\n          reverse = _options$reverse === void 0 ? false : _options$reverse,\n          _options$voids2 = options.voids,\n          voids = _options$voids2 === void 0 ? false : _options$voids2;\n      var match = options.match;\n\n      if (match == null) {\n        match = function match() {\n          return true;\n        };\n      }\n\n      if (!at) {\n        return;\n      }\n\n      var levels = [];\n      var path = Editor.path(editor, at);\n\n      var _iterator4 = _createForOfIteratorHelper$5(Node$1.levels(editor, path)),\n          _step4;\n\n      try {\n        for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n          var _step4$value = _slicedToArray(_step4.value, 2),\n              n = _step4$value[0],\n              p = _step4$value[1];\n\n          if (!match(n, p)) {\n            continue;\n          }\n\n          levels.push([n, p]);\n\n          if (!voids && Editor.isVoid(editor, n)) {\n            break;\n          }\n        }\n      } catch (err) {\n        _iterator4.e(err);\n      } finally {\n        _iterator4.f();\n      }\n\n      if (reverse) {\n        levels.reverse();\n      }\n\n      yield* levels;\n    },\n\n    /**\n     * Get the marks that would be added to text at the current selection.\n     */\n    marks: function marks(editor) {\n      var marks = editor.marks,\n          selection = editor.selection;\n\n      if (!selection) {\n        return null;\n      }\n\n      if (marks) {\n        return marks;\n      }\n\n      if (Range.isExpanded(selection)) {\n        var _Editor$nodes = Editor.nodes(editor, {\n          match: Text.isText\n        }),\n            _Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),\n            match = _Editor$nodes2[0];\n\n        if (match) {\n          var _match = _slicedToArray(match, 1),\n              _node = _match[0];\n\n          _node.text;\n              var _rest = _objectWithoutProperties(_node, _excluded$4);\n\n          return _rest;\n        } else {\n          return {};\n        }\n      }\n\n      var anchor = selection.anchor;\n      var path = anchor.path;\n\n      var _Editor$leaf = Editor.leaf(editor, path),\n          _Editor$leaf2 = _slicedToArray(_Editor$leaf, 1),\n          node = _Editor$leaf2[0];\n\n      if (anchor.offset === 0) {\n        var prev = Editor.previous(editor, {\n          at: path,\n          match: Text.isText\n        });\n        var block = Editor.above(editor, {\n          match: function match(n) {\n            return Editor.isBlock(editor, n);\n          }\n        });\n\n        if (prev && block) {\n          var _prev = _slicedToArray(prev, 2),\n              prevNode = _prev[0],\n              prevPath = _prev[1];\n\n          var _block = _slicedToArray(block, 2),\n              blockPath = _block[1];\n\n          if (Path.isAncestor(blockPath, prevPath)) {\n            node = prevNode;\n          }\n        }\n      }\n\n      var _node2 = node;\n          _node2.text;\n          var rest = _objectWithoutProperties(_node2, _excluded2$3);\n\n      return rest;\n    },\n\n    /**\n     * Get the matching node in the branch of the document after a location.\n     */\n    next: function next(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$mode2 = options.mode,\n          mode = _options$mode2 === void 0 ? 'lowest' : _options$mode2,\n          _options$voids3 = options.voids,\n          voids = _options$voids3 === void 0 ? false : _options$voids3;\n      var match = options.match,\n          _options$at3 = options.at,\n          at = _options$at3 === void 0 ? editor.selection : _options$at3;\n\n      if (!at) {\n        return;\n      }\n\n      var pointAfterLocation = Editor.after(editor, at, {\n        voids: voids\n      });\n      if (!pointAfterLocation) return;\n\n      var _Editor$last = Editor.last(editor, []),\n          _Editor$last2 = _slicedToArray(_Editor$last, 2),\n          to = _Editor$last2[1];\n\n      var span = [pointAfterLocation.path, to];\n\n      if (Path.isPath(at) && at.length === 0) {\n        throw new Error(\"Cannot get the next node from the root node!\");\n      }\n\n      if (match == null) {\n        if (Path.isPath(at)) {\n          var _Editor$parent = Editor.parent(editor, at),\n              _Editor$parent2 = _slicedToArray(_Editor$parent, 1),\n              parent = _Editor$parent2[0];\n\n          match = function match(n) {\n            return parent.children.includes(n);\n          };\n        } else {\n          match = function match() {\n            return true;\n          };\n        }\n      }\n\n      var _Editor$nodes3 = Editor.nodes(editor, {\n        at: span,\n        match: match,\n        mode: mode,\n        voids: voids\n      }),\n          _Editor$nodes4 = _slicedToArray(_Editor$nodes3, 1),\n          next = _Editor$nodes4[0];\n\n      return next;\n    },\n\n    /**\n     * Get the node at a location.\n     */\n    node: function node(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var path = Editor.path(editor, at, options);\n      var node = Node$1.get(editor, path);\n      return [node, path];\n    },\n\n    /**\n     * Iterate through all of the nodes in the Editor.\n     */\n    nodes: function* nodes(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$at4 = options.at,\n          at = _options$at4 === void 0 ? editor.selection : _options$at4,\n          _options$mode3 = options.mode,\n          mode = _options$mode3 === void 0 ? 'all' : _options$mode3,\n          _options$universal = options.universal,\n          universal = _options$universal === void 0 ? false : _options$universal,\n          _options$reverse2 = options.reverse,\n          reverse = _options$reverse2 === void 0 ? false : _options$reverse2,\n          _options$voids4 = options.voids,\n          voids = _options$voids4 === void 0 ? false : _options$voids4;\n      var match = options.match;\n\n      if (!match) {\n        match = function match() {\n          return true;\n        };\n      }\n\n      if (!at) {\n        return;\n      }\n\n      var from;\n      var to;\n\n      if (Span.isSpan(at)) {\n        from = at[0];\n        to = at[1];\n      } else {\n        var first = Editor.path(editor, at, {\n          edge: 'start'\n        });\n        var last = Editor.path(editor, at, {\n          edge: 'end'\n        });\n        from = reverse ? last : first;\n        to = reverse ? first : last;\n      }\n\n      var nodeEntries = Node$1.nodes(editor, {\n        reverse: reverse,\n        from: from,\n        to: to,\n        pass: function pass(_ref) {\n          var _ref2 = _slicedToArray(_ref, 1),\n              n = _ref2[0];\n\n          return voids ? false : Editor.isVoid(editor, n);\n        }\n      });\n      var matches = [];\n      var hit;\n\n      var _iterator5 = _createForOfIteratorHelper$5(nodeEntries),\n          _step5;\n\n      try {\n        for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n          var _step5$value = _slicedToArray(_step5.value, 2),\n              node = _step5$value[0],\n              path = _step5$value[1];\n\n          var isLower = hit && Path.compare(path, hit[1]) === 0; // In highest mode any node lower than the last hit is not a match.\n\n          if (mode === 'highest' && isLower) {\n            continue;\n          }\n\n          if (!match(node, path)) {\n            // If we've arrived at a leaf text node that is not lower than the last\n            // hit, then we've found a branch that doesn't include a match, which\n            // means the match is not universal.\n            if (universal && !isLower && Text.isText(node)) {\n              return;\n            } else {\n              continue;\n            }\n          } // If there's a match and it's lower than the last, update the hit.\n\n\n          if (mode === 'lowest' && isLower) {\n            hit = [node, path];\n            continue;\n          } // In lowest mode we emit the last hit, once it's guaranteed lowest.\n\n\n          var emit = mode === 'lowest' ? hit : [node, path];\n\n          if (emit) {\n            if (universal) {\n              matches.push(emit);\n            } else {\n              yield emit;\n            }\n          }\n\n          hit = [node, path];\n        } // Since lowest is always emitting one behind, catch up at the end.\n\n      } catch (err) {\n        _iterator5.e(err);\n      } finally {\n        _iterator5.f();\n      }\n\n      if (mode === 'lowest' && hit) {\n        if (universal) {\n          matches.push(hit);\n        } else {\n          yield hit;\n        }\n      } // Universal defers to ensure that the match occurs in every branch, so we\n      // yield all of the matches after iterating.\n\n\n      if (universal) {\n        yield* matches;\n      }\n    },\n\n    /**\n     * Normalize any dirty objects in the editor.\n     */\n    normalize: function normalize(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$force = options.force,\n          force = _options$force === void 0 ? false : _options$force;\n\n      var getDirtyPaths = function getDirtyPaths(editor) {\n        return DIRTY_PATHS.get(editor) || [];\n      };\n\n      if (!Editor.isNormalizing(editor)) {\n        return;\n      }\n\n      if (force) {\n        var allPaths = Array.from(Node$1.nodes(editor), function (_ref3) {\n          var _ref4 = _slicedToArray(_ref3, 2),\n              p = _ref4[1];\n\n          return p;\n        });\n        DIRTY_PATHS.set(editor, allPaths);\n      }\n\n      if (getDirtyPaths(editor).length === 0) {\n        return;\n      }\n\n      Editor.withoutNormalizing(editor, function () {\n        /*\n          Fix dirty elements with no children.\n          editor.normalizeNode() does fix this, but some normalization fixes also require it to work.\n          Running an initial pass avoids the catch-22 race condition.\n        */\n        var _iterator6 = _createForOfIteratorHelper$5(getDirtyPaths(editor)),\n            _step6;\n\n        try {\n          for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n            var _dirtyPath = _step6.value;\n\n            if (Node$1.has(editor, _dirtyPath)) {\n              var _entry = Editor.node(editor, _dirtyPath);\n\n              var _entry2 = _slicedToArray(_entry, 2),\n                  node = _entry2[0],\n                  _ = _entry2[1];\n              /*\n                The default normalizer inserts an empty text node in this scenario, but it can be customised.\n                So there is some risk here.\n                           As long as the normalizer only inserts child nodes for this case it is safe to do in any order;\n                by definition adding children to an empty node can't cause other paths to change.\n              */\n\n\n              if (Element$1.isElement(node) && node.children.length === 0) {\n                editor.normalizeNode(_entry);\n              }\n            }\n          }\n        } catch (err) {\n          _iterator6.e(err);\n        } finally {\n          _iterator6.f();\n        }\n\n        var max = getDirtyPaths(editor).length * 42; // HACK: better way?\n\n        var m = 0;\n\n        while (getDirtyPaths(editor).length !== 0) {\n          if (m > max) {\n            throw new Error(\"\\n            Could not completely normalize the editor after \".concat(max, \" iterations! This is usually due to incorrect normalization logic that leaves a node in an invalid state.\\n          \"));\n          }\n\n          var dirtyPath = getDirtyPaths(editor).pop(); // If the node doesn't exist in the tree, it does not need to be normalized.\n\n          if (Node$1.has(editor, dirtyPath)) {\n            var entry = Editor.node(editor, dirtyPath);\n            editor.normalizeNode(entry);\n          }\n\n          m++;\n        }\n      });\n    },\n\n    /**\n     * Get the parent node of a location.\n     */\n    parent: function parent(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var path = Editor.path(editor, at, options);\n      var parentPath = Path.parent(path);\n      var entry = Editor.node(editor, parentPath);\n      return entry;\n    },\n\n    /**\n     * Get the path of a location.\n     */\n    path: function path(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var depth = options.depth,\n          edge = options.edge;\n\n      if (Path.isPath(at)) {\n        if (edge === 'start') {\n          var _Node$first = Node$1.first(editor, at),\n              _Node$first2 = _slicedToArray(_Node$first, 2),\n              firstPath = _Node$first2[1];\n\n          at = firstPath;\n        } else if (edge === 'end') {\n          var _Node$last = Node$1.last(editor, at),\n              _Node$last2 = _slicedToArray(_Node$last, 2),\n              lastPath = _Node$last2[1];\n\n          at = lastPath;\n        }\n      }\n\n      if (Range.isRange(at)) {\n        if (edge === 'start') {\n          at = Range.start(at);\n        } else if (edge === 'end') {\n          at = Range.end(at);\n        } else {\n          at = Path.common(at.anchor.path, at.focus.path);\n        }\n      }\n\n      if (Point.isPoint(at)) {\n        at = at.path;\n      }\n\n      if (depth != null) {\n        at = at.slice(0, depth);\n      }\n\n      return at;\n    },\n    hasPath: function hasPath(editor, path) {\n      return Node$1.has(editor, path);\n    },\n\n    /**\n     * Create a mutable ref for a `Path` object, which will stay in sync as new\n     * operations are applied to the editor.\n     */\n    pathRef: function pathRef(editor, path) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$affinity = options.affinity,\n          affinity = _options$affinity === void 0 ? 'forward' : _options$affinity;\n      var ref = {\n        current: path,\n        affinity: affinity,\n        unref: function unref() {\n          var current = ref.current;\n          var pathRefs = Editor.pathRefs(editor);\n          pathRefs[\"delete\"](ref);\n          ref.current = null;\n          return current;\n        }\n      };\n      var refs = Editor.pathRefs(editor);\n      refs.add(ref);\n      return ref;\n    },\n\n    /**\n     * Get the set of currently tracked path refs of the editor.\n     */\n    pathRefs: function pathRefs(editor) {\n      var refs = PATH_REFS.get(editor);\n\n      if (!refs) {\n        refs = new Set();\n        PATH_REFS.set(editor, refs);\n      }\n\n      return refs;\n    },\n\n    /**\n     * Get the start or end point of a location.\n     */\n    point: function point(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$edge = options.edge,\n          edge = _options$edge === void 0 ? 'start' : _options$edge;\n\n      if (Path.isPath(at)) {\n        var path;\n\n        if (edge === 'end') {\n          var _Node$last3 = Node$1.last(editor, at),\n              _Node$last4 = _slicedToArray(_Node$last3, 2),\n              lastPath = _Node$last4[1];\n\n          path = lastPath;\n        } else {\n          var _Node$first3 = Node$1.first(editor, at),\n              _Node$first4 = _slicedToArray(_Node$first3, 2),\n              firstPath = _Node$first4[1];\n\n          path = firstPath;\n        }\n\n        var node = Node$1.get(editor, path);\n\n        if (!Text.isText(node)) {\n          throw new Error(\"Cannot get the \".concat(edge, \" point in the node at path [\").concat(at, \"] because it has no \").concat(edge, \" text node.\"));\n        }\n\n        return {\n          path: path,\n          offset: edge === 'end' ? node.text.length : 0\n        };\n      }\n\n      if (Range.isRange(at)) {\n        var _Range$edges = Range.edges(at),\n            _Range$edges2 = _slicedToArray(_Range$edges, 2),\n            start = _Range$edges2[0],\n            end = _Range$edges2[1];\n\n        return edge === 'start' ? start : end;\n      }\n\n      return at;\n    },\n\n    /**\n     * Create a mutable ref for a `Point` object, which will stay in sync as new\n     * operations are applied to the editor.\n     */\n    pointRef: function pointRef(editor, point) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$affinity2 = options.affinity,\n          affinity = _options$affinity2 === void 0 ? 'forward' : _options$affinity2;\n      var ref = {\n        current: point,\n        affinity: affinity,\n        unref: function unref() {\n          var current = ref.current;\n          var pointRefs = Editor.pointRefs(editor);\n          pointRefs[\"delete\"](ref);\n          ref.current = null;\n          return current;\n        }\n      };\n      var refs = Editor.pointRefs(editor);\n      refs.add(ref);\n      return ref;\n    },\n\n    /**\n     * Get the set of currently tracked point refs of the editor.\n     */\n    pointRefs: function pointRefs(editor) {\n      var refs = POINT_REFS.get(editor);\n\n      if (!refs) {\n        refs = new Set();\n        POINT_REFS.set(editor, refs);\n      }\n\n      return refs;\n    },\n\n    /**\n     * Return all the positions in `at` range where a `Point` can be placed.\n     *\n     * By default, moves forward by individual offsets at a time, but\n     * the `unit` option can be used to to move by character, word, line, or block.\n     *\n     * The `reverse` option can be used to change iteration direction.\n     *\n     * Note: By default void nodes are treated as a single point and iteration\n     * will not happen inside their content unless you pass in true for the\n     * `voids` option, then iteration will occur.\n     */\n    positions: function* positions(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$at5 = options.at,\n          at = _options$at5 === void 0 ? editor.selection : _options$at5,\n          _options$unit3 = options.unit,\n          unit = _options$unit3 === void 0 ? 'offset' : _options$unit3,\n          _options$reverse3 = options.reverse,\n          reverse = _options$reverse3 === void 0 ? false : _options$reverse3,\n          _options$voids5 = options.voids,\n          voids = _options$voids5 === void 0 ? false : _options$voids5;\n\n      if (!at) {\n        return;\n      }\n      /**\n       * Algorithm notes:\n       *\n       * Each step `distance` is dynamic depending on the underlying text\n       * and the `unit` specified.  Each step, e.g., a line or word, may\n       * span multiple text nodes, so we iterate through the text both on\n       * two levels in step-sync:\n       *\n       * `leafText` stores the text on a text leaf level, and is advanced\n       * through using the counters `leafTextOffset` and `leafTextRemaining`.\n       *\n       * `blockText` stores the text on a block level, and is shortened\n       * by `distance` every time it is advanced.\n       *\n       * We only maintain a window of one blockText and one leafText because\n       * a block node always appears before all of its leaf nodes.\n       */\n\n\n      var range = Editor.range(editor, at);\n\n      var _Range$edges3 = Range.edges(range),\n          _Range$edges4 = _slicedToArray(_Range$edges3, 2),\n          start = _Range$edges4[0],\n          end = _Range$edges4[1];\n\n      var first = reverse ? end : start;\n      var isNewBlock = false;\n      var blockText = '';\n      var distance = 0; // Distance for leafText to catch up to blockText.\n\n      var leafTextRemaining = 0;\n      var leafTextOffset = 0; // Iterate through all nodes in range, grabbing entire textual content\n      // of block nodes in blockText, and text nodes in leafText.\n      // Exploits the fact that nodes are sequenced in such a way that we first\n      // encounter the block node, then all of its text nodes, so when iterating\n      // through the blockText and leafText we just need to remember a window of\n      // one block node and leaf node, respectively.\n\n      var _iterator7 = _createForOfIteratorHelper$5(Editor.nodes(editor, {\n        at: at,\n        reverse: reverse,\n        voids: voids\n      })),\n          _step7;\n\n      try {\n        for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n          var _step7$value = _slicedToArray(_step7.value, 2),\n              node = _step7$value[0],\n              path = _step7$value[1];\n\n          /*\n           * ELEMENT NODE - Yield position(s) for voids, collect blockText for blocks\n           */\n          if (Element$1.isElement(node)) {\n            // Void nodes are a special case, so by default we will always\n            // yield their first point. If the `voids` option is set to true,\n            // then we will iterate over their content.\n            if (!voids && editor.isVoid(node)) {\n              yield Editor.start(editor, path);\n              continue;\n            } // Inline element nodes are ignored as they don't themselves\n            // contribute to `blockText` or `leafText` - their parent and\n            // children do.\n\n\n            if (editor.isInline(node)) continue; // Block element node - set `blockText` to its text content.\n\n            if (Editor.hasInlines(editor, node)) {\n              // We always exhaust block nodes before encountering a new one:\n              //   console.assert(blockText === '',\n              //     `blockText='${blockText}' - `+\n              //     `not exhausted before new block node`, path)\n              // Ensure range considered is capped to `range`, in the\n              // start/end edge cases where block extends beyond range.\n              // Equivalent to this, but presumably more performant:\n              //   blockRange = Editor.range(editor, ...Editor.edges(editor, path))\n              //   blockRange = Range.intersection(range, blockRange) // intersect\n              //   blockText = Editor.string(editor, blockRange, { voids })\n              var e = Path.isAncestor(path, end.path) ? end : Editor.end(editor, path);\n              var s = Path.isAncestor(path, start.path) ? start : Editor.start(editor, path);\n              blockText = Editor.string(editor, {\n                anchor: s,\n                focus: e\n              }, {\n                voids: voids\n              });\n              isNewBlock = true;\n            }\n          }\n          /*\n           * TEXT LEAF NODE - Iterate through text content, yielding\n           * positions every `distance` offset according to `unit`.\n           */\n\n\n          if (Text.isText(node)) {\n            var isFirst = Path.equals(path, first.path); // Proof that we always exhaust text nodes before encountering a new one:\n            //   console.assert(leafTextRemaining <= 0,\n            //     `leafTextRemaining=${leafTextRemaining} - `+\n            //     `not exhausted before new leaf text node`, path)\n            // Reset `leafText` counters for new text node.\n\n            if (isFirst) {\n              leafTextRemaining = reverse ? first.offset : node.text.length - first.offset;\n              leafTextOffset = first.offset; // Works for reverse too.\n            } else {\n              leafTextRemaining = node.text.length;\n              leafTextOffset = reverse ? leafTextRemaining : 0;\n            } // Yield position at the start of node (potentially).\n\n\n            if (isFirst || isNewBlock || unit === 'offset') {\n              yield {\n                path: path,\n                offset: leafTextOffset\n              };\n              isNewBlock = false;\n            } // Yield positions every (dynamically calculated) `distance` offset.\n\n\n            while (true) {\n              // If `leafText` has caught up with `blockText` (distance=0),\n              // and if blockText is exhausted, break to get another block node,\n              // otherwise advance blockText forward by the new `distance`.\n              if (distance === 0) {\n                if (blockText === '') break;\n                distance = calcDistance(blockText, unit, reverse); // Split the string at the previously found distance and use the\n                // remaining string for the next iteration.\n\n                blockText = splitByCharacterDistance(blockText, distance, reverse)[1];\n              } // Advance `leafText` by the current `distance`.\n\n\n              leafTextOffset = reverse ? leafTextOffset - distance : leafTextOffset + distance;\n              leafTextRemaining = leafTextRemaining - distance; // If `leafText` is exhausted, break to get a new leaf node\n              // and set distance to the overflow amount, so we'll (maybe)\n              // catch up to blockText in the next leaf text node.\n\n              if (leafTextRemaining < 0) {\n                distance = -leafTextRemaining;\n                break;\n              } // Successfully walked `distance` offsets through `leafText`\n              // to catch up with `blockText`, so we can reset `distance`\n              // and yield this position in this node.\n\n\n              distance = 0;\n              yield {\n                path: path,\n                offset: leafTextOffset\n              };\n            }\n          }\n        } // Proof that upon completion, we've exahusted both leaf and block text:\n        //   console.assert(leafTextRemaining <= 0, \"leafText wasn't exhausted\")\n        //   console.assert(blockText === '', \"blockText wasn't exhausted\")\n        // Helper:\n        // Return the distance in offsets for a step of size `unit` on given string.\n\n      } catch (err) {\n        _iterator7.e(err);\n      } finally {\n        _iterator7.f();\n      }\n\n      function calcDistance(text, unit, reverse) {\n        if (unit === 'character') {\n          return getCharacterDistance(text, reverse);\n        } else if (unit === 'word') {\n          return getWordDistance(text, reverse);\n        } else if (unit === 'line' || unit === 'block') {\n          return text.length;\n        }\n\n        return 1;\n      }\n    },\n\n    /**\n     * Get the matching node in the branch of the document before a location.\n     */\n    previous: function previous(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$mode4 = options.mode,\n          mode = _options$mode4 === void 0 ? 'lowest' : _options$mode4,\n          _options$voids6 = options.voids,\n          voids = _options$voids6 === void 0 ? false : _options$voids6;\n      var match = options.match,\n          _options$at6 = options.at,\n          at = _options$at6 === void 0 ? editor.selection : _options$at6;\n\n      if (!at) {\n        return;\n      }\n\n      var pointBeforeLocation = Editor.before(editor, at, {\n        voids: voids\n      });\n\n      if (!pointBeforeLocation) {\n        return;\n      }\n\n      var _Editor$first = Editor.first(editor, []),\n          _Editor$first2 = _slicedToArray(_Editor$first, 2),\n          to = _Editor$first2[1]; // The search location is from the start of the document to the path of\n      // the point before the location passed in\n\n\n      var span = [pointBeforeLocation.path, to];\n\n      if (Path.isPath(at) && at.length === 0) {\n        throw new Error(\"Cannot get the previous node from the root node!\");\n      }\n\n      if (match == null) {\n        if (Path.isPath(at)) {\n          var _Editor$parent3 = Editor.parent(editor, at),\n              _Editor$parent4 = _slicedToArray(_Editor$parent3, 1),\n              parent = _Editor$parent4[0];\n\n          match = function match(n) {\n            return parent.children.includes(n);\n          };\n        } else {\n          match = function match() {\n            return true;\n          };\n        }\n      }\n\n      var _Editor$nodes5 = Editor.nodes(editor, {\n        reverse: true,\n        at: span,\n        match: match,\n        mode: mode,\n        voids: voids\n      }),\n          _Editor$nodes6 = _slicedToArray(_Editor$nodes5, 1),\n          previous = _Editor$nodes6[0];\n\n      return previous;\n    },\n\n    /**\n     * Get a range of a location.\n     */\n    range: function range(editor, at, to) {\n      if (Range.isRange(at) && !to) {\n        return at;\n      }\n\n      var start = Editor.start(editor, at);\n      var end = Editor.end(editor, to || at);\n      return {\n        anchor: start,\n        focus: end\n      };\n    },\n\n    /**\n     * Create a mutable ref for a `Range` object, which will stay in sync as new\n     * operations are applied to the editor.\n     */\n    rangeRef: function rangeRef(editor, range) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$affinity3 = options.affinity,\n          affinity = _options$affinity3 === void 0 ? 'forward' : _options$affinity3;\n      var ref = {\n        current: range,\n        affinity: affinity,\n        unref: function unref() {\n          var current = ref.current;\n          var rangeRefs = Editor.rangeRefs(editor);\n          rangeRefs[\"delete\"](ref);\n          ref.current = null;\n          return current;\n        }\n      };\n      var refs = Editor.rangeRefs(editor);\n      refs.add(ref);\n      return ref;\n    },\n\n    /**\n     * Get the set of currently tracked range refs of the editor.\n     */\n    rangeRefs: function rangeRefs(editor) {\n      var refs = RANGE_REFS.get(editor);\n\n      if (!refs) {\n        refs = new Set();\n        RANGE_REFS.set(editor, refs);\n      }\n\n      return refs;\n    },\n\n    /**\n     * Remove a custom property from all of the leaf text nodes in the current\n     * selection.\n     *\n     * If the selection is currently collapsed, the removal will be stored on\n     * `editor.marks` and applied to the text inserted next.\n     */\n    removeMark: function removeMark(editor, key) {\n      editor.removeMark(key);\n    },\n\n    /**\n     * Manually set if the editor should currently be normalizing.\n     *\n     * Note: Using this incorrectly can leave the editor in an invalid state.\n     *\n     */\n    setNormalizing: function setNormalizing(editor, isNormalizing) {\n      NORMALIZING.set(editor, isNormalizing);\n    },\n\n    /**\n     * Get the start point of a location.\n     */\n    start: function start(editor, at) {\n      return Editor.point(editor, at, {\n        edge: 'start'\n      });\n    },\n\n    /**\n     * Get the text string content of a location.\n     *\n     * Note: by default the text of void nodes is considered to be an empty\n     * string, regardless of content, unless you pass in true for the voids option\n     */\n    string: function string(editor, at) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$voids7 = options.voids,\n          voids = _options$voids7 === void 0 ? false : _options$voids7;\n      var range = Editor.range(editor, at);\n\n      var _Range$edges5 = Range.edges(range),\n          _Range$edges6 = _slicedToArray(_Range$edges5, 2),\n          start = _Range$edges6[0],\n          end = _Range$edges6[1];\n\n      var text = '';\n\n      var _iterator8 = _createForOfIteratorHelper$5(Editor.nodes(editor, {\n        at: range,\n        match: Text.isText,\n        voids: voids\n      })),\n          _step8;\n\n      try {\n        for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n          var _step8$value = _slicedToArray(_step8.value, 2),\n              node = _step8$value[0],\n              path = _step8$value[1];\n\n          var t = node.text;\n\n          if (Path.equals(path, end.path)) {\n            t = t.slice(0, end.offset);\n          }\n\n          if (Path.equals(path, start.path)) {\n            t = t.slice(start.offset);\n          }\n\n          text += t;\n        }\n      } catch (err) {\n        _iterator8.e(err);\n      } finally {\n        _iterator8.f();\n      }\n\n      return text;\n    },\n\n    /**\n     * Convert a range into a non-hanging one.\n     */\n    unhangRange: function unhangRange(editor, range) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$voids8 = options.voids,\n          voids = _options$voids8 === void 0 ? false : _options$voids8;\n\n      var _Range$edges7 = Range.edges(range),\n          _Range$edges8 = _slicedToArray(_Range$edges7, 2),\n          start = _Range$edges8[0],\n          end = _Range$edges8[1]; // PERF: exit early if we can guarantee that the range isn't hanging.\n\n\n      if (start.offset !== 0 || end.offset !== 0 || Range.isCollapsed(range)) {\n        return range;\n      }\n\n      var endBlock = Editor.above(editor, {\n        at: end,\n        match: function match(n) {\n          return Editor.isBlock(editor, n);\n        }\n      });\n      var blockPath = endBlock ? endBlock[1] : [];\n      var first = Editor.start(editor, []);\n      var before = {\n        anchor: first,\n        focus: end\n      };\n      var skip = true;\n\n      var _iterator9 = _createForOfIteratorHelper$5(Editor.nodes(editor, {\n        at: before,\n        match: Text.isText,\n        reverse: true,\n        voids: voids\n      })),\n          _step9;\n\n      try {\n        for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n          var _step9$value = _slicedToArray(_step9.value, 2),\n              node = _step9$value[0],\n              path = _step9$value[1];\n\n          if (skip) {\n            skip = false;\n            continue;\n          }\n\n          if (node.text !== '' || Path.isBefore(path, blockPath)) {\n            end = {\n              path: path,\n              offset: node.text.length\n            };\n            break;\n          }\n        }\n      } catch (err) {\n        _iterator9.e(err);\n      } finally {\n        _iterator9.f();\n      }\n\n      return {\n        anchor: start,\n        focus: end\n      };\n    },\n\n    /**\n     * Match a void node in the current branch of the editor.\n     */\n    \"void\": function _void(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      return Editor.above(editor, _objectSpread$8(_objectSpread$8({}, options), {}, {\n        match: function match(n) {\n          return Editor.isVoid(editor, n);\n        }\n      }));\n    },\n\n    /**\n     * Call a function, deferring normalization until after it completes.\n     */\n    withoutNormalizing: function withoutNormalizing(editor, fn) {\n      var value = Editor.isNormalizing(editor);\n      Editor.setNormalizing(editor, false);\n\n      try {\n        fn();\n      } finally {\n        Editor.setNormalizing(editor, value);\n      }\n\n      Editor.normalize(editor);\n    }\n  };\n\n  var Location = {\n    /**\n     * Check if a value implements the `Location` interface.\n     */\n    isLocation: function isLocation(value) {\n      return Path.isPath(value) || Point.isPoint(value) || Range.isRange(value);\n    }\n  };\n  var Span = {\n    /**\n     * Check if a value implements the `Span` interface.\n     */\n    isSpan: function isSpan(value) {\n      return Array.isArray(value) && value.length === 2 && value.every(Path.isPath);\n    }\n  };\n\n  var _excluded$3 = [\"children\"],\n      _excluded2$2 = [\"text\"];\n\n  function _createForOfIteratorHelper$4(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$4(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$4(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$4(o, minLen); }\n\n  function _arrayLikeToArray$4(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n  var IS_NODE_LIST_CACHE = new WeakMap();\n  var Node$1 = {\n    /**\n     * Get the node at a specific path, asserting that it's an ancestor node.\n     */\n    ancestor: function ancestor(root, path) {\n      var node = Node$1.get(root, path);\n\n      if (Text.isText(node)) {\n        throw new Error(\"Cannot get the ancestor node at path [\".concat(path, \"] because it refers to a text node instead: \").concat(node));\n      }\n\n      return node;\n    },\n\n    /**\n     * Return a generator of all the ancestor nodes above a specific path.\n     *\n     * By default the order is bottom-up, from lowest to highest ancestor in\n     * the tree, but you can pass the `reverse: true` option to go top-down.\n     */\n    ancestors: function* ancestors(root, path) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      var _iterator = _createForOfIteratorHelper$4(Path.ancestors(path, options)),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var p = _step.value;\n          var n = Node$1.ancestor(root, p);\n          var entry = [n, p];\n          yield entry;\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    },\n\n    /**\n     * Get the child of a node at a specific index.\n     */\n    child: function child(root, index) {\n      if (Text.isText(root)) {\n        throw new Error(\"Cannot get the child of a text node: \".concat(JSON.stringify(root)));\n      }\n\n      var c = root.children[index];\n\n      if (c == null) {\n        throw new Error(\"Cannot get child at index `\".concat(index, \"` in node: \").concat(JSON.stringify(root)));\n      }\n\n      return c;\n    },\n\n    /**\n     * Iterate over the children of a node at a specific path.\n     */\n    children: function* children(root, path) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$reverse = options.reverse,\n          reverse = _options$reverse === void 0 ? false : _options$reverse;\n      var ancestor = Node$1.ancestor(root, path);\n      var children = ancestor.children;\n      var index = reverse ? children.length - 1 : 0;\n\n      while (reverse ? index >= 0 : index < children.length) {\n        var child = Node$1.child(ancestor, index);\n        var childPath = path.concat(index);\n        yield [child, childPath];\n        index = reverse ? index - 1 : index + 1;\n      }\n    },\n\n    /**\n     * Get an entry for the common ancesetor node of two paths.\n     */\n    common: function common(root, path, another) {\n      var p = Path.common(path, another);\n      var n = Node$1.get(root, p);\n      return [n, p];\n    },\n\n    /**\n     * Get the node at a specific path, asserting that it's a descendant node.\n     */\n    descendant: function descendant(root, path) {\n      var node = Node$1.get(root, path);\n\n      if (Editor.isEditor(node)) {\n        throw new Error(\"Cannot get the descendant node at path [\".concat(path, \"] because it refers to the root editor node instead: \").concat(node));\n      }\n\n      return node;\n    },\n\n    /**\n     * Return a generator of all the descendant node entries inside a root node.\n     */\n    descendants: function* descendants(root) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var _iterator2 = _createForOfIteratorHelper$4(Node$1.nodes(root, options)),\n          _step2;\n\n      try {\n        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n          var _step2$value = _slicedToArray(_step2.value, 2),\n              node = _step2$value[0],\n              path = _step2$value[1];\n\n          if (path.length !== 0) {\n            // NOTE: we have to coerce here because checking the path's length does\n            // guarantee that `node` is not a `Editor`, but TypeScript doesn't know.\n            yield [node, path];\n          }\n        }\n      } catch (err) {\n        _iterator2.e(err);\n      } finally {\n        _iterator2.f();\n      }\n    },\n\n    /**\n     * Return a generator of all the element nodes inside a root node. Each iteration\n     * will return an `ElementEntry` tuple consisting of `[Element, Path]`. If the\n     * root node is an element it will be included in the iteration as well.\n     */\n    elements: function* elements(root) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var _iterator3 = _createForOfIteratorHelper$4(Node$1.nodes(root, options)),\n          _step3;\n\n      try {\n        for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n          var _step3$value = _slicedToArray(_step3.value, 2),\n              node = _step3$value[0],\n              path = _step3$value[1];\n\n          if (Element$1.isElement(node)) {\n            yield [node, path];\n          }\n        }\n      } catch (err) {\n        _iterator3.e(err);\n      } finally {\n        _iterator3.f();\n      }\n    },\n\n    /**\n     * Extract props from a Node.\n     */\n    extractProps: function extractProps(node) {\n      if (Element$1.isAncestor(node)) {\n        node.children;\n            var properties = _objectWithoutProperties(node, _excluded$3);\n\n        return properties;\n      } else {\n        node.text;\n            var _properties = _objectWithoutProperties(node, _excluded2$2);\n\n        return _properties;\n      }\n    },\n\n    /**\n     * Get the first node entry in a root node from a path.\n     */\n    first: function first(root, path) {\n      var p = path.slice();\n      var n = Node$1.get(root, p);\n\n      while (n) {\n        if (Text.isText(n) || n.children.length === 0) {\n          break;\n        } else {\n          n = n.children[0];\n          p.push(0);\n        }\n      }\n\n      return [n, p];\n    },\n\n    /**\n     * Get the sliced fragment represented by a range inside a root node.\n     */\n    fragment: function fragment(root, range) {\n      if (Text.isText(root)) {\n        throw new Error(\"Cannot get a fragment starting from a root text node: \".concat(JSON.stringify(root)));\n      }\n\n      var newRoot = immer.produce({\n        children: root.children\n      }, function (r) {\n        var _Range$edges = Range.edges(range),\n            _Range$edges2 = _slicedToArray(_Range$edges, 2),\n            start = _Range$edges2[0],\n            end = _Range$edges2[1];\n\n        var nodeEntries = Node$1.nodes(r, {\n          reverse: true,\n          pass: function pass(_ref) {\n            var _ref2 = _slicedToArray(_ref, 2),\n                path = _ref2[1];\n\n            return !Range.includes(range, path);\n          }\n        });\n\n        var _iterator4 = _createForOfIteratorHelper$4(nodeEntries),\n            _step4;\n\n        try {\n          for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n            var _step4$value = _slicedToArray(_step4.value, 2),\n                path = _step4$value[1];\n\n            if (!Range.includes(range, path)) {\n              var parent = Node$1.parent(r, path);\n              var index = path[path.length - 1];\n              parent.children.splice(index, 1);\n            }\n\n            if (Path.equals(path, end.path)) {\n              var leaf = Node$1.leaf(r, path);\n              leaf.text = leaf.text.slice(0, end.offset);\n            }\n\n            if (Path.equals(path, start.path)) {\n              var _leaf = Node$1.leaf(r, path);\n\n              _leaf.text = _leaf.text.slice(start.offset);\n            }\n          }\n        } catch (err) {\n          _iterator4.e(err);\n        } finally {\n          _iterator4.f();\n        }\n\n        if (Editor.isEditor(r)) {\n          r.selection = null;\n        }\n      });\n      return newRoot.children;\n    },\n\n    /**\n     * Get the descendant node referred to by a specific path. If the path is an\n     * empty array, it refers to the root node itself.\n     */\n    get: function get(root, path) {\n      var node = root;\n\n      for (var i = 0; i < path.length; i++) {\n        var p = path[i];\n\n        if (Text.isText(node) || !node.children[p]) {\n          throw new Error(\"Cannot find a descendant at path [\".concat(path, \"] in node: \").concat(JSON.stringify(root)));\n        }\n\n        node = node.children[p];\n      }\n\n      return node;\n    },\n\n    /**\n     * Check if a descendant node exists at a specific path.\n     */\n    has: function has(root, path) {\n      var node = root;\n\n      for (var i = 0; i < path.length; i++) {\n        var p = path[i];\n\n        if (Text.isText(node) || !node.children[p]) {\n          return false;\n        }\n\n        node = node.children[p];\n      }\n\n      return true;\n    },\n\n    /**\n     * Check if a value implements the `Node` interface.\n     */\n    isNode: function isNode(value) {\n      return Text.isText(value) || Element$1.isElement(value) || Editor.isEditor(value);\n    },\n\n    /**\n     * Check if a value is a list of `Node` objects.\n     */\n    isNodeList: function isNodeList(value) {\n      if (!Array.isArray(value)) {\n        return false;\n      }\n\n      var cachedResult = IS_NODE_LIST_CACHE.get(value);\n\n      if (cachedResult !== undefined) {\n        return cachedResult;\n      }\n\n      var isNodeList = value.every(function (val) {\n        return Node$1.isNode(val);\n      });\n      IS_NODE_LIST_CACHE.set(value, isNodeList);\n      return isNodeList;\n    },\n\n    /**\n     * Get the last node entry in a root node from a path.\n     */\n    last: function last(root, path) {\n      var p = path.slice();\n      var n = Node$1.get(root, p);\n\n      while (n) {\n        if (Text.isText(n) || n.children.length === 0) {\n          break;\n        } else {\n          var i = n.children.length - 1;\n          n = n.children[i];\n          p.push(i);\n        }\n      }\n\n      return [n, p];\n    },\n\n    /**\n     * Get the node at a specific path, ensuring it's a leaf text node.\n     */\n    leaf: function leaf(root, path) {\n      var node = Node$1.get(root, path);\n\n      if (!Text.isText(node)) {\n        throw new Error(\"Cannot get the leaf node at path [\".concat(path, \"] because it refers to a non-leaf node: \").concat(node));\n      }\n\n      return node;\n    },\n\n    /**\n     * Return a generator of the in a branch of the tree, from a specific path.\n     *\n     * By default the order is top-down, from lowest to highest node in the tree,\n     * but you can pass the `reverse: true` option to go bottom-up.\n     */\n    levels: function* levels(root, path) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      var _iterator5 = _createForOfIteratorHelper$4(Path.levels(path, options)),\n          _step5;\n\n      try {\n        for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n          var p = _step5.value;\n          var n = Node$1.get(root, p);\n          yield [n, p];\n        }\n      } catch (err) {\n        _iterator5.e(err);\n      } finally {\n        _iterator5.f();\n      }\n    },\n\n    /**\n     * Check if a node matches a set of props.\n     */\n    matches: function matches(node, props) {\n      return Element$1.isElement(node) && Element$1.isElementProps(props) && Element$1.matches(node, props) || Text.isText(node) && Text.isTextProps(props) && Text.matches(node, props);\n    },\n\n    /**\n     * Return a generator of all the node entries of a root node. Each entry is\n     * returned as a `[Node, Path]` tuple, with the path referring to the node's\n     * position inside the root node.\n     */\n    nodes: function* nodes(root) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var pass = options.pass,\n          _options$reverse2 = options.reverse,\n          reverse = _options$reverse2 === void 0 ? false : _options$reverse2;\n      var _options$from = options.from,\n          from = _options$from === void 0 ? [] : _options$from,\n          to = options.to;\n      var visited = new Set();\n      var p = [];\n      var n = root;\n\n      while (true) {\n        if (to && (reverse ? Path.isBefore(p, to) : Path.isAfter(p, to))) {\n          break;\n        }\n\n        if (!visited.has(n)) {\n          yield [n, p];\n        } // If we're allowed to go downward and we haven't descended yet, do.\n\n\n        if (!visited.has(n) && !Text.isText(n) && n.children.length !== 0 && (pass == null || pass([n, p]) === false)) {\n          visited.add(n);\n          var nextIndex = reverse ? n.children.length - 1 : 0;\n\n          if (Path.isAncestor(p, from)) {\n            nextIndex = from[p.length];\n          }\n\n          p = p.concat(nextIndex);\n          n = Node$1.get(root, p);\n          continue;\n        } // If we're at the root and we can't go down, we're done.\n\n\n        if (p.length === 0) {\n          break;\n        } // If we're going forward...\n\n\n        if (!reverse) {\n          var newPath = Path.next(p);\n\n          if (Node$1.has(root, newPath)) {\n            p = newPath;\n            n = Node$1.get(root, p);\n            continue;\n          }\n        } // If we're going backward...\n\n\n        if (reverse && p[p.length - 1] !== 0) {\n          var _newPath = Path.previous(p);\n\n          p = _newPath;\n          n = Node$1.get(root, p);\n          continue;\n        } // Otherwise we're going upward...\n\n\n        p = Path.parent(p);\n        n = Node$1.get(root, p);\n        visited.add(n);\n      }\n    },\n\n    /**\n     * Get the parent of a node at a specific path.\n     */\n    parent: function parent(root, path) {\n      var parentPath = Path.parent(path);\n      var p = Node$1.get(root, parentPath);\n\n      if (Text.isText(p)) {\n        throw new Error(\"Cannot get the parent of path [\".concat(path, \"] because it does not exist in the root.\"));\n      }\n\n      return p;\n    },\n\n    /**\n     * Get the concatenated text string of a node's content.\n     *\n     * Note that this will not include spaces or line breaks between block nodes.\n     * It is not a user-facing string, but a string for performing offset-related\n     * computations for a node.\n     */\n    string: function string(node) {\n      if (Text.isText(node)) {\n        return node.text;\n      } else {\n        return node.children.map(Node$1.string).join('');\n      }\n    },\n\n    /**\n     * Return a generator of all leaf text nodes in a root node.\n     */\n    texts: function* texts(root) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var _iterator6 = _createForOfIteratorHelper$4(Node$1.nodes(root, options)),\n          _step6;\n\n      try {\n        for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n          var _step6$value = _slicedToArray(_step6.value, 2),\n              node = _step6$value[0],\n              path = _step6$value[1];\n\n          if (Text.isText(node)) {\n            yield [node, path];\n          }\n        }\n      } catch (err) {\n        _iterator6.e(err);\n      } finally {\n        _iterator6.f();\n      }\n    }\n  };\n\n  function ownKeys$7(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$7(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$7(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n  var Operation = {\n    /**\n     * Check of a value is a `NodeOperation` object.\n     */\n    isNodeOperation: function isNodeOperation(value) {\n      return Operation.isOperation(value) && value.type.endsWith('_node');\n    },\n\n    /**\n     * Check of a value is an `Operation` object.\n     */\n    isOperation: function isOperation(value) {\n      if (!isPlainObject.isPlainObject(value)) {\n        return false;\n      }\n\n      switch (value.type) {\n        case 'insert_node':\n          return Path.isPath(value.path) && Node$1.isNode(value.node);\n\n        case 'insert_text':\n          return typeof value.offset === 'number' && typeof value.text === 'string' && Path.isPath(value.path);\n\n        case 'merge_node':\n          return typeof value.position === 'number' && Path.isPath(value.path) && isPlainObject.isPlainObject(value.properties);\n\n        case 'move_node':\n          return Path.isPath(value.path) && Path.isPath(value.newPath);\n\n        case 'remove_node':\n          return Path.isPath(value.path) && Node$1.isNode(value.node);\n\n        case 'remove_text':\n          return typeof value.offset === 'number' && typeof value.text === 'string' && Path.isPath(value.path);\n\n        case 'set_node':\n          return Path.isPath(value.path) && isPlainObject.isPlainObject(value.properties) && isPlainObject.isPlainObject(value.newProperties);\n\n        case 'set_selection':\n          return value.properties === null && Range.isRange(value.newProperties) || value.newProperties === null && Range.isRange(value.properties) || isPlainObject.isPlainObject(value.properties) && isPlainObject.isPlainObject(value.newProperties);\n\n        case 'split_node':\n          return Path.isPath(value.path) && typeof value.position === 'number' && isPlainObject.isPlainObject(value.properties);\n\n        default:\n          return false;\n      }\n    },\n\n    /**\n     * Check if a value is a list of `Operation` objects.\n     */\n    isOperationList: function isOperationList(value) {\n      return Array.isArray(value) && value.every(function (val) {\n        return Operation.isOperation(val);\n      });\n    },\n\n    /**\n     * Check of a value is a `SelectionOperation` object.\n     */\n    isSelectionOperation: function isSelectionOperation(value) {\n      return Operation.isOperation(value) && value.type.endsWith('_selection');\n    },\n\n    /**\n     * Check of a value is a `TextOperation` object.\n     */\n    isTextOperation: function isTextOperation(value) {\n      return Operation.isOperation(value) && value.type.endsWith('_text');\n    },\n\n    /**\n     * Invert an operation, returning a new operation that will exactly undo the\n     * original when applied.\n     */\n    inverse: function inverse(op) {\n      switch (op.type) {\n        case 'insert_node':\n          {\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              type: 'remove_node'\n            });\n          }\n\n        case 'insert_text':\n          {\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              type: 'remove_text'\n            });\n          }\n\n        case 'merge_node':\n          {\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              type: 'split_node',\n              path: Path.previous(op.path)\n            });\n          }\n\n        case 'move_node':\n          {\n            var newPath = op.newPath,\n                path = op.path; // PERF: in this case the move operation is a no-op anyways.\n\n            if (Path.equals(newPath, path)) {\n              return op;\n            } // If the move happens completely within a single parent the path and\n            // newPath are stable with respect to each other.\n\n\n            if (Path.isSibling(path, newPath)) {\n              return _objectSpread$7(_objectSpread$7({}, op), {}, {\n                path: newPath,\n                newPath: path\n              });\n            } // If the move does not happen within a single parent it is possible\n            // for the move to impact the true path to the location where the node\n            // was removed from and where it was inserted. We have to adjust for this\n            // and find the original path. We can accomplish this (only in non-sibling)\n            // moves by looking at the impact of the move operation on the node\n            // after the original move path.\n\n\n            var inversePath = Path.transform(path, op);\n            var inverseNewPath = Path.transform(Path.next(path), op);\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              path: inversePath,\n              newPath: inverseNewPath\n            });\n          }\n\n        case 'remove_node':\n          {\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              type: 'insert_node'\n            });\n          }\n\n        case 'remove_text':\n          {\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              type: 'insert_text'\n            });\n          }\n\n        case 'set_node':\n          {\n            var properties = op.properties,\n                newProperties = op.newProperties;\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              properties: newProperties,\n              newProperties: properties\n            });\n          }\n\n        case 'set_selection':\n          {\n            var _properties = op.properties,\n                _newProperties = op.newProperties;\n\n            if (_properties == null) {\n              return _objectSpread$7(_objectSpread$7({}, op), {}, {\n                properties: _newProperties,\n                newProperties: null\n              });\n            } else if (_newProperties == null) {\n              return _objectSpread$7(_objectSpread$7({}, op), {}, {\n                properties: null,\n                newProperties: _properties\n              });\n            } else {\n              return _objectSpread$7(_objectSpread$7({}, op), {}, {\n                properties: _newProperties,\n                newProperties: _properties\n              });\n            }\n          }\n\n        case 'split_node':\n          {\n            return _objectSpread$7(_objectSpread$7({}, op), {}, {\n              type: 'merge_node',\n              path: Path.next(op.path)\n            });\n          }\n      }\n    }\n  };\n\n  var Path = {\n    /**\n     * Get a list of ancestor paths for a given path.\n     *\n     * The paths are sorted from deepest to shallowest ancestor. However, if the\n     * `reverse: true` option is passed, they are reversed.\n     */\n    ancestors: function ancestors(path) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$reverse = options.reverse,\n          reverse = _options$reverse === void 0 ? false : _options$reverse;\n      var paths = Path.levels(path, options);\n\n      if (reverse) {\n        paths = paths.slice(1);\n      } else {\n        paths = paths.slice(0, -1);\n      }\n\n      return paths;\n    },\n\n    /**\n     * Get the common ancestor path of two paths.\n     */\n    common: function common(path, another) {\n      var common = [];\n\n      for (var i = 0; i < path.length && i < another.length; i++) {\n        var av = path[i];\n        var bv = another[i];\n\n        if (av !== bv) {\n          break;\n        }\n\n        common.push(av);\n      }\n\n      return common;\n    },\n\n    /**\n     * Compare a path to another, returning an integer indicating whether the path\n     * was before, at, or after the other.\n     *\n     * Note: Two paths of unequal length can still receive a `0` result if one is\n     * directly above or below the other. If you want exact matching, use\n     * [[Path.equals]] instead.\n     */\n    compare: function compare(path, another) {\n      var min = Math.min(path.length, another.length);\n\n      for (var i = 0; i < min; i++) {\n        if (path[i] < another[i]) return -1;\n        if (path[i] > another[i]) return 1;\n      }\n\n      return 0;\n    },\n\n    /**\n     * Check if a path ends after one of the indexes in another.\n     */\n    endsAfter: function endsAfter(path, another) {\n      var i = path.length - 1;\n      var as = path.slice(0, i);\n      var bs = another.slice(0, i);\n      var av = path[i];\n      var bv = another[i];\n      return Path.equals(as, bs) && av > bv;\n    },\n\n    /**\n     * Check if a path ends at one of the indexes in another.\n     */\n    endsAt: function endsAt(path, another) {\n      var i = path.length;\n      var as = path.slice(0, i);\n      var bs = another.slice(0, i);\n      return Path.equals(as, bs);\n    },\n\n    /**\n     * Check if a path ends before one of the indexes in another.\n     */\n    endsBefore: function endsBefore(path, another) {\n      var i = path.length - 1;\n      var as = path.slice(0, i);\n      var bs = another.slice(0, i);\n      var av = path[i];\n      var bv = another[i];\n      return Path.equals(as, bs) && av < bv;\n    },\n\n    /**\n     * Check if a path is exactly equal to another.\n     */\n    equals: function equals(path, another) {\n      return path.length === another.length && path.every(function (n, i) {\n        return n === another[i];\n      });\n    },\n\n    /**\n     * Check if the path of previous sibling node exists\n     */\n    hasPrevious: function hasPrevious(path) {\n      return path[path.length - 1] > 0;\n    },\n\n    /**\n     * Check if a path is after another.\n     */\n    isAfter: function isAfter(path, another) {\n      return Path.compare(path, another) === 1;\n    },\n\n    /**\n     * Check if a path is an ancestor of another.\n     */\n    isAncestor: function isAncestor(path, another) {\n      return path.length < another.length && Path.compare(path, another) === 0;\n    },\n\n    /**\n     * Check if a path is before another.\n     */\n    isBefore: function isBefore(path, another) {\n      return Path.compare(path, another) === -1;\n    },\n\n    /**\n     * Check if a path is a child of another.\n     */\n    isChild: function isChild(path, another) {\n      return path.length === another.length + 1 && Path.compare(path, another) === 0;\n    },\n\n    /**\n     * Check if a path is equal to or an ancestor of another.\n     */\n    isCommon: function isCommon(path, another) {\n      return path.length <= another.length && Path.compare(path, another) === 0;\n    },\n\n    /**\n     * Check if a path is a descendant of another.\n     */\n    isDescendant: function isDescendant(path, another) {\n      return path.length > another.length && Path.compare(path, another) === 0;\n    },\n\n    /**\n     * Check if a path is the parent of another.\n     */\n    isParent: function isParent(path, another) {\n      return path.length + 1 === another.length && Path.compare(path, another) === 0;\n    },\n\n    /**\n     * Check is a value implements the `Path` interface.\n     */\n    isPath: function isPath(value) {\n      return Array.isArray(value) && (value.length === 0 || typeof value[0] === 'number');\n    },\n\n    /**\n     * Check if a path is a sibling of another.\n     */\n    isSibling: function isSibling(path, another) {\n      if (path.length !== another.length) {\n        return false;\n      }\n\n      var as = path.slice(0, -1);\n      var bs = another.slice(0, -1);\n      var al = path[path.length - 1];\n      var bl = another[another.length - 1];\n      return al !== bl && Path.equals(as, bs);\n    },\n\n    /**\n     * Get a list of paths at every level down to a path. Note: this is the same\n     * as `Path.ancestors`, but including the path itself.\n     *\n     * The paths are sorted from shallowest to deepest. However, if the `reverse:\n     * true` option is passed, they are reversed.\n     */\n    levels: function levels(path) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$reverse2 = options.reverse,\n          reverse = _options$reverse2 === void 0 ? false : _options$reverse2;\n      var list = [];\n\n      for (var i = 0; i <= path.length; i++) {\n        list.push(path.slice(0, i));\n      }\n\n      if (reverse) {\n        list.reverse();\n      }\n\n      return list;\n    },\n\n    /**\n     * Given a path, get the path to the next sibling node.\n     */\n    next: function next(path) {\n      if (path.length === 0) {\n        throw new Error(\"Cannot get the next path of a root path [\".concat(path, \"], because it has no next index.\"));\n      }\n\n      var last = path[path.length - 1];\n      return path.slice(0, -1).concat(last + 1);\n    },\n\n    /**\n     * Given a path, return a new path referring to the parent node above it.\n     */\n    parent: function parent(path) {\n      if (path.length === 0) {\n        throw new Error(\"Cannot get the parent path of the root path [\".concat(path, \"].\"));\n      }\n\n      return path.slice(0, -1);\n    },\n\n    /**\n     * Given a path, get the path to the previous sibling node.\n     */\n    previous: function previous(path) {\n      if (path.length === 0) {\n        throw new Error(\"Cannot get the previous path of a root path [\".concat(path, \"], because it has no previous index.\"));\n      }\n\n      var last = path[path.length - 1];\n\n      if (last <= 0) {\n        throw new Error(\"Cannot get the previous path of a first child path [\".concat(path, \"] because it would result in a negative index.\"));\n      }\n\n      return path.slice(0, -1).concat(last - 1);\n    },\n\n    /**\n     * Get a path relative to an ancestor.\n     */\n    relative: function relative(path, ancestor) {\n      if (!Path.isAncestor(ancestor, path) && !Path.equals(path, ancestor)) {\n        throw new Error(\"Cannot get the relative path of [\".concat(path, \"] inside ancestor [\").concat(ancestor, \"], because it is not above or equal to the path.\"));\n      }\n\n      return path.slice(ancestor.length);\n    },\n\n    /**\n     * Transform a path by an operation.\n     */\n    transform: function transform(path, operation) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return immer.produce(path, function (p) {\n        var _options$affinity = options.affinity,\n            affinity = _options$affinity === void 0 ? 'forward' : _options$affinity; // PERF: Exit early if the operation is guaranteed not to have an effect.\n\n        if (!path || (path === null || path === void 0 ? void 0 : path.length) === 0) {\n          return;\n        }\n\n        if (p === null) {\n          return null;\n        }\n\n        switch (operation.type) {\n          case 'insert_node':\n            {\n              var op = operation.path;\n\n              if (Path.equals(op, p) || Path.endsBefore(op, p) || Path.isAncestor(op, p)) {\n                p[op.length - 1] += 1;\n              }\n\n              break;\n            }\n\n          case 'remove_node':\n            {\n              var _op = operation.path;\n\n              if (Path.equals(_op, p) || Path.isAncestor(_op, p)) {\n                return null;\n              } else if (Path.endsBefore(_op, p)) {\n                p[_op.length - 1] -= 1;\n              }\n\n              break;\n            }\n\n          case 'merge_node':\n            {\n              var _op2 = operation.path,\n                  position = operation.position;\n\n              if (Path.equals(_op2, p) || Path.endsBefore(_op2, p)) {\n                p[_op2.length - 1] -= 1;\n              } else if (Path.isAncestor(_op2, p)) {\n                p[_op2.length - 1] -= 1;\n                p[_op2.length] += position;\n              }\n\n              break;\n            }\n\n          case 'split_node':\n            {\n              var _op3 = operation.path,\n                  _position = operation.position;\n\n              if (Path.equals(_op3, p)) {\n                if (affinity === 'forward') {\n                  p[p.length - 1] += 1;\n                } else if (affinity === 'backward') ; else {\n                  return null;\n                }\n              } else if (Path.endsBefore(_op3, p)) {\n                p[_op3.length - 1] += 1;\n              } else if (Path.isAncestor(_op3, p) && path[_op3.length] >= _position) {\n                p[_op3.length - 1] += 1;\n                p[_op3.length] -= _position;\n              }\n\n              break;\n            }\n\n          case 'move_node':\n            {\n              var _op4 = operation.path,\n                  onp = operation.newPath; // If the old and new path are the same, it's a no-op.\n\n              if (Path.equals(_op4, onp)) {\n                return;\n              }\n\n              if (Path.isAncestor(_op4, p) || Path.equals(_op4, p)) {\n                var copy = onp.slice();\n\n                if (Path.endsBefore(_op4, onp) && _op4.length < onp.length) {\n                  copy[_op4.length - 1] -= 1;\n                }\n\n                return copy.concat(p.slice(_op4.length));\n              } else if (Path.isSibling(_op4, onp) && (Path.isAncestor(onp, p) || Path.equals(onp, p))) {\n                if (Path.endsBefore(_op4, p)) {\n                  p[_op4.length - 1] -= 1;\n                } else {\n                  p[_op4.length - 1] += 1;\n                }\n              } else if (Path.endsBefore(onp, p) || Path.equals(onp, p) || Path.isAncestor(onp, p)) {\n                if (Path.endsBefore(_op4, p)) {\n                  p[_op4.length - 1] -= 1;\n                }\n\n                p[onp.length - 1] += 1;\n              } else if (Path.endsBefore(_op4, p)) {\n                if (Path.equals(onp, p)) {\n                  p[onp.length - 1] += 1;\n                }\n\n                p[_op4.length - 1] -= 1;\n              }\n\n              break;\n            }\n        }\n      });\n    }\n  };\n\n  var PathRef = {\n    /**\n     * Transform the path ref's current value by an operation.\n     */\n    transform: function transform(ref, op) {\n      var current = ref.current,\n          affinity = ref.affinity;\n\n      if (current == null) {\n        return;\n      }\n\n      var path = Path.transform(current, op, {\n        affinity: affinity\n      });\n      ref.current = path;\n\n      if (path == null) {\n        ref.unref();\n      }\n    }\n  };\n\n  function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n  var Point = {\n    /**\n     * Compare a point to another, returning an integer indicating whether the\n     * point was before, at, or after the other.\n     */\n    compare: function compare(point, another) {\n      var result = Path.compare(point.path, another.path);\n\n      if (result === 0) {\n        if (point.offset < another.offset) return -1;\n        if (point.offset > another.offset) return 1;\n        return 0;\n      }\n\n      return result;\n    },\n\n    /**\n     * Check if a point is after another.\n     */\n    isAfter: function isAfter(point, another) {\n      return Point.compare(point, another) === 1;\n    },\n\n    /**\n     * Check if a point is before another.\n     */\n    isBefore: function isBefore(point, another) {\n      return Point.compare(point, another) === -1;\n    },\n\n    /**\n     * Check if a point is exactly equal to another.\n     */\n    equals: function equals(point, another) {\n      // PERF: ensure the offsets are equal first since they are cheaper to check.\n      return point.offset === another.offset && Path.equals(point.path, another.path);\n    },\n\n    /**\n     * Check if a value implements the `Point` interface.\n     */\n    isPoint: function isPoint(value) {\n      return isPlainObject.isPlainObject(value) && typeof value.offset === 'number' && Path.isPath(value.path);\n    },\n\n    /**\n     * Transform a point by an operation.\n     */\n    transform: function transform(point, op) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return immer.produce(point, function (p) {\n        if (p === null) {\n          return null;\n        }\n\n        var _options$affinity = options.affinity,\n            affinity = _options$affinity === void 0 ? 'forward' : _options$affinity;\n        var path = p.path,\n            offset = p.offset;\n\n        switch (op.type) {\n          case 'insert_node':\n          case 'move_node':\n            {\n              p.path = Path.transform(path, op, options);\n              break;\n            }\n\n          case 'insert_text':\n            {\n              if (Path.equals(op.path, path) && op.offset <= offset) {\n                p.offset += op.text.length;\n              }\n\n              break;\n            }\n\n          case 'merge_node':\n            {\n              if (Path.equals(op.path, path)) {\n                p.offset += op.position;\n              }\n\n              p.path = Path.transform(path, op, options);\n              break;\n            }\n\n          case 'remove_text':\n            {\n              if (Path.equals(op.path, path) && op.offset <= offset) {\n                p.offset -= Math.min(offset - op.offset, op.text.length);\n              }\n\n              break;\n            }\n\n          case 'remove_node':\n            {\n              if (Path.equals(op.path, path) || Path.isAncestor(op.path, path)) {\n                return null;\n              }\n\n              p.path = Path.transform(path, op, options);\n              break;\n            }\n\n          case 'split_node':\n            {\n              if (Path.equals(op.path, path)) {\n                if (op.position === offset && affinity == null) {\n                  return null;\n                } else if (op.position < offset || op.position === offset && affinity === 'forward') {\n                  p.offset -= op.position;\n                  p.path = Path.transform(path, op, _objectSpread$6(_objectSpread$6({}, options), {}, {\n                    affinity: 'forward'\n                  }));\n                }\n              } else {\n                p.path = Path.transform(path, op, options);\n              }\n\n              break;\n            }\n        }\n      });\n    }\n  };\n\n  var PointRef = {\n    /**\n     * Transform the point ref's current value by an operation.\n     */\n    transform: function transform(ref, op) {\n      var current = ref.current,\n          affinity = ref.affinity;\n\n      if (current == null) {\n        return;\n      }\n\n      var point = Point.transform(current, op, {\n        affinity: affinity\n      });\n      ref.current = point;\n\n      if (point == null) {\n        ref.unref();\n      }\n    }\n  };\n\n  var _excluded$2 = [\"anchor\", \"focus\"];\n\n  function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n  var Range = {\n    /**\n     * Get the start and end points of a range, in the order in which they appear\n     * in the document.\n     */\n    edges: function edges(range) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$reverse = options.reverse,\n          reverse = _options$reverse === void 0 ? false : _options$reverse;\n      var anchor = range.anchor,\n          focus = range.focus;\n      return Range.isBackward(range) === reverse ? [anchor, focus] : [focus, anchor];\n    },\n\n    /**\n     * Get the end point of a range.\n     */\n    end: function end(range) {\n      var _Range$edges = Range.edges(range),\n          _Range$edges2 = _slicedToArray(_Range$edges, 2),\n          end = _Range$edges2[1];\n\n      return end;\n    },\n\n    /**\n     * Check if a range is exactly equal to another.\n     */\n    equals: function equals(range, another) {\n      return Point.equals(range.anchor, another.anchor) && Point.equals(range.focus, another.focus);\n    },\n\n    /**\n     * Check if a range includes a path, a point or part of another range.\n     */\n    includes: function includes(range, target) {\n      if (Range.isRange(target)) {\n        if (Range.includes(range, target.anchor) || Range.includes(range, target.focus)) {\n          return true;\n        }\n\n        var _Range$edges3 = Range.edges(range),\n            _Range$edges4 = _slicedToArray(_Range$edges3, 2),\n            rs = _Range$edges4[0],\n            re = _Range$edges4[1];\n\n        var _Range$edges5 = Range.edges(target),\n            _Range$edges6 = _slicedToArray(_Range$edges5, 2),\n            ts = _Range$edges6[0],\n            te = _Range$edges6[1];\n\n        return Point.isBefore(rs, ts) && Point.isAfter(re, te);\n      }\n\n      var _Range$edges7 = Range.edges(range),\n          _Range$edges8 = _slicedToArray(_Range$edges7, 2),\n          start = _Range$edges8[0],\n          end = _Range$edges8[1];\n\n      var isAfterStart = false;\n      var isBeforeEnd = false;\n\n      if (Point.isPoint(target)) {\n        isAfterStart = Point.compare(target, start) >= 0;\n        isBeforeEnd = Point.compare(target, end) <= 0;\n      } else {\n        isAfterStart = Path.compare(target, start.path) >= 0;\n        isBeforeEnd = Path.compare(target, end.path) <= 0;\n      }\n\n      return isAfterStart && isBeforeEnd;\n    },\n\n    /**\n     * Get the intersection of a range with another.\n     */\n    intersection: function intersection(range, another) {\n      range.anchor;\n          range.focus;\n          var rest = _objectWithoutProperties(range, _excluded$2);\n\n      var _Range$edges9 = Range.edges(range),\n          _Range$edges10 = _slicedToArray(_Range$edges9, 2),\n          s1 = _Range$edges10[0],\n          e1 = _Range$edges10[1];\n\n      var _Range$edges11 = Range.edges(another),\n          _Range$edges12 = _slicedToArray(_Range$edges11, 2),\n          s2 = _Range$edges12[0],\n          e2 = _Range$edges12[1];\n\n      var start = Point.isBefore(s1, s2) ? s2 : s1;\n      var end = Point.isBefore(e1, e2) ? e1 : e2;\n\n      if (Point.isBefore(end, start)) {\n        return null;\n      } else {\n        return _objectSpread$5({\n          anchor: start,\n          focus: end\n        }, rest);\n      }\n    },\n\n    /**\n     * Check if a range is backward, meaning that its anchor point appears in the\n     * document _after_ its focus point.\n     */\n    isBackward: function isBackward(range) {\n      var anchor = range.anchor,\n          focus = range.focus;\n      return Point.isAfter(anchor, focus);\n    },\n\n    /**\n     * Check if a range is collapsed, meaning that both its anchor and focus\n     * points refer to the exact same position in the document.\n     */\n    isCollapsed: function isCollapsed(range) {\n      var anchor = range.anchor,\n          focus = range.focus;\n      return Point.equals(anchor, focus);\n    },\n\n    /**\n     * Check if a range is expanded.\n     *\n     * This is the opposite of [[Range.isCollapsed]] and is provided for legibility.\n     */\n    isExpanded: function isExpanded(range) {\n      return !Range.isCollapsed(range);\n    },\n\n    /**\n     * Check if a range is forward.\n     *\n     * This is the opposite of [[Range.isBackward]] and is provided for legibility.\n     */\n    isForward: function isForward(range) {\n      return !Range.isBackward(range);\n    },\n\n    /**\n     * Check if a value implements the [[Range]] interface.\n     */\n    isRange: function isRange(value) {\n      return isPlainObject.isPlainObject(value) && Point.isPoint(value.anchor) && Point.isPoint(value.focus);\n    },\n\n    /**\n     * Iterate through all of the point entries in a range.\n     */\n    points: function* points(range) {\n      yield [range.anchor, 'anchor'];\n      yield [range.focus, 'focus'];\n    },\n\n    /**\n     * Get the start point of a range.\n     */\n    start: function start(range) {\n      var _Range$edges13 = Range.edges(range),\n          _Range$edges14 = _slicedToArray(_Range$edges13, 1),\n          start = _Range$edges14[0];\n\n      return start;\n    },\n\n    /**\n     * Transform a range by an operation.\n     */\n    transform: function transform(range, op) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return immer.produce(range, function (r) {\n        if (r === null) {\n          return null;\n        }\n\n        var _options$affinity = options.affinity,\n            affinity = _options$affinity === void 0 ? 'inward' : _options$affinity;\n        var affinityAnchor;\n        var affinityFocus;\n\n        if (affinity === 'inward') {\n          // If the range is collapsed, make sure to use the same affinity to\n          // avoid the two points passing each other and expanding in the opposite\n          // direction\n          var isCollapsed = Range.isCollapsed(r);\n\n          if (Range.isForward(r)) {\n            affinityAnchor = 'forward';\n            affinityFocus = isCollapsed ? affinityAnchor : 'backward';\n          } else {\n            affinityAnchor = 'backward';\n            affinityFocus = isCollapsed ? affinityAnchor : 'forward';\n          }\n        } else if (affinity === 'outward') {\n          if (Range.isForward(r)) {\n            affinityAnchor = 'backward';\n            affinityFocus = 'forward';\n          } else {\n            affinityAnchor = 'forward';\n            affinityFocus = 'backward';\n          }\n        } else {\n          affinityAnchor = affinity;\n          affinityFocus = affinity;\n        }\n\n        var anchor = Point.transform(r.anchor, op, {\n          affinity: affinityAnchor\n        });\n        var focus = Point.transform(r.focus, op, {\n          affinity: affinityFocus\n        });\n\n        if (!anchor || !focus) {\n          return null;\n        }\n\n        r.anchor = anchor;\n        r.focus = focus;\n      });\n    }\n  };\n\n  var RangeRef = {\n    /**\n     * Transform the range ref's current value by an operation.\n     */\n    transform: function transform(ref, op) {\n      var current = ref.current,\n          affinity = ref.affinity;\n\n      if (current == null) {\n        return;\n      }\n\n      var path = Range.transform(current, op, {\n        affinity: affinity\n      });\n      ref.current = path;\n\n      if (path == null) {\n        ref.unref();\n      }\n    }\n  };\n\n  /*\n    Custom deep equal comparison for Slate nodes.\n\n    We don't need general purpose deep equality;\n    Slate only supports plain values, Arrays, and nested objects.\n    Complex values nested inside Arrays are not supported.\n\n    Slate objects are designed to be serialised, so\n    missing keys are deliberately normalised to undefined.\n   */\n\n  var isDeepEqual = function isDeepEqual(node, another) {\n    for (var key in node) {\n      var a = node[key];\n      var b = another[key];\n\n      if (isPlainObject.isPlainObject(a) && isPlainObject.isPlainObject(b)) {\n        if (!isDeepEqual(a, b)) return false;\n      } else if (Array.isArray(a) && Array.isArray(b)) {\n        if (a.length !== b.length) return false;\n\n        for (var i = 0; i < a.length; i++) {\n          if (a[i] !== b[i]) return false;\n        }\n      } else if (a !== b) {\n        return false;\n      }\n    }\n    /*\n      Deep object equality is only necessary in one direction; in the reverse direction\n      we are only looking for keys that are missing.\n      As above, undefined keys are normalised to missing.\n    */\n\n\n    for (var _key in another) {\n      if (node[_key] === undefined && another[_key] !== undefined) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n\n  var _excluded$1 = [\"text\"],\n      _excluded2$1 = [\"anchor\", \"focus\"];\n\n  function _createForOfIteratorHelper$3(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$3(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$3(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$3(o, minLen); }\n\n  function _arrayLikeToArray$3(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n  function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n  var Text = {\n    /**\n     * Check if two text nodes are equal.\n     *\n     * When loose is set, the text is not compared. This is\n     * used to check whether sibling text nodes can be merged.\n     */\n    equals: function equals(text, another) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var _options$loose = options.loose,\n          loose = _options$loose === void 0 ? false : _options$loose;\n\n      function omitText(obj) {\n        obj.text;\n            var rest = _objectWithoutProperties(obj, _excluded$1);\n\n        return rest;\n      }\n\n      return isDeepEqual(loose ? omitText(text) : text, loose ? omitText(another) : another);\n    },\n\n    /**\n     * Check if a value implements the `Text` interface.\n     */\n    isText: function isText(value) {\n      return isPlainObject.isPlainObject(value) && typeof value.text === 'string';\n    },\n\n    /**\n     * Check if a value is a list of `Text` objects.\n     */\n    isTextList: function isTextList(value) {\n      return Array.isArray(value) && value.every(function (val) {\n        return Text.isText(val);\n      });\n    },\n\n    /**\n     * Check if some props are a partial of Text.\n     */\n    isTextProps: function isTextProps(props) {\n      return props.text !== undefined;\n    },\n\n    /**\n     * Check if an text matches set of properties.\n     *\n     * Note: this is for matching custom properties, and it does not ensure that\n     * the `text` property are two nodes equal.\n     */\n    matches: function matches(text, props) {\n      for (var key in props) {\n        if (key === 'text') {\n          continue;\n        }\n\n        if (!text.hasOwnProperty(key) || text[key] !== props[key]) {\n          return false;\n        }\n      }\n\n      return true;\n    },\n\n    /**\n     * Get the leaves for a text node given decorations.\n     */\n    decorations: function decorations(node, _decorations) {\n      var leaves = [_objectSpread$4({}, node)];\n\n      var _iterator = _createForOfIteratorHelper$3(_decorations),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var dec = _step.value;\n\n          var anchor = dec.anchor,\n              focus = dec.focus,\n              rest = _objectWithoutProperties(dec, _excluded2$1);\n\n          var _Range$edges = Range.edges(dec),\n              _Range$edges2 = _slicedToArray(_Range$edges, 2),\n              start = _Range$edges2[0],\n              end = _Range$edges2[1];\n\n          var next = [];\n          var o = 0;\n\n          var _iterator2 = _createForOfIteratorHelper$3(leaves),\n              _step2;\n\n          try {\n            for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n              var leaf = _step2.value;\n              var length = leaf.text.length;\n              var offset = o;\n              o += length; // If the range encompases the entire leaf, add the range.\n\n              if (start.offset <= offset && end.offset >= o) {\n                Object.assign(leaf, rest);\n                next.push(leaf);\n                continue;\n              } // If the range expanded and match the leaf, or starts after, or ends before it, continue.\n\n\n              if (start.offset !== end.offset && (start.offset === o || end.offset === offset) || start.offset > o || end.offset < offset || end.offset === offset && offset !== 0) {\n                next.push(leaf);\n                continue;\n              } // Otherwise we need to split the leaf, at the start, end, or both,\n              // and add the range to the middle intersecting section. Do the end\n              // split first since we don't need to update the offset that way.\n\n\n              var middle = leaf;\n              var before = void 0;\n              var after = void 0;\n\n              if (end.offset < o) {\n                var off = end.offset - offset;\n                after = _objectSpread$4(_objectSpread$4({}, middle), {}, {\n                  text: middle.text.slice(off)\n                });\n                middle = _objectSpread$4(_objectSpread$4({}, middle), {}, {\n                  text: middle.text.slice(0, off)\n                });\n              }\n\n              if (start.offset > offset) {\n                var _off = start.offset - offset;\n\n                before = _objectSpread$4(_objectSpread$4({}, middle), {}, {\n                  text: middle.text.slice(0, _off)\n                });\n                middle = _objectSpread$4(_objectSpread$4({}, middle), {}, {\n                  text: middle.text.slice(_off)\n                });\n              }\n\n              Object.assign(middle, rest);\n\n              if (before) {\n                next.push(before);\n              }\n\n              next.push(middle);\n\n              if (after) {\n                next.push(after);\n              }\n            }\n          } catch (err) {\n            _iterator2.e(err);\n          } finally {\n            _iterator2.f();\n          }\n\n          leaves = next;\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n\n      return leaves;\n    }\n  };\n\n  function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n  function _createForOfIteratorHelper$2(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); }\n\n  function _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n  var applyToDraft = function applyToDraft(editor, selection, op) {\n    switch (op.type) {\n      case 'insert_node':\n        {\n          var path = op.path,\n              node = op.node;\n          var parent = Node$1.parent(editor, path);\n          var index = path[path.length - 1];\n\n          if (index > parent.children.length) {\n            throw new Error(\"Cannot apply an \\\"insert_node\\\" operation at path [\".concat(path, \"] because the destination is past the end of the node.\"));\n          }\n\n          parent.children.splice(index, 0, node);\n\n          if (selection) {\n            var _iterator = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step;\n\n            try {\n              for (_iterator.s(); !(_step = _iterator.n()).done;) {\n                var _step$value = _slicedToArray(_step.value, 2),\n                    point = _step$value[0],\n                    key = _step$value[1];\n\n                selection[key] = Point.transform(point, op);\n              }\n            } catch (err) {\n              _iterator.e(err);\n            } finally {\n              _iterator.f();\n            }\n          }\n\n          break;\n        }\n\n      case 'insert_text':\n        {\n          var _path = op.path,\n              offset = op.offset,\n              text = op.text;\n          if (text.length === 0) break;\n\n          var _node = Node$1.leaf(editor, _path);\n\n          var before = _node.text.slice(0, offset);\n\n          var after = _node.text.slice(offset);\n\n          _node.text = before + text + after;\n\n          if (selection) {\n            var _iterator2 = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step2;\n\n            try {\n              for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n                var _step2$value = _slicedToArray(_step2.value, 2),\n                    _point = _step2$value[0],\n                    _key = _step2$value[1];\n\n                selection[_key] = Point.transform(_point, op);\n              }\n            } catch (err) {\n              _iterator2.e(err);\n            } finally {\n              _iterator2.f();\n            }\n          }\n\n          break;\n        }\n\n      case 'merge_node':\n        {\n          var _path2 = op.path;\n\n          var _node2 = Node$1.get(editor, _path2);\n\n          var prevPath = Path.previous(_path2);\n          var prev = Node$1.get(editor, prevPath);\n\n          var _parent = Node$1.parent(editor, _path2);\n\n          var _index = _path2[_path2.length - 1];\n\n          if (Text.isText(_node2) && Text.isText(prev)) {\n            prev.text += _node2.text;\n          } else if (!Text.isText(_node2) && !Text.isText(prev)) {\n            var _prev$children;\n\n            (_prev$children = prev.children).push.apply(_prev$children, _toConsumableArray(_node2.children));\n          } else {\n            throw new Error(\"Cannot apply a \\\"merge_node\\\" operation at path [\".concat(_path2, \"] to nodes of different interfaces: \").concat(_node2, \" \").concat(prev));\n          }\n\n          _parent.children.splice(_index, 1);\n\n          if (selection) {\n            var _iterator3 = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step3;\n\n            try {\n              for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n                var _step3$value = _slicedToArray(_step3.value, 2),\n                    _point2 = _step3$value[0],\n                    _key2 = _step3$value[1];\n\n                selection[_key2] = Point.transform(_point2, op);\n              }\n            } catch (err) {\n              _iterator3.e(err);\n            } finally {\n              _iterator3.f();\n            }\n          }\n\n          break;\n        }\n\n      case 'move_node':\n        {\n          var _path3 = op.path,\n              newPath = op.newPath;\n\n          if (Path.isAncestor(_path3, newPath)) {\n            throw new Error(\"Cannot move a path [\".concat(_path3, \"] to new path [\").concat(newPath, \"] because the destination is inside itself.\"));\n          }\n\n          var _node3 = Node$1.get(editor, _path3);\n\n          var _parent2 = Node$1.parent(editor, _path3);\n\n          var _index2 = _path3[_path3.length - 1]; // This is tricky, but since the `path` and `newPath` both refer to\n          // the same snapshot in time, there's a mismatch. After either\n          // removing the original position, the second step's path can be out\n          // of date. So instead of using the `op.newPath` directly, we\n          // transform `op.path` to ascertain what the `newPath` would be after\n          // the operation was applied.\n\n          _parent2.children.splice(_index2, 1);\n\n          var truePath = Path.transform(_path3, op);\n          var newParent = Node$1.get(editor, Path.parent(truePath));\n          var newIndex = truePath[truePath.length - 1];\n          newParent.children.splice(newIndex, 0, _node3);\n\n          if (selection) {\n            var _iterator4 = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step4;\n\n            try {\n              for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n                var _step4$value = _slicedToArray(_step4.value, 2),\n                    _point3 = _step4$value[0],\n                    _key3 = _step4$value[1];\n\n                selection[_key3] = Point.transform(_point3, op);\n              }\n            } catch (err) {\n              _iterator4.e(err);\n            } finally {\n              _iterator4.f();\n            }\n          }\n\n          break;\n        }\n\n      case 'remove_node':\n        {\n          var _path4 = op.path;\n          var _index3 = _path4[_path4.length - 1];\n\n          var _parent3 = Node$1.parent(editor, _path4);\n\n          _parent3.children.splice(_index3, 1); // Transform all of the points in the value, but if the point was in the\n          // node that was removed we need to update the range or remove it.\n\n\n          if (selection) {\n            var _iterator5 = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step5;\n\n            try {\n              for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n                var _step5$value = _slicedToArray(_step5.value, 2),\n                    _point4 = _step5$value[0],\n                    _key4 = _step5$value[1];\n\n                var result = Point.transform(_point4, op);\n\n                if (selection != null && result != null) {\n                  selection[_key4] = result;\n                } else {\n                  var _prev = void 0;\n\n                  var next = void 0;\n\n                  var _iterator6 = _createForOfIteratorHelper$2(Node$1.texts(editor)),\n                      _step6;\n\n                  try {\n                    for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n                      var _step6$value = _slicedToArray(_step6.value, 2),\n                          n = _step6$value[0],\n                          p = _step6$value[1];\n\n                      if (Path.compare(p, _path4) === -1) {\n                        _prev = [n, p];\n                      } else {\n                        next = [n, p];\n                        break;\n                      }\n                    }\n                  } catch (err) {\n                    _iterator6.e(err);\n                  } finally {\n                    _iterator6.f();\n                  }\n\n                  var preferNext = false;\n\n                  if (_prev && next) {\n                    if (Path.equals(next[1], _path4)) {\n                      preferNext = !Path.hasPrevious(next[1]);\n                    } else {\n                      preferNext = Path.common(_prev[1], _path4).length < Path.common(next[1], _path4).length;\n                    }\n                  }\n\n                  if (_prev && !preferNext) {\n                    _point4.path = _prev[1];\n                    _point4.offset = _prev[0].text.length;\n                  } else if (next) {\n                    _point4.path = next[1];\n                    _point4.offset = 0;\n                  } else {\n                    selection = null;\n                  }\n                }\n              }\n            } catch (err) {\n              _iterator5.e(err);\n            } finally {\n              _iterator5.f();\n            }\n          }\n\n          break;\n        }\n\n      case 'remove_text':\n        {\n          var _path5 = op.path,\n              _offset = op.offset,\n              _text = op.text;\n          if (_text.length === 0) break;\n\n          var _node4 = Node$1.leaf(editor, _path5);\n\n          var _before = _node4.text.slice(0, _offset);\n\n          var _after = _node4.text.slice(_offset + _text.length);\n\n          _node4.text = _before + _after;\n\n          if (selection) {\n            var _iterator7 = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step7;\n\n            try {\n              for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n                var _step7$value = _slicedToArray(_step7.value, 2),\n                    _point5 = _step7$value[0],\n                    _key5 = _step7$value[1];\n\n                selection[_key5] = Point.transform(_point5, op);\n              }\n            } catch (err) {\n              _iterator7.e(err);\n            } finally {\n              _iterator7.f();\n            }\n          }\n\n          break;\n        }\n\n      case 'set_node':\n        {\n          var _path6 = op.path,\n              properties = op.properties,\n              newProperties = op.newProperties;\n\n          if (_path6.length === 0) {\n            throw new Error(\"Cannot set properties on the root node!\");\n          }\n\n          var _node5 = Node$1.get(editor, _path6);\n\n          for (var _key6 in newProperties) {\n            if (_key6 === 'children' || _key6 === 'text') {\n              throw new Error(\"Cannot set the \\\"\".concat(_key6, \"\\\" property of nodes!\"));\n            }\n\n            var value = newProperties[_key6];\n\n            if (value == null) {\n              delete _node5[_key6];\n            } else {\n              _node5[_key6] = value;\n            }\n          } // properties that were previously defined, but are now missing, must be deleted\n\n\n          for (var _key7 in properties) {\n            if (!newProperties.hasOwnProperty(_key7)) {\n              delete _node5[_key7];\n            }\n          }\n\n          break;\n        }\n\n      case 'set_selection':\n        {\n          var _newProperties = op.newProperties;\n\n          if (_newProperties == null) {\n            selection = _newProperties;\n          } else {\n            if (selection == null) {\n              if (!Range.isRange(_newProperties)) {\n                throw new Error(\"Cannot apply an incomplete \\\"set_selection\\\" operation properties \".concat(JSON.stringify(_newProperties), \" when there is no current selection.\"));\n              }\n\n              selection = _objectSpread$3({}, _newProperties);\n            }\n\n            for (var _key8 in _newProperties) {\n              var _value = _newProperties[_key8];\n\n              if (_value == null) {\n                if (_key8 === 'anchor' || _key8 === 'focus') {\n                  throw new Error(\"Cannot remove the \\\"\".concat(_key8, \"\\\" selection property\"));\n                }\n\n                delete selection[_key8];\n              } else {\n                selection[_key8] = _value;\n              }\n            }\n          }\n\n          break;\n        }\n\n      case 'split_node':\n        {\n          var _path7 = op.path,\n              position = op.position,\n              _properties = op.properties;\n\n          if (_path7.length === 0) {\n            throw new Error(\"Cannot apply a \\\"split_node\\\" operation at path [\".concat(_path7, \"] because the root node cannot be split.\"));\n          }\n\n          var _node6 = Node$1.get(editor, _path7);\n\n          var _parent4 = Node$1.parent(editor, _path7);\n\n          var _index4 = _path7[_path7.length - 1];\n          var newNode;\n\n          if (Text.isText(_node6)) {\n            var _before2 = _node6.text.slice(0, position);\n\n            var _after2 = _node6.text.slice(position);\n\n            _node6.text = _before2;\n            newNode = _objectSpread$3(_objectSpread$3({}, _properties), {}, {\n              text: _after2\n            });\n          } else {\n            var _before3 = _node6.children.slice(0, position);\n\n            var _after3 = _node6.children.slice(position);\n\n            _node6.children = _before3;\n            newNode = _objectSpread$3(_objectSpread$3({}, _properties), {}, {\n              children: _after3\n            });\n          }\n\n          _parent4.children.splice(_index4 + 1, 0, newNode);\n\n          if (selection) {\n            var _iterator8 = _createForOfIteratorHelper$2(Range.points(selection)),\n                _step8;\n\n            try {\n              for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n                var _step8$value = _slicedToArray(_step8.value, 2),\n                    _point6 = _step8$value[0],\n                    _key9 = _step8$value[1];\n\n                selection[_key9] = Point.transform(_point6, op);\n              }\n            } catch (err) {\n              _iterator8.e(err);\n            } finally {\n              _iterator8.f();\n            }\n          }\n\n          break;\n        }\n    }\n\n    return selection;\n  };\n\n  var GeneralTransforms = {\n    /**\n     * Transform the editor by an operation.\n     */\n    transform: function transform(editor, op) {\n      editor.children = immer.createDraft(editor.children);\n      var selection = editor.selection && immer.createDraft(editor.selection);\n\n      try {\n        selection = applyToDraft(editor, selection, op);\n      } finally {\n        editor.children = immer.finishDraft(editor.children);\n\n        if (selection) {\n          editor.selection = immer.isDraft(selection) ? immer.finishDraft(selection) : selection;\n        } else {\n          editor.selection = null;\n        }\n      }\n    }\n  };\n\n  var _excluded = [\"text\"],\n      _excluded2 = [\"children\"];\n\n  function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n  function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }\n\n  function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n  var NodeTransforms = {\n    /**\n     * Insert nodes at a specific location in the Editor.\n     */\n    insertNodes: function insertNodes(editor, nodes) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$hanging = options.hanging,\n            hanging = _options$hanging === void 0 ? false : _options$hanging,\n            _options$voids = options.voids,\n            voids = _options$voids === void 0 ? false : _options$voids,\n            _options$mode = options.mode,\n            mode = _options$mode === void 0 ? 'lowest' : _options$mode;\n        var at = options.at,\n            match = options.match,\n            select = options.select;\n\n        if (Node$1.isNode(nodes)) {\n          nodes = [nodes];\n        }\n\n        if (nodes.length === 0) {\n          return;\n        }\n\n        var _nodes = nodes,\n            _nodes2 = _slicedToArray(_nodes, 1),\n            node = _nodes2[0]; // By default, use the selection as the target location. But if there is\n        // no selection, insert at the end of the document since that is such a\n        // common use case when inserting from a non-selected state.\n\n\n        if (!at) {\n          if (editor.selection) {\n            at = editor.selection;\n          } else if (editor.children.length > 0) {\n            at = Editor.end(editor, []);\n          } else {\n            at = [0];\n          }\n\n          select = true;\n        }\n\n        if (select == null) {\n          select = false;\n        }\n\n        if (Range.isRange(at)) {\n          if (!hanging) {\n            at = Editor.unhangRange(editor, at);\n          }\n\n          if (Range.isCollapsed(at)) {\n            at = at.anchor;\n          } else {\n            var _Range$edges = Range.edges(at),\n                _Range$edges2 = _slicedToArray(_Range$edges, 2),\n                end = _Range$edges2[1];\n\n            var pointRef = Editor.pointRef(editor, end);\n            Transforms[\"delete\"](editor, {\n              at: at\n            });\n            at = pointRef.unref();\n          }\n        }\n\n        if (Point.isPoint(at)) {\n          if (match == null) {\n            if (Text.isText(node)) {\n              match = function match(n) {\n                return Text.isText(n);\n              };\n            } else if (editor.isInline(node)) {\n              match = function match(n) {\n                return Text.isText(n) || Editor.isInline(editor, n);\n              };\n            } else {\n              match = function match(n) {\n                return Editor.isBlock(editor, n);\n              };\n            }\n          }\n\n          var _Editor$nodes = Editor.nodes(editor, {\n            at: at.path,\n            match: match,\n            mode: mode,\n            voids: voids\n          }),\n              _Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),\n              entry = _Editor$nodes2[0];\n\n          if (entry) {\n            var _entry = _slicedToArray(entry, 2),\n                _matchPath = _entry[1];\n\n            var pathRef = Editor.pathRef(editor, _matchPath);\n            var isAtEnd = Editor.isEnd(editor, at, _matchPath);\n            Transforms.splitNodes(editor, {\n              at: at,\n              match: match,\n              mode: mode,\n              voids: voids\n            });\n            var path = pathRef.unref();\n            at = isAtEnd ? Path.next(path) : path;\n          } else {\n            return;\n          }\n        }\n\n        var parentPath = Path.parent(at);\n        var index = at[at.length - 1];\n\n        if (!voids && Editor[\"void\"](editor, {\n          at: parentPath\n        })) {\n          return;\n        }\n\n        var _iterator = _createForOfIteratorHelper$1(nodes),\n            _step;\n\n        try {\n          for (_iterator.s(); !(_step = _iterator.n()).done;) {\n            var _node = _step.value;\n\n            var _path = parentPath.concat(index);\n\n            index++;\n            editor.apply({\n              type: 'insert_node',\n              path: _path,\n              node: _node\n            });\n            at = Path.next(at);\n          }\n        } catch (err) {\n          _iterator.e(err);\n        } finally {\n          _iterator.f();\n        }\n\n        at = Path.previous(at);\n\n        if (select) {\n          var point = Editor.end(editor, at);\n\n          if (point) {\n            Transforms.select(editor, point);\n          }\n        }\n      });\n    },\n\n    /**\n     * Lift nodes at a specific location upwards in the document tree, splitting\n     * their parent in two if necessary.\n     */\n    liftNodes: function liftNodes(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$at = options.at,\n            at = _options$at === void 0 ? editor.selection : _options$at,\n            _options$mode2 = options.mode,\n            mode = _options$mode2 === void 0 ? 'lowest' : _options$mode2,\n            _options$voids2 = options.voids,\n            voids = _options$voids2 === void 0 ? false : _options$voids2;\n        var match = options.match;\n\n        if (match == null) {\n          match = Path.isPath(at) ? matchPath(editor, at) : function (n) {\n            return Editor.isBlock(editor, n);\n          };\n        }\n\n        if (!at) {\n          return;\n        }\n\n        var matches = Editor.nodes(editor, {\n          at: at,\n          match: match,\n          mode: mode,\n          voids: voids\n        });\n        var pathRefs = Array.from(matches, function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              p = _ref2[1];\n\n          return Editor.pathRef(editor, p);\n        });\n\n        for (var _i = 0, _pathRefs = pathRefs; _i < _pathRefs.length; _i++) {\n          var pathRef = _pathRefs[_i];\n          var path = pathRef.unref();\n\n          if (path.length < 2) {\n            throw new Error(\"Cannot lift node at a path [\".concat(path, \"] because it has a depth of less than `2`.\"));\n          }\n\n          var parentNodeEntry = Editor.node(editor, Path.parent(path));\n\n          var _parentNodeEntry = _slicedToArray(parentNodeEntry, 2),\n              parent = _parentNodeEntry[0],\n              parentPath = _parentNodeEntry[1];\n\n          var index = path[path.length - 1];\n          var length = parent.children.length;\n\n          if (length === 1) {\n            var toPath = Path.next(parentPath);\n            Transforms.moveNodes(editor, {\n              at: path,\n              to: toPath,\n              voids: voids\n            });\n            Transforms.removeNodes(editor, {\n              at: parentPath,\n              voids: voids\n            });\n          } else if (index === 0) {\n            Transforms.moveNodes(editor, {\n              at: path,\n              to: parentPath,\n              voids: voids\n            });\n          } else if (index === length - 1) {\n            var _toPath = Path.next(parentPath);\n\n            Transforms.moveNodes(editor, {\n              at: path,\n              to: _toPath,\n              voids: voids\n            });\n          } else {\n            var splitPath = Path.next(path);\n\n            var _toPath2 = Path.next(parentPath);\n\n            Transforms.splitNodes(editor, {\n              at: splitPath,\n              voids: voids\n            });\n            Transforms.moveNodes(editor, {\n              at: path,\n              to: _toPath2,\n              voids: voids\n            });\n          }\n        }\n      });\n    },\n\n    /**\n     * Merge a node at a location with the previous node of the same depth,\n     * removing any empty containing nodes after the merge if necessary.\n     */\n    mergeNodes: function mergeNodes(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var match = options.match,\n            _options$at2 = options.at,\n            at = _options$at2 === void 0 ? editor.selection : _options$at2;\n        var _options$hanging2 = options.hanging,\n            hanging = _options$hanging2 === void 0 ? false : _options$hanging2,\n            _options$voids3 = options.voids,\n            voids = _options$voids3 === void 0 ? false : _options$voids3,\n            _options$mode3 = options.mode,\n            mode = _options$mode3 === void 0 ? 'lowest' : _options$mode3;\n\n        if (!at) {\n          return;\n        }\n\n        if (match == null) {\n          if (Path.isPath(at)) {\n            var _Editor$parent = Editor.parent(editor, at),\n                _Editor$parent2 = _slicedToArray(_Editor$parent, 1),\n                parent = _Editor$parent2[0];\n\n            match = function match(n) {\n              return parent.children.includes(n);\n            };\n          } else {\n            match = function match(n) {\n              return Editor.isBlock(editor, n);\n            };\n          }\n        }\n\n        if (!hanging && Range.isRange(at)) {\n          at = Editor.unhangRange(editor, at);\n        }\n\n        if (Range.isRange(at)) {\n          if (Range.isCollapsed(at)) {\n            at = at.anchor;\n          } else {\n            var _Range$edges3 = Range.edges(at),\n                _Range$edges4 = _slicedToArray(_Range$edges3, 2),\n                end = _Range$edges4[1];\n\n            var pointRef = Editor.pointRef(editor, end);\n            Transforms[\"delete\"](editor, {\n              at: at\n            });\n            at = pointRef.unref();\n\n            if (options.at == null) {\n              Transforms.select(editor, at);\n            }\n          }\n        }\n\n        var _Editor$nodes3 = Editor.nodes(editor, {\n          at: at,\n          match: match,\n          voids: voids,\n          mode: mode\n        }),\n            _Editor$nodes4 = _slicedToArray(_Editor$nodes3, 1),\n            current = _Editor$nodes4[0];\n\n        var prev = Editor.previous(editor, {\n          at: at,\n          match: match,\n          voids: voids,\n          mode: mode\n        });\n\n        if (!current || !prev) {\n          return;\n        }\n\n        var _current = _slicedToArray(current, 2),\n            node = _current[0],\n            path = _current[1];\n\n        var _prev = _slicedToArray(prev, 2),\n            prevNode = _prev[0],\n            prevPath = _prev[1];\n\n        if (path.length === 0 || prevPath.length === 0) {\n          return;\n        }\n\n        var newPath = Path.next(prevPath);\n        var commonPath = Path.common(path, prevPath);\n        var isPreviousSibling = Path.isSibling(path, prevPath);\n        var levels = Array.from(Editor.levels(editor, {\n          at: path\n        }), function (_ref3) {\n          var _ref4 = _slicedToArray(_ref3, 1),\n              n = _ref4[0];\n\n          return n;\n        }).slice(commonPath.length).slice(0, -1); // Determine if the merge will leave an ancestor of the path empty as a\n        // result, in which case we'll want to remove it after merging.\n\n        var emptyAncestor = Editor.above(editor, {\n          at: path,\n          mode: 'highest',\n          match: function match(n) {\n            return levels.includes(n) && hasSingleChildNest(editor, n);\n          }\n        });\n        var emptyRef = emptyAncestor && Editor.pathRef(editor, emptyAncestor[1]);\n        var properties;\n        var position; // Ensure that the nodes are equivalent, and figure out what the position\n        // and extra properties of the merge will be.\n\n        if (Text.isText(node) && Text.isText(prevNode)) {\n          node.text;\n              var rest = _objectWithoutProperties(node, _excluded);\n\n          position = prevNode.text.length;\n          properties = rest;\n        } else if (Element$1.isElement(node) && Element$1.isElement(prevNode)) {\n          node.children;\n              var _rest = _objectWithoutProperties(node, _excluded2);\n\n          position = prevNode.children.length;\n          properties = _rest;\n        } else {\n          throw new Error(\"Cannot merge the node at path [\".concat(path, \"] with the previous sibling because it is not the same kind: \").concat(JSON.stringify(node), \" \").concat(JSON.stringify(prevNode)));\n        } // If the node isn't already the next sibling of the previous node, move\n        // it so that it is before merging.\n\n\n        if (!isPreviousSibling) {\n          Transforms.moveNodes(editor, {\n            at: path,\n            to: newPath,\n            voids: voids\n          });\n        } // If there was going to be an empty ancestor of the node that was merged,\n        // we remove it from the tree.\n\n\n        if (emptyRef) {\n          Transforms.removeNodes(editor, {\n            at: emptyRef.current,\n            voids: voids\n          });\n        } // If the target node that we're merging with is empty, remove it instead\n        // of merging the two. This is a common rich text editor behavior to\n        // prevent losing formatting when deleting entire nodes when you have a\n        // hanging selection.\n        // if prevNode is first child in parent,don't remove it.\n\n\n        if (Element$1.isElement(prevNode) && Editor.isEmpty(editor, prevNode) || Text.isText(prevNode) && prevNode.text === '' && prevPath[prevPath.length - 1] !== 0) {\n          Transforms.removeNodes(editor, {\n            at: prevPath,\n            voids: voids\n          });\n        } else {\n          editor.apply({\n            type: 'merge_node',\n            path: newPath,\n            position: position,\n            properties: properties\n          });\n        }\n\n        if (emptyRef) {\n          emptyRef.unref();\n        }\n      });\n    },\n\n    /**\n     * Move the nodes at a location to a new location.\n     */\n    moveNodes: function moveNodes(editor, options) {\n      Editor.withoutNormalizing(editor, function () {\n        var to = options.to,\n            _options$at3 = options.at,\n            at = _options$at3 === void 0 ? editor.selection : _options$at3,\n            _options$mode4 = options.mode,\n            mode = _options$mode4 === void 0 ? 'lowest' : _options$mode4,\n            _options$voids4 = options.voids,\n            voids = _options$voids4 === void 0 ? false : _options$voids4;\n        var match = options.match;\n\n        if (!at) {\n          return;\n        }\n\n        if (match == null) {\n          match = Path.isPath(at) ? matchPath(editor, at) : function (n) {\n            return Editor.isBlock(editor, n);\n          };\n        }\n\n        var toRef = Editor.pathRef(editor, to);\n        var targets = Editor.nodes(editor, {\n          at: at,\n          match: match,\n          mode: mode,\n          voids: voids\n        });\n        var pathRefs = Array.from(targets, function (_ref5) {\n          var _ref6 = _slicedToArray(_ref5, 2),\n              p = _ref6[1];\n\n          return Editor.pathRef(editor, p);\n        });\n\n        for (var _i2 = 0, _pathRefs2 = pathRefs; _i2 < _pathRefs2.length; _i2++) {\n          var pathRef = _pathRefs2[_i2];\n          var path = pathRef.unref();\n          var newPath = toRef.current;\n\n          if (path.length !== 0) {\n            editor.apply({\n              type: 'move_node',\n              path: path,\n              newPath: newPath\n            });\n          }\n\n          if (toRef.current && Path.isSibling(newPath, path) && Path.isAfter(newPath, path)) {\n            // When performing a sibling move to a later index, the path at the destination is shifted\n            // to before the insertion point instead of after. To ensure our group of nodes are inserted\n            // in the correct order we increment toRef to account for that\n            toRef.current = Path.next(toRef.current);\n          }\n        }\n\n        toRef.unref();\n      });\n    },\n\n    /**\n     * Remove the nodes at a specific location in the document.\n     */\n    removeNodes: function removeNodes(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$hanging3 = options.hanging,\n            hanging = _options$hanging3 === void 0 ? false : _options$hanging3,\n            _options$voids5 = options.voids,\n            voids = _options$voids5 === void 0 ? false : _options$voids5,\n            _options$mode5 = options.mode,\n            mode = _options$mode5 === void 0 ? 'lowest' : _options$mode5;\n        var _options$at4 = options.at,\n            at = _options$at4 === void 0 ? editor.selection : _options$at4,\n            match = options.match;\n\n        if (!at) {\n          return;\n        }\n\n        if (match == null) {\n          match = Path.isPath(at) ? matchPath(editor, at) : function (n) {\n            return Editor.isBlock(editor, n);\n          };\n        }\n\n        if (!hanging && Range.isRange(at)) {\n          at = Editor.unhangRange(editor, at);\n        }\n\n        var depths = Editor.nodes(editor, {\n          at: at,\n          match: match,\n          mode: mode,\n          voids: voids\n        });\n        var pathRefs = Array.from(depths, function (_ref7) {\n          var _ref8 = _slicedToArray(_ref7, 2),\n              p = _ref8[1];\n\n          return Editor.pathRef(editor, p);\n        });\n\n        for (var _i3 = 0, _pathRefs3 = pathRefs; _i3 < _pathRefs3.length; _i3++) {\n          var pathRef = _pathRefs3[_i3];\n          var path = pathRef.unref();\n\n          if (path) {\n            var _Editor$node = Editor.node(editor, path),\n                _Editor$node2 = _slicedToArray(_Editor$node, 1),\n                node = _Editor$node2[0];\n\n            editor.apply({\n              type: 'remove_node',\n              path: path,\n              node: node\n            });\n          }\n        }\n      });\n    },\n\n    /**\n     * Set new properties on the nodes at a location.\n     */\n    setNodes: function setNodes(editor, props) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var match = options.match,\n            _options$at5 = options.at,\n            at = _options$at5 === void 0 ? editor.selection : _options$at5;\n        var _options$hanging4 = options.hanging,\n            hanging = _options$hanging4 === void 0 ? false : _options$hanging4,\n            _options$mode6 = options.mode,\n            mode = _options$mode6 === void 0 ? 'lowest' : _options$mode6,\n            _options$split = options.split,\n            split = _options$split === void 0 ? false : _options$split,\n            _options$voids6 = options.voids,\n            voids = _options$voids6 === void 0 ? false : _options$voids6;\n\n        if (!at) {\n          return;\n        }\n\n        if (match == null) {\n          match = Path.isPath(at) ? matchPath(editor, at) : function (n) {\n            return Editor.isBlock(editor, n);\n          };\n        }\n\n        if (!hanging && Range.isRange(at)) {\n          at = Editor.unhangRange(editor, at);\n        }\n\n        if (split && Range.isRange(at)) {\n          if (Range.isCollapsed(at) && Editor.leaf(editor, at.anchor)[0].text.length > 0) {\n            // If the range is collapsed in a non-empty node and 'split' is true, there's nothing to\n            // set that won't get normalized away\n            return;\n          }\n\n          var rangeRef = Editor.rangeRef(editor, at, {\n            affinity: 'inward'\n          });\n\n          var _Range$edges5 = Range.edges(at),\n              _Range$edges6 = _slicedToArray(_Range$edges5, 2),\n              start = _Range$edges6[0],\n              end = _Range$edges6[1];\n\n          var splitMode = mode === 'lowest' ? 'lowest' : 'highest';\n          var endAtEndOfNode = Editor.isEnd(editor, end, end.path);\n          Transforms.splitNodes(editor, {\n            at: end,\n            match: match,\n            mode: splitMode,\n            voids: voids,\n            always: !endAtEndOfNode\n          });\n          var startAtStartOfNode = Editor.isStart(editor, start, start.path);\n          Transforms.splitNodes(editor, {\n            at: start,\n            match: match,\n            mode: splitMode,\n            voids: voids,\n            always: !startAtStartOfNode\n          });\n          at = rangeRef.unref();\n\n          if (options.at == null) {\n            Transforms.select(editor, at);\n          }\n        }\n\n        var _iterator2 = _createForOfIteratorHelper$1(Editor.nodes(editor, {\n          at: at,\n          match: match,\n          mode: mode,\n          voids: voids\n        })),\n            _step2;\n\n        try {\n          for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n            var _step2$value = _slicedToArray(_step2.value, 2),\n                node = _step2$value[0],\n                path = _step2$value[1];\n\n            var properties = {};\n            var newProperties = {}; // You can't set properties on the editor node.\n\n            if (path.length === 0) {\n              continue;\n            }\n\n            var hasChanges = false;\n\n            for (var k in props) {\n              if (k === 'children' || k === 'text') {\n                continue;\n              }\n\n              if (props[k] !== node[k]) {\n                hasChanges = true; // Omit new properties from the old properties list\n\n                if (node.hasOwnProperty(k)) properties[k] = node[k]; // Omit properties that have been removed from the new properties list\n\n                if (props[k] != null) newProperties[k] = props[k];\n              }\n            }\n\n            if (hasChanges) {\n              editor.apply({\n                type: 'set_node',\n                path: path,\n                properties: properties,\n                newProperties: newProperties\n              });\n            }\n          }\n        } catch (err) {\n          _iterator2.e(err);\n        } finally {\n          _iterator2.f();\n        }\n      });\n    },\n\n    /**\n     * Split the nodes at a specific location.\n     */\n    splitNodes: function splitNodes(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$mode7 = options.mode,\n            mode = _options$mode7 === void 0 ? 'lowest' : _options$mode7,\n            _options$voids7 = options.voids,\n            voids = _options$voids7 === void 0 ? false : _options$voids7;\n        var match = options.match,\n            _options$at6 = options.at,\n            at = _options$at6 === void 0 ? editor.selection : _options$at6,\n            _options$height = options.height,\n            height = _options$height === void 0 ? 0 : _options$height,\n            _options$always = options.always,\n            always = _options$always === void 0 ? false : _options$always;\n\n        if (match == null) {\n          match = function match(n) {\n            return Editor.isBlock(editor, n);\n          };\n        }\n\n        if (Range.isRange(at)) {\n          at = deleteRange(editor, at);\n        } // If the target is a path, the default height-skipping and position\n        // counters need to account for us potentially splitting at a non-leaf.\n\n\n        if (Path.isPath(at)) {\n          var path = at;\n          var point = Editor.point(editor, path);\n\n          var _Editor$parent3 = Editor.parent(editor, path),\n              _Editor$parent4 = _slicedToArray(_Editor$parent3, 1),\n              parent = _Editor$parent4[0];\n\n          match = function match(n) {\n            return n === parent;\n          };\n\n          height = point.path.length - path.length + 1;\n          at = point;\n          always = true;\n        }\n\n        if (!at) {\n          return;\n        }\n\n        var beforeRef = Editor.pointRef(editor, at, {\n          affinity: 'backward'\n        });\n\n        var _Editor$nodes5 = Editor.nodes(editor, {\n          at: at,\n          match: match,\n          mode: mode,\n          voids: voids\n        }),\n            _Editor$nodes6 = _slicedToArray(_Editor$nodes5, 1),\n            highest = _Editor$nodes6[0];\n\n        if (!highest) {\n          return;\n        }\n\n        var voidMatch = Editor[\"void\"](editor, {\n          at: at,\n          mode: 'highest'\n        });\n        var nudge = 0;\n\n        if (!voids && voidMatch) {\n          var _voidMatch = _slicedToArray(voidMatch, 2),\n              voidNode = _voidMatch[0],\n              voidPath = _voidMatch[1];\n\n          if (Element$1.isElement(voidNode) && editor.isInline(voidNode)) {\n            var after = Editor.after(editor, voidPath);\n\n            if (!after) {\n              var text = {\n                text: ''\n              };\n              var afterPath = Path.next(voidPath);\n              Transforms.insertNodes(editor, text, {\n                at: afterPath,\n                voids: voids\n              });\n              after = Editor.point(editor, afterPath);\n            }\n\n            at = after;\n            always = true;\n          }\n\n          var siblingHeight = at.path.length - voidPath.length;\n          height = siblingHeight + 1;\n          always = true;\n        }\n\n        var afterRef = Editor.pointRef(editor, at);\n        var depth = at.path.length - height;\n\n        var _highest = _slicedToArray(highest, 2),\n            highestPath = _highest[1];\n\n        var lowestPath = at.path.slice(0, depth);\n        var position = height === 0 ? at.offset : at.path[depth] + nudge;\n\n        var _iterator3 = _createForOfIteratorHelper$1(Editor.levels(editor, {\n          at: lowestPath,\n          reverse: true,\n          voids: voids\n        })),\n            _step3;\n\n        try {\n          for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n            var _step3$value = _slicedToArray(_step3.value, 2),\n                node = _step3$value[0],\n                _path2 = _step3$value[1];\n\n            var split = false;\n\n            if (_path2.length < highestPath.length || _path2.length === 0 || !voids && Editor.isVoid(editor, node)) {\n              break;\n            }\n\n            var _point2 = beforeRef.current;\n            var isEnd = Editor.isEnd(editor, _point2, _path2);\n\n            if (always || !beforeRef || !Editor.isEdge(editor, _point2, _path2)) {\n              split = true;\n              var properties = Node$1.extractProps(node);\n              editor.apply({\n                type: 'split_node',\n                path: _path2,\n                position: position,\n                properties: properties\n              });\n            }\n\n            position = _path2[_path2.length - 1] + (split || isEnd ? 1 : 0);\n          }\n        } catch (err) {\n          _iterator3.e(err);\n        } finally {\n          _iterator3.f();\n        }\n\n        if (options.at == null) {\n          var _point = afterRef.current || Editor.end(editor, []);\n\n          Transforms.select(editor, _point);\n        }\n\n        beforeRef.unref();\n        afterRef.unref();\n      });\n    },\n\n    /**\n     * Unset properties on the nodes at a location.\n     */\n    unsetNodes: function unsetNodes(editor, props) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      if (!Array.isArray(props)) {\n        props = [props];\n      }\n\n      var obj = {};\n\n      var _iterator4 = _createForOfIteratorHelper$1(props),\n          _step4;\n\n      try {\n        for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n          var key = _step4.value;\n          obj[key] = null;\n        }\n      } catch (err) {\n        _iterator4.e(err);\n      } finally {\n        _iterator4.f();\n      }\n\n      Transforms.setNodes(editor, obj, options);\n    },\n\n    /**\n     * Unwrap the nodes at a location from a parent node, splitting the parent if\n     * necessary to ensure that only the content in the range is unwrapped.\n     */\n    unwrapNodes: function unwrapNodes(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$mode8 = options.mode,\n            mode = _options$mode8 === void 0 ? 'lowest' : _options$mode8,\n            _options$split2 = options.split,\n            split = _options$split2 === void 0 ? false : _options$split2,\n            _options$voids8 = options.voids,\n            voids = _options$voids8 === void 0 ? false : _options$voids8;\n        var _options$at7 = options.at,\n            at = _options$at7 === void 0 ? editor.selection : _options$at7,\n            match = options.match;\n\n        if (!at) {\n          return;\n        }\n\n        if (match == null) {\n          match = Path.isPath(at) ? matchPath(editor, at) : function (n) {\n            return Editor.isBlock(editor, n);\n          };\n        }\n\n        if (Path.isPath(at)) {\n          at = Editor.range(editor, at);\n        }\n\n        var rangeRef = Range.isRange(at) ? Editor.rangeRef(editor, at) : null;\n        var matches = Editor.nodes(editor, {\n          at: at,\n          match: match,\n          mode: mode,\n          voids: voids\n        });\n        var pathRefs = Array.from(matches, function (_ref9) {\n          var _ref10 = _slicedToArray(_ref9, 2),\n              p = _ref10[1];\n\n          return Editor.pathRef(editor, p);\n        } // unwrapNode will call liftNode which does not support splitting the node when nested.\n        // If we do not reverse the order and call it from top to the bottom, it will remove all blocks\n        // that wrap target node. So we reverse the order.\n        ).reverse();\n\n        var _iterator5 = _createForOfIteratorHelper$1(pathRefs),\n            _step5;\n\n        try {\n          var _loop = function _loop() {\n            var pathRef = _step5.value;\n            var path = pathRef.unref();\n\n            var _Editor$node3 = Editor.node(editor, path),\n                _Editor$node4 = _slicedToArray(_Editor$node3, 1),\n                node = _Editor$node4[0];\n\n            var range = Editor.range(editor, path);\n\n            if (split && rangeRef) {\n              range = Range.intersection(rangeRef.current, range);\n            }\n\n            Transforms.liftNodes(editor, {\n              at: range,\n              match: function match(n) {\n                return Element$1.isAncestor(node) && node.children.includes(n);\n              },\n              voids: voids\n            });\n          };\n\n          for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n            _loop();\n          }\n        } catch (err) {\n          _iterator5.e(err);\n        } finally {\n          _iterator5.f();\n        }\n\n        if (rangeRef) {\n          rangeRef.unref();\n        }\n      });\n    },\n\n    /**\n     * Wrap the nodes at a location in a new container node, splitting the edges\n     * of the range first to ensure that only the content in the range is wrapped.\n     */\n    wrapNodes: function wrapNodes(editor, element) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$mode9 = options.mode,\n            mode = _options$mode9 === void 0 ? 'lowest' : _options$mode9,\n            _options$split3 = options.split,\n            split = _options$split3 === void 0 ? false : _options$split3,\n            _options$voids9 = options.voids,\n            voids = _options$voids9 === void 0 ? false : _options$voids9;\n        var match = options.match,\n            _options$at8 = options.at,\n            at = _options$at8 === void 0 ? editor.selection : _options$at8;\n\n        if (!at) {\n          return;\n        }\n\n        if (match == null) {\n          if (Path.isPath(at)) {\n            match = matchPath(editor, at);\n          } else if (editor.isInline(element)) {\n            match = function match(n) {\n              return Editor.isInline(editor, n) || Text.isText(n);\n            };\n          } else {\n            match = function match(n) {\n              return Editor.isBlock(editor, n);\n            };\n          }\n        }\n\n        if (split && Range.isRange(at)) {\n          var _Range$edges7 = Range.edges(at),\n              _Range$edges8 = _slicedToArray(_Range$edges7, 2),\n              start = _Range$edges8[0],\n              end = _Range$edges8[1];\n\n          var rangeRef = Editor.rangeRef(editor, at, {\n            affinity: 'inward'\n          });\n          Transforms.splitNodes(editor, {\n            at: end,\n            match: match,\n            voids: voids\n          });\n          Transforms.splitNodes(editor, {\n            at: start,\n            match: match,\n            voids: voids\n          });\n          at = rangeRef.unref();\n\n          if (options.at == null) {\n            Transforms.select(editor, at);\n          }\n        }\n\n        var roots = Array.from(Editor.nodes(editor, {\n          at: at,\n          match: editor.isInline(element) ? function (n) {\n            return Editor.isBlock(editor, n);\n          } : function (n) {\n            return Editor.isEditor(n);\n          },\n          mode: 'lowest',\n          voids: voids\n        }));\n\n        for (var _i4 = 0, _roots = roots; _i4 < _roots.length; _i4++) {\n          var _roots$_i = _slicedToArray(_roots[_i4], 2),\n              rootPath = _roots$_i[1];\n\n          var a = Range.isRange(at) ? Range.intersection(at, Editor.range(editor, rootPath)) : at;\n\n          if (!a) {\n            continue;\n          }\n\n          var matches = Array.from(Editor.nodes(editor, {\n            at: a,\n            match: match,\n            mode: mode,\n            voids: voids\n          }));\n\n          if (matches.length > 0) {\n            var _ret = function () {\n              var _matches = _slicedToArray(matches, 1),\n                  first = _matches[0];\n\n              var last = matches[matches.length - 1];\n\n              var _first = _slicedToArray(first, 2),\n                  firstPath = _first[1];\n\n              var _last = _slicedToArray(last, 2),\n                  lastPath = _last[1];\n\n              if (firstPath.length === 0 && lastPath.length === 0) {\n                // if there's no matching parent - usually means the node is an editor - don't do anything\n                return \"continue\";\n              }\n\n              var commonPath = Path.equals(firstPath, lastPath) ? Path.parent(firstPath) : Path.common(firstPath, lastPath);\n              var range = Editor.range(editor, firstPath, lastPath);\n              var commonNodeEntry = Editor.node(editor, commonPath);\n\n              var _commonNodeEntry = _slicedToArray(commonNodeEntry, 1),\n                  commonNode = _commonNodeEntry[0];\n\n              var depth = commonPath.length + 1;\n              var wrapperPath = Path.next(lastPath.slice(0, depth));\n\n              var wrapper = _objectSpread$2(_objectSpread$2({}, element), {}, {\n                children: []\n              });\n\n              Transforms.insertNodes(editor, wrapper, {\n                at: wrapperPath,\n                voids: voids\n              });\n              Transforms.moveNodes(editor, {\n                at: range,\n                match: function match(n) {\n                  return Element$1.isAncestor(commonNode) && commonNode.children.includes(n);\n                },\n                to: wrapperPath.concat(0),\n                voids: voids\n              });\n            }();\n\n            if (_ret === \"continue\") continue;\n          }\n        }\n      });\n    }\n  };\n\n  var hasSingleChildNest = function hasSingleChildNest(editor, node) {\n    if (Element$1.isElement(node)) {\n      var element = node;\n\n      if (Editor.isVoid(editor, node)) {\n        return true;\n      } else if (element.children.length === 1) {\n        return hasSingleChildNest(editor, element.children[0]);\n      } else {\n        return false;\n      }\n    } else if (Editor.isEditor(node)) {\n      return false;\n    } else {\n      return true;\n    }\n  };\n  /**\n   * Convert a range into a point by deleting it's content.\n   */\n\n\n  var deleteRange = function deleteRange(editor, range) {\n    if (Range.isCollapsed(range)) {\n      return range.anchor;\n    } else {\n      var _Range$edges9 = Range.edges(range),\n          _Range$edges10 = _slicedToArray(_Range$edges9, 2),\n          end = _Range$edges10[1];\n\n      var pointRef = Editor.pointRef(editor, end);\n      Transforms[\"delete\"](editor, {\n        at: range\n      });\n      return pointRef.unref();\n    }\n  };\n\n  var matchPath = function matchPath(editor, path) {\n    var _Editor$node5 = Editor.node(editor, path),\n        _Editor$node6 = _slicedToArray(_Editor$node5, 1),\n        node = _Editor$node6[0];\n\n    return function (n) {\n      return n === node;\n    };\n  };\n\n  function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n  var SelectionTransforms = {\n    /**\n     * Collapse the selection.\n     */\n    collapse: function collapse(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var _options$edge = options.edge,\n          edge = _options$edge === void 0 ? 'anchor' : _options$edge;\n      var selection = editor.selection;\n\n      if (!selection) {\n        return;\n      } else if (edge === 'anchor') {\n        Transforms.select(editor, selection.anchor);\n      } else if (edge === 'focus') {\n        Transforms.select(editor, selection.focus);\n      } else if (edge === 'start') {\n        var _Range$edges = Range.edges(selection),\n            _Range$edges2 = _slicedToArray(_Range$edges, 1),\n            start = _Range$edges2[0];\n\n        Transforms.select(editor, start);\n      } else if (edge === 'end') {\n        var _Range$edges3 = Range.edges(selection),\n            _Range$edges4 = _slicedToArray(_Range$edges3, 2),\n            end = _Range$edges4[1];\n\n        Transforms.select(editor, end);\n      }\n    },\n\n    /**\n     * Unset the selection.\n     */\n    deselect: function deselect(editor) {\n      var selection = editor.selection;\n\n      if (selection) {\n        editor.apply({\n          type: 'set_selection',\n          properties: selection,\n          newProperties: null\n        });\n      }\n    },\n\n    /**\n     * Move the selection's point forward or backward.\n     */\n    move: function move(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var selection = editor.selection;\n      var _options$distance = options.distance,\n          distance = _options$distance === void 0 ? 1 : _options$distance,\n          _options$unit = options.unit,\n          unit = _options$unit === void 0 ? 'character' : _options$unit,\n          _options$reverse = options.reverse,\n          reverse = _options$reverse === void 0 ? false : _options$reverse;\n      var _options$edge2 = options.edge,\n          edge = _options$edge2 === void 0 ? null : _options$edge2;\n\n      if (!selection) {\n        return;\n      }\n\n      if (edge === 'start') {\n        edge = Range.isBackward(selection) ? 'focus' : 'anchor';\n      }\n\n      if (edge === 'end') {\n        edge = Range.isBackward(selection) ? 'anchor' : 'focus';\n      }\n\n      var anchor = selection.anchor,\n          focus = selection.focus;\n      var opts = {\n        distance: distance,\n        unit: unit\n      };\n      var props = {};\n\n      if (edge == null || edge === 'anchor') {\n        var point = reverse ? Editor.before(editor, anchor, opts) : Editor.after(editor, anchor, opts);\n\n        if (point) {\n          props.anchor = point;\n        }\n      }\n\n      if (edge == null || edge === 'focus') {\n        var _point = reverse ? Editor.before(editor, focus, opts) : Editor.after(editor, focus, opts);\n\n        if (_point) {\n          props.focus = _point;\n        }\n      }\n\n      Transforms.setSelection(editor, props);\n    },\n\n    /**\n     * Set the selection to a new value.\n     */\n    select: function select(editor, target) {\n      var selection = editor.selection;\n      target = Editor.range(editor, target);\n\n      if (selection) {\n        Transforms.setSelection(editor, target);\n        return;\n      }\n\n      if (!Range.isRange(target)) {\n        throw new Error(\"When setting the selection and the current selection is `null` you must provide at least an `anchor` and `focus`, but you passed: \".concat(JSON.stringify(target)));\n      }\n\n      editor.apply({\n        type: 'set_selection',\n        properties: selection,\n        newProperties: target\n      });\n    },\n\n    /**\n     * Set new properties on one of the selection's points.\n     */\n    setPoint: function setPoint(editor, props) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var selection = editor.selection;\n      var _options$edge3 = options.edge,\n          edge = _options$edge3 === void 0 ? 'both' : _options$edge3;\n\n      if (!selection) {\n        return;\n      }\n\n      if (edge === 'start') {\n        edge = Range.isBackward(selection) ? 'focus' : 'anchor';\n      }\n\n      if (edge === 'end') {\n        edge = Range.isBackward(selection) ? 'anchor' : 'focus';\n      }\n\n      var anchor = selection.anchor,\n          focus = selection.focus;\n      var point = edge === 'anchor' ? anchor : focus;\n      Transforms.setSelection(editor, _defineProperty({}, edge === 'anchor' ? 'anchor' : 'focus', _objectSpread$1(_objectSpread$1({}, point), props)));\n    },\n\n    /**\n     * Set new properties on the selection.\n     */\n    setSelection: function setSelection(editor, props) {\n      var selection = editor.selection;\n      var oldProps = {};\n      var newProps = {};\n\n      if (!selection) {\n        return;\n      }\n\n      for (var k in props) {\n        if (k === 'anchor' && props.anchor != null && !Point.equals(props.anchor, selection.anchor) || k === 'focus' && props.focus != null && !Point.equals(props.focus, selection.focus) || k !== 'anchor' && k !== 'focus' && props[k] !== selection[k]) {\n          oldProps[k] = selection[k];\n          newProps[k] = props[k];\n        }\n      }\n\n      if (Object.keys(oldProps).length > 0) {\n        editor.apply({\n          type: 'set_selection',\n          properties: oldProps,\n          newProperties: newProps\n        });\n      }\n    }\n  };\n\n  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\n  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\n  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n  var TextTransforms = {\n    /**\n     * Delete content in the editor.\n     */\n    \"delete\": function _delete(editor) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$reverse = options.reverse,\n            reverse = _options$reverse === void 0 ? false : _options$reverse,\n            _options$unit = options.unit,\n            unit = _options$unit === void 0 ? 'character' : _options$unit,\n            _options$distance = options.distance,\n            distance = _options$distance === void 0 ? 1 : _options$distance,\n            _options$voids = options.voids,\n            voids = _options$voids === void 0 ? false : _options$voids;\n        var _options$at = options.at,\n            at = _options$at === void 0 ? editor.selection : _options$at,\n            _options$hanging = options.hanging,\n            hanging = _options$hanging === void 0 ? false : _options$hanging;\n\n        if (!at) {\n          return;\n        }\n\n        if (Range.isRange(at) && Range.isCollapsed(at)) {\n          at = at.anchor;\n        }\n\n        if (Point.isPoint(at)) {\n          var furthestVoid = Editor[\"void\"](editor, {\n            at: at,\n            mode: 'highest'\n          });\n\n          if (!voids && furthestVoid) {\n            var _furthestVoid = _slicedToArray(furthestVoid, 2),\n                voidPath = _furthestVoid[1];\n\n            at = voidPath;\n          } else {\n            var opts = {\n              unit: unit,\n              distance: distance\n            };\n            var target = reverse ? Editor.before(editor, at, opts) || Editor.start(editor, []) : Editor.after(editor, at, opts) || Editor.end(editor, []);\n            at = {\n              anchor: at,\n              focus: target\n            };\n            hanging = true;\n          }\n        }\n\n        if (Path.isPath(at)) {\n          Transforms.removeNodes(editor, {\n            at: at,\n            voids: voids\n          });\n          return;\n        }\n\n        if (Range.isCollapsed(at)) {\n          return;\n        }\n\n        if (!hanging) {\n          var _Range$edges = Range.edges(at),\n              _Range$edges2 = _slicedToArray(_Range$edges, 2),\n              _end = _Range$edges2[1];\n\n          var endOfDoc = Editor.end(editor, []);\n\n          if (!Point.equals(_end, endOfDoc)) {\n            at = Editor.unhangRange(editor, at, {\n              voids: voids\n            });\n          }\n        }\n\n        var _Range$edges3 = Range.edges(at),\n            _Range$edges4 = _slicedToArray(_Range$edges3, 2),\n            start = _Range$edges4[0],\n            end = _Range$edges4[1];\n\n        var startBlock = Editor.above(editor, {\n          match: function match(n) {\n            return Editor.isBlock(editor, n);\n          },\n          at: start,\n          voids: voids\n        });\n        var endBlock = Editor.above(editor, {\n          match: function match(n) {\n            return Editor.isBlock(editor, n);\n          },\n          at: end,\n          voids: voids\n        });\n        var isAcrossBlocks = startBlock && endBlock && !Path.equals(startBlock[1], endBlock[1]);\n        var isSingleText = Path.equals(start.path, end.path);\n        var startVoid = voids ? null : Editor[\"void\"](editor, {\n          at: start,\n          mode: 'highest'\n        });\n        var endVoid = voids ? null : Editor[\"void\"](editor, {\n          at: end,\n          mode: 'highest'\n        }); // If the start or end points are inside an inline void, nudge them out.\n\n        if (startVoid) {\n          var before = Editor.before(editor, start);\n\n          if (before && startBlock && Path.isAncestor(startBlock[1], before.path)) {\n            start = before;\n          }\n        }\n\n        if (endVoid) {\n          var after = Editor.after(editor, end);\n\n          if (after && endBlock && Path.isAncestor(endBlock[1], after.path)) {\n            end = after;\n          }\n        } // Get the highest nodes that are completely inside the range, as well as\n        // the start and end nodes.\n\n\n        var matches = [];\n        var lastPath;\n\n        var _iterator = _createForOfIteratorHelper(Editor.nodes(editor, {\n          at: at,\n          voids: voids\n        })),\n            _step;\n\n        try {\n          for (_iterator.s(); !(_step = _iterator.n()).done;) {\n            var entry = _step.value;\n\n            var _entry = _slicedToArray(entry, 2),\n                _node2 = _entry[0],\n                _path3 = _entry[1];\n\n            if (lastPath && Path.compare(_path3, lastPath) === 0) {\n              continue;\n            }\n\n            if (!voids && Editor.isVoid(editor, _node2) || !Path.isCommon(_path3, start.path) && !Path.isCommon(_path3, end.path)) {\n              matches.push(entry);\n              lastPath = _path3;\n            }\n          }\n        } catch (err) {\n          _iterator.e(err);\n        } finally {\n          _iterator.f();\n        }\n\n        var pathRefs = Array.from(matches, function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              p = _ref2[1];\n\n          return Editor.pathRef(editor, p);\n        });\n        var startRef = Editor.pointRef(editor, start);\n        var endRef = Editor.pointRef(editor, end);\n\n        if (!isSingleText && !startVoid) {\n          var _point = startRef.current;\n\n          var _Editor$leaf = Editor.leaf(editor, _point),\n              _Editor$leaf2 = _slicedToArray(_Editor$leaf, 1),\n              node = _Editor$leaf2[0];\n\n          var path = _point.path;\n          var _start = start,\n              offset = _start.offset;\n          var text = node.text.slice(offset);\n          if (text.length > 0) editor.apply({\n            type: 'remove_text',\n            path: path,\n            offset: offset,\n            text: text\n          });\n        }\n\n        for (var _i = 0, _pathRefs = pathRefs; _i < _pathRefs.length; _i++) {\n          var pathRef = _pathRefs[_i];\n\n          var _path = pathRef.unref();\n\n          Transforms.removeNodes(editor, {\n            at: _path,\n            voids: voids\n          });\n        }\n\n        if (!endVoid) {\n          var _point2 = endRef.current;\n\n          var _Editor$leaf3 = Editor.leaf(editor, _point2),\n              _Editor$leaf4 = _slicedToArray(_Editor$leaf3, 1),\n              _node = _Editor$leaf4[0];\n\n          var _path2 = _point2.path;\n\n          var _offset = isSingleText ? start.offset : 0;\n\n          var _text = _node.text.slice(_offset, end.offset);\n\n          if (_text.length > 0) editor.apply({\n            type: 'remove_text',\n            path: _path2,\n            offset: _offset,\n            text: _text\n          });\n        }\n\n        if (!isSingleText && isAcrossBlocks && endRef.current && startRef.current) {\n          Transforms.mergeNodes(editor, {\n            at: endRef.current,\n            hanging: true,\n            voids: voids\n          });\n        }\n\n        var point = reverse ? startRef.unref() || endRef.unref() : endRef.unref() || startRef.unref();\n\n        if (options.at == null && point) {\n          Transforms.select(editor, point);\n        }\n      });\n    },\n\n    /**\n     * Insert a fragment at a specific location in the editor.\n     */\n    insertFragment: function insertFragment(editor, fragment) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$hanging2 = options.hanging,\n            hanging = _options$hanging2 === void 0 ? false : _options$hanging2,\n            _options$voids2 = options.voids,\n            voids = _options$voids2 === void 0 ? false : _options$voids2;\n        var _options$at2 = options.at,\n            at = _options$at2 === void 0 ? editor.selection : _options$at2;\n\n        if (!fragment.length) {\n          return;\n        }\n\n        if (!at) {\n          return;\n        } else if (Range.isRange(at)) {\n          if (!hanging) {\n            at = Editor.unhangRange(editor, at);\n          }\n\n          if (Range.isCollapsed(at)) {\n            at = at.anchor;\n          } else {\n            var _Range$edges5 = Range.edges(at),\n                _Range$edges6 = _slicedToArray(_Range$edges5, 2),\n                end = _Range$edges6[1];\n\n            if (!voids && Editor[\"void\"](editor, {\n              at: end\n            })) {\n              return;\n            }\n\n            var pointRef = Editor.pointRef(editor, end);\n            Transforms[\"delete\"](editor, {\n              at: at\n            });\n            at = pointRef.unref();\n          }\n        } else if (Path.isPath(at)) {\n          at = Editor.start(editor, at);\n        }\n\n        if (!voids && Editor[\"void\"](editor, {\n          at: at\n        })) {\n          return;\n        } // If the insert point is at the edge of an inline node, move it outside\n        // instead since it will need to be split otherwise.\n\n\n        var inlineElementMatch = Editor.above(editor, {\n          at: at,\n          match: function match(n) {\n            return Editor.isInline(editor, n);\n          },\n          mode: 'highest',\n          voids: voids\n        });\n\n        if (inlineElementMatch) {\n          var _inlineElementMatch = _slicedToArray(inlineElementMatch, 2),\n              _inlinePath = _inlineElementMatch[1];\n\n          if (Editor.isEnd(editor, at, _inlinePath)) {\n            var after = Editor.after(editor, _inlinePath);\n            at = after;\n          } else if (Editor.isStart(editor, at, _inlinePath)) {\n            var before = Editor.before(editor, _inlinePath);\n            at = before;\n          }\n        }\n\n        var blockMatch = Editor.above(editor, {\n          match: function match(n) {\n            return Editor.isBlock(editor, n);\n          },\n          at: at,\n          voids: voids\n        });\n\n        var _blockMatch = _slicedToArray(blockMatch, 2),\n            blockPath = _blockMatch[1];\n\n        var isBlockStart = Editor.isStart(editor, at, blockPath);\n        var isBlockEnd = Editor.isEnd(editor, at, blockPath);\n        var isBlockEmpty = isBlockStart && isBlockEnd;\n        var mergeStart = !isBlockStart || isBlockStart && isBlockEnd;\n        var mergeEnd = !isBlockEnd;\n\n        var _Node$first = Node$1.first({\n          children: fragment\n        }, []),\n            _Node$first2 = _slicedToArray(_Node$first, 2),\n            firstPath = _Node$first2[1];\n\n        var _Node$last = Node$1.last({\n          children: fragment\n        }, []),\n            _Node$last2 = _slicedToArray(_Node$last, 2),\n            lastPath = _Node$last2[1];\n\n        var matches = [];\n\n        var matcher = function matcher(_ref3) {\n          var _ref4 = _slicedToArray(_ref3, 2),\n              n = _ref4[0],\n              p = _ref4[1];\n\n          var isRoot = p.length === 0;\n\n          if (isRoot) {\n            return false;\n          }\n\n          if (isBlockEmpty) {\n            return true;\n          }\n\n          if (mergeStart && Path.isAncestor(p, firstPath) && Element$1.isElement(n) && !editor.isVoid(n) && !editor.isInline(n)) {\n            return false;\n          }\n\n          if (mergeEnd && Path.isAncestor(p, lastPath) && Element$1.isElement(n) && !editor.isVoid(n) && !editor.isInline(n)) {\n            return false;\n          }\n\n          return true;\n        };\n\n        var _iterator2 = _createForOfIteratorHelper(Node$1.nodes({\n          children: fragment\n        }, {\n          pass: matcher\n        })),\n            _step2;\n\n        try {\n          for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n            var entry = _step2.value;\n\n            if (matcher(entry)) {\n              matches.push(entry);\n            }\n          }\n        } catch (err) {\n          _iterator2.e(err);\n        } finally {\n          _iterator2.f();\n        }\n\n        var starts = [];\n        var middles = [];\n        var ends = [];\n        var starting = true;\n        var hasBlocks = false;\n\n        for (var _i2 = 0, _matches = matches; _i2 < _matches.length; _i2++) {\n          var _matches$_i = _slicedToArray(_matches[_i2], 1),\n              node = _matches$_i[0];\n\n          if (Element$1.isElement(node) && !editor.isInline(node)) {\n            starting = false;\n            hasBlocks = true;\n            middles.push(node);\n          } else if (starting) {\n            starts.push(node);\n          } else {\n            ends.push(node);\n          }\n        }\n\n        var _Editor$nodes = Editor.nodes(editor, {\n          at: at,\n          match: function match(n) {\n            return Text.isText(n) || Editor.isInline(editor, n);\n          },\n          mode: 'highest',\n          voids: voids\n        }),\n            _Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),\n            inlineMatch = _Editor$nodes2[0];\n\n        var _inlineMatch = _slicedToArray(inlineMatch, 2),\n            inlinePath = _inlineMatch[1];\n\n        var isInlineStart = Editor.isStart(editor, at, inlinePath);\n        var isInlineEnd = Editor.isEnd(editor, at, inlinePath);\n        var middleRef = Editor.pathRef(editor, isBlockEnd ? Path.next(blockPath) : blockPath);\n        var endRef = Editor.pathRef(editor, isInlineEnd ? Path.next(inlinePath) : inlinePath);\n        var blockPathRef = Editor.pathRef(editor, blockPath);\n        Transforms.splitNodes(editor, {\n          at: at,\n          match: function match(n) {\n            return hasBlocks ? Editor.isBlock(editor, n) : Text.isText(n) || Editor.isInline(editor, n);\n          },\n          mode: hasBlocks ? 'lowest' : 'highest',\n          voids: voids\n        });\n        var startRef = Editor.pathRef(editor, !isInlineStart || isInlineStart && isInlineEnd ? Path.next(inlinePath) : inlinePath);\n        Transforms.insertNodes(editor, starts, {\n          at: startRef.current,\n          match: function match(n) {\n            return Text.isText(n) || Editor.isInline(editor, n);\n          },\n          mode: 'highest',\n          voids: voids\n        });\n\n        if (isBlockEmpty && middles.length) {\n          Transforms[\"delete\"](editor, {\n            at: blockPathRef.unref(),\n            voids: voids\n          });\n        }\n\n        Transforms.insertNodes(editor, middles, {\n          at: middleRef.current,\n          match: function match(n) {\n            return Editor.isBlock(editor, n);\n          },\n          mode: 'lowest',\n          voids: voids\n        });\n        Transforms.insertNodes(editor, ends, {\n          at: endRef.current,\n          match: function match(n) {\n            return Text.isText(n) || Editor.isInline(editor, n);\n          },\n          mode: 'highest',\n          voids: voids\n        });\n\n        if (!options.at) {\n          var path;\n\n          if (ends.length > 0) {\n            path = Path.previous(endRef.current);\n          } else if (middles.length > 0) {\n            path = Path.previous(middleRef.current);\n          } else {\n            path = Path.previous(startRef.current);\n          }\n\n          var _end2 = Editor.end(editor, path);\n\n          Transforms.select(editor, _end2);\n        }\n\n        startRef.unref();\n        middleRef.unref();\n        endRef.unref();\n      });\n    },\n\n    /**\n     * Insert a string of text in the Editor.\n     */\n    insertText: function insertText(editor, text) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      Editor.withoutNormalizing(editor, function () {\n        var _options$voids3 = options.voids,\n            voids = _options$voids3 === void 0 ? false : _options$voids3;\n        var _options$at3 = options.at,\n            at = _options$at3 === void 0 ? editor.selection : _options$at3;\n\n        if (!at) {\n          return;\n        }\n\n        if (Path.isPath(at)) {\n          at = Editor.range(editor, at);\n        }\n\n        if (Range.isRange(at)) {\n          if (Range.isCollapsed(at)) {\n            at = at.anchor;\n          } else {\n            var end = Range.end(at);\n\n            if (!voids && Editor[\"void\"](editor, {\n              at: end\n            })) {\n              return;\n            }\n\n            var pointRef = Editor.pointRef(editor, end);\n            Transforms[\"delete\"](editor, {\n              at: at,\n              voids: voids\n            });\n            at = pointRef.unref();\n            Transforms.setSelection(editor, {\n              anchor: at,\n              focus: at\n            });\n          }\n        }\n\n        if (!voids && Editor[\"void\"](editor, {\n          at: at\n        })) {\n          return;\n        }\n\n        var _at = at,\n            path = _at.path,\n            offset = _at.offset;\n        if (text.length > 0) editor.apply({\n          type: 'insert_text',\n          path: path,\n          offset: offset,\n          text: text\n        });\n      });\n    }\n  };\n\n  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\n  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n  var Transforms = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, GeneralTransforms), NodeTransforms), SelectionTransforms), TextTransforms);\n\n  var Editor_1 = Editor;\n  var Element_1 = Element$1;\n  var Location_1 = Location;\n  var Node_1 = Node$1;\n  var Operation_1 = Operation;\n  var Path_1 = Path;\n  var PathRef_1 = PathRef;\n  var Point_1 = Point;\n  var PointRef_1 = PointRef;\n  var Range_1 = Range;\n  var RangeRef_1 = RangeRef;\n  var Span_1 = Span;\n  var Text_1 = Text;\n  var Transforms_1 = Transforms;\n  var createEditor_1 = createEditor$1;\n\n\n  var dist$7 = /*#__PURE__*/Object.defineProperty({\n  \tEditor: Editor_1,\n  \tElement: Element_1,\n  \tLocation: Location_1,\n  \tNode: Node_1,\n  \tOperation: Operation_1,\n  \tPath: Path_1,\n  \tPathRef: PathRef_1,\n  \tPoint: Point_1,\n  \tPointRef: PointRef_1,\n  \tRange: Range_1,\n  \tRangeRef: RangeRef_1,\n  \tSpan: Span_1,\n  \tText: Text_1,\n  \tTransforms: Transforms_1,\n  \tcreateEditor: createEditor_1\n  }, '__esModule', {value: true});\n\n  /**\n   * lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n\n  /** Used as references for various `Number` constants. */\n  var MAX_SAFE_INTEGER$1 = 9007199254740991;\n\n  /** `Object#toString` result references. */\n  var argsTag$1 = '[object Arguments]',\n      funcTag$1 = '[object Function]',\n      genTag$1 = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      weakMapTag = '[object WeakMap]';\n\n  var dataViewTag = '[object DataView]';\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint$1 = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange$1 = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange$1 = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n      rsComboSymbolsRange$1 = '\\\\u20d0-\\\\u20f0',\n      rsVarRange$1 = '\\\\ufe0e\\\\ufe0f';\n\n  /** Used to compose unicode capture groups. */\n  var rsAstral$1 = '[' + rsAstralRange$1 + ']',\n      rsCombo$1 = '[' + rsComboMarksRange$1 + rsComboSymbolsRange$1 + ']',\n      rsFitz$1 = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier$1 = '(?:' + rsCombo$1 + '|' + rsFitz$1 + ')',\n      rsNonAstral$1 = '[^' + rsAstralRange$1 + ']',\n      rsRegional$1 = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair$1 = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsZWJ$1 = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var reOptMod$1 = rsModifier$1 + '?',\n      rsOptVar$1 = '[' + rsVarRange$1 + ']?',\n      rsOptJoin$1 = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral$1, rsRegional$1, rsSurrPair$1].join('|') + ')' + rsOptVar$1 + reOptMod$1 + ')*',\n      rsSeq$1 = rsOptVar$1 + reOptMod$1 + rsOptJoin$1,\n      rsSymbol$1 = '(?:' + [rsNonAstral$1 + rsCombo$1 + '?', rsCombo$1, rsRegional$1, rsSurrPair$1, rsAstral$1].join('|') + ')';\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode$1 = RegExp(rsFitz$1 + '(?=' + rsFitz$1 + ')|' + rsSymbol$1 + rsSeq$1, 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode$1 = RegExp('[' + rsZWJ$1 + rsAstralRange$1  + rsComboMarksRange$1 + rsComboSymbolsRange$1 + rsVarRange$1 + ']');\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal$3 = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n  /** Detect free variable `self`. */\n  var freeSelf$3 = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root$3 = freeGlobal$3 || freeSelf$3 || Function('return this')();\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array ? array.length : 0,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray$1(string) {\n    return string.split('');\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes$1(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode$1(string) {\n    return reHasUnicode$1.test(string);\n  }\n\n  /**\n   * Checks if `value` is a host object in IE < 9.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n   */\n  function isHostObject(value) {\n    // Many host objects are `Object` objects that can coerce to strings\n    // despite having improperly defined `toString` methods.\n    var result = false;\n    if (value != null && typeof value.toString != 'function') {\n      try {\n        result = !!(value + '');\n      } catch (e) {}\n    }\n    return result;\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg$1(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray$1(string) {\n    return hasUnicode$1(string)\n      ? unicodeToArray$1(string)\n      : asciiToArray$1(string);\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray$1(string) {\n    return string.match(reUnicode$1) || [];\n  }\n\n  /** Used for built-in method references. */\n  var funcProto = Function.prototype,\n      objectProto$4 = Object.prototype;\n\n  /** Used to detect overreaching core-js shims. */\n  var coreJsData = root$3['__core-js_shared__'];\n\n  /** Used to detect methods masquerading as native. */\n  var maskSrcKey = (function() {\n    var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n    return uid ? ('Symbol(src)_1.' + uid) : '';\n  }());\n\n  /** Used to resolve the decompiled source of functions. */\n  var funcToString = funcProto.toString;\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$2 = objectProto$4.hasOwnProperty;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var objectToString$4 = objectProto$4.toString;\n\n  /** Used to detect if a method is native. */\n  var reIsNative = RegExp('^' +\n    funcToString.call(hasOwnProperty$2).replace(reRegExpChar, '\\\\$&')\n    .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n  );\n\n  /** Built-in value references. */\n  var Symbol$2 = root$3.Symbol,\n      iteratorSymbol = Symbol$2 ? Symbol$2.iterator : undefined,\n      propertyIsEnumerable$1 = objectProto$4.propertyIsEnumerable;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeKeys$1 = overArg$1(Object.keys, Object);\n\n  /* Built-in method references that are verified to be native. */\n  var DataView = getNative(root$3, 'DataView'),\n      Map$1 = getNative(root$3, 'Map'),\n      Promise$1 = getNative(root$3, 'Promise'),\n      Set$1 = getNative(root$3, 'Set'),\n      WeakMap$1 = getNative(root$3, 'WeakMap');\n\n  /** Used to detect maps, sets, and weakmaps. */\n  var dataViewCtorString = toSource(DataView),\n      mapCtorString = toSource(Map$1),\n      promiseCtorString = toSource(Promise$1),\n      setCtorString = toSource(Set$1),\n      weakMapCtorString = toSource(WeakMap$1);\n\n  /**\n   * Creates an array of the enumerable property names of the array-like `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @param {boolean} inherited Specify returning inherited property names.\n   * @returns {Array} Returns the array of property names.\n   */\n  function arrayLikeKeys$1(value, inherited) {\n    // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n    // Safari 9 makes `arguments.length` enumerable in strict mode.\n    var result = (isArray$1(value) || isArguments$1(value))\n      ? baseTimes$1(value.length, String)\n      : [];\n\n    var length = result.length,\n        skipIndexes = !!length;\n\n    for (var key in value) {\n      if ((inherited || hasOwnProperty$2.call(value, key)) &&\n          !(skipIndexes && (key == 'length' || isIndex$1(key, length)))) {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `getTag`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  function baseGetTag(value) {\n    return objectToString$4.call(value);\n  }\n\n  /**\n   * The base implementation of `_.isNative` without bad shim checks.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a native function,\n   *  else `false`.\n   */\n  function baseIsNative(value) {\n    if (!isObject$3(value) || isMasked(value)) {\n      return false;\n    }\n    var pattern = (isFunction$1(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n    return pattern.test(toSource(value));\n  }\n\n  /**\n   * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function baseKeys$1(object) {\n    if (!isPrototype$1(object)) {\n      return nativeKeys$1(object);\n    }\n    var result = [];\n    for (var key in Object(object)) {\n      if (hasOwnProperty$2.call(object, key) && key != 'constructor') {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Copies the values of `source` to `array`.\n   *\n   * @private\n   * @param {Array} source The array to copy values from.\n   * @param {Array} [array=[]] The array to copy values to.\n   * @returns {Array} Returns `array`.\n   */\n  function copyArray(source, array) {\n    var index = -1,\n        length = source.length;\n\n    array || (array = Array(length));\n    while (++index < length) {\n      array[index] = source[index];\n    }\n    return array;\n  }\n\n  /**\n   * Gets the native function at `key` of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {string} key The key of the method to get.\n   * @returns {*} Returns the function if it's native, else `undefined`.\n   */\n  function getNative(object, key) {\n    var value = getValue(object, key);\n    return baseIsNative(value) ? value : undefined;\n  }\n\n  /**\n   * Gets the `toStringTag` of `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  var getTag = baseGetTag;\n\n  // Fallback for data views, maps, sets, and weak maps in IE 11,\n  // for data views in Edge < 14, and promises in Node.js.\n  if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n      (Map$1 && getTag(new Map$1) != mapTag) ||\n      (Promise$1 && getTag(Promise$1.resolve()) != promiseTag) ||\n      (Set$1 && getTag(new Set$1) != setTag) ||\n      (WeakMap$1 && getTag(new WeakMap$1) != weakMapTag)) {\n    getTag = function(value) {\n      var result = objectToString$4.call(value),\n          Ctor = result == objectTag ? value.constructor : undefined,\n          ctorString = Ctor ? toSource(Ctor) : undefined;\n\n      if (ctorString) {\n        switch (ctorString) {\n          case dataViewCtorString: return dataViewTag;\n          case mapCtorString: return mapTag;\n          case promiseCtorString: return promiseTag;\n          case setCtorString: return setTag;\n          case weakMapCtorString: return weakMapTag;\n        }\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Checks if `value` is a valid array-like index.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n   */\n  function isIndex$1(value, length) {\n    length = length == null ? MAX_SAFE_INTEGER$1 : length;\n    return !!length &&\n      (typeof value == 'number' || reIsUint$1.test(value)) &&\n      (value > -1 && value % 1 == 0 && value < length);\n  }\n\n  /**\n   * Checks if `func` has its source masked.\n   *\n   * @private\n   * @param {Function} func The function to check.\n   * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n   */\n  function isMasked(func) {\n    return !!maskSrcKey && (maskSrcKey in func);\n  }\n\n  /**\n   * Checks if `value` is likely a prototype object.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n   */\n  function isPrototype$1(value) {\n    var Ctor = value && value.constructor,\n        proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$4;\n\n    return value === proto;\n  }\n\n  /**\n   * Converts `func` to its source code.\n   *\n   * @private\n   * @param {Function} func The function to process.\n   * @returns {string} Returns the source code.\n   */\n  function toSource(func) {\n    if (func != null) {\n      try {\n        return funcToString.call(func);\n      } catch (e) {}\n      try {\n        return (func + '');\n      } catch (e) {}\n    }\n    return '';\n  }\n\n  /**\n   * Checks if `value` is likely an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArguments(function() { return arguments; }());\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  function isArguments$1(value) {\n    // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n    return isArrayLikeObject$1(value) && hasOwnProperty$2.call(value, 'callee') &&\n      (!propertyIsEnumerable$1.call(value, 'callee') || objectToString$4.call(value) == argsTag$1);\n  }\n\n  /**\n   * Checks if `value` is classified as an `Array` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n   * @example\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   *\n   * _.isArray(document.body.children);\n   * // => false\n   *\n   * _.isArray('abc');\n   * // => false\n   *\n   * _.isArray(_.noop);\n   * // => false\n   */\n  var isArray$1 = Array.isArray;\n\n  /**\n   * Checks if `value` is array-like. A value is considered array-like if it's\n   * not a function and has a `value.length` that's an integer greater than or\n   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n   * @example\n   *\n   * _.isArrayLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLike(document.body.children);\n   * // => true\n   *\n   * _.isArrayLike('abc');\n   * // => true\n   *\n   * _.isArrayLike(_.noop);\n   * // => false\n   */\n  function isArrayLike$1(value) {\n    return value != null && isLength$1(value.length) && !isFunction$1(value);\n  }\n\n  /**\n   * This method is like `_.isArrayLike` except that it also checks if `value`\n   * is an object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array-like object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArrayLikeObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLikeObject(document.body.children);\n   * // => true\n   *\n   * _.isArrayLikeObject('abc');\n   * // => false\n   *\n   * _.isArrayLikeObject(_.noop);\n   * // => false\n   */\n  function isArrayLikeObject$1(value) {\n    return isObjectLike$4(value) && isArrayLike$1(value);\n  }\n\n  /**\n   * Checks if `value` is classified as a `Function` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   *\n   * _.isFunction(/abc/);\n   * // => false\n   */\n  function isFunction$1(value) {\n    // The use of `Object#toString` avoids issues with the `typeof` operator\n    // in Safari 8-9 which returns 'object' for typed array and other constructors.\n    var tag = isObject$3(value) ? objectToString$4.call(value) : '';\n    return tag == funcTag$1 || tag == genTag$1;\n  }\n\n  /**\n   * Checks if `value` is a valid array-like length.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n   * @example\n   *\n   * _.isLength(3);\n   * // => true\n   *\n   * _.isLength(Number.MIN_VALUE);\n   * // => false\n   *\n   * _.isLength(Infinity);\n   * // => false\n   *\n   * _.isLength('3');\n   * // => false\n   */\n  function isLength$1(value) {\n    return typeof value == 'number' &&\n      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject$3(value) {\n    var type = typeof value;\n    return !!value && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike$4(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Checks if `value` is classified as a `String` primitive or object.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n   * @example\n   *\n   * _.isString('abc');\n   * // => true\n   *\n   * _.isString(1);\n   * // => false\n   */\n  function isString(value) {\n    return typeof value == 'string' ||\n      (!isArray$1(value) && isObjectLike$4(value) && objectToString$4.call(value) == stringTag);\n  }\n\n  /**\n   * Converts `value` to an array.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {Array} Returns the converted array.\n   * @example\n   *\n   * _.toArray({ 'a': 1, 'b': 2 });\n   * // => [1, 2]\n   *\n   * _.toArray('abc');\n   * // => ['a', 'b', 'c']\n   *\n   * _.toArray(1);\n   * // => []\n   *\n   * _.toArray(null);\n   * // => []\n   */\n  function toArray(value) {\n    if (!value) {\n      return [];\n    }\n    if (isArrayLike$1(value)) {\n      return isString(value) ? stringToArray$1(value) : copyArray(value);\n    }\n    if (iteratorSymbol && value[iteratorSymbol]) {\n      return iteratorToArray(value[iteratorSymbol]());\n    }\n    var tag = getTag(value),\n        func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n    return func(value);\n  }\n\n  /**\n   * Creates an array of the own enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects. See the\n   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * for more details.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keys(new Foo);\n   * // => ['a', 'b'] (iteration order is not guaranteed)\n   *\n   * _.keys('hi');\n   * // => ['0', '1']\n   */\n  function keys$1(object) {\n    return isArrayLike$1(object) ? arrayLikeKeys$1(object) : baseKeys$1(object);\n  }\n\n  /**\n   * Creates an array of the own enumerable string keyed property values of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property values.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.values(new Foo);\n   * // => [1, 2] (iteration order is not guaranteed)\n   *\n   * _.values('hi');\n   * // => ['h', 'i']\n   */\n  function values(object) {\n    return object ? baseValues(object, keys$1(object)) : [];\n  }\n\n  var lodash_toarray = toArray;\n\n  /**\n   * SSR Window 3.0.0\n   * Better handling for window object in SSR environment\n   * https://github.com/nolimits4web/ssr-window\n   *\n   * Copyright 2020, Vladimir Kharlampidi\n   *\n   * Licensed under MIT\n   *\n   * Released on: November 9, 2020\n   */\n\n  var ssrWindow_umd = createCommonjsModule$1(function (module, exports) {\n  (function (global, factory) {\n      factory(exports) ;\n  }(commonjsGlobal, (function (exports) {\n      /* eslint-disable no-param-reassign */\n      function isObject(obj) {\n          return (obj !== null &&\n              typeof obj === 'object' &&\n              'constructor' in obj &&\n              obj.constructor === Object);\n      }\n      function extend(target, src) {\n          if (target === void 0) { target = {}; }\n          if (src === void 0) { src = {}; }\n          Object.keys(src).forEach(function (key) {\n              if (typeof target[key] === 'undefined')\n                  target[key] = src[key];\n              else if (isObject(src[key]) &&\n                  isObject(target[key]) &&\n                  Object.keys(src[key]).length > 0) {\n                  extend(target[key], src[key]);\n              }\n          });\n      }\n\n      var ssrDocument = {\n          body: {},\n          addEventListener: function () { },\n          removeEventListener: function () { },\n          activeElement: {\n              blur: function () { },\n              nodeName: '',\n          },\n          querySelector: function () {\n              return null;\n          },\n          querySelectorAll: function () {\n              return [];\n          },\n          getElementById: function () {\n              return null;\n          },\n          createEvent: function () {\n              return {\n                  initEvent: function () { },\n              };\n          },\n          createElement: function () {\n              return {\n                  children: [],\n                  childNodes: [],\n                  style: {},\n                  setAttribute: function () { },\n                  getElementsByTagName: function () {\n                      return [];\n                  },\n              };\n          },\n          createElementNS: function () {\n              return {};\n          },\n          importNode: function () {\n              return null;\n          },\n          location: {\n              hash: '',\n              host: '',\n              hostname: '',\n              href: '',\n              origin: '',\n              pathname: '',\n              protocol: '',\n              search: '',\n          },\n      };\n      function getDocument() {\n          var doc = typeof document !== 'undefined' ? document : {};\n          extend(doc, ssrDocument);\n          return doc;\n      }\n\n      var ssrWindow = {\n          document: ssrDocument,\n          navigator: {\n              userAgent: '',\n          },\n          location: {\n              hash: '',\n              host: '',\n              hostname: '',\n              href: '',\n              origin: '',\n              pathname: '',\n              protocol: '',\n              search: '',\n          },\n          history: {\n              replaceState: function () { },\n              pushState: function () { },\n              go: function () { },\n              back: function () { },\n          },\n          CustomEvent: function CustomEvent() {\n              return this;\n          },\n          addEventListener: function () { },\n          removeEventListener: function () { },\n          getComputedStyle: function () {\n              return {\n                  getPropertyValue: function () {\n                      return '';\n                  },\n              };\n          },\n          Image: function () { },\n          Date: function () { },\n          screen: {},\n          setTimeout: function () { },\n          clearTimeout: function () { },\n          matchMedia: function () {\n              return {};\n          },\n          requestAnimationFrame: function (callback) {\n              if (typeof setTimeout === 'undefined') {\n                  callback();\n                  return null;\n              }\n              return setTimeout(callback, 0);\n          },\n          cancelAnimationFrame: function (id) {\n              if (typeof setTimeout === 'undefined') {\n                  return;\n              }\n              clearTimeout(id);\n          },\n      };\n      function getWindow() {\n          var win = typeof window !== 'undefined' ? window : {};\n          extend(win, ssrWindow);\n          return win;\n      }\n\n      exports.extend = extend;\n      exports.getDocument = getDocument;\n      exports.getWindow = getWindow;\n      exports.ssrDocument = ssrDocument;\n      exports.ssrWindow = ssrWindow;\n\n      Object.defineProperty(exports, '__esModule', { value: true });\n\n  })));\n\n  });\n\n  /**\n   * Dom7 3.0.0\n   * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n   * https://framework7.io/docs/dom7.html\n   *\n   * Copyright 2020, Vladimir Kharlampidi\n   *\n   * Licensed under MIT\n   *\n   * Released on: November 9, 2020\n   */\n\n\n\n\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  function _getPrototypeOf(o) {\n    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n      return o.__proto__ || Object.getPrototypeOf(o);\n    };\n    return _getPrototypeOf(o);\n  }\n\n  function _setPrototypeOf(o, p) {\n    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n      o.__proto__ = p;\n      return o;\n    };\n\n    return _setPrototypeOf(o, p);\n  }\n\n  function _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n\n    try {\n      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  function _construct(Parent, args, Class) {\n    if (_isNativeReflectConstruct()) {\n      _construct = Reflect.construct;\n    } else {\n      _construct = function _construct(Parent, args, Class) {\n        var a = [null];\n        a.push.apply(a, args);\n        var Constructor = Function.bind.apply(Parent, a);\n        var instance = new Constructor();\n        if (Class) _setPrototypeOf(instance, Class.prototype);\n        return instance;\n      };\n    }\n\n    return _construct.apply(null, arguments);\n  }\n\n  function _isNativeFunction(fn) {\n    return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n  }\n\n  function _wrapNativeSuper(Class) {\n    var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n    _wrapNativeSuper = function _wrapNativeSuper(Class) {\n      if (Class === null || !_isNativeFunction(Class)) return Class;\n\n      if (typeof Class !== \"function\") {\n        throw new TypeError(\"Super expression must either be null or a function\");\n      }\n\n      if (typeof _cache !== \"undefined\") {\n        if (_cache.has(Class)) return _cache.get(Class);\n\n        _cache.set(Class, Wrapper);\n      }\n\n      function Wrapper() {\n        return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n      }\n\n      Wrapper.prototype = Object.create(Class.prototype, {\n        constructor: {\n          value: Wrapper,\n          enumerable: false,\n          writable: true,\n          configurable: true\n        }\n      });\n      return _setPrototypeOf(Wrapper, Class);\n    };\n\n    return _wrapNativeSuper(Class);\n  }\n\n  function _assertThisInitialized(self) {\n    if (self === void 0) {\n      throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n    }\n\n    return self;\n  }\n\n  /* eslint-disable no-proto */\n  function makeReactive(obj) {\n    var proto = obj.__proto__;\n    Object.defineProperty(obj, '__proto__', {\n      get: function get() {\n        return proto;\n      },\n      set: function set(value) {\n        proto.__proto__ = value;\n      }\n    });\n  }\n\n  var Dom7 = /*#__PURE__*/function (_Array) {\n    _inheritsLoose(Dom7, _Array);\n\n    function Dom7(items) {\n      var _this;\n\n      _this = _Array.call.apply(_Array, [this].concat(items)) || this;\n      makeReactive(_assertThisInitialized(_this));\n      return _this;\n    }\n\n    return Dom7;\n  }( /*#__PURE__*/_wrapNativeSuper(Array));\n\n  function arrayFlat(arr) {\n    if (arr === void 0) {\n      arr = [];\n    }\n\n    var res = [];\n    arr.forEach(function (el) {\n      if (Array.isArray(el)) {\n        res.push.apply(res, arrayFlat(el));\n      } else {\n        res.push(el);\n      }\n    });\n    return res;\n  }\n  function arrayFilter(arr, callback) {\n    return Array.prototype.filter.call(arr, callback);\n  }\n  function arrayUnique(arr) {\n    var uniqueArray = [];\n\n    for (var i = 0; i < arr.length; i += 1) {\n      if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n    }\n\n    return uniqueArray;\n  }\n  function toCamelCase(string) {\n    return string.toLowerCase().replace(/-(.)/g, function (match, group) {\n      return group.toUpperCase();\n    });\n  }\n\n  function qsa(selector, context) {\n    if (typeof selector !== 'string') {\n      return [selector];\n    }\n\n    var a = [];\n    var res = context.querySelectorAll(selector);\n\n    for (var i = 0; i < res.length; i += 1) {\n      a.push(res[i]);\n    }\n\n    return a;\n  }\n\n  function $(selector, context) {\n    var window = ssrWindow_umd.getWindow();\n    var document = ssrWindow_umd.getDocument();\n    var arr = [];\n\n    if (!context && selector instanceof Dom7) {\n      return selector;\n    }\n\n    if (!selector) {\n      return new Dom7(arr);\n    }\n\n    if (typeof selector === 'string') {\n      var html = selector.trim();\n\n      if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n        var toCreate = 'div';\n        if (html.indexOf('<li') === 0) toCreate = 'ul';\n        if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n        if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n        if (html.indexOf('<tbody') === 0) toCreate = 'table';\n        if (html.indexOf('<option') === 0) toCreate = 'select';\n        var tempParent = document.createElement(toCreate);\n        tempParent.innerHTML = html;\n\n        for (var i = 0; i < tempParent.childNodes.length; i += 1) {\n          arr.push(tempParent.childNodes[i]);\n        }\n      } else {\n        arr = qsa(selector.trim(), context || document);\n      } // arr = qsa(selector, document);\n\n    } else if (selector.nodeType || selector === window || selector === document) {\n      arr.push(selector);\n    } else if (Array.isArray(selector)) {\n      if (selector instanceof Dom7) return selector;\n      arr = selector;\n    }\n\n    return new Dom7(arrayUnique(arr));\n  }\n\n  $.fn = Dom7.prototype;\n\n  function addClass() {\n    for (var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++) {\n      classes[_key] = arguments[_key];\n    }\n\n    var classNames = arrayFlat(classes.map(function (c) {\n      return c.split(' ');\n    }));\n    this.forEach(function (el) {\n      var _el$classList;\n\n      (_el$classList = el.classList).add.apply(_el$classList, classNames);\n    });\n    return this;\n  }\n\n  function removeClass() {\n    for (var _len2 = arguments.length, classes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      classes[_key2] = arguments[_key2];\n    }\n\n    var classNames = arrayFlat(classes.map(function (c) {\n      return c.split(' ');\n    }));\n    this.forEach(function (el) {\n      var _el$classList2;\n\n      (_el$classList2 = el.classList).remove.apply(_el$classList2, classNames);\n    });\n    return this;\n  }\n\n  function toggleClass() {\n    for (var _len3 = arguments.length, classes = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      classes[_key3] = arguments[_key3];\n    }\n\n    var classNames = arrayFlat(classes.map(function (c) {\n      return c.split(' ');\n    }));\n    this.forEach(function (el) {\n      classNames.forEach(function (className) {\n        el.classList.toggle(className);\n      });\n    });\n  }\n\n  function hasClass() {\n    for (var _len4 = arguments.length, classes = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      classes[_key4] = arguments[_key4];\n    }\n\n    var classNames = arrayFlat(classes.map(function (c) {\n      return c.split(' ');\n    }));\n    return arrayFilter(this, function (el) {\n      return classNames.filter(function (className) {\n        return el.classList.contains(className);\n      }).length > 0;\n    }).length > 0;\n  }\n\n  function attr(attrs, value) {\n    if (arguments.length === 1 && typeof attrs === 'string') {\n      // Get attr\n      if (this[0]) return this[0].getAttribute(attrs);\n      return undefined;\n    } // Set attrs\n\n\n    for (var i = 0; i < this.length; i += 1) {\n      if (arguments.length === 2) {\n        // String\n        this[i].setAttribute(attrs, value);\n      } else {\n        // Object\n        for (var attrName in attrs) {\n          this[i][attrName] = attrs[attrName];\n          this[i].setAttribute(attrName, attrs[attrName]);\n        }\n      }\n    }\n\n    return this;\n  }\n\n  function removeAttr(attr) {\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].removeAttribute(attr);\n    }\n\n    return this;\n  }\n\n  function prop(props, value) {\n    if (arguments.length === 1 && typeof props === 'string') {\n      // Get prop\n      if (this[0]) return this[0][props];\n    } else {\n      // Set props\n      for (var i = 0; i < this.length; i += 1) {\n        if (arguments.length === 2) {\n          // String\n          this[i][props] = value;\n        } else {\n          // Object\n          for (var propName in props) {\n            this[i][propName] = props[propName];\n          }\n        }\n      }\n\n      return this;\n    }\n\n    return this;\n  }\n\n  function data(key, value) {\n    var el;\n\n    if (typeof value === 'undefined') {\n      el = this[0];\n      if (!el) return undefined; // Get value\n\n      if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n        return el.dom7ElementDataStorage[key];\n      }\n\n      var dataKey = el.getAttribute(\"data-\" + key);\n\n      if (dataKey) {\n        return dataKey;\n      }\n\n      return undefined;\n    } // Set value\n\n\n    for (var i = 0; i < this.length; i += 1) {\n      el = this[i];\n      if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n      el.dom7ElementDataStorage[key] = value;\n    }\n\n    return this;\n  }\n\n  function removeData(key) {\n    for (var i = 0; i < this.length; i += 1) {\n      var el = this[i];\n\n      if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n        el.dom7ElementDataStorage[key] = null;\n        delete el.dom7ElementDataStorage[key];\n      }\n    }\n  }\n\n  function dataset() {\n    var el = this[0];\n    if (!el) return undefined;\n    var dataset = {}; // eslint-disable-line\n\n    if (el.dataset) {\n      for (var dataKey in el.dataset) {\n        dataset[dataKey] = el.dataset[dataKey];\n      }\n    } else {\n      for (var i = 0; i < el.attributes.length; i += 1) {\n        var _attr = el.attributes[i];\n\n        if (_attr.name.indexOf('data-') >= 0) {\n          dataset[toCamelCase(_attr.name.split('data-')[1])] = _attr.value;\n        }\n      }\n    }\n\n    for (var key in dataset) {\n      if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n    }\n\n    return dataset;\n  }\n\n  function val(value) {\n    if (typeof value === 'undefined') {\n      // get value\n      var el = this[0];\n      if (!el) return undefined;\n\n      if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n        var values = [];\n\n        for (var i = 0; i < el.selectedOptions.length; i += 1) {\n          values.push(el.selectedOptions[i].value);\n        }\n\n        return values;\n      }\n\n      return el.value;\n    } // set value\n\n\n    for (var _i = 0; _i < this.length; _i += 1) {\n      var _el = this[_i];\n\n      if (Array.isArray(value) && _el.multiple && _el.nodeName.toLowerCase() === 'select') {\n        for (var j = 0; j < _el.options.length; j += 1) {\n          _el.options[j].selected = value.indexOf(_el.options[j].value) >= 0;\n        }\n      } else {\n        _el.value = value;\n      }\n    }\n\n    return this;\n  }\n\n  function value(value) {\n    return this.val(value);\n  }\n\n  function transform(transform) {\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].style.transform = transform;\n    }\n\n    return this;\n  }\n\n  function transition(duration) {\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].style.transitionDuration = typeof duration !== 'string' ? duration + \"ms\" : duration;\n    }\n\n    return this;\n  }\n\n  function on() {\n    for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n      args[_key5] = arguments[_key5];\n    }\n\n    var eventType = args[0],\n        targetSelector = args[1],\n        listener = args[2],\n        capture = args[3];\n\n    if (typeof args[1] === 'function') {\n      eventType = args[0];\n      listener = args[1];\n      capture = args[2];\n      targetSelector = undefined;\n    }\n\n    if (!capture) capture = false;\n\n    function handleLiveEvent(e) {\n      var target = e.target;\n      if (!target) return;\n      var eventData = e.target.dom7EventData || [];\n\n      if (eventData.indexOf(e) < 0) {\n        eventData.unshift(e);\n      }\n\n      if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n        var _parents = $(target).parents(); // eslint-disable-line\n\n\n        for (var k = 0; k < _parents.length; k += 1) {\n          if ($(_parents[k]).is(targetSelector)) listener.apply(_parents[k], eventData);\n        }\n      }\n    }\n\n    function handleEvent(e) {\n      var eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n      if (eventData.indexOf(e) < 0) {\n        eventData.unshift(e);\n      }\n\n      listener.apply(this, eventData);\n    }\n\n    var events = eventType.split(' ');\n    var j;\n\n    for (var i = 0; i < this.length; i += 1) {\n      var el = this[i];\n\n      if (!targetSelector) {\n        for (j = 0; j < events.length; j += 1) {\n          var event = events[j];\n          if (!el.dom7Listeners) el.dom7Listeners = {};\n          if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n          el.dom7Listeners[event].push({\n            listener: listener,\n            proxyListener: handleEvent\n          });\n          el.addEventListener(event, handleEvent, capture);\n        }\n      } else {\n        // Live events\n        for (j = 0; j < events.length; j += 1) {\n          var _event = events[j];\n          if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n          if (!el.dom7LiveListeners[_event]) el.dom7LiveListeners[_event] = [];\n\n          el.dom7LiveListeners[_event].push({\n            listener: listener,\n            proxyListener: handleLiveEvent\n          });\n\n          el.addEventListener(_event, handleLiveEvent, capture);\n        }\n      }\n    }\n\n    return this;\n  }\n\n  function off() {\n    for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n      args[_key6] = arguments[_key6];\n    }\n\n    var eventType = args[0],\n        targetSelector = args[1],\n        listener = args[2],\n        capture = args[3];\n\n    if (typeof args[1] === 'function') {\n      eventType = args[0];\n      listener = args[1];\n      capture = args[2];\n      targetSelector = undefined;\n    }\n\n    if (!capture) capture = false;\n    var events = eventType.split(' ');\n\n    for (var i = 0; i < events.length; i += 1) {\n      var event = events[i];\n\n      for (var j = 0; j < this.length; j += 1) {\n        var el = this[j];\n        var handlers = void 0;\n\n        if (!targetSelector && el.dom7Listeners) {\n          handlers = el.dom7Listeners[event];\n        } else if (targetSelector && el.dom7LiveListeners) {\n          handlers = el.dom7LiveListeners[event];\n        }\n\n        if (handlers && handlers.length) {\n          for (var k = handlers.length - 1; k >= 0; k -= 1) {\n            var handler = handlers[k];\n\n            if (listener && handler.listener === listener) {\n              el.removeEventListener(event, handler.proxyListener, capture);\n              handlers.splice(k, 1);\n            } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n              el.removeEventListener(event, handler.proxyListener, capture);\n              handlers.splice(k, 1);\n            } else if (!listener) {\n              el.removeEventListener(event, handler.proxyListener, capture);\n              handlers.splice(k, 1);\n            }\n          }\n        }\n      }\n    }\n\n    return this;\n  }\n\n  function once() {\n    var dom = this;\n\n    for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n      args[_key7] = arguments[_key7];\n    }\n\n    var eventName = args[0],\n        targetSelector = args[1],\n        listener = args[2],\n        capture = args[3];\n\n    if (typeof args[1] === 'function') {\n      eventName = args[0];\n      listener = args[1];\n      capture = args[2];\n      targetSelector = undefined;\n    }\n\n    function onceHandler() {\n      for (var _len8 = arguments.length, eventArgs = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {\n        eventArgs[_key8] = arguments[_key8];\n      }\n\n      listener.apply(this, eventArgs);\n      dom.off(eventName, targetSelector, onceHandler, capture);\n\n      if (onceHandler.dom7proxy) {\n        delete onceHandler.dom7proxy;\n      }\n    }\n\n    onceHandler.dom7proxy = listener;\n    return dom.on(eventName, targetSelector, onceHandler, capture);\n  }\n\n  function trigger() {\n    var window = ssrWindow_umd.getWindow();\n\n    for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {\n      args[_key9] = arguments[_key9];\n    }\n\n    var events = args[0].split(' ');\n    var eventData = args[1];\n\n    for (var i = 0; i < events.length; i += 1) {\n      var event = events[i];\n\n      for (var j = 0; j < this.length; j += 1) {\n        var el = this[j];\n\n        if (window.CustomEvent) {\n          var evt = new window.CustomEvent(event, {\n            detail: eventData,\n            bubbles: true,\n            cancelable: true\n          });\n          el.dom7EventData = args.filter(function (data, dataIndex) {\n            return dataIndex > 0;\n          });\n          el.dispatchEvent(evt);\n          el.dom7EventData = [];\n          delete el.dom7EventData;\n        }\n      }\n    }\n\n    return this;\n  }\n\n  function transitionEnd(callback) {\n    var dom = this;\n\n    function fireCallBack(e) {\n      if (e.target !== this) return;\n      callback.call(this, e);\n      dom.off('transitionend', fireCallBack);\n    }\n\n    if (callback) {\n      dom.on('transitionend', fireCallBack);\n    }\n\n    return this;\n  }\n\n  function animationEnd(callback) {\n    var dom = this;\n\n    function fireCallBack(e) {\n      if (e.target !== this) return;\n      callback.call(this, e);\n      dom.off('animationend', fireCallBack);\n    }\n\n    if (callback) {\n      dom.on('animationend', fireCallBack);\n    }\n\n    return this;\n  }\n\n  function width() {\n    var window = ssrWindow_umd.getWindow();\n\n    if (this[0] === window) {\n      return window.innerWidth;\n    }\n\n    if (this.length > 0) {\n      return parseFloat(this.css('width'));\n    }\n\n    return null;\n  }\n\n  function outerWidth(includeMargins) {\n    if (this.length > 0) {\n      if (includeMargins) {\n        var _styles = this.styles();\n\n        return this[0].offsetWidth + parseFloat(_styles.getPropertyValue('margin-right')) + parseFloat(_styles.getPropertyValue('margin-left'));\n      }\n\n      return this[0].offsetWidth;\n    }\n\n    return null;\n  }\n\n  function height() {\n    var window = ssrWindow_umd.getWindow();\n\n    if (this[0] === window) {\n      return window.innerHeight;\n    }\n\n    if (this.length > 0) {\n      return parseFloat(this.css('height'));\n    }\n\n    return null;\n  }\n\n  function outerHeight(includeMargins) {\n    if (this.length > 0) {\n      if (includeMargins) {\n        var _styles2 = this.styles();\n\n        return this[0].offsetHeight + parseFloat(_styles2.getPropertyValue('margin-top')) + parseFloat(_styles2.getPropertyValue('margin-bottom'));\n      }\n\n      return this[0].offsetHeight;\n    }\n\n    return null;\n  }\n\n  function offset() {\n    if (this.length > 0) {\n      var window = ssrWindow_umd.getWindow();\n      var document = ssrWindow_umd.getDocument();\n      var el = this[0];\n      var box = el.getBoundingClientRect();\n      var body = document.body;\n      var clientTop = el.clientTop || body.clientTop || 0;\n      var clientLeft = el.clientLeft || body.clientLeft || 0;\n      var scrollTop = el === window ? window.scrollY : el.scrollTop;\n      var scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n      return {\n        top: box.top + scrollTop - clientTop,\n        left: box.left + scrollLeft - clientLeft\n      };\n    }\n\n    return null;\n  }\n\n  function hide() {\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].style.display = 'none';\n    }\n\n    return this;\n  }\n\n  function show() {\n    var window = ssrWindow_umd.getWindow();\n\n    for (var i = 0; i < this.length; i += 1) {\n      var el = this[i];\n\n      if (el.style.display === 'none') {\n        el.style.display = '';\n      }\n\n      if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n        // Still not visible\n        el.style.display = 'block';\n      }\n    }\n\n    return this;\n  }\n\n  function styles() {\n    var window = ssrWindow_umd.getWindow();\n    if (this[0]) return window.getComputedStyle(this[0], null);\n    return {};\n  }\n\n  function css(props, value) {\n    var window = ssrWindow_umd.getWindow();\n    var i;\n\n    if (arguments.length === 1) {\n      if (typeof props === 'string') {\n        // .css('width')\n        if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n      } else {\n        // .css({ width: '100px' })\n        for (i = 0; i < this.length; i += 1) {\n          for (var _prop in props) {\n            this[i].style[_prop] = props[_prop];\n          }\n        }\n\n        return this;\n      }\n    }\n\n    if (arguments.length === 2 && typeof props === 'string') {\n      // .css('width', '100px')\n      for (i = 0; i < this.length; i += 1) {\n        this[i].style[props] = value;\n      }\n\n      return this;\n    }\n\n    return this;\n  }\n\n  function each(callback) {\n    if (!callback) return this;\n    this.forEach(function (el, index) {\n      callback.apply(el, [el, index]);\n    });\n    return this;\n  }\n\n  function filter(callback) {\n    var result = arrayFilter(this, callback);\n    return $(result);\n  }\n\n  function html(html) {\n    if (typeof html === 'undefined') {\n      return this[0] ? this[0].innerHTML : null;\n    }\n\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].innerHTML = html;\n    }\n\n    return this;\n  }\n\n  function text(text) {\n    if (typeof text === 'undefined') {\n      return this[0] ? this[0].textContent.trim() : null;\n    }\n\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].textContent = text;\n    }\n\n    return this;\n  }\n\n  function is(selector) {\n    var window = ssrWindow_umd.getWindow();\n    var document = ssrWindow_umd.getDocument();\n    var el = this[0];\n    var compareWith;\n    var i;\n    if (!el || typeof selector === 'undefined') return false;\n\n    if (typeof selector === 'string') {\n      if (el.matches) return el.matches(selector);\n      if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n      if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n      compareWith = $(selector);\n\n      for (i = 0; i < compareWith.length; i += 1) {\n        if (compareWith[i] === el) return true;\n      }\n\n      return false;\n    }\n\n    if (selector === document) {\n      return el === document;\n    }\n\n    if (selector === window) {\n      return el === window;\n    }\n\n    if (selector.nodeType || selector instanceof Dom7) {\n      compareWith = selector.nodeType ? [selector] : selector;\n\n      for (i = 0; i < compareWith.length; i += 1) {\n        if (compareWith[i] === el) return true;\n      }\n\n      return false;\n    }\n\n    return false;\n  }\n\n  function index$1() {\n    var child = this[0];\n    var i;\n\n    if (child) {\n      i = 0; // eslint-disable-next-line\n\n      while ((child = child.previousSibling) !== null) {\n        if (child.nodeType === 1) i += 1;\n      }\n\n      return i;\n    }\n\n    return undefined;\n  }\n\n  function eq(index) {\n    if (typeof index === 'undefined') return this;\n    var length = this.length;\n\n    if (index > length - 1) {\n      return $([]);\n    }\n\n    if (index < 0) {\n      var returnIndex = length + index;\n      if (returnIndex < 0) return $([]);\n      return $([this[returnIndex]]);\n    }\n\n    return $([this[index]]);\n  }\n\n  function append() {\n    var newChild;\n    var document = ssrWindow_umd.getDocument();\n\n    for (var k = 0; k < arguments.length; k += 1) {\n      newChild = k < 0 || arguments.length <= k ? undefined : arguments[k];\n\n      for (var i = 0; i < this.length; i += 1) {\n        if (typeof newChild === 'string') {\n          var tempDiv = document.createElement('div');\n          tempDiv.innerHTML = newChild;\n\n          while (tempDiv.firstChild) {\n            this[i].appendChild(tempDiv.firstChild);\n          }\n        } else if (newChild instanceof Dom7) {\n          for (var j = 0; j < newChild.length; j += 1) {\n            this[i].appendChild(newChild[j]);\n          }\n        } else {\n          this[i].appendChild(newChild);\n        }\n      }\n    }\n\n    return this;\n  }\n\n  function appendTo(parent) {\n    $(parent).append(this);\n    return this;\n  }\n\n  function prepend(newChild) {\n    var document = ssrWindow_umd.getDocument();\n    var i;\n    var j;\n\n    for (i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        var tempDiv = document.createElement('div');\n        tempDiv.innerHTML = newChild;\n\n        for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n          this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (j = 0; j < newChild.length; j += 1) {\n          this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n        }\n      } else {\n        this[i].insertBefore(newChild, this[i].childNodes[0]);\n      }\n    }\n\n    return this;\n  }\n\n  function prependTo(parent) {\n    $(parent).prepend(this);\n    return this;\n  }\n\n  function insertBefore(selector) {\n    var before = $(selector);\n\n    for (var i = 0; i < this.length; i += 1) {\n      if (before.length === 1) {\n        before[0].parentNode.insertBefore(this[i], before[0]);\n      } else if (before.length > 1) {\n        for (var j = 0; j < before.length; j += 1) {\n          before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n        }\n      }\n    }\n  }\n\n  function insertAfter(selector) {\n    var after = $(selector);\n\n    for (var i = 0; i < this.length; i += 1) {\n      if (after.length === 1) {\n        after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n      } else if (after.length > 1) {\n        for (var j = 0; j < after.length; j += 1) {\n          after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n        }\n      }\n    }\n  }\n\n  function next(selector) {\n    if (this.length > 0) {\n      if (selector) {\n        if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n          return $([this[0].nextElementSibling]);\n        }\n\n        return $([]);\n      }\n\n      if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n      return $([]);\n    }\n\n    return $([]);\n  }\n\n  function nextAll(selector) {\n    var nextEls = [];\n    var el = this[0];\n    if (!el) return $([]);\n\n    while (el.nextElementSibling) {\n      var _next = el.nextElementSibling; // eslint-disable-line\n\n      if (selector) {\n        if ($(_next).is(selector)) nextEls.push(_next);\n      } else nextEls.push(_next);\n\n      el = _next;\n    }\n\n    return $(nextEls);\n  }\n\n  function prev(selector) {\n    if (this.length > 0) {\n      var el = this[0];\n\n      if (selector) {\n        if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n          return $([el.previousElementSibling]);\n        }\n\n        return $([]);\n      }\n\n      if (el.previousElementSibling) return $([el.previousElementSibling]);\n      return $([]);\n    }\n\n    return $([]);\n  }\n\n  function prevAll(selector) {\n    var prevEls = [];\n    var el = this[0];\n    if (!el) return $([]);\n\n    while (el.previousElementSibling) {\n      var _prev = el.previousElementSibling; // eslint-disable-line\n\n      if (selector) {\n        if ($(_prev).is(selector)) prevEls.push(_prev);\n      } else prevEls.push(_prev);\n\n      el = _prev;\n    }\n\n    return $(prevEls);\n  }\n\n  function siblings(selector) {\n    return this.nextAll(selector).add(this.prevAll(selector));\n  }\n\n  function parent(selector) {\n    var parents = []; // eslint-disable-line\n\n    for (var i = 0; i < this.length; i += 1) {\n      if (this[i].parentNode !== null) {\n        if (selector) {\n          if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n        } else {\n          parents.push(this[i].parentNode);\n        }\n      }\n    }\n\n    return $(parents);\n  }\n\n  function parents(selector) {\n    var parents = []; // eslint-disable-line\n\n    for (var i = 0; i < this.length; i += 1) {\n      var _parent = this[i].parentNode; // eslint-disable-line\n\n      while (_parent) {\n        if (selector) {\n          if ($(_parent).is(selector)) parents.push(_parent);\n        } else {\n          parents.push(_parent);\n        }\n\n        _parent = _parent.parentNode;\n      }\n    }\n\n    return $(parents);\n  }\n\n  function closest(selector) {\n    var closest = this; // eslint-disable-line\n\n    if (typeof selector === 'undefined') {\n      return $([]);\n    }\n\n    if (!closest.is(selector)) {\n      closest = closest.parents(selector).eq(0);\n    }\n\n    return closest;\n  }\n\n  function find(selector) {\n    var foundElements = [];\n\n    for (var i = 0; i < this.length; i += 1) {\n      var found = this[i].querySelectorAll(selector);\n\n      for (var j = 0; j < found.length; j += 1) {\n        foundElements.push(found[j]);\n      }\n    }\n\n    return $(foundElements);\n  }\n\n  function children(selector) {\n    var children = []; // eslint-disable-line\n\n    for (var i = 0; i < this.length; i += 1) {\n      var childNodes = this[i].children;\n\n      for (var j = 0; j < childNodes.length; j += 1) {\n        if (!selector || $(childNodes[j]).is(selector)) {\n          children.push(childNodes[j]);\n        }\n      }\n    }\n\n    return $(children);\n  }\n\n  function remove() {\n    for (var i = 0; i < this.length; i += 1) {\n      if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n    }\n\n    return this;\n  }\n\n  function detach() {\n    return this.remove();\n  }\n\n  function add() {\n    var dom = this;\n    var i;\n    var j;\n\n    for (var _len10 = arguments.length, els = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {\n      els[_key10] = arguments[_key10];\n    }\n\n    for (i = 0; i < els.length; i += 1) {\n      var toAdd = $(els[i]);\n\n      for (j = 0; j < toAdd.length; j += 1) {\n        dom.push(toAdd[j]);\n      }\n    }\n\n    return dom;\n  }\n\n  function empty() {\n    for (var i = 0; i < this.length; i += 1) {\n      var el = this[i];\n\n      if (el.nodeType === 1) {\n        for (var j = 0; j < el.childNodes.length; j += 1) {\n          if (el.childNodes[j].parentNode) {\n            el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n          }\n        }\n\n        el.textContent = '';\n      }\n    }\n\n    return this;\n  }\n\n  function scrollTo() {\n    var window = ssrWindow_umd.getWindow();\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var left = args[0],\n        top = args[1],\n        duration = args[2],\n        easing = args[3],\n        callback = args[4];\n\n    if (args.length === 4 && typeof easing === 'function') {\n      callback = easing;\n      left = args[0];\n      top = args[1];\n      duration = args[2];\n      callback = args[3];\n      easing = args[4];\n    }\n\n    if (typeof easing === 'undefined') easing = 'swing';\n    return this.each(function animate() {\n      var el = this;\n      var currentTop;\n      var currentLeft;\n      var maxTop;\n      var maxLeft;\n      var newTop;\n      var newLeft;\n      var scrollTop; // eslint-disable-line\n\n      var scrollLeft; // eslint-disable-line\n\n      var animateTop = top > 0 || top === 0;\n      var animateLeft = left > 0 || left === 0;\n\n      if (typeof easing === 'undefined') {\n        easing = 'swing';\n      }\n\n      if (animateTop) {\n        currentTop = el.scrollTop;\n\n        if (!duration) {\n          el.scrollTop = top;\n        }\n      }\n\n      if (animateLeft) {\n        currentLeft = el.scrollLeft;\n\n        if (!duration) {\n          el.scrollLeft = left;\n        }\n      }\n\n      if (!duration) return;\n\n      if (animateTop) {\n        maxTop = el.scrollHeight - el.offsetHeight;\n        newTop = Math.max(Math.min(top, maxTop), 0);\n      }\n\n      if (animateLeft) {\n        maxLeft = el.scrollWidth - el.offsetWidth;\n        newLeft = Math.max(Math.min(left, maxLeft), 0);\n      }\n\n      var startTime = null;\n      if (animateTop && newTop === currentTop) animateTop = false;\n      if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n      function render(time) {\n        if (time === void 0) {\n          time = new Date().getTime();\n        }\n\n        if (startTime === null) {\n          startTime = time;\n        }\n\n        var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n        var easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n        var done;\n        if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n        if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n        if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n          el.scrollTop = newTop;\n          done = true;\n        }\n\n        if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n          el.scrollTop = newTop;\n          done = true;\n        }\n\n        if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n          el.scrollLeft = newLeft;\n          done = true;\n        }\n\n        if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n          el.scrollLeft = newLeft;\n          done = true;\n        }\n\n        if (done) {\n          if (callback) callback();\n          return;\n        }\n\n        if (animateTop) el.scrollTop = scrollTop;\n        if (animateLeft) el.scrollLeft = scrollLeft;\n        window.requestAnimationFrame(render);\n      }\n\n      window.requestAnimationFrame(render);\n    });\n  } // scrollTop(top, duration, easing, callback) {\n\n\n  function scrollTop() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    var top = args[0],\n        duration = args[1],\n        easing = args[2],\n        callback = args[3];\n\n    if (args.length === 3 && typeof easing === 'function') {\n      top = args[0];\n      duration = args[1];\n      callback = args[2];\n      easing = args[3];\n    }\n\n    var dom = this;\n\n    if (typeof top === 'undefined') {\n      if (dom.length > 0) return dom[0].scrollTop;\n      return null;\n    }\n\n    return dom.scrollTo(undefined, top, duration, easing, callback);\n  }\n\n  function scrollLeft() {\n    for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      args[_key3] = arguments[_key3];\n    }\n\n    var left = args[0],\n        duration = args[1],\n        easing = args[2],\n        callback = args[3];\n\n    if (args.length === 3 && typeof easing === 'function') {\n      left = args[0];\n      duration = args[1];\n      callback = args[2];\n      easing = args[3];\n    }\n\n    var dom = this;\n\n    if (typeof left === 'undefined') {\n      if (dom.length > 0) return dom[0].scrollLeft;\n      return null;\n    }\n\n    return dom.scrollTo(left, undefined, duration, easing, callback);\n  }\n\n  function animate(initialProps, initialParams) {\n    var window = ssrWindow_umd.getWindow();\n    var els = this;\n    var a = {\n      props: Object.assign({}, initialProps),\n      params: Object.assign({\n        duration: 300,\n        easing: 'swing' // or 'linear'\n\n        /* Callbacks\n        begin(elements)\n        complete(elements)\n        progress(elements, complete, remaining, start, tweenValue)\n        */\n\n      }, initialParams),\n      elements: els,\n      animating: false,\n      que: [],\n      easingProgress: function easingProgress(easing, progress) {\n        if (easing === 'swing') {\n          return 0.5 - Math.cos(progress * Math.PI) / 2;\n        }\n\n        if (typeof easing === 'function') {\n          return easing(progress);\n        }\n\n        return progress;\n      },\n      stop: function stop() {\n        if (a.frameId) {\n          window.cancelAnimationFrame(a.frameId);\n        }\n\n        a.animating = false;\n        a.elements.each(function (el) {\n          var element = el;\n          delete element.dom7AnimateInstance;\n        });\n        a.que = [];\n      },\n      done: function done(complete) {\n        a.animating = false;\n        a.elements.each(function (el) {\n          var element = el;\n          delete element.dom7AnimateInstance;\n        });\n        if (complete) complete(els);\n\n        if (a.que.length > 0) {\n          var que = a.que.shift();\n          a.animate(que[0], que[1]);\n        }\n      },\n      animate: function animate(props, params) {\n        if (a.animating) {\n          a.que.push([props, params]);\n          return a;\n        }\n\n        var elements = []; // Define & Cache Initials & Units\n\n        a.elements.each(function (el, index) {\n          var initialFullValue;\n          var initialValue;\n          var unit;\n          var finalValue;\n          var finalFullValue;\n          if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n          elements[index] = {\n            container: el\n          };\n          Object.keys(props).forEach(function (prop) {\n            initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n            initialValue = parseFloat(initialFullValue);\n            unit = initialFullValue.replace(initialValue, '');\n            finalValue = parseFloat(props[prop]);\n            finalFullValue = props[prop] + unit;\n            elements[index][prop] = {\n              initialFullValue: initialFullValue,\n              initialValue: initialValue,\n              unit: unit,\n              finalValue: finalValue,\n              finalFullValue: finalFullValue,\n              currentValue: initialValue\n            };\n          });\n        });\n        var startTime = null;\n        var time;\n        var elementsDone = 0;\n        var propsDone = 0;\n        var done;\n        var began = false;\n        a.animating = true;\n\n        function render() {\n          time = new Date().getTime();\n          var progress;\n          var easeProgress; // let el;\n\n          if (!began) {\n            began = true;\n            if (params.begin) params.begin(els);\n          }\n\n          if (startTime === null) {\n            startTime = time;\n          }\n\n          if (params.progress) {\n            // eslint-disable-next-line\n            params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n          }\n\n          elements.forEach(function (element) {\n            var el = element;\n            if (done || el.done) return;\n            Object.keys(props).forEach(function (prop) {\n              if (done || el.done) return;\n              progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n              easeProgress = a.easingProgress(params.easing, progress);\n              var _el$prop = el[prop],\n                  initialValue = _el$prop.initialValue,\n                  finalValue = _el$prop.finalValue,\n                  unit = _el$prop.unit;\n              el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n              var currentValue = el[prop].currentValue;\n\n              if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n                el.container.style[prop] = finalValue + unit;\n                propsDone += 1;\n\n                if (propsDone === Object.keys(props).length) {\n                  el.done = true;\n                  elementsDone += 1;\n                }\n\n                if (elementsDone === elements.length) {\n                  done = true;\n                }\n              }\n\n              if (done) {\n                a.done(params.complete);\n                return;\n              }\n\n              el.container.style[prop] = currentValue + unit;\n            });\n          });\n          if (done) return; // Then call\n\n          a.frameId = window.requestAnimationFrame(render);\n        }\n\n        a.frameId = window.requestAnimationFrame(render);\n        return a;\n      }\n    };\n\n    if (a.elements.length === 0) {\n      return els;\n    }\n\n    var animateInstance;\n\n    for (var i = 0; i < a.elements.length; i += 1) {\n      if (a.elements[i].dom7AnimateInstance) {\n        animateInstance = a.elements[i].dom7AnimateInstance;\n      } else a.elements[i].dom7AnimateInstance = a;\n    }\n\n    if (!animateInstance) {\n      animateInstance = a;\n    }\n\n    if (initialProps === 'stop') {\n      animateInstance.stop();\n    } else {\n      animateInstance.animate(a.props, a.params);\n    }\n\n    return els;\n  }\n\n  function stop() {\n    var els = this;\n\n    for (var i = 0; i < els.length; i += 1) {\n      if (els[i].dom7AnimateInstance) {\n        els[i].dom7AnimateInstance.stop();\n      }\n    }\n  }\n\n  var noTrigger = 'resize scroll'.split(' ');\n\n  function shortcut(name) {\n    function eventHandler() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      if (typeof args[0] === 'undefined') {\n        for (var i = 0; i < this.length; i += 1) {\n          if (noTrigger.indexOf(name) < 0) {\n            if (name in this[i]) this[i][name]();else {\n              $(this[i]).trigger(name);\n            }\n          }\n        }\n\n        return this;\n      }\n\n      return this.on.apply(this, [name].concat(args));\n    }\n\n    return eventHandler;\n  }\n\n  var click = shortcut('click');\n  var blur = shortcut('blur');\n  var focus = shortcut('focus');\n  var focusin = shortcut('focusin');\n  var focusout = shortcut('focusout');\n  var keyup = shortcut('keyup');\n  var keydown = shortcut('keydown');\n  var keypress = shortcut('keypress');\n  var submit = shortcut('submit');\n  var change = shortcut('change');\n  var mousedown = shortcut('mousedown');\n  var mousemove = shortcut('mousemove');\n  var mouseup = shortcut('mouseup');\n  var mouseenter = shortcut('mouseenter');\n  var mouseleave = shortcut('mouseleave');\n  var mouseout = shortcut('mouseout');\n  var mouseover = shortcut('mouseover');\n  var touchstart = shortcut('touchstart');\n  var touchend = shortcut('touchend');\n  var touchmove = shortcut('touchmove');\n  var resize = shortcut('resize');\n  var scroll = shortcut('scroll');\n\n  var $_1 = $;\n  var add_1 = add;\n  var addClass_1 = addClass;\n  var animate_1 = animate;\n  var animationEnd_1 = animationEnd;\n  var append_1 = append;\n  var appendTo_1 = appendTo;\n  var attr_1 = attr;\n  var blur_1 = blur;\n  var change_1 = change;\n  var children_1 = children;\n  var click_1 = click;\n  var closest_1 = closest;\n  var css_1 = css;\n  var data_1 = data;\n  var dataset_1 = dataset;\n  var _default$1 = $;\n  var detach_1 = detach;\n  var each_1 = each;\n  var empty_1 = empty;\n  var eq_1 = eq;\n  var filter_1 = filter;\n  var find_1 = find;\n  var focus_1 = focus;\n  var focusin_1 = focusin;\n  var focusout_1 = focusout;\n  var hasClass_1 = hasClass;\n  var height_1 = height;\n  var hide_1 = hide;\n  var html_1 = html;\n  var index_1 = index$1;\n  var insertAfter_1 = insertAfter;\n  var insertBefore_1 = insertBefore;\n  var is_1 = is;\n  var keydown_1 = keydown;\n  var keypress_1 = keypress;\n  var keyup_1 = keyup;\n  var mousedown_1 = mousedown;\n  var mouseenter_1 = mouseenter;\n  var mouseleave_1 = mouseleave;\n  var mousemove_1 = mousemove;\n  var mouseout_1 = mouseout;\n  var mouseover_1 = mouseover;\n  var mouseup_1 = mouseup;\n  var next_1 = next;\n  var nextAll_1 = nextAll;\n  var off_1 = off;\n  var offset_1 = offset;\n  var on_1 = on;\n  var once_1 = once;\n  var outerHeight_1 = outerHeight;\n  var outerWidth_1 = outerWidth;\n  var parent_1 = parent;\n  var parents_1 = parents;\n  var prepend_1 = prepend;\n  var prependTo_1 = prependTo;\n  var prev_1 = prev;\n  var prevAll_1 = prevAll;\n  var prop_1 = prop;\n  var remove_1 = remove;\n  var removeAttr_1 = removeAttr;\n  var removeClass_1 = removeClass;\n  var removeData_1 = removeData;\n  var resize_1 = resize;\n  var scroll_1 = scroll;\n  var scrollLeft_1 = scrollLeft;\n  var scrollTo_1 = scrollTo;\n  var scrollTop_1 = scrollTop;\n  var show_1 = show;\n  var siblings_1 = siblings;\n  var stop_1 = stop;\n  var styles_1 = styles;\n  var submit_1 = submit;\n  var text_1 = text;\n  var toggleClass_1 = toggleClass;\n  var touchend_1 = touchend;\n  var touchmove_1 = touchmove;\n  var touchstart_1 = touchstart;\n  var transform_1 = transform;\n  var transition_1 = transition;\n  var transitionEnd_1 = transitionEnd;\n  var trigger_1 = trigger;\n  var val_1 = val;\n  var value_1 = value;\n  var width_1 = width;\n\n  var dom7_cjs = /*#__PURE__*/Object.defineProperty({\n  \t$: $_1,\n  \tadd: add_1,\n  \taddClass: addClass_1,\n  \tanimate: animate_1,\n  \tanimationEnd: animationEnd_1,\n  \tappend: append_1,\n  \tappendTo: appendTo_1,\n  \tattr: attr_1,\n  \tblur: blur_1,\n  \tchange: change_1,\n  \tchildren: children_1,\n  \tclick: click_1,\n  \tclosest: closest_1,\n  \tcss: css_1,\n  \tdata: data_1,\n  \tdataset: dataset_1,\n  \tdefault: _default$1,\n  \tdetach: detach_1,\n  \teach: each_1,\n  \tempty: empty_1,\n  \teq: eq_1,\n  \tfilter: filter_1,\n  \tfind: find_1,\n  \tfocus: focus_1,\n  \tfocusin: focusin_1,\n  \tfocusout: focusout_1,\n  \thasClass: hasClass_1,\n  \theight: height_1,\n  \thide: hide_1,\n  \thtml: html_1,\n  \tindex: index_1,\n  \tinsertAfter: insertAfter_1,\n  \tinsertBefore: insertBefore_1,\n  \tis: is_1,\n  \tkeydown: keydown_1,\n  \tkeypress: keypress_1,\n  \tkeyup: keyup_1,\n  \tmousedown: mousedown_1,\n  \tmouseenter: mouseenter_1,\n  \tmouseleave: mouseleave_1,\n  \tmousemove: mousemove_1,\n  \tmouseout: mouseout_1,\n  \tmouseover: mouseover_1,\n  \tmouseup: mouseup_1,\n  \tnext: next_1,\n  \tnextAll: nextAll_1,\n  \toff: off_1,\n  \toffset: offset_1,\n  \ton: on_1,\n  \tonce: once_1,\n  \touterHeight: outerHeight_1,\n  \touterWidth: outerWidth_1,\n  \tparent: parent_1,\n  \tparents: parents_1,\n  \tprepend: prepend_1,\n  \tprependTo: prependTo_1,\n  \tprev: prev_1,\n  \tprevAll: prevAll_1,\n  \tprop: prop_1,\n  \tremove: remove_1,\n  \tremoveAttr: removeAttr_1,\n  \tremoveClass: removeClass_1,\n  \tremoveData: removeData_1,\n  \tresize: resize_1,\n  \tscroll: scroll_1,\n  \tscrollLeft: scrollLeft_1,\n  \tscrollTo: scrollTo_1,\n  \tscrollTop: scrollTop_1,\n  \tshow: show_1,\n  \tsiblings: siblings_1,\n  \tstop: stop_1,\n  \tstyles: styles_1,\n  \tsubmit: submit_1,\n  \ttext: text_1,\n  \ttoggleClass: toggleClass_1,\n  \ttouchend: touchend_1,\n  \ttouchmove: touchmove_1,\n  \ttouchstart: touchstart_1,\n  \ttransform: transform_1,\n  \ttransition: transition_1,\n  \ttransitionEnd: transitionEnd_1,\n  \ttrigger: trigger_1,\n  \tval: val_1,\n  \tvalue: value_1,\n  \twidth: width_1\n  }, '__esModule', {value: true});\n\n  /**\n   * lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n  /** Used as references for various `Number` constants. */\n  var MAX_SAFE_INTEGER = 9007199254740991;\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]';\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$3 = Object.prototype;\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$1 = objectProto$3.hasOwnProperty;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var objectToString$3 = objectProto$3.toString;\n\n  /** Built-in value references. */\n  var propertyIsEnumerable = objectProto$3.propertyIsEnumerable;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeKeys = overArg(Object.keys, Object);\n\n  /**\n   * Creates an array of the enumerable property names of the array-like `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @param {boolean} inherited Specify returning inherited property names.\n   * @returns {Array} Returns the array of property names.\n   */\n  function arrayLikeKeys(value, inherited) {\n    // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n    // Safari 9 makes `arguments.length` enumerable in strict mode.\n    var result = (isArray(value) || isArguments(value))\n      ? baseTimes(value.length, String)\n      : [];\n\n    var length = result.length,\n        skipIndexes = !!length;\n\n    for (var key in value) {\n      if ((inherited || hasOwnProperty$1.call(value, key)) &&\n          !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.forEach` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array|Object} Returns `collection`.\n   */\n  var baseEach = createBaseEach(baseForOwn);\n\n  /**\n   * The base implementation of `baseForOwn` which iterates over `object`\n   * properties returned by `keysFunc` and invokes `iteratee` for each property.\n   * Iteratee functions may exit iteration early by explicitly returning `false`.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {Function} keysFunc The function to get the keys of `object`.\n   * @returns {Object} Returns `object`.\n   */\n  var baseFor = createBaseFor();\n\n  /**\n   * The base implementation of `_.forOwn` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Object} Returns `object`.\n   */\n  function baseForOwn(object, iteratee) {\n    return object && baseFor(object, iteratee, keys);\n  }\n\n  /**\n   * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function baseKeys(object) {\n    if (!isPrototype(object)) {\n      return nativeKeys(object);\n    }\n    var result = [];\n    for (var key in Object(object)) {\n      if (hasOwnProperty$1.call(object, key) && key != 'constructor') {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates a `baseEach` or `baseEachRight` function.\n   *\n   * @private\n   * @param {Function} eachFunc The function to iterate over a collection.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {Function} Returns the new base function.\n   */\n  function createBaseEach(eachFunc, fromRight) {\n    return function(collection, iteratee) {\n      if (collection == null) {\n        return collection;\n      }\n      if (!isArrayLike(collection)) {\n        return eachFunc(collection, iteratee);\n      }\n      var length = collection.length,\n          index = fromRight ? length : -1,\n          iterable = Object(collection);\n\n      while ((fromRight ? index-- : ++index < length)) {\n        if (iteratee(iterable[index], index, iterable) === false) {\n          break;\n        }\n      }\n      return collection;\n    };\n  }\n\n  /**\n   * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n   *\n   * @private\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {Function} Returns the new base function.\n   */\n  function createBaseFor(fromRight) {\n    return function(object, iteratee, keysFunc) {\n      var index = -1,\n          iterable = Object(object),\n          props = keysFunc(object),\n          length = props.length;\n\n      while (length--) {\n        var key = props[fromRight ? length : ++index];\n        if (iteratee(iterable[key], key, iterable) === false) {\n          break;\n        }\n      }\n      return object;\n    };\n  }\n\n  /**\n   * Checks if `value` is a valid array-like index.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n   */\n  function isIndex(value, length) {\n    length = length == null ? MAX_SAFE_INTEGER : length;\n    return !!length &&\n      (typeof value == 'number' || reIsUint.test(value)) &&\n      (value > -1 && value % 1 == 0 && value < length);\n  }\n\n  /**\n   * Checks if `value` is likely a prototype object.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n   */\n  function isPrototype(value) {\n    var Ctor = value && value.constructor,\n        proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$3;\n\n    return value === proto;\n  }\n\n  /**\n   * Iterates over elements of `collection` and invokes `iteratee` for each element.\n   * The iteratee is invoked with three arguments: (value, index|key, collection).\n   * Iteratee functions may exit iteration early by explicitly returning `false`.\n   *\n   * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n   * property are iterated like arrays. To avoid this behavior use `_.forIn`\n   * or `_.forOwn` for object iteration.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @alias each\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @returns {Array|Object} Returns `collection`.\n   * @see _.forEachRight\n   * @example\n   *\n   * _([1, 2]).forEach(function(value) {\n   *   console.log(value);\n   * });\n   * // => Logs `1` then `2`.\n   *\n   * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n   *   console.log(key);\n   * });\n   * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n   */\n  function forEach(collection, iteratee) {\n    var func = isArray(collection) ? arrayEach : baseEach;\n    return func(collection, typeof iteratee == 'function' ? iteratee : identity);\n  }\n\n  /**\n   * Checks if `value` is likely an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArguments(function() { return arguments; }());\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  function isArguments(value) {\n    // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n    return isArrayLikeObject(value) && hasOwnProperty$1.call(value, 'callee') &&\n      (!propertyIsEnumerable.call(value, 'callee') || objectToString$3.call(value) == argsTag);\n  }\n\n  /**\n   * Checks if `value` is classified as an `Array` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n   * @example\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   *\n   * _.isArray(document.body.children);\n   * // => false\n   *\n   * _.isArray('abc');\n   * // => false\n   *\n   * _.isArray(_.noop);\n   * // => false\n   */\n  var isArray = Array.isArray;\n\n  /**\n   * Checks if `value` is array-like. A value is considered array-like if it's\n   * not a function and has a `value.length` that's an integer greater than or\n   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n   * @example\n   *\n   * _.isArrayLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLike(document.body.children);\n   * // => true\n   *\n   * _.isArrayLike('abc');\n   * // => true\n   *\n   * _.isArrayLike(_.noop);\n   * // => false\n   */\n  function isArrayLike(value) {\n    return value != null && isLength(value.length) && !isFunction(value);\n  }\n\n  /**\n   * This method is like `_.isArrayLike` except that it also checks if `value`\n   * is an object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array-like object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArrayLikeObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLikeObject(document.body.children);\n   * // => true\n   *\n   * _.isArrayLikeObject('abc');\n   * // => false\n   *\n   * _.isArrayLikeObject(_.noop);\n   * // => false\n   */\n  function isArrayLikeObject(value) {\n    return isObjectLike$3(value) && isArrayLike(value);\n  }\n\n  /**\n   * Checks if `value` is classified as a `Function` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   *\n   * _.isFunction(/abc/);\n   * // => false\n   */\n  function isFunction(value) {\n    // The use of `Object#toString` avoids issues with the `typeof` operator\n    // in Safari 8-9 which returns 'object' for typed array and other constructors.\n    var tag = isObject$2(value) ? objectToString$3.call(value) : '';\n    return tag == funcTag || tag == genTag;\n  }\n\n  /**\n   * Checks if `value` is a valid array-like length.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n   * @example\n   *\n   * _.isLength(3);\n   * // => true\n   *\n   * _.isLength(Number.MIN_VALUE);\n   * // => false\n   *\n   * _.isLength(Infinity);\n   * // => false\n   *\n   * _.isLength('3');\n   * // => false\n   */\n  function isLength(value) {\n    return typeof value == 'number' &&\n      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject$2(value) {\n    var type = typeof value;\n    return !!value && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike$3(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Creates an array of the own enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects. See the\n   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * for more details.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keys(new Foo);\n   * // => ['a', 'b'] (iteration order is not guaranteed)\n   *\n   * _.keys('hi');\n   * // => ['0', '1']\n   */\n  function keys(object) {\n    return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n  }\n\n  /**\n   * This method returns the first argument it receives.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Util\n   * @param {*} value Any value.\n   * @returns {*} Returns `value`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   *\n   * console.log(_.identity(object) === object);\n   * // => true\n   */\n  function identity(value) {\n    return value;\n  }\n\n  var lodash_foreach = forEach;\n\n  let urlAlphabet$1 =\n    'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';\n  var urlAlphabet_1 = { urlAlphabet: urlAlphabet$1 };\n\n  let { urlAlphabet } = urlAlphabet_1;\n  {\n    if (\n      typeof navigator !== 'undefined' &&\n      navigator.product === 'ReactNative' &&\n      typeof crypto === 'undefined'\n    ) {\n      throw new Error(\n        'React Native does not have a built-in secure random generator. ' +\n          'If you don’t need unpredictable IDs use `nanoid/non-secure`. ' +\n          'For secure IDs, import `react-native-get-random-values` ' +\n          'before Nano ID.'\n      )\n    }\n    if (typeof msCrypto !== 'undefined' && typeof crypto === 'undefined') {\n      throw new Error(\n        'Import file with `if (!window.crypto) window.crypto = window.msCrypto`' +\n          ' before importing Nano ID to fix IE 11 support'\n      )\n    }\n    if (typeof crypto === 'undefined') {\n      throw new Error(\n        'Your browser does not have secure random generator. ' +\n          'If you don’t need unpredictable IDs, you can use nanoid/non-secure.'\n      )\n    }\n  }\n  let random = bytes => crypto.getRandomValues(new Uint8Array(bytes));\n  let customRandom = (alphabet, size, getRandom) => {\n    let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1;\n    let step = -~((1.6 * mask * size) / alphabet.length);\n    return () => {\n      let id = '';\n      while (true) {\n        let bytes = getRandom(step);\n        let j = step;\n        while (j--) {\n          id += alphabet[bytes[j] & mask] || '';\n          if (id.length === size) return id\n        }\n      }\n    }\n  };\n  let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random);\n  let nanoid$2 = (size = 21) => {\n    let id = '';\n    let bytes = crypto.getRandomValues(new Uint8Array(size));\n    while (size--) {\n      let byte = bytes[size] & 63;\n      if (byte < 36) {\n        id += byte.toString(36);\n      } else if (byte < 62) {\n        id += (byte - 26).toString(36).toUpperCase();\n      } else if (byte < 63) {\n        id += '_';\n      } else {\n        id += '-';\n      }\n    }\n    return id\n  };\n  var index_browser = { nanoid: nanoid$2, customAlphabet, customRandom, urlAlphabet, random };\n\n  /**\n   * lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n\n  /** Used as the `TypeError` message for \"Functions\" methods. */\n  var FUNC_ERROR_TEXT$1 = 'Expected a function';\n\n  /** Used as references for various `Number` constants. */\n  var NAN$1 = 0 / 0;\n\n  /** `Object#toString` result references. */\n  var symbolTag$2 = '[object Symbol]';\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim$1 = /^\\s+|\\s+$/g;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex$1 = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary$1 = /^0b[01]+$/i;\n\n  /** Used to detect octal string values. */\n  var reIsOctal$1 = /^0o[0-7]+$/i;\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseInt$1 = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal$2 = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n  /** Detect free variable `self`. */\n  var freeSelf$2 = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root$2 = freeGlobal$2 || freeSelf$2 || Function('return this')();\n\n  /** Used for built-in method references. */\n  var objectProto$2 = Object.prototype;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var objectToString$2 = objectProto$2.toString;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeMax$1 = Math.max,\n      nativeMin$1 = Math.min;\n\n  /**\n   * Gets the timestamp of the number of milliseconds that have elapsed since\n   * the Unix epoch (1 January 1970 00:00:00 UTC).\n   *\n   * @static\n   * @memberOf _\n   * @since 2.4.0\n   * @category Date\n   * @returns {number} Returns the timestamp.\n   * @example\n   *\n   * _.defer(function(stamp) {\n   *   console.log(_.now() - stamp);\n   * }, _.now());\n   * // => Logs the number of milliseconds it took for the deferred invocation.\n   */\n  var now$1 = function() {\n    return root$2.Date.now();\n  };\n\n  /**\n   * Creates a debounced function that delays invoking `func` until after `wait`\n   * milliseconds have elapsed since the last time the debounced function was\n   * invoked. The debounced function comes with a `cancel` method to cancel\n   * delayed `func` invocations and a `flush` method to immediately invoke them.\n   * Provide `options` to indicate whether `func` should be invoked on the\n   * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n   * with the last arguments provided to the debounced function. Subsequent\n   * calls to the debounced function return the result of the last `func`\n   * invocation.\n   *\n   * **Note:** If `leading` and `trailing` options are `true`, `func` is\n   * invoked on the trailing edge of the timeout only if the debounced function\n   * is invoked more than once during the `wait` timeout.\n   *\n   * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n   * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n   *\n   * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n   * for details over the differences between `_.debounce` and `_.throttle`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to debounce.\n   * @param {number} [wait=0] The number of milliseconds to delay.\n   * @param {Object} [options={}] The options object.\n   * @param {boolean} [options.leading=false]\n   *  Specify invoking on the leading edge of the timeout.\n   * @param {number} [options.maxWait]\n   *  The maximum time `func` is allowed to be delayed before it's invoked.\n   * @param {boolean} [options.trailing=true]\n   *  Specify invoking on the trailing edge of the timeout.\n   * @returns {Function} Returns the new debounced function.\n   * @example\n   *\n   * // Avoid costly calculations while the window size is in flux.\n   * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n   *\n   * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n   * jQuery(element).on('click', _.debounce(sendMail, 300, {\n   *   'leading': true,\n   *   'trailing': false\n   * }));\n   *\n   * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n   * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n   * var source = new EventSource('/stream');\n   * jQuery(source).on('message', debounced);\n   *\n   * // Cancel the trailing debounced invocation.\n   * jQuery(window).on('popstate', debounced.cancel);\n   */\n  function debounce$2(func, wait, options) {\n    var lastArgs,\n        lastThis,\n        maxWait,\n        result,\n        timerId,\n        lastCallTime,\n        lastInvokeTime = 0,\n        leading = false,\n        maxing = false,\n        trailing = true;\n\n    if (typeof func != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT$1);\n    }\n    wait = toNumber$1(wait) || 0;\n    if (isObject$1(options)) {\n      leading = !!options.leading;\n      maxing = 'maxWait' in options;\n      maxWait = maxing ? nativeMax$1(toNumber$1(options.maxWait) || 0, wait) : maxWait;\n      trailing = 'trailing' in options ? !!options.trailing : trailing;\n    }\n\n    function invokeFunc(time) {\n      var args = lastArgs,\n          thisArg = lastThis;\n\n      lastArgs = lastThis = undefined;\n      lastInvokeTime = time;\n      result = func.apply(thisArg, args);\n      return result;\n    }\n\n    function leadingEdge(time) {\n      // Reset any `maxWait` timer.\n      lastInvokeTime = time;\n      // Start the timer for the trailing edge.\n      timerId = setTimeout(timerExpired, wait);\n      // Invoke the leading edge.\n      return leading ? invokeFunc(time) : result;\n    }\n\n    function remainingWait(time) {\n      var timeSinceLastCall = time - lastCallTime,\n          timeSinceLastInvoke = time - lastInvokeTime,\n          result = wait - timeSinceLastCall;\n\n      return maxing ? nativeMin$1(result, maxWait - timeSinceLastInvoke) : result;\n    }\n\n    function shouldInvoke(time) {\n      var timeSinceLastCall = time - lastCallTime,\n          timeSinceLastInvoke = time - lastInvokeTime;\n\n      // Either this is the first call, activity has stopped and we're at the\n      // trailing edge, the system time has gone backwards and we're treating\n      // it as the trailing edge, or we've hit the `maxWait` limit.\n      return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n        (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n    }\n\n    function timerExpired() {\n      var time = now$1();\n      if (shouldInvoke(time)) {\n        return trailingEdge(time);\n      }\n      // Restart the timer.\n      timerId = setTimeout(timerExpired, remainingWait(time));\n    }\n\n    function trailingEdge(time) {\n      timerId = undefined;\n\n      // Only invoke if we have `lastArgs` which means `func` has been\n      // debounced at least once.\n      if (trailing && lastArgs) {\n        return invokeFunc(time);\n      }\n      lastArgs = lastThis = undefined;\n      return result;\n    }\n\n    function cancel() {\n      if (timerId !== undefined) {\n        clearTimeout(timerId);\n      }\n      lastInvokeTime = 0;\n      lastArgs = lastCallTime = lastThis = timerId = undefined;\n    }\n\n    function flush() {\n      return timerId === undefined ? result : trailingEdge(now$1());\n    }\n\n    function debounced() {\n      var time = now$1(),\n          isInvoking = shouldInvoke(time);\n\n      lastArgs = arguments;\n      lastThis = this;\n      lastCallTime = time;\n\n      if (isInvoking) {\n        if (timerId === undefined) {\n          return leadingEdge(lastCallTime);\n        }\n        if (maxing) {\n          // Handle invocations in a tight loop.\n          timerId = setTimeout(timerExpired, wait);\n          return invokeFunc(lastCallTime);\n        }\n      }\n      if (timerId === undefined) {\n        timerId = setTimeout(timerExpired, wait);\n      }\n      return result;\n    }\n    debounced.cancel = cancel;\n    debounced.flush = flush;\n    return debounced;\n  }\n\n  /**\n   * Creates a throttled function that only invokes `func` at most once per\n   * every `wait` milliseconds. The throttled function comes with a `cancel`\n   * method to cancel delayed `func` invocations and a `flush` method to\n   * immediately invoke them. Provide `options` to indicate whether `func`\n   * should be invoked on the leading and/or trailing edge of the `wait`\n   * timeout. The `func` is invoked with the last arguments provided to the\n   * throttled function. Subsequent calls to the throttled function return the\n   * result of the last `func` invocation.\n   *\n   * **Note:** If `leading` and `trailing` options are `true`, `func` is\n   * invoked on the trailing edge of the timeout only if the throttled function\n   * is invoked more than once during the `wait` timeout.\n   *\n   * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n   * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n   *\n   * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n   * for details over the differences between `_.throttle` and `_.debounce`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to throttle.\n   * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n   * @param {Object} [options={}] The options object.\n   * @param {boolean} [options.leading=true]\n   *  Specify invoking on the leading edge of the timeout.\n   * @param {boolean} [options.trailing=true]\n   *  Specify invoking on the trailing edge of the timeout.\n   * @returns {Function} Returns the new throttled function.\n   * @example\n   *\n   * // Avoid excessively updating the position while scrolling.\n   * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n   *\n   * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n   * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n   * jQuery(element).on('click', throttled);\n   *\n   * // Cancel the trailing throttled invocation.\n   * jQuery(window).on('popstate', throttled.cancel);\n   */\n  function throttle(func, wait, options) {\n    var leading = true,\n        trailing = true;\n\n    if (typeof func != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT$1);\n    }\n    if (isObject$1(options)) {\n      leading = 'leading' in options ? !!options.leading : leading;\n      trailing = 'trailing' in options ? !!options.trailing : trailing;\n    }\n    return debounce$2(func, wait, {\n      'leading': leading,\n      'maxWait': wait,\n      'trailing': trailing\n    });\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject$1(value) {\n    var type = typeof value;\n    return !!value && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike$2(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Checks if `value` is classified as a `Symbol` primitive or object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n   * @example\n   *\n   * _.isSymbol(Symbol.iterator);\n   * // => true\n   *\n   * _.isSymbol('abc');\n   * // => false\n   */\n  function isSymbol$2(value) {\n    return typeof value == 'symbol' ||\n      (isObjectLike$2(value) && objectToString$2.call(value) == symbolTag$2);\n  }\n\n  /**\n   * Converts `value` to a number.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to process.\n   * @returns {number} Returns the number.\n   * @example\n   *\n   * _.toNumber(3.2);\n   * // => 3.2\n   *\n   * _.toNumber(Number.MIN_VALUE);\n   * // => 5e-324\n   *\n   * _.toNumber(Infinity);\n   * // => Infinity\n   *\n   * _.toNumber('3.2');\n   * // => 3.2\n   */\n  function toNumber$1(value) {\n    if (typeof value == 'number') {\n      return value;\n    }\n    if (isSymbol$2(value)) {\n      return NAN$1;\n    }\n    if (isObject$1(value)) {\n      var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n      value = isObject$1(other) ? (other + '') : other;\n    }\n    if (typeof value != 'string') {\n      return value === 0 ? value : +value;\n    }\n    value = value.replace(reTrim$1, '');\n    var isBinary = reIsBinary$1.test(value);\n    return (isBinary || reIsOctal$1.test(value))\n      ? freeParseInt$1(value.slice(2), isBinary ? 2 : 8)\n      : (reIsBadHex$1.test(value) ? NAN$1 : +value);\n  }\n\n  var lodash_throttle = throttle;\n\n  var snabbdom_cjs = createCommonjsModule$1(function (module, exports) {\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  function createElement(tagName, options) {\n      return document.createElement(tagName, options);\n  }\n  function createElementNS(namespaceURI, qualifiedName, options) {\n      return document.createElementNS(namespaceURI, qualifiedName, options);\n  }\n  function createTextNode(text) {\n      return document.createTextNode(text);\n  }\n  function createComment(text) {\n      return document.createComment(text);\n  }\n  function insertBefore(parentNode, newNode, referenceNode) {\n      parentNode.insertBefore(newNode, referenceNode);\n  }\n  function removeChild(node, child) {\n      node.removeChild(child);\n  }\n  function appendChild(node, child) {\n      node.appendChild(child);\n  }\n  function parentNode(node) {\n      return node.parentNode;\n  }\n  function nextSibling(node) {\n      return node.nextSibling;\n  }\n  function tagName(elm) {\n      return elm.tagName;\n  }\n  function setTextContent(node, text) {\n      node.textContent = text;\n  }\n  function getTextContent(node) {\n      return node.textContent;\n  }\n  function isElement(node) {\n      return node.nodeType === 1;\n  }\n  function isText(node) {\n      return node.nodeType === 3;\n  }\n  function isComment(node) {\n      return node.nodeType === 8;\n  }\n  const htmlDomApi = {\n      createElement,\n      createElementNS,\n      createTextNode,\n      createComment,\n      insertBefore,\n      removeChild,\n      appendChild,\n      parentNode,\n      nextSibling,\n      tagName,\n      setTextContent,\n      getTextContent,\n      isElement,\n      isText,\n      isComment,\n  };\n\n  function vnode(sel, data, children, text, elm) {\n      const key = data === undefined ? undefined : data.key;\n      return { sel, data, children, text, elm, key };\n  }\n\n  const array = Array.isArray;\n  function primitive(s) {\n      return typeof s === \"string\" ||\n          typeof s === \"number\" ||\n          s instanceof String ||\n          s instanceof Number;\n  }\n\n  function isUndef(s) {\n      return s === undefined;\n  }\n  function isDef(s) {\n      return s !== undefined;\n  }\n  const emptyNode = vnode(\"\", {}, [], undefined, undefined);\n  function sameVnode(vnode1, vnode2) {\n      var _a, _b;\n      const isSameKey = vnode1.key === vnode2.key;\n      const isSameIs = ((_a = vnode1.data) === null || _a === void 0 ? void 0 : _a.is) === ((_b = vnode2.data) === null || _b === void 0 ? void 0 : _b.is);\n      const isSameSel = vnode1.sel === vnode2.sel;\n      return isSameSel && isSameKey && isSameIs;\n  }\n  function isVnode(vnode) {\n      return vnode.sel !== undefined;\n  }\n  function createKeyToOldIdx(children, beginIdx, endIdx) {\n      var _a;\n      const map = {};\n      for (let i = beginIdx; i <= endIdx; ++i) {\n          const key = (_a = children[i]) === null || _a === void 0 ? void 0 : _a.key;\n          if (key !== undefined) {\n              map[key] = i;\n          }\n      }\n      return map;\n  }\n  const hooks = [\n      \"create\",\n      \"update\",\n      \"remove\",\n      \"destroy\",\n      \"pre\",\n      \"post\",\n  ];\n  function init$1(modules, domApi) {\n      const cbs = {\n          create: [],\n          update: [],\n          remove: [],\n          destroy: [],\n          pre: [],\n          post: [],\n      };\n      const api = domApi !== undefined ? domApi : htmlDomApi;\n      for (const hook of hooks) {\n          for (const module of modules) {\n              const currentHook = module[hook];\n              if (currentHook !== undefined) {\n                  cbs[hook].push(currentHook);\n              }\n          }\n      }\n      function emptyNodeAt(elm) {\n          const id = elm.id ? \"#\" + elm.id : \"\";\n          // elm.className doesn't return a string when elm is an SVG element inside a shadowRoot.\n          // https://stackoverflow.com/questions/29454340/detecting-classname-of-svganimatedstring\n          const classes = elm.getAttribute(\"class\");\n          const c = classes ? \".\" + classes.split(\" \").join(\".\") : \"\";\n          return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);\n      }\n      function createRmCb(childElm, listeners) {\n          return function rmCb() {\n              if (--listeners === 0) {\n                  const parent = api.parentNode(childElm);\n                  api.removeChild(parent, childElm);\n              }\n          };\n      }\n      function createElm(vnode, insertedVnodeQueue) {\n          var _a, _b;\n          let i;\n          let data = vnode.data;\n          if (data !== undefined) {\n              const init = (_a = data.hook) === null || _a === void 0 ? void 0 : _a.init;\n              if (isDef(init)) {\n                  init(vnode);\n                  data = vnode.data;\n              }\n          }\n          const children = vnode.children;\n          const sel = vnode.sel;\n          if (sel === \"!\") {\n              if (isUndef(vnode.text)) {\n                  vnode.text = \"\";\n              }\n              vnode.elm = api.createComment(vnode.text);\n          }\n          else if (sel !== undefined) {\n              // Parse selector\n              const hashIdx = sel.indexOf(\"#\");\n              const dotIdx = sel.indexOf(\".\", hashIdx);\n              const hash = hashIdx > 0 ? hashIdx : sel.length;\n              const dot = dotIdx > 0 ? dotIdx : sel.length;\n              const tag = hashIdx !== -1 || dotIdx !== -1\n                  ? sel.slice(0, Math.min(hash, dot))\n                  : sel;\n              const elm = (vnode.elm =\n                  isDef(data) && isDef((i = data.ns))\n                      ? api.createElementNS(i, tag, data)\n                      : api.createElement(tag, data));\n              if (hash < dot)\n                  elm.setAttribute(\"id\", sel.slice(hash + 1, dot));\n              if (dotIdx > 0)\n                  elm.setAttribute(\"class\", sel.slice(dot + 1).replace(/\\./g, \" \"));\n              for (i = 0; i < cbs.create.length; ++i)\n                  cbs.create[i](emptyNode, vnode);\n              if (array(children)) {\n                  for (i = 0; i < children.length; ++i) {\n                      const ch = children[i];\n                      if (ch != null) {\n                          api.appendChild(elm, createElm(ch, insertedVnodeQueue));\n                      }\n                  }\n              }\n              else if (primitive(vnode.text)) {\n                  api.appendChild(elm, api.createTextNode(vnode.text));\n              }\n              const hook = vnode.data.hook;\n              if (isDef(hook)) {\n                  (_b = hook.create) === null || _b === void 0 ? void 0 : _b.call(hook, emptyNode, vnode);\n                  if (hook.insert) {\n                      insertedVnodeQueue.push(vnode);\n                  }\n              }\n          }\n          else {\n              vnode.elm = api.createTextNode(vnode.text);\n          }\n          return vnode.elm;\n      }\n      function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n          for (; startIdx <= endIdx; ++startIdx) {\n              const ch = vnodes[startIdx];\n              if (ch != null) {\n                  api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);\n              }\n          }\n      }\n      function invokeDestroyHook(vnode) {\n          var _a, _b;\n          const data = vnode.data;\n          if (data !== undefined) {\n              (_b = (_a = data === null || data === void 0 ? void 0 : data.hook) === null || _a === void 0 ? void 0 : _a.destroy) === null || _b === void 0 ? void 0 : _b.call(_a, vnode);\n              for (let i = 0; i < cbs.destroy.length; ++i)\n                  cbs.destroy[i](vnode);\n              if (vnode.children !== undefined) {\n                  for (let j = 0; j < vnode.children.length; ++j) {\n                      const child = vnode.children[j];\n                      if (child != null && typeof child !== \"string\") {\n                          invokeDestroyHook(child);\n                      }\n                  }\n              }\n          }\n      }\n      function removeVnodes(parentElm, vnodes, startIdx, endIdx) {\n          var _a, _b;\n          for (; startIdx <= endIdx; ++startIdx) {\n              let listeners;\n              let rm;\n              const ch = vnodes[startIdx];\n              if (ch != null) {\n                  if (isDef(ch.sel)) {\n                      invokeDestroyHook(ch);\n                      listeners = cbs.remove.length + 1;\n                      rm = createRmCb(ch.elm, listeners);\n                      for (let i = 0; i < cbs.remove.length; ++i)\n                          cbs.remove[i](ch, rm);\n                      const removeHook = (_b = (_a = ch === null || ch === void 0 ? void 0 : ch.data) === null || _a === void 0 ? void 0 : _a.hook) === null || _b === void 0 ? void 0 : _b.remove;\n                      if (isDef(removeHook)) {\n                          removeHook(ch, rm);\n                      }\n                      else {\n                          rm();\n                      }\n                  }\n                  else {\n                      // Text node\n                      api.removeChild(parentElm, ch.elm);\n                  }\n              }\n          }\n      }\n      function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {\n          let oldStartIdx = 0;\n          let newStartIdx = 0;\n          let oldEndIdx = oldCh.length - 1;\n          let oldStartVnode = oldCh[0];\n          let oldEndVnode = oldCh[oldEndIdx];\n          let newEndIdx = newCh.length - 1;\n          let newStartVnode = newCh[0];\n          let newEndVnode = newCh[newEndIdx];\n          let oldKeyToIdx;\n          let idxInOld;\n          let elmToMove;\n          let before;\n          while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n              if (oldStartVnode == null) {\n                  oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left\n              }\n              else if (oldEndVnode == null) {\n                  oldEndVnode = oldCh[--oldEndIdx];\n              }\n              else if (newStartVnode == null) {\n                  newStartVnode = newCh[++newStartIdx];\n              }\n              else if (newEndVnode == null) {\n                  newEndVnode = newCh[--newEndIdx];\n              }\n              else if (sameVnode(oldStartVnode, newStartVnode)) {\n                  patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);\n                  oldStartVnode = oldCh[++oldStartIdx];\n                  newStartVnode = newCh[++newStartIdx];\n              }\n              else if (sameVnode(oldEndVnode, newEndVnode)) {\n                  patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);\n                  oldEndVnode = oldCh[--oldEndIdx];\n                  newEndVnode = newCh[--newEndIdx];\n              }\n              else if (sameVnode(oldStartVnode, newEndVnode)) {\n                  // Vnode moved right\n                  patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);\n                  api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));\n                  oldStartVnode = oldCh[++oldStartIdx];\n                  newEndVnode = newCh[--newEndIdx];\n              }\n              else if (sameVnode(oldEndVnode, newStartVnode)) {\n                  // Vnode moved left\n                  patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);\n                  api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n                  oldEndVnode = oldCh[--oldEndIdx];\n                  newStartVnode = newCh[++newStartIdx];\n              }\n              else {\n                  if (oldKeyToIdx === undefined) {\n                      oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);\n                  }\n                  idxInOld = oldKeyToIdx[newStartVnode.key];\n                  if (isUndef(idxInOld)) {\n                      // New element\n                      api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);\n                  }\n                  else {\n                      elmToMove = oldCh[idxInOld];\n                      if (elmToMove.sel !== newStartVnode.sel) {\n                          api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);\n                      }\n                      else {\n                          patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);\n                          oldCh[idxInOld] = undefined;\n                          api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);\n                      }\n                  }\n                  newStartVnode = newCh[++newStartIdx];\n              }\n          }\n          if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {\n              if (oldStartIdx > oldEndIdx) {\n                  before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;\n                  addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n              }\n              else {\n                  removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n              }\n          }\n      }\n      function patchVnode(oldVnode, vnode, insertedVnodeQueue) {\n          var _a, _b, _c, _d, _e;\n          const hook = (_a = vnode.data) === null || _a === void 0 ? void 0 : _a.hook;\n          (_b = hook === null || hook === void 0 ? void 0 : hook.prepatch) === null || _b === void 0 ? void 0 : _b.call(hook, oldVnode, vnode);\n          const elm = (vnode.elm = oldVnode.elm);\n          const oldCh = oldVnode.children;\n          const ch = vnode.children;\n          if (oldVnode === vnode)\n              return;\n          if (vnode.data !== undefined) {\n              for (let i = 0; i < cbs.update.length; ++i)\n                  cbs.update[i](oldVnode, vnode);\n              (_d = (_c = vnode.data.hook) === null || _c === void 0 ? void 0 : _c.update) === null || _d === void 0 ? void 0 : _d.call(_c, oldVnode, vnode);\n          }\n          if (isUndef(vnode.text)) {\n              if (isDef(oldCh) && isDef(ch)) {\n                  if (oldCh !== ch)\n                      updateChildren(elm, oldCh, ch, insertedVnodeQueue);\n              }\n              else if (isDef(ch)) {\n                  if (isDef(oldVnode.text))\n                      api.setTextContent(elm, \"\");\n                  addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n              }\n              else if (isDef(oldCh)) {\n                  removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n              }\n              else if (isDef(oldVnode.text)) {\n                  api.setTextContent(elm, \"\");\n              }\n          }\n          else if (oldVnode.text !== vnode.text) {\n              if (isDef(oldCh)) {\n                  removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n              }\n              api.setTextContent(elm, vnode.text);\n          }\n          (_e = hook === null || hook === void 0 ? void 0 : hook.postpatch) === null || _e === void 0 ? void 0 : _e.call(hook, oldVnode, vnode);\n      }\n      return function patch(oldVnode, vnode) {\n          let i, elm, parent;\n          const insertedVnodeQueue = [];\n          for (i = 0; i < cbs.pre.length; ++i)\n              cbs.pre[i]();\n          if (!isVnode(oldVnode)) {\n              oldVnode = emptyNodeAt(oldVnode);\n          }\n          if (sameVnode(oldVnode, vnode)) {\n              patchVnode(oldVnode, vnode, insertedVnodeQueue);\n          }\n          else {\n              elm = oldVnode.elm;\n              parent = api.parentNode(elm);\n              createElm(vnode, insertedVnodeQueue);\n              if (parent !== null) {\n                  api.insertBefore(parent, vnode.elm, api.nextSibling(elm));\n                  removeVnodes(parent, [oldVnode], 0, 0);\n              }\n          }\n          for (i = 0; i < insertedVnodeQueue.length; ++i) {\n              insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);\n          }\n          for (i = 0; i < cbs.post.length; ++i)\n              cbs.post[i]();\n          return vnode;\n      };\n  }\n\n  function addNS(data, children, sel) {\n      data.ns = \"http://www.w3.org/2000/svg\";\n      if (sel !== \"foreignObject\" && children !== undefined) {\n          for (let i = 0; i < children.length; ++i) {\n              const childData = children[i].data;\n              if (childData !== undefined) {\n                  addNS(childData, children[i].children, children[i].sel);\n              }\n          }\n      }\n  }\n  function h(sel, b, c) {\n      let data = {};\n      let children;\n      let text;\n      let i;\n      if (c !== undefined) {\n          if (b !== null) {\n              data = b;\n          }\n          if (array(c)) {\n              children = c;\n          }\n          else if (primitive(c)) {\n              text = c.toString();\n          }\n          else if (c && c.sel) {\n              children = [c];\n          }\n      }\n      else if (b !== undefined && b !== null) {\n          if (array(b)) {\n              children = b;\n          }\n          else if (primitive(b)) {\n              text = b.toString();\n          }\n          else if (b && b.sel) {\n              children = [b];\n          }\n          else {\n              data = b;\n          }\n      }\n      if (children !== undefined) {\n          for (i = 0; i < children.length; ++i) {\n              if (primitive(children[i]))\n                  children[i] = vnode(undefined, undefined, undefined, children[i], undefined);\n          }\n      }\n      if (sel[0] === \"s\" &&\n          sel[1] === \"v\" &&\n          sel[2] === \"g\" &&\n          (sel.length === 3 || sel[3] === \".\" || sel[3] === \"#\")) {\n          addNS(data, children, sel);\n      }\n      return vnode(sel, data, children, text, undefined);\n  }\n\n  function copyToThunk(vnode, thunk) {\n      vnode.data.fn = thunk.data.fn;\n      vnode.data.args = thunk.data.args;\n      thunk.data = vnode.data;\n      thunk.children = vnode.children;\n      thunk.text = vnode.text;\n      thunk.elm = vnode.elm;\n  }\n  function init(thunk) {\n      const cur = thunk.data;\n      const vnode = cur.fn(...cur.args);\n      copyToThunk(vnode, thunk);\n  }\n  function prepatch(oldVnode, thunk) {\n      let i;\n      const old = oldVnode.data;\n      const cur = thunk.data;\n      const oldArgs = old.args;\n      const args = cur.args;\n      if (old.fn !== cur.fn || oldArgs.length !== args.length) {\n          copyToThunk(cur.fn(...args), thunk);\n          return;\n      }\n      for (i = 0; i < args.length; ++i) {\n          if (oldArgs[i] !== args[i]) {\n              copyToThunk(cur.fn(...args), thunk);\n              return;\n          }\n      }\n      copyToThunk(oldVnode, thunk);\n  }\n  const thunk = function thunk(sel, key, fn, args) {\n      if (args === undefined) {\n          args = fn;\n          fn = key;\n          key = undefined;\n      }\n      return h(sel, {\n          key: key,\n          hook: { init, prepatch },\n          fn: fn,\n          args: args,\n      });\n  };\n\n  function pre(vnode, newVnode) {\n      const attachData = vnode.data.attachData;\n      // Copy created placeholder and real element from old vnode\n      newVnode.data.attachData.placeholder = attachData.placeholder;\n      newVnode.data.attachData.real = attachData.real;\n      // Mount real element in vnode so the patch process operates on it\n      vnode.elm = vnode.data.attachData.real;\n  }\n  function post(_, vnode) {\n      // Mount dummy placeholder in vnode so potential reorders use it\n      vnode.elm = vnode.data.attachData.placeholder;\n  }\n  function destroy(vnode) {\n      // Remove placeholder\n      if (vnode.elm !== undefined) {\n          vnode.elm.parentNode.removeChild(vnode.elm);\n      }\n      // Remove real element from where it was inserted\n      vnode.elm = vnode.data.attachData.real;\n  }\n  function create(_, vnode) {\n      const real = vnode.elm;\n      const attachData = vnode.data.attachData;\n      const placeholder = document.createElement(\"span\");\n      // Replace actual element with dummy placeholder\n      // Snabbdom will then insert placeholder instead\n      vnode.elm = placeholder;\n      attachData.target.appendChild(real);\n      attachData.real = real;\n      attachData.placeholder = placeholder;\n  }\n  function attachTo(target, vnode) {\n      if (vnode.data === undefined)\n          vnode.data = {};\n      if (vnode.data.hook === undefined)\n          vnode.data.hook = {};\n      const data = vnode.data;\n      const hook = vnode.data.hook;\n      data.attachData = { target: target, placeholder: undefined, real: undefined };\n      hook.create = create;\n      hook.prepatch = pre;\n      hook.postpatch = post;\n      hook.destroy = destroy;\n      return vnode;\n  }\n\n  function toVNode(node, domApi) {\n      const api = domApi !== undefined ? domApi : htmlDomApi;\n      let text;\n      if (api.isElement(node)) {\n          const id = node.id ? \"#\" + node.id : \"\";\n          const cn = node.getAttribute(\"class\");\n          const c = cn ? \".\" + cn.split(\" \").join(\".\") : \"\";\n          const sel = api.tagName(node).toLowerCase() + id + c;\n          const attrs = {};\n          const children = [];\n          let name;\n          let i, n;\n          const elmAttrs = node.attributes;\n          const elmChildren = node.childNodes;\n          for (i = 0, n = elmAttrs.length; i < n; i++) {\n              name = elmAttrs[i].nodeName;\n              if (name !== \"id\" && name !== \"class\") {\n                  attrs[name] = elmAttrs[i].nodeValue;\n              }\n          }\n          for (i = 0, n = elmChildren.length; i < n; i++) {\n              children.push(toVNode(elmChildren[i], domApi));\n          }\n          return vnode(sel, { attrs }, children, undefined, node);\n      }\n      else if (api.isText(node)) {\n          text = api.getTextContent(node);\n          return vnode(undefined, undefined, undefined, text, node);\n      }\n      else if (api.isComment(node)) {\n          text = api.getTextContent(node);\n          return vnode(\"!\", {}, [], text, node);\n      }\n      else {\n          return vnode(\"\", {}, [], undefined, node);\n      }\n  }\n\n  const xlinkNS = \"http://www.w3.org/1999/xlink\";\n  const xmlNS = \"http://www.w3.org/XML/1998/namespace\";\n  const colonChar = 58;\n  const xChar = 120;\n  function updateAttrs(oldVnode, vnode) {\n      let key;\n      const elm = vnode.elm;\n      let oldAttrs = oldVnode.data.attrs;\n      let attrs = vnode.data.attrs;\n      if (!oldAttrs && !attrs)\n          return;\n      if (oldAttrs === attrs)\n          return;\n      oldAttrs = oldAttrs || {};\n      attrs = attrs || {};\n      // update modified attributes, add new attributes\n      for (key in attrs) {\n          const cur = attrs[key];\n          const old = oldAttrs[key];\n          if (old !== cur) {\n              if (cur === true) {\n                  elm.setAttribute(key, \"\");\n              }\n              else if (cur === false) {\n                  elm.removeAttribute(key);\n              }\n              else {\n                  if (key.charCodeAt(0) !== xChar) {\n                      elm.setAttribute(key, cur);\n                  }\n                  else if (key.charCodeAt(3) === colonChar) {\n                      // Assume xml namespace\n                      elm.setAttributeNS(xmlNS, key, cur);\n                  }\n                  else if (key.charCodeAt(5) === colonChar) {\n                      // Assume xlink namespace\n                      elm.setAttributeNS(xlinkNS, key, cur);\n                  }\n                  else {\n                      elm.setAttribute(key, cur);\n                  }\n              }\n          }\n      }\n      // remove removed attributes\n      // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)\n      // the other option is to remove all attributes with value == undefined\n      for (key in oldAttrs) {\n          if (!(key in attrs)) {\n              elm.removeAttribute(key);\n          }\n      }\n  }\n  const attributesModule = {\n      create: updateAttrs,\n      update: updateAttrs,\n  };\n\n  function updateClass(oldVnode, vnode) {\n      let cur;\n      let name;\n      const elm = vnode.elm;\n      let oldClass = oldVnode.data.class;\n      let klass = vnode.data.class;\n      if (!oldClass && !klass)\n          return;\n      if (oldClass === klass)\n          return;\n      oldClass = oldClass || {};\n      klass = klass || {};\n      for (name in oldClass) {\n          if (oldClass[name] && !Object.prototype.hasOwnProperty.call(klass, name)) {\n              // was `true` and now not provided\n              elm.classList.remove(name);\n          }\n      }\n      for (name in klass) {\n          cur = klass[name];\n          if (cur !== oldClass[name]) {\n              elm.classList[cur ? \"add\" : \"remove\"](name);\n          }\n      }\n  }\n  const classModule = { create: updateClass, update: updateClass };\n\n  const CAPS_REGEX = /[A-Z]/g;\n  function updateDataset(oldVnode, vnode) {\n      const elm = vnode.elm;\n      let oldDataset = oldVnode.data.dataset;\n      let dataset = vnode.data.dataset;\n      let key;\n      if (!oldDataset && !dataset)\n          return;\n      if (oldDataset === dataset)\n          return;\n      oldDataset = oldDataset || {};\n      dataset = dataset || {};\n      const d = elm.dataset;\n      for (key in oldDataset) {\n          if (!dataset[key]) {\n              if (d) {\n                  if (key in d) {\n                      delete d[key];\n                  }\n              }\n              else {\n                  elm.removeAttribute(\"data-\" + key.replace(CAPS_REGEX, \"-$&\").toLowerCase());\n              }\n          }\n      }\n      for (key in dataset) {\n          if (oldDataset[key] !== dataset[key]) {\n              if (d) {\n                  d[key] = dataset[key];\n              }\n              else {\n                  elm.setAttribute(\"data-\" + key.replace(CAPS_REGEX, \"-$&\").toLowerCase(), dataset[key]);\n              }\n          }\n      }\n  }\n  const datasetModule = {\n      create: updateDataset,\n      update: updateDataset,\n  };\n\n  function invokeHandler(handler, vnode, event) {\n      if (typeof handler === \"function\") {\n          // call function handler\n          handler.call(vnode, event, vnode);\n      }\n      else if (typeof handler === \"object\") {\n          // call multiple handlers\n          for (let i = 0; i < handler.length; i++) {\n              invokeHandler(handler[i], vnode, event);\n          }\n      }\n  }\n  function handleEvent(event, vnode) {\n      const name = event.type;\n      const on = vnode.data.on;\n      // call event handler(s) if exists\n      if (on && on[name]) {\n          invokeHandler(on[name], vnode, event);\n      }\n  }\n  function createListener() {\n      return function handler(event) {\n          handleEvent(event, handler.vnode);\n      };\n  }\n  function updateEventListeners(oldVnode, vnode) {\n      const oldOn = oldVnode.data.on;\n      const oldListener = oldVnode.listener;\n      const oldElm = oldVnode.elm;\n      const on = vnode && vnode.data.on;\n      const elm = (vnode && vnode.elm);\n      let name;\n      // optimization for reused immutable handlers\n      if (oldOn === on) {\n          return;\n      }\n      // remove existing listeners which no longer used\n      if (oldOn && oldListener) {\n          // if element changed or deleted we remove all existing listeners unconditionally\n          if (!on) {\n              for (name in oldOn) {\n                  // remove listener if element was changed or existing listeners removed\n                  oldElm.removeEventListener(name, oldListener, false);\n              }\n          }\n          else {\n              for (name in oldOn) {\n                  // remove listener if existing listener removed\n                  if (!on[name]) {\n                      oldElm.removeEventListener(name, oldListener, false);\n                  }\n              }\n          }\n      }\n      // add new listeners which has not already attached\n      if (on) {\n          // reuse existing listener or create new\n          const listener = (vnode.listener =\n              oldVnode.listener || createListener());\n          // update vnode for listener\n          listener.vnode = vnode;\n          // if element changed or added we add all needed listeners unconditionally\n          if (!oldOn) {\n              for (name in on) {\n                  // add listener if element was changed or new listeners added\n                  elm.addEventListener(name, listener, false);\n              }\n          }\n          else {\n              for (name in on) {\n                  // add listener if new listener added\n                  if (!oldOn[name]) {\n                      elm.addEventListener(name, listener, false);\n                  }\n              }\n          }\n      }\n  }\n  const eventListenersModule = {\n      create: updateEventListeners,\n      update: updateEventListeners,\n      destroy: updateEventListeners,\n  };\n\n  function updateProps(oldVnode, vnode) {\n      let key;\n      let cur;\n      let old;\n      const elm = vnode.elm;\n      let oldProps = oldVnode.data.props;\n      let props = vnode.data.props;\n      if (!oldProps && !props)\n          return;\n      if (oldProps === props)\n          return;\n      oldProps = oldProps || {};\n      props = props || {};\n      for (key in props) {\n          cur = props[key];\n          old = oldProps[key];\n          if (old !== cur && (key !== \"value\" || elm[key] !== cur)) {\n              elm[key] = cur;\n          }\n      }\n  }\n  const propsModule = { create: updateProps, update: updateProps };\n\n  // Bindig `requestAnimationFrame` like this fixes a bug in IE/Edge. See #360 and #409.\n  const raf = (typeof window !== \"undefined\" &&\n      window.requestAnimationFrame.bind(window)) ||\n      setTimeout;\n  const nextFrame = function (fn) {\n      raf(function () {\n          raf(fn);\n      });\n  };\n  let reflowForced = false;\n  function setNextFrame(obj, prop, val) {\n      nextFrame(function () {\n          obj[prop] = val;\n      });\n  }\n  function updateStyle(oldVnode, vnode) {\n      let cur;\n      let name;\n      const elm = vnode.elm;\n      let oldStyle = oldVnode.data.style;\n      let style = vnode.data.style;\n      if (!oldStyle && !style)\n          return;\n      if (oldStyle === style)\n          return;\n      oldStyle = oldStyle || {};\n      style = style || {};\n      const oldHasDel = \"delayed\" in oldStyle;\n      for (name in oldStyle) {\n          if (!style[name]) {\n              if (name[0] === \"-\" && name[1] === \"-\") {\n                  elm.style.removeProperty(name);\n              }\n              else {\n                  elm.style[name] = \"\";\n              }\n          }\n      }\n      for (name in style) {\n          cur = style[name];\n          if (name === \"delayed\" && style.delayed) {\n              for (const name2 in style.delayed) {\n                  cur = style.delayed[name2];\n                  if (!oldHasDel || cur !== oldStyle.delayed[name2]) {\n                      setNextFrame(elm.style, name2, cur);\n                  }\n              }\n          }\n          else if (name !== \"remove\" && cur !== oldStyle[name]) {\n              if (name[0] === \"-\" && name[1] === \"-\") {\n                  elm.style.setProperty(name, cur);\n              }\n              else {\n                  elm.style[name] = cur;\n              }\n          }\n      }\n  }\n  function applyDestroyStyle(vnode) {\n      let style;\n      let name;\n      const elm = vnode.elm;\n      const s = vnode.data.style;\n      if (!s || !(style = s.destroy))\n          return;\n      for (name in style) {\n          elm.style[name] = style[name];\n      }\n  }\n  function applyRemoveStyle(vnode, rm) {\n      const s = vnode.data.style;\n      if (!s || !s.remove) {\n          rm();\n          return;\n      }\n      if (!reflowForced) {\n          // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n          vnode.elm.offsetLeft;\n          reflowForced = true;\n      }\n      let name;\n      const elm = vnode.elm;\n      let i = 0;\n      const style = s.remove;\n      let amount = 0;\n      const applied = [];\n      for (name in style) {\n          applied.push(name);\n          elm.style[name] = style[name];\n      }\n      const compStyle = getComputedStyle(elm);\n      const props = compStyle[\"transition-property\"].split(\", \");\n      for (; i < props.length; ++i) {\n          if (applied.indexOf(props[i]) !== -1)\n              amount++;\n      }\n      elm.addEventListener(\"transitionend\", function (ev) {\n          if (ev.target === elm)\n              --amount;\n          if (amount === 0)\n              rm();\n      });\n  }\n  function forceReflow() {\n      reflowForced = false;\n  }\n  const styleModule = {\n      pre: forceReflow,\n      create: updateStyle,\n      update: updateStyle,\n      destroy: applyDestroyStyle,\n      remove: applyRemoveStyle,\n  };\n\n  /* eslint-disable @typescript-eslint/no-namespace, import/export */\n  function flattenAndFilter(children, flattened) {\n      for (const child of children) {\n          // filter out falsey children, except 0 since zero can be a valid value e.g inside a chart\n          if (child !== undefined &&\n              child !== null &&\n              child !== false &&\n              child !== \"\") {\n              if (Array.isArray(child)) {\n                  flattenAndFilter(child, flattened);\n              }\n              else if (typeof child === \"string\" ||\n                  typeof child === \"number\" ||\n                  typeof child === \"boolean\") {\n                  flattened.push(vnode(undefined, undefined, undefined, String(child), undefined));\n              }\n              else {\n                  flattened.push(child);\n              }\n          }\n      }\n      return flattened;\n  }\n  /**\n   * jsx/tsx compatible factory function\n   * see: https://www.typescriptlang.org/docs/handbook/jsx.html#factory-functions\n   */\n  function jsx(tag, data, ...children) {\n      const flatChildren = flattenAndFilter(children, []);\n      if (typeof tag === \"function\") {\n          // tag is a function component\n          return tag(data, flatChildren);\n      }\n      else {\n          if (flatChildren.length === 1 &&\n              !flatChildren[0].sel &&\n              flatChildren[0].text) {\n              // only child is a simple text node, pass as text for a simpler vtree\n              return h(tag, data, flatChildren[0].text);\n          }\n          else {\n              return h(tag, data, flatChildren);\n          }\n      }\n  }\n  (function (jsx) {\n  })(jsx || (jsx = {}));\n\n  exports.array = array;\n  exports.attachTo = attachTo;\n  exports.attributesModule = attributesModule;\n  exports.classModule = classModule;\n  exports.datasetModule = datasetModule;\n  exports.eventListenersModule = eventListenersModule;\n  exports.h = h;\n  exports.htmlDomApi = htmlDomApi;\n  exports.init = init$1;\n  exports.jsx = jsx;\n  exports.primitive = primitive;\n  exports.propsModule = propsModule;\n  exports.styleModule = styleModule;\n  exports.thunk = thunk;\n  exports.toVNode = toVNode;\n  exports.vnode = vnode;\n  });\n\n  /**\n   * lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0;\n\n  /** `Object#toString` result references. */\n  var symbolTag$1 = '[object Symbol]';\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',\n    rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,\n    rsUpper + '+' + rsOptUpperContr,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 'ss'\n  };\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal$1 = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n  /** Detect free variable `self`. */\n  var freeSelf$1 = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root$1 = freeGlobal$1 || freeSelf$1 || Function('return this')();\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array ? array.length : 0;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$1 = Object.prototype;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var objectToString$1 = objectProto$1.toString;\n\n  /** Built-in value references. */\n  var Symbol$1 = root$1.Symbol;\n\n  /** Used to convert symbols to primitives and strings. */\n  var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined,\n      symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n  /**\n   * The base implementation of `_.slice` without an iteratee call guard.\n   *\n   * @private\n   * @param {Array} array The array to slice.\n   * @param {number} [start=0] The start position.\n   * @param {number} [end=array.length] The end position.\n   * @returns {Array} Returns the slice of `array`.\n   */\n  function baseSlice(array, start, end) {\n    var index = -1,\n        length = array.length;\n\n    if (start < 0) {\n      start = -start > length ? 0 : (length + start);\n    }\n    end = end > length ? length : end;\n    if (end < 0) {\n      end += length;\n    }\n    length = start > end ? 0 : ((end - start) >>> 0);\n    start >>>= 0;\n\n    var result = Array(length);\n    while (++index < length) {\n      result[index] = array[index + start];\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toString` which doesn't convert nullish\n   * values to empty strings.\n   *\n   * @private\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   */\n  function baseToString(value) {\n    // Exit early for strings to avoid a performance hit in some environments.\n    if (typeof value == 'string') {\n      return value;\n    }\n    if (isSymbol$1(value)) {\n      return symbolToString ? symbolToString.call(value) : '';\n    }\n    var result = (value + '');\n    return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n  }\n\n  /**\n   * Casts `array` to a slice if it's needed.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {number} start The start position.\n   * @param {number} [end=array.length] The end position.\n   * @returns {Array} Returns the cast slice.\n   */\n  function castSlice(array, start, end) {\n    var length = array.length;\n    end = end === undefined ? length : end;\n    return (!start && end >= length) ? array : baseSlice(array, start, end);\n  }\n\n  /**\n   * Creates a function like `_.lowerFirst`.\n   *\n   * @private\n   * @param {string} methodName The name of the `String` case method to use.\n   * @returns {Function} Returns the new case function.\n   */\n  function createCaseFirst(methodName) {\n    return function(string) {\n      string = toString(string);\n\n      var strSymbols = hasUnicode(string)\n        ? stringToArray(string)\n        : undefined;\n\n      var chr = strSymbols\n        ? strSymbols[0]\n        : string.charAt(0);\n\n      var trailing = strSymbols\n        ? castSlice(strSymbols, 1).join('')\n        : string.slice(1);\n\n      return chr[methodName]() + trailing;\n    };\n  }\n\n  /**\n   * Creates a function like `_.camelCase`.\n   *\n   * @private\n   * @param {Function} callback The function to combine each word.\n   * @returns {Function} Returns the new compounder function.\n   */\n  function createCompounder(callback) {\n    return function(string) {\n      return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n    };\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike$1(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Checks if `value` is classified as a `Symbol` primitive or object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n   * @example\n   *\n   * _.isSymbol(Symbol.iterator);\n   * // => true\n   *\n   * _.isSymbol('abc');\n   * // => false\n   */\n  function isSymbol$1(value) {\n    return typeof value == 'symbol' ||\n      (isObjectLike$1(value) && objectToString$1.call(value) == symbolTag$1);\n  }\n\n  /**\n   * Converts `value` to a string. An empty string is returned for `null`\n   * and `undefined` values. The sign of `-0` is preserved.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   * @example\n   *\n   * _.toString(null);\n   * // => ''\n   *\n   * _.toString(-0);\n   * // => '-0'\n   *\n   * _.toString([1, 2, 3]);\n   * // => '1,2,3'\n   */\n  function toString(value) {\n    return value == null ? '' : baseToString(value);\n  }\n\n  /**\n   * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category String\n   * @param {string} [string=''] The string to convert.\n   * @returns {string} Returns the camel cased string.\n   * @example\n   *\n   * _.camelCase('Foo Bar');\n   * // => 'fooBar'\n   *\n   * _.camelCase('--foo-bar--');\n   * // => 'fooBar'\n   *\n   * _.camelCase('__FOO_BAR__');\n   * // => 'fooBar'\n   */\n  var camelCase = createCompounder(function(result, word, index) {\n    word = word.toLowerCase();\n    return result + (index ? capitalize(word) : word);\n  });\n\n  /**\n   * Converts the first character of `string` to upper case and the remaining\n   * to lower case.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category String\n   * @param {string} [string=''] The string to capitalize.\n   * @returns {string} Returns the capitalized string.\n   * @example\n   *\n   * _.capitalize('FRED');\n   * // => 'Fred'\n   */\n  function capitalize(string) {\n    return upperFirst(toString(string).toLowerCase());\n  }\n\n  /**\n   * Deburrs `string` by converting\n   * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n   * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n   * letters to basic Latin letters and removing\n   * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category String\n   * @param {string} [string=''] The string to deburr.\n   * @returns {string} Returns the deburred string.\n   * @example\n   *\n   * _.deburr('déjà vu');\n   * // => 'deja vu'\n   */\n  function deburr(string) {\n    string = toString(string);\n    return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n  }\n\n  /**\n   * Converts the first character of `string` to upper case.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category String\n   * @param {string} [string=''] The string to convert.\n   * @returns {string} Returns the converted string.\n   * @example\n   *\n   * _.upperFirst('fred');\n   * // => 'Fred'\n   *\n   * _.upperFirst('FRED');\n   * // => 'FRED'\n   */\n  var upperFirst = createCaseFirst('toUpperCase');\n\n  /**\n   * Splits `string` into an array of its words.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category String\n   * @param {string} [string=''] The string to inspect.\n   * @param {RegExp|string} [pattern] The pattern to match words.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {Array} Returns the words of `string`.\n   * @example\n   *\n   * _.words('fred, barney, & pebbles');\n   * // => ['fred', 'barney', 'pebbles']\n   *\n   * _.words('fred, barney, & pebbles', /[^, ]+/g);\n   * // => ['fred', 'barney', '&', 'pebbles']\n   */\n  function words(string, pattern, guard) {\n    string = toString(string);\n    pattern = guard ? undefined : pattern;\n\n    if (pattern === undefined) {\n      return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n    }\n    return string.match(pattern) || [];\n  }\n\n  var lodash_camelcase = camelCase;\n\n  /**\n   * Constants.\n   */\n\n  var IS_MAC = typeof window != 'undefined' && /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\n\n  var MODIFIERS = {\n    alt: 'altKey',\n    control: 'ctrlKey',\n    meta: 'metaKey',\n    shift: 'shiftKey'\n  };\n\n  var ALIASES = {\n    add: '+',\n    break: 'pause',\n    cmd: 'meta',\n    command: 'meta',\n    ctl: 'control',\n    ctrl: 'control',\n    del: 'delete',\n    down: 'arrowdown',\n    esc: 'escape',\n    ins: 'insert',\n    left: 'arrowleft',\n    mod: IS_MAC ? 'meta' : 'control',\n    opt: 'alt',\n    option: 'alt',\n    return: 'enter',\n    right: 'arrowright',\n    space: ' ',\n    spacebar: ' ',\n    up: 'arrowup',\n    win: 'meta',\n    windows: 'meta'\n  };\n\n  var CODES = {\n    backspace: 8,\n    tab: 9,\n    enter: 13,\n    shift: 16,\n    control: 17,\n    alt: 18,\n    pause: 19,\n    capslock: 20,\n    escape: 27,\n    ' ': 32,\n    pageup: 33,\n    pagedown: 34,\n    end: 35,\n    home: 36,\n    arrowleft: 37,\n    arrowup: 38,\n    arrowright: 39,\n    arrowdown: 40,\n    insert: 45,\n    delete: 46,\n    meta: 91,\n    numlock: 144,\n    scrolllock: 145,\n    ';': 186,\n    '=': 187,\n    ',': 188,\n    '-': 189,\n    '.': 190,\n    '/': 191,\n    '`': 192,\n    '[': 219,\n    '\\\\': 220,\n    ']': 221,\n    '\\'': 222\n  };\n\n  for (var f = 1; f < 20; f++) {\n    CODES['f' + f] = 111 + f;\n  }\n\n  /**\n   * Is hotkey?\n   */\n\n  function isHotkey(hotkey, options, event) {\n    if (options && !('byKey' in options)) {\n      event = options;\n      options = null;\n    }\n\n    if (!Array.isArray(hotkey)) {\n      hotkey = [hotkey];\n    }\n\n    var array = hotkey.map(function (string) {\n      return parseHotkey(string, options);\n    });\n    var check = function check(e) {\n      return array.some(function (object) {\n        return compareHotkey(object, e);\n      });\n    };\n    var ret = event == null ? check : check(event);\n    return ret;\n  }\n\n  function isCodeHotkey(hotkey, event) {\n    return isHotkey(hotkey, event);\n  }\n\n  function isKeyHotkey(hotkey, event) {\n    return isHotkey(hotkey, { byKey: true }, event);\n  }\n\n  /**\n   * Parse.\n   */\n\n  function parseHotkey(hotkey, options) {\n    var byKey = options && options.byKey;\n    var ret = {};\n\n    // Special case to handle the `+` key since we use it as a separator.\n    hotkey = hotkey.replace('++', '+add');\n    var values = hotkey.split('+');\n    var length = values.length;\n\n    // Ensure that all the modifiers are set to false unless the hotkey has them.\n\n    for (var k in MODIFIERS) {\n      ret[MODIFIERS[k]] = false;\n    }\n\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var value = _step.value;\n\n        var optional = value.endsWith('?') && value.length > 1;\n\n        if (optional) {\n          value = value.slice(0, -1);\n        }\n\n        var name = toKeyName(value);\n        var modifier = MODIFIERS[name];\n\n        if (value.length > 1 && !modifier && !ALIASES[value] && !CODES[name]) {\n          throw new TypeError('Unknown modifier: \"' + value + '\"');\n        }\n\n        if (length === 1 || !modifier) {\n          if (byKey) {\n            ret.key = name;\n          } else {\n            ret.which = toKeyCode(value);\n          }\n        }\n\n        if (modifier) {\n          ret[modifier] = optional ? null : true;\n        }\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n\n    return ret;\n  }\n\n  /**\n   * Compare.\n   */\n\n  function compareHotkey(object, event) {\n    for (var key in object) {\n      var expected = object[key];\n      var actual = void 0;\n\n      if (expected == null) {\n        continue;\n      }\n\n      if (key === 'key' && event.key != null) {\n        actual = event.key.toLowerCase();\n      } else if (key === 'which') {\n        actual = expected === 91 && event.which === 93 ? 91 : event.which;\n      } else {\n        actual = event[key];\n      }\n\n      if (actual == null && expected === false) {\n        continue;\n      }\n\n      if (actual !== expected) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Utils.\n   */\n\n  function toKeyCode(name) {\n    name = toKeyName(name);\n    var code = CODES[name] || name.toUpperCase().charCodeAt(0);\n    return code;\n  }\n\n  function toKeyName(name) {\n    name = name.toLowerCase();\n    name = ALIASES[name] || name;\n    return name;\n  }\n\n  /**\n   * Export.\n   */\n\n  var _default = isHotkey;\n  var isHotkey_1 = isHotkey;\n  var isCodeHotkey_1 = isCodeHotkey;\n  var isKeyHotkey_1 = isKeyHotkey;\n  var parseHotkey_1 = parseHotkey;\n  var compareHotkey_1 = compareHotkey;\n  var toKeyCode_1 = toKeyCode;\n  var toKeyName_1 = toKeyName;\n\n  var lib$4 = /*#__PURE__*/Object.defineProperty({\n  \tdefault: _default,\n  \tisHotkey: isHotkey_1,\n  \tisCodeHotkey: isCodeHotkey_1,\n  \tisKeyHotkey: isKeyHotkey_1,\n  \tparseHotkey: parseHotkey_1,\n  \tcompareHotkey: compareHotkey_1,\n  \ttoKeyCode: toKeyCode_1,\n  \ttoKeyName: toKeyName_1\n  }, '__esModule', {value: true});\n\n  /**\n   * lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n\n  /** Used as the `TypeError` message for \"Functions\" methods. */\n  var FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used as references for various `Number` constants. */\n  var NAN = 0 / 0;\n\n  /** `Object#toString` result references. */\n  var symbolTag = '[object Symbol]';\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Used for built-in method references. */\n  var objectProto = Object.prototype;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var objectToString = objectProto.toString;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeMax = Math.max,\n      nativeMin = Math.min;\n\n  /**\n   * Gets the timestamp of the number of milliseconds that have elapsed since\n   * the Unix epoch (1 January 1970 00:00:00 UTC).\n   *\n   * @static\n   * @memberOf _\n   * @since 2.4.0\n   * @category Date\n   * @returns {number} Returns the timestamp.\n   * @example\n   *\n   * _.defer(function(stamp) {\n   *   console.log(_.now() - stamp);\n   * }, _.now());\n   * // => Logs the number of milliseconds it took for the deferred invocation.\n   */\n  var now = function() {\n    return root.Date.now();\n  };\n\n  /**\n   * Creates a debounced function that delays invoking `func` until after `wait`\n   * milliseconds have elapsed since the last time the debounced function was\n   * invoked. The debounced function comes with a `cancel` method to cancel\n   * delayed `func` invocations and a `flush` method to immediately invoke them.\n   * Provide `options` to indicate whether `func` should be invoked on the\n   * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n   * with the last arguments provided to the debounced function. Subsequent\n   * calls to the debounced function return the result of the last `func`\n   * invocation.\n   *\n   * **Note:** If `leading` and `trailing` options are `true`, `func` is\n   * invoked on the trailing edge of the timeout only if the debounced function\n   * is invoked more than once during the `wait` timeout.\n   *\n   * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n   * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n   *\n   * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n   * for details over the differences between `_.debounce` and `_.throttle`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to debounce.\n   * @param {number} [wait=0] The number of milliseconds to delay.\n   * @param {Object} [options={}] The options object.\n   * @param {boolean} [options.leading=false]\n   *  Specify invoking on the leading edge of the timeout.\n   * @param {number} [options.maxWait]\n   *  The maximum time `func` is allowed to be delayed before it's invoked.\n   * @param {boolean} [options.trailing=true]\n   *  Specify invoking on the trailing edge of the timeout.\n   * @returns {Function} Returns the new debounced function.\n   * @example\n   *\n   * // Avoid costly calculations while the window size is in flux.\n   * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n   *\n   * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n   * jQuery(element).on('click', _.debounce(sendMail, 300, {\n   *   'leading': true,\n   *   'trailing': false\n   * }));\n   *\n   * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n   * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n   * var source = new EventSource('/stream');\n   * jQuery(source).on('message', debounced);\n   *\n   * // Cancel the trailing debounced invocation.\n   * jQuery(window).on('popstate', debounced.cancel);\n   */\n  function debounce$1(func, wait, options) {\n    var lastArgs,\n        lastThis,\n        maxWait,\n        result,\n        timerId,\n        lastCallTime,\n        lastInvokeTime = 0,\n        leading = false,\n        maxing = false,\n        trailing = true;\n\n    if (typeof func != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    wait = toNumber(wait) || 0;\n    if (isObject(options)) {\n      leading = !!options.leading;\n      maxing = 'maxWait' in options;\n      maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n      trailing = 'trailing' in options ? !!options.trailing : trailing;\n    }\n\n    function invokeFunc(time) {\n      var args = lastArgs,\n          thisArg = lastThis;\n\n      lastArgs = lastThis = undefined;\n      lastInvokeTime = time;\n      result = func.apply(thisArg, args);\n      return result;\n    }\n\n    function leadingEdge(time) {\n      // Reset any `maxWait` timer.\n      lastInvokeTime = time;\n      // Start the timer for the trailing edge.\n      timerId = setTimeout(timerExpired, wait);\n      // Invoke the leading edge.\n      return leading ? invokeFunc(time) : result;\n    }\n\n    function remainingWait(time) {\n      var timeSinceLastCall = time - lastCallTime,\n          timeSinceLastInvoke = time - lastInvokeTime,\n          result = wait - timeSinceLastCall;\n\n      return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n    }\n\n    function shouldInvoke(time) {\n      var timeSinceLastCall = time - lastCallTime,\n          timeSinceLastInvoke = time - lastInvokeTime;\n\n      // Either this is the first call, activity has stopped and we're at the\n      // trailing edge, the system time has gone backwards and we're treating\n      // it as the trailing edge, or we've hit the `maxWait` limit.\n      return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n        (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n    }\n\n    function timerExpired() {\n      var time = now();\n      if (shouldInvoke(time)) {\n        return trailingEdge(time);\n      }\n      // Restart the timer.\n      timerId = setTimeout(timerExpired, remainingWait(time));\n    }\n\n    function trailingEdge(time) {\n      timerId = undefined;\n\n      // Only invoke if we have `lastArgs` which means `func` has been\n      // debounced at least once.\n      if (trailing && lastArgs) {\n        return invokeFunc(time);\n      }\n      lastArgs = lastThis = undefined;\n      return result;\n    }\n\n    function cancel() {\n      if (timerId !== undefined) {\n        clearTimeout(timerId);\n      }\n      lastInvokeTime = 0;\n      lastArgs = lastCallTime = lastThis = timerId = undefined;\n    }\n\n    function flush() {\n      return timerId === undefined ? result : trailingEdge(now());\n    }\n\n    function debounced() {\n      var time = now(),\n          isInvoking = shouldInvoke(time);\n\n      lastArgs = arguments;\n      lastThis = this;\n      lastCallTime = time;\n\n      if (isInvoking) {\n        if (timerId === undefined) {\n          return leadingEdge(lastCallTime);\n        }\n        if (maxing) {\n          // Handle invocations in a tight loop.\n          timerId = setTimeout(timerExpired, wait);\n          return invokeFunc(lastCallTime);\n        }\n      }\n      if (timerId === undefined) {\n        timerId = setTimeout(timerExpired, wait);\n      }\n      return result;\n    }\n    debounced.cancel = cancel;\n    debounced.flush = flush;\n    return debounced;\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject(value) {\n    var type = typeof value;\n    return !!value && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Checks if `value` is classified as a `Symbol` primitive or object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n   * @example\n   *\n   * _.isSymbol(Symbol.iterator);\n   * // => true\n   *\n   * _.isSymbol('abc');\n   * // => false\n   */\n  function isSymbol(value) {\n    return typeof value == 'symbol' ||\n      (isObjectLike(value) && objectToString.call(value) == symbolTag);\n  }\n\n  /**\n   * Converts `value` to a number.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to process.\n   * @returns {number} Returns the number.\n   * @example\n   *\n   * _.toNumber(3.2);\n   * // => 3.2\n   *\n   * _.toNumber(Number.MIN_VALUE);\n   * // => 5e-324\n   *\n   * _.toNumber(Infinity);\n   * // => Infinity\n   *\n   * _.toNumber('3.2');\n   * // => 3.2\n   */\n  function toNumber(value) {\n    if (typeof value == 'number') {\n      return value;\n    }\n    if (isSymbol(value)) {\n      return NAN;\n    }\n    if (isObject(value)) {\n      var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n      value = isObject(other) ? (other + '') : other;\n    }\n    if (typeof value != 'string') {\n      return value === 0 ? value : +value;\n    }\n    value = value.replace(reTrim, '');\n    var isBinary = reIsBinary.test(value);\n    return (isBinary || reIsOctal.test(value))\n      ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n      : (reIsBadHex.test(value) ? NAN : +value);\n  }\n\n  var lodash_debounce = debounce$1;\n\n  /**\n   * lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n\n  var lodash_clonedeep = createCommonjsModule$1(function (module, exports) {\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as references for various `Number` constants. */\n  var MAX_SAFE_INTEGER = 9007199254740991;\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      weakMapTag = '[object WeakMap]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /**\n   * Adds the key-value `pair` to `map`.\n   *\n   * @private\n   * @param {Object} map The map to modify.\n   * @param {Array} pair The key-value pair to add.\n   * @returns {Object} Returns `map`.\n   */\n  function addMapEntry(map, pair) {\n    // Don't return `map.set` because it's not chainable in IE 11.\n    map.set(pair[0], pair[1]);\n    return map;\n  }\n\n  /**\n   * Adds `value` to `set`.\n   *\n   * @private\n   * @param {Object} set The set to modify.\n   * @param {*} value The value to add.\n   * @returns {Object} Returns `set`.\n   */\n  function addSetEntry(set, value) {\n    // Don't return `set.add` because it's not chainable in IE 11.\n    set.add(value);\n    return set;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array ? array.length : 0;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `value` is a host object in IE < 9.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n   */\n  function isHostObject(value) {\n    // Many host objects are `Object` objects that can coerce to strings\n    // despite having improperly defined `toString` methods.\n    var result = false;\n    if (value != null && typeof value.toString != 'function') {\n      try {\n        result = !!(value + '');\n      } catch (e) {}\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /** Used for built-in method references. */\n  var arrayProto = Array.prototype,\n      funcProto = Function.prototype,\n      objectProto = Object.prototype;\n\n  /** Used to detect overreaching core-js shims. */\n  var coreJsData = root['__core-js_shared__'];\n\n  /** Used to detect methods masquerading as native. */\n  var maskSrcKey = (function() {\n    var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n    return uid ? ('Symbol(src)_1.' + uid) : '';\n  }());\n\n  /** Used to resolve the decompiled source of functions. */\n  var funcToString = funcProto.toString;\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty = objectProto.hasOwnProperty;\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var objectToString = objectProto.toString;\n\n  /** Used to detect if a method is native. */\n  var reIsNative = RegExp('^' +\n    funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n    .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n  );\n\n  /** Built-in value references. */\n  var Buffer = moduleExports ? root.Buffer : undefined,\n      Symbol = root.Symbol,\n      Uint8Array = root.Uint8Array,\n      getPrototype = overArg(Object.getPrototypeOf, Object),\n      objectCreate = Object.create,\n      propertyIsEnumerable = objectProto.propertyIsEnumerable,\n      splice = arrayProto.splice;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeGetSymbols = Object.getOwnPropertySymbols,\n      nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n      nativeKeys = overArg(Object.keys, Object);\n\n  /* Built-in method references that are verified to be native. */\n  var DataView = getNative(root, 'DataView'),\n      Map = getNative(root, 'Map'),\n      Promise = getNative(root, 'Promise'),\n      Set = getNative(root, 'Set'),\n      WeakMap = getNative(root, 'WeakMap'),\n      nativeCreate = getNative(Object, 'create');\n\n  /** Used to detect maps, sets, and weakmaps. */\n  var dataViewCtorString = toSource(DataView),\n      mapCtorString = toSource(Map),\n      promiseCtorString = toSource(Promise),\n      setCtorString = toSource(Set),\n      weakMapCtorString = toSource(WeakMap);\n\n  /** Used to convert symbols to primitives and strings. */\n  var symbolProto = Symbol ? Symbol.prototype : undefined,\n      symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n  /**\n   * Creates a hash object.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function Hash(entries) {\n    var index = -1,\n        length = entries ? entries.length : 0;\n\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n\n  /**\n   * Removes all key-value entries from the hash.\n   *\n   * @private\n   * @name clear\n   * @memberOf Hash\n   */\n  function hashClear() {\n    this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  }\n\n  /**\n   * Removes `key` and its value from the hash.\n   *\n   * @private\n   * @name delete\n   * @memberOf Hash\n   * @param {Object} hash The hash to modify.\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function hashDelete(key) {\n    return this.has(key) && delete this.__data__[key];\n  }\n\n  /**\n   * Gets the hash value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf Hash\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function hashGet(key) {\n    var data = this.__data__;\n    if (nativeCreate) {\n      var result = data[key];\n      return result === HASH_UNDEFINED ? undefined : result;\n    }\n    return hasOwnProperty.call(data, key) ? data[key] : undefined;\n  }\n\n  /**\n   * Checks if a hash value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf Hash\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function hashHas(key) {\n    var data = this.__data__;\n    return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n  }\n\n  /**\n   * Sets the hash `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf Hash\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the hash instance.\n   */\n  function hashSet(key, value) {\n    var data = this.__data__;\n    data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n    return this;\n  }\n\n  // Add methods to `Hash`.\n  Hash.prototype.clear = hashClear;\n  Hash.prototype['delete'] = hashDelete;\n  Hash.prototype.get = hashGet;\n  Hash.prototype.has = hashHas;\n  Hash.prototype.set = hashSet;\n\n  /**\n   * Creates an list cache object.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function ListCache(entries) {\n    var index = -1,\n        length = entries ? entries.length : 0;\n\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n\n  /**\n   * Removes all key-value entries from the list cache.\n   *\n   * @private\n   * @name clear\n   * @memberOf ListCache\n   */\n  function listCacheClear() {\n    this.__data__ = [];\n  }\n\n  /**\n   * Removes `key` and its value from the list cache.\n   *\n   * @private\n   * @name delete\n   * @memberOf ListCache\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function listCacheDelete(key) {\n    var data = this.__data__,\n        index = assocIndexOf(data, key);\n\n    if (index < 0) {\n      return false;\n    }\n    var lastIndex = data.length - 1;\n    if (index == lastIndex) {\n      data.pop();\n    } else {\n      splice.call(data, index, 1);\n    }\n    return true;\n  }\n\n  /**\n   * Gets the list cache value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf ListCache\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function listCacheGet(key) {\n    var data = this.__data__,\n        index = assocIndexOf(data, key);\n\n    return index < 0 ? undefined : data[index][1];\n  }\n\n  /**\n   * Checks if a list cache value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf ListCache\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function listCacheHas(key) {\n    return assocIndexOf(this.__data__, key) > -1;\n  }\n\n  /**\n   * Sets the list cache `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf ListCache\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the list cache instance.\n   */\n  function listCacheSet(key, value) {\n    var data = this.__data__,\n        index = assocIndexOf(data, key);\n\n    if (index < 0) {\n      data.push([key, value]);\n    } else {\n      data[index][1] = value;\n    }\n    return this;\n  }\n\n  // Add methods to `ListCache`.\n  ListCache.prototype.clear = listCacheClear;\n  ListCache.prototype['delete'] = listCacheDelete;\n  ListCache.prototype.get = listCacheGet;\n  ListCache.prototype.has = listCacheHas;\n  ListCache.prototype.set = listCacheSet;\n\n  /**\n   * Creates a map cache object to store key-value pairs.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function MapCache(entries) {\n    var index = -1,\n        length = entries ? entries.length : 0;\n\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n\n  /**\n   * Removes all key-value entries from the map.\n   *\n   * @private\n   * @name clear\n   * @memberOf MapCache\n   */\n  function mapCacheClear() {\n    this.__data__ = {\n      'hash': new Hash,\n      'map': new (Map || ListCache),\n      'string': new Hash\n    };\n  }\n\n  /**\n   * Removes `key` and its value from the map.\n   *\n   * @private\n   * @name delete\n   * @memberOf MapCache\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function mapCacheDelete(key) {\n    return getMapData(this, key)['delete'](key);\n  }\n\n  /**\n   * Gets the map value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf MapCache\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function mapCacheGet(key) {\n    return getMapData(this, key).get(key);\n  }\n\n  /**\n   * Checks if a map value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf MapCache\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function mapCacheHas(key) {\n    return getMapData(this, key).has(key);\n  }\n\n  /**\n   * Sets the map `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf MapCache\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the map cache instance.\n   */\n  function mapCacheSet(key, value) {\n    getMapData(this, key).set(key, value);\n    return this;\n  }\n\n  // Add methods to `MapCache`.\n  MapCache.prototype.clear = mapCacheClear;\n  MapCache.prototype['delete'] = mapCacheDelete;\n  MapCache.prototype.get = mapCacheGet;\n  MapCache.prototype.has = mapCacheHas;\n  MapCache.prototype.set = mapCacheSet;\n\n  /**\n   * Creates a stack cache object to store key-value pairs.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function Stack(entries) {\n    this.__data__ = new ListCache(entries);\n  }\n\n  /**\n   * Removes all key-value entries from the stack.\n   *\n   * @private\n   * @name clear\n   * @memberOf Stack\n   */\n  function stackClear() {\n    this.__data__ = new ListCache;\n  }\n\n  /**\n   * Removes `key` and its value from the stack.\n   *\n   * @private\n   * @name delete\n   * @memberOf Stack\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function stackDelete(key) {\n    return this.__data__['delete'](key);\n  }\n\n  /**\n   * Gets the stack value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf Stack\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function stackGet(key) {\n    return this.__data__.get(key);\n  }\n\n  /**\n   * Checks if a stack value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf Stack\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function stackHas(key) {\n    return this.__data__.has(key);\n  }\n\n  /**\n   * Sets the stack `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf Stack\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the stack cache instance.\n   */\n  function stackSet(key, value) {\n    var cache = this.__data__;\n    if (cache instanceof ListCache) {\n      var pairs = cache.__data__;\n      if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n        pairs.push([key, value]);\n        return this;\n      }\n      cache = this.__data__ = new MapCache(pairs);\n    }\n    cache.set(key, value);\n    return this;\n  }\n\n  // Add methods to `Stack`.\n  Stack.prototype.clear = stackClear;\n  Stack.prototype['delete'] = stackDelete;\n  Stack.prototype.get = stackGet;\n  Stack.prototype.has = stackHas;\n  Stack.prototype.set = stackSet;\n\n  /**\n   * Creates an array of the enumerable property names of the array-like `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @param {boolean} inherited Specify returning inherited property names.\n   * @returns {Array} Returns the array of property names.\n   */\n  function arrayLikeKeys(value, inherited) {\n    // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n    // Safari 9 makes `arguments.length` enumerable in strict mode.\n    var result = (isArray(value) || isArguments(value))\n      ? baseTimes(value.length, String)\n      : [];\n\n    var length = result.length,\n        skipIndexes = !!length;\n\n    for (var key in value) {\n      if ((inherited || hasOwnProperty.call(value, key)) &&\n          !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Assigns `value` to `key` of `object` if the existing value is not equivalent\n   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons.\n   *\n   * @private\n   * @param {Object} object The object to modify.\n   * @param {string} key The key of the property to assign.\n   * @param {*} value The value to assign.\n   */\n  function assignValue(object, key, value) {\n    var objValue = object[key];\n    if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n        (value === undefined && !(key in object))) {\n      object[key] = value;\n    }\n  }\n\n  /**\n   * Gets the index at which the `key` is found in `array` of key-value pairs.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} key The key to search for.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function assocIndexOf(array, key) {\n    var length = array.length;\n    while (length--) {\n      if (eq(array[length][0], key)) {\n        return length;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.assign` without support for multiple sources\n   * or `customizer` functions.\n   *\n   * @private\n   * @param {Object} object The destination object.\n   * @param {Object} source The source object.\n   * @returns {Object} Returns `object`.\n   */\n  function baseAssign(object, source) {\n    return object && copyObject(source, keys(source), object);\n  }\n\n  /**\n   * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n   * traversed objects.\n   *\n   * @private\n   * @param {*} value The value to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @param {boolean} [isFull] Specify a clone including symbols.\n   * @param {Function} [customizer] The function to customize cloning.\n   * @param {string} [key] The key of `value`.\n   * @param {Object} [object] The parent object of `value`.\n   * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n   * @returns {*} Returns the cloned value.\n   */\n  function baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n    var result;\n    if (customizer) {\n      result = object ? customizer(value, key, object, stack) : customizer(value);\n    }\n    if (result !== undefined) {\n      return result;\n    }\n    if (!isObject(value)) {\n      return value;\n    }\n    var isArr = isArray(value);\n    if (isArr) {\n      result = initCloneArray(value);\n      if (!isDeep) {\n        return copyArray(value, result);\n      }\n    } else {\n      var tag = getTag(value),\n          isFunc = tag == funcTag || tag == genTag;\n\n      if (isBuffer(value)) {\n        return cloneBuffer(value, isDeep);\n      }\n      if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n        if (isHostObject(value)) {\n          return object ? value : {};\n        }\n        result = initCloneObject(isFunc ? {} : value);\n        if (!isDeep) {\n          return copySymbols(value, baseAssign(result, value));\n        }\n      } else {\n        if (!cloneableTags[tag]) {\n          return object ? value : {};\n        }\n        result = initCloneByTag(value, tag, baseClone, isDeep);\n      }\n    }\n    // Check for circular references and return its corresponding clone.\n    stack || (stack = new Stack);\n    var stacked = stack.get(value);\n    if (stacked) {\n      return stacked;\n    }\n    stack.set(value, result);\n\n    if (!isArr) {\n      var props = isFull ? getAllKeys(value) : keys(value);\n    }\n    arrayEach(props || value, function(subValue, key) {\n      if (props) {\n        key = subValue;\n        subValue = value[key];\n      }\n      // Recursively populate clone (susceptible to call stack limits).\n      assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.create` without support for assigning\n   * properties to the created object.\n   *\n   * @private\n   * @param {Object} prototype The object to inherit from.\n   * @returns {Object} Returns the new object.\n   */\n  function baseCreate(proto) {\n    return isObject(proto) ? objectCreate(proto) : {};\n  }\n\n  /**\n   * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n   * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n   * symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Function} keysFunc The function to get the keys of `object`.\n   * @param {Function} symbolsFunc The function to get the symbols of `object`.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n    var result = keysFunc(object);\n    return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n  }\n\n  /**\n   * The base implementation of `getTag`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  function baseGetTag(value) {\n    return objectToString.call(value);\n  }\n\n  /**\n   * The base implementation of `_.isNative` without bad shim checks.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a native function,\n   *  else `false`.\n   */\n  function baseIsNative(value) {\n    if (!isObject(value) || isMasked(value)) {\n      return false;\n    }\n    var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n    return pattern.test(toSource(value));\n  }\n\n  /**\n   * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function baseKeys(object) {\n    if (!isPrototype(object)) {\n      return nativeKeys(object);\n    }\n    var result = [];\n    for (var key in Object(object)) {\n      if (hasOwnProperty.call(object, key) && key != 'constructor') {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates a clone of  `buffer`.\n   *\n   * @private\n   * @param {Buffer} buffer The buffer to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Buffer} Returns the cloned buffer.\n   */\n  function cloneBuffer(buffer, isDeep) {\n    if (isDeep) {\n      return buffer.slice();\n    }\n    var result = new buffer.constructor(buffer.length);\n    buffer.copy(result);\n    return result;\n  }\n\n  /**\n   * Creates a clone of `arrayBuffer`.\n   *\n   * @private\n   * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n   * @returns {ArrayBuffer} Returns the cloned array buffer.\n   */\n  function cloneArrayBuffer(arrayBuffer) {\n    var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n    new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n    return result;\n  }\n\n  /**\n   * Creates a clone of `dataView`.\n   *\n   * @private\n   * @param {Object} dataView The data view to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the cloned data view.\n   */\n  function cloneDataView(dataView, isDeep) {\n    var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n    return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n  }\n\n  /**\n   * Creates a clone of `map`.\n   *\n   * @private\n   * @param {Object} map The map to clone.\n   * @param {Function} cloneFunc The function to clone values.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the cloned map.\n   */\n  function cloneMap(map, isDeep, cloneFunc) {\n    var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n    return arrayReduce(array, addMapEntry, new map.constructor);\n  }\n\n  /**\n   * Creates a clone of `regexp`.\n   *\n   * @private\n   * @param {Object} regexp The regexp to clone.\n   * @returns {Object} Returns the cloned regexp.\n   */\n  function cloneRegExp(regexp) {\n    var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n    result.lastIndex = regexp.lastIndex;\n    return result;\n  }\n\n  /**\n   * Creates a clone of `set`.\n   *\n   * @private\n   * @param {Object} set The set to clone.\n   * @param {Function} cloneFunc The function to clone values.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the cloned set.\n   */\n  function cloneSet(set, isDeep, cloneFunc) {\n    var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n    return arrayReduce(array, addSetEntry, new set.constructor);\n  }\n\n  /**\n   * Creates a clone of the `symbol` object.\n   *\n   * @private\n   * @param {Object} symbol The symbol object to clone.\n   * @returns {Object} Returns the cloned symbol object.\n   */\n  function cloneSymbol(symbol) {\n    return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n  }\n\n  /**\n   * Creates a clone of `typedArray`.\n   *\n   * @private\n   * @param {Object} typedArray The typed array to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the cloned typed array.\n   */\n  function cloneTypedArray(typedArray, isDeep) {\n    var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n    return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n  }\n\n  /**\n   * Copies the values of `source` to `array`.\n   *\n   * @private\n   * @param {Array} source The array to copy values from.\n   * @param {Array} [array=[]] The array to copy values to.\n   * @returns {Array} Returns `array`.\n   */\n  function copyArray(source, array) {\n    var index = -1,\n        length = source.length;\n\n    array || (array = Array(length));\n    while (++index < length) {\n      array[index] = source[index];\n    }\n    return array;\n  }\n\n  /**\n   * Copies properties of `source` to `object`.\n   *\n   * @private\n   * @param {Object} source The object to copy properties from.\n   * @param {Array} props The property identifiers to copy.\n   * @param {Object} [object={}] The object to copy properties to.\n   * @param {Function} [customizer] The function to customize copied values.\n   * @returns {Object} Returns `object`.\n   */\n  function copyObject(source, props, object, customizer) {\n    object || (object = {});\n\n    var index = -1,\n        length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n\n      var newValue = customizer\n        ? customizer(object[key], source[key], key, object, source)\n        : undefined;\n\n      assignValue(object, key, newValue === undefined ? source[key] : newValue);\n    }\n    return object;\n  }\n\n  /**\n   * Copies own symbol properties of `source` to `object`.\n   *\n   * @private\n   * @param {Object} source The object to copy symbols from.\n   * @param {Object} [object={}] The object to copy symbols to.\n   * @returns {Object} Returns `object`.\n   */\n  function copySymbols(source, object) {\n    return copyObject(source, getSymbols(source), object);\n  }\n\n  /**\n   * Creates an array of own enumerable property names and symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function getAllKeys(object) {\n    return baseGetAllKeys(object, keys, getSymbols);\n  }\n\n  /**\n   * Gets the data for `map`.\n   *\n   * @private\n   * @param {Object} map The map to query.\n   * @param {string} key The reference key.\n   * @returns {*} Returns the map data.\n   */\n  function getMapData(map, key) {\n    var data = map.__data__;\n    return isKeyable(key)\n      ? data[typeof key == 'string' ? 'string' : 'hash']\n      : data.map;\n  }\n\n  /**\n   * Gets the native function at `key` of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {string} key The key of the method to get.\n   * @returns {*} Returns the function if it's native, else `undefined`.\n   */\n  function getNative(object, key) {\n    var value = getValue(object, key);\n    return baseIsNative(value) ? value : undefined;\n  }\n\n  /**\n   * Creates an array of the own enumerable symbol properties of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of symbols.\n   */\n  var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n  /**\n   * Gets the `toStringTag` of `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  var getTag = baseGetTag;\n\n  // Fallback for data views, maps, sets, and weak maps in IE 11,\n  // for data views in Edge < 14, and promises in Node.js.\n  if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n      (Map && getTag(new Map) != mapTag) ||\n      (Promise && getTag(Promise.resolve()) != promiseTag) ||\n      (Set && getTag(new Set) != setTag) ||\n      (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n    getTag = function(value) {\n      var result = objectToString.call(value),\n          Ctor = result == objectTag ? value.constructor : undefined,\n          ctorString = Ctor ? toSource(Ctor) : undefined;\n\n      if (ctorString) {\n        switch (ctorString) {\n          case dataViewCtorString: return dataViewTag;\n          case mapCtorString: return mapTag;\n          case promiseCtorString: return promiseTag;\n          case setCtorString: return setTag;\n          case weakMapCtorString: return weakMapTag;\n        }\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Initializes an array clone.\n   *\n   * @private\n   * @param {Array} array The array to clone.\n   * @returns {Array} Returns the initialized clone.\n   */\n  function initCloneArray(array) {\n    var length = array.length,\n        result = array.constructor(length);\n\n    // Add properties assigned by `RegExp#exec`.\n    if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n      result.index = array.index;\n      result.input = array.input;\n    }\n    return result;\n  }\n\n  /**\n   * Initializes an object clone.\n   *\n   * @private\n   * @param {Object} object The object to clone.\n   * @returns {Object} Returns the initialized clone.\n   */\n  function initCloneObject(object) {\n    return (typeof object.constructor == 'function' && !isPrototype(object))\n      ? baseCreate(getPrototype(object))\n      : {};\n  }\n\n  /**\n   * Initializes an object clone based on its `toStringTag`.\n   *\n   * **Note:** This function only supports cloning values with tags of\n   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n   *\n   * @private\n   * @param {Object} object The object to clone.\n   * @param {string} tag The `toStringTag` of the object to clone.\n   * @param {Function} cloneFunc The function to clone values.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the initialized clone.\n   */\n  function initCloneByTag(object, tag, cloneFunc, isDeep) {\n    var Ctor = object.constructor;\n    switch (tag) {\n      case arrayBufferTag:\n        return cloneArrayBuffer(object);\n\n      case boolTag:\n      case dateTag:\n        return new Ctor(+object);\n\n      case dataViewTag:\n        return cloneDataView(object, isDeep);\n\n      case float32Tag: case float64Tag:\n      case int8Tag: case int16Tag: case int32Tag:\n      case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n        return cloneTypedArray(object, isDeep);\n\n      case mapTag:\n        return cloneMap(object, isDeep, cloneFunc);\n\n      case numberTag:\n      case stringTag:\n        return new Ctor(object);\n\n      case regexpTag:\n        return cloneRegExp(object);\n\n      case setTag:\n        return cloneSet(object, isDeep, cloneFunc);\n\n      case symbolTag:\n        return cloneSymbol(object);\n    }\n  }\n\n  /**\n   * Checks if `value` is a valid array-like index.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n   */\n  function isIndex(value, length) {\n    length = length == null ? MAX_SAFE_INTEGER : length;\n    return !!length &&\n      (typeof value == 'number' || reIsUint.test(value)) &&\n      (value > -1 && value % 1 == 0 && value < length);\n  }\n\n  /**\n   * Checks if `value` is suitable for use as unique object key.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n   */\n  function isKeyable(value) {\n    var type = typeof value;\n    return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n      ? (value !== '__proto__')\n      : (value === null);\n  }\n\n  /**\n   * Checks if `func` has its source masked.\n   *\n   * @private\n   * @param {Function} func The function to check.\n   * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n   */\n  function isMasked(func) {\n    return !!maskSrcKey && (maskSrcKey in func);\n  }\n\n  /**\n   * Checks if `value` is likely a prototype object.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n   */\n  function isPrototype(value) {\n    var Ctor = value && value.constructor,\n        proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n    return value === proto;\n  }\n\n  /**\n   * Converts `func` to its source code.\n   *\n   * @private\n   * @param {Function} func The function to process.\n   * @returns {string} Returns the source code.\n   */\n  function toSource(func) {\n    if (func != null) {\n      try {\n        return funcToString.call(func);\n      } catch (e) {}\n      try {\n        return (func + '');\n      } catch (e) {}\n    }\n    return '';\n  }\n\n  /**\n   * This method is like `_.clone` except that it recursively clones `value`.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.0.0\n   * @category Lang\n   * @param {*} value The value to recursively clone.\n   * @returns {*} Returns the deep cloned value.\n   * @see _.clone\n   * @example\n   *\n   * var objects = [{ 'a': 1 }, { 'b': 2 }];\n   *\n   * var deep = _.cloneDeep(objects);\n   * console.log(deep[0] === objects[0]);\n   * // => false\n   */\n  function cloneDeep(value) {\n    return baseClone(value, true, true);\n  }\n\n  /**\n   * Performs a\n   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * comparison between two values to determine if they are equivalent.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   * var other = { 'a': 1 };\n   *\n   * _.eq(object, object);\n   * // => true\n   *\n   * _.eq(object, other);\n   * // => false\n   *\n   * _.eq('a', 'a');\n   * // => true\n   *\n   * _.eq('a', Object('a'));\n   * // => false\n   *\n   * _.eq(NaN, NaN);\n   * // => true\n   */\n  function eq(value, other) {\n    return value === other || (value !== value && other !== other);\n  }\n\n  /**\n   * Checks if `value` is likely an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArguments(function() { return arguments; }());\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  function isArguments(value) {\n    // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n    return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n      (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n  }\n\n  /**\n   * Checks if `value` is classified as an `Array` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n   * @example\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   *\n   * _.isArray(document.body.children);\n   * // => false\n   *\n   * _.isArray('abc');\n   * // => false\n   *\n   * _.isArray(_.noop);\n   * // => false\n   */\n  var isArray = Array.isArray;\n\n  /**\n   * Checks if `value` is array-like. A value is considered array-like if it's\n   * not a function and has a `value.length` that's an integer greater than or\n   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n   * @example\n   *\n   * _.isArrayLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLike(document.body.children);\n   * // => true\n   *\n   * _.isArrayLike('abc');\n   * // => true\n   *\n   * _.isArrayLike(_.noop);\n   * // => false\n   */\n  function isArrayLike(value) {\n    return value != null && isLength(value.length) && !isFunction(value);\n  }\n\n  /**\n   * This method is like `_.isArrayLike` except that it also checks if `value`\n   * is an object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array-like object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArrayLikeObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLikeObject(document.body.children);\n   * // => true\n   *\n   * _.isArrayLikeObject('abc');\n   * // => false\n   *\n   * _.isArrayLikeObject(_.noop);\n   * // => false\n   */\n  function isArrayLikeObject(value) {\n    return isObjectLike(value) && isArrayLike(value);\n  }\n\n  /**\n   * Checks if `value` is a buffer.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.3.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n   * @example\n   *\n   * _.isBuffer(new Buffer(2));\n   * // => true\n   *\n   * _.isBuffer(new Uint8Array(2));\n   * // => false\n   */\n  var isBuffer = nativeIsBuffer || stubFalse;\n\n  /**\n   * Checks if `value` is classified as a `Function` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   *\n   * _.isFunction(/abc/);\n   * // => false\n   */\n  function isFunction(value) {\n    // The use of `Object#toString` avoids issues with the `typeof` operator\n    // in Safari 8-9 which returns 'object' for typed array and other constructors.\n    var tag = isObject(value) ? objectToString.call(value) : '';\n    return tag == funcTag || tag == genTag;\n  }\n\n  /**\n   * Checks if `value` is a valid array-like length.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n   * @example\n   *\n   * _.isLength(3);\n   * // => true\n   *\n   * _.isLength(Number.MIN_VALUE);\n   * // => false\n   *\n   * _.isLength(Infinity);\n   * // => false\n   *\n   * _.isLength('3');\n   * // => false\n   */\n  function isLength(value) {\n    return typeof value == 'number' &&\n      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject(value) {\n    var type = typeof value;\n    return !!value && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Creates an array of the own enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects. See the\n   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * for more details.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keys(new Foo);\n   * // => ['a', 'b'] (iteration order is not guaranteed)\n   *\n   * _.keys('hi');\n   * // => ['0', '1']\n   */\n  function keys(object) {\n    return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n  }\n\n  /**\n   * This method returns a new empty array.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.13.0\n   * @category Util\n   * @returns {Array} Returns the new empty array.\n   * @example\n   *\n   * var arrays = _.times(2, _.stubArray);\n   *\n   * console.log(arrays);\n   * // => [[], []]\n   *\n   * console.log(arrays[0] === arrays[1]);\n   * // => false\n   */\n  function stubArray() {\n    return [];\n  }\n\n  /**\n   * This method returns `false`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.13.0\n   * @category Util\n   * @returns {boolean} Returns `false`.\n   * @example\n   *\n   * _.times(2, _.stubFalse);\n   * // => [false, false]\n   */\n  function stubFalse() {\n    return false;\n  }\n\n  module.exports = cloneDeep;\n  });\n\n  var hasProperty = function has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n  };\n\n  var _apply;\n\n  function _classPrivateFieldLooseBase$8(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$8 = 0;\n\n  function _classPrivateFieldLooseKey$8(name) { return \"__private_\" + id$8++ + \"_\" + name; }\n\n\n\n  function insertReplacement(source, rx, replacement) {\n    const newParts = [];\n    source.forEach(chunk => {\n      // When the source contains multiple placeholders for interpolation,\n      // we should ignore chunks that are not strings, because those\n      // can be JSX objects and will be otherwise incorrectly turned into strings.\n      // Without this condition we’d get this: [object Object] hello [object Object] my <button>\n      if (typeof chunk !== 'string') {\n        return newParts.push(chunk);\n      }\n\n      return rx[Symbol.split](chunk).forEach((raw, i, list) => {\n        if (raw !== '') {\n          newParts.push(raw);\n        } // Interlace with the `replacement` value\n\n\n        if (i < list.length - 1) {\n          newParts.push(replacement);\n        }\n      });\n    });\n    return newParts;\n  }\n  /**\n   * Takes a string with placeholder variables like `%{smart_count} file selected`\n   * and replaces it with values from options `{smart_count: 5}`\n   *\n   * @license https://github.com/airbnb/polyglot.js/blob/master/LICENSE\n   * taken from https://github.com/airbnb/polyglot.js/blob/master/lib/polyglot.js#L299\n   *\n   * @param {string} phrase that needs interpolation, with placeholders\n   * @param {object} options with values that will be used to replace placeholders\n   * @returns {any[]} interpolated\n   */\n\n\n  function interpolate(phrase, options) {\n    const dollarRegex = /\\$/g;\n    const dollarBillsYall = '$$$$';\n    let interpolated = [phrase];\n    if (options == null) return interpolated;\n\n    for (const arg of Object.keys(options)) {\n      if (arg !== '_') {\n        // Ensure replacement value is escaped to prevent special $-prefixed\n        // regex replace tokens. the \"$$$$\" is needed because each \"$\" needs to\n        // be escaped with \"$\" itself, and we need two in the resulting output.\n        let replacement = options[arg];\n\n        if (typeof replacement === 'string') {\n          replacement = dollarRegex[Symbol.replace](replacement, dollarBillsYall);\n        } // We create a new `RegExp` each time instead of using a more-efficient\n        // string replace so that the same argument can be replaced multiple times\n        // in the same phrase.\n\n\n        interpolated = insertReplacement(interpolated, new RegExp(`%\\\\{${arg}\\\\}`, 'g'), replacement);\n      }\n    }\n\n    return interpolated;\n  }\n  /**\n   * Translates strings with interpolation & pluralization support.\n   * Extensible with custom dictionaries and pluralization functions.\n   *\n   * Borrows heavily from and inspired by Polyglot https://github.com/airbnb/polyglot.js,\n   * basically a stripped-down version of it. Differences: pluralization functions are not hardcoded\n   * and can be easily added among with dictionaries, nested objects are used for pluralization\n   * as opposed to `||||` delimeter\n   *\n   * Usage example: `translator.translate('files_chosen', {smart_count: 3})`\n   */\n\n\n  var Translator_1 = (_apply = /*#__PURE__*/_classPrivateFieldLooseKey$8(\"apply\"), class Translator {\n    /**\n     * @param {object|Array<object>} locales - locale or list of locales.\n     */\n    constructor(locales) {\n      Object.defineProperty(this, _apply, {\n        value: _apply2\n      });\n      this.locale = {\n        strings: {},\n\n        pluralize(n) {\n          if (n === 1) {\n            return 0;\n          }\n\n          return 1;\n        }\n\n      };\n\n      if (Array.isArray(locales)) {\n        locales.forEach(_classPrivateFieldLooseBase$8(this, _apply)[_apply], this);\n      } else {\n        _classPrivateFieldLooseBase$8(this, _apply)[_apply](locales);\n      }\n    }\n\n    /**\n     * Public translate method\n     *\n     * @param {string} key\n     * @param {object} options with values that will be used later to replace placeholders in string\n     * @returns {string} translated (and interpolated)\n     */\n    translate(key, options) {\n      return this.translateArray(key, options).join('');\n    }\n    /**\n     * Get a translation and return the translated and interpolated parts as an array.\n     *\n     * @param {string} key\n     * @param {object} options with values that will be used to replace placeholders\n     * @returns {Array} The translated and interpolated parts, in order.\n     */\n\n\n    translateArray(key, options) {\n      if (!hasProperty(this.locale.strings, key)) {\n        throw new Error(`missing string: ${key}`);\n      }\n\n      const string = this.locale.strings[key];\n      const hasPluralForms = typeof string === 'object';\n\n      if (hasPluralForms) {\n        if (options && typeof options.smart_count !== 'undefined') {\n          const plural = this.locale.pluralize(options.smart_count);\n          return interpolate(string[plural], options);\n        }\n\n        throw new Error('Attempted to use a string with plural forms, but no value was given for %{smart_count}');\n      }\n\n      return interpolate(string, options);\n    }\n\n  });\n\n  function _apply2(locale) {\n    if (!(locale != null && locale.strings)) {\n      return;\n    }\n\n    const prevLocale = this.locale;\n    this.locale = { ...prevLocale,\n      strings: { ...prevLocale.strings,\n        ...locale.strings\n      }\n    };\n    this.locale.pluralize = locale.pluralize || prevLocale.pluralize;\n  }\n\n  /**\n  * Create an event emitter with namespaces\n  * @name createNamespaceEmitter\n  * @example\n  * var emitter = require('./index')()\n  *\n  * emitter.on('*', function () {\n  *   console.log('all events emitted', this.event)\n  * })\n  *\n  * emitter.on('example', function () {\n  *   console.log('example event emitted')\n  * })\n  */\n  var namespaceEmitter = function createNamespaceEmitter () {\n    var emitter = {};\n    var _fns = emitter._fns = {};\n\n    /**\n    * Emit an event. Optionally namespace the event. Handlers are fired in the order in which they were added with exact matches taking precedence. Separate the namespace and event with a `:`\n    * @name emit\n    * @param {String} event – the name of the event, with optional namespace\n    * @param {...*} data – up to 6 arguments that are passed to the event listener\n    * @example\n    * emitter.emit('example')\n    * emitter.emit('demo:test')\n    * emitter.emit('data', { example: true}, 'a string', 1)\n    */\n    emitter.emit = function emit (event, arg1, arg2, arg3, arg4, arg5, arg6) {\n      var toEmit = getListeners(event);\n\n      if (toEmit.length) {\n        emitAll(event, toEmit, [arg1, arg2, arg3, arg4, arg5, arg6]);\n      }\n    };\n\n    /**\n    * Create en event listener.\n    * @name on\n    * @param {String} event\n    * @param {Function} fn\n    * @example\n    * emitter.on('example', function () {})\n    * emitter.on('demo', function () {})\n    */\n    emitter.on = function on (event, fn) {\n      if (!_fns[event]) {\n        _fns[event] = [];\n      }\n\n      _fns[event].push(fn);\n    };\n\n    /**\n    * Create en event listener that fires once.\n    * @name once\n    * @param {String} event\n    * @param {Function} fn\n    * @example\n    * emitter.once('example', function () {})\n    * emitter.once('demo', function () {})\n    */\n    emitter.once = function once (event, fn) {\n      function one () {\n        fn.apply(this, arguments);\n        emitter.off(event, one);\n      }\n      this.on(event, one);\n    };\n\n    /**\n    * Stop listening to an event. Stop all listeners on an event by only passing the event name. Stop a single listener by passing that event handler as a callback.\n    * You must be explicit about what will be unsubscribed: `emitter.off('demo')` will unsubscribe an `emitter.on('demo')` listener,\n    * `emitter.off('demo:example')` will unsubscribe an `emitter.on('demo:example')` listener\n    * @name off\n    * @param {String} event\n    * @param {Function} [fn] – the specific handler\n    * @example\n    * emitter.off('example')\n    * emitter.off('demo', function () {})\n    */\n    emitter.off = function off (event, fn) {\n      var keep = [];\n\n      if (event && fn) {\n        var fns = this._fns[event];\n        var i = 0;\n        var l = fns ? fns.length : 0;\n\n        for (i; i < l; i++) {\n          if (fns[i] !== fn) {\n            keep.push(fns[i]);\n          }\n        }\n      }\n\n      keep.length ? this._fns[event] = keep : delete this._fns[event];\n    };\n\n    function getListeners (e) {\n      var out = _fns[e] ? _fns[e] : [];\n      var idx = e.indexOf(':');\n      var args = (idx === -1) ? [e] : [e.substring(0, idx), e.substring(idx + 1)];\n\n      var keys = Object.keys(_fns);\n      var i = 0;\n      var l = keys.length;\n\n      for (i; i < l; i++) {\n        var key = keys[i];\n        if (key === '*') {\n          out = out.concat(_fns[key]);\n        }\n\n        if (args.length === 2 && args[0] === key) {\n          out = out.concat(_fns[key]);\n          break\n        }\n      }\n\n      return out\n    }\n\n    function emitAll (e, fns, args) {\n      var i = 0;\n      var l = fns.length;\n\n      for (i; i < l; i++) {\n        if (!fns[i]) break\n        fns[i].event = e;\n        fns[i].apply(fns[i], args);\n      }\n    }\n\n    return emitter\n  };\n\n  // Adapted from https://github.com/Flet/prettier-bytes/\n  // Changing 1000 bytes to 1024, so we can keep uppercase KB vs kB\n  // ISC License (c) Dan Flettre https://github.com/Flet/prettier-bytes/blob/master/LICENSE\n  var prettierBytes = function prettierBytes (num) {\n    if (typeof num !== 'number' || isNaN(num)) {\n      throw new TypeError('Expected a number, got ' + typeof num)\n    }\n\n    var neg = num < 0;\n    var units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n    if (neg) {\n      num = -num;\n    }\n\n    if (num < 1) {\n      return (neg ? '-' : '') + num + ' B'\n    }\n\n    var exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1);\n    num = Number(num / Math.pow(1024, exponent));\n    var unit = units[exponent];\n\n    if (num >= 10 || num % 1 === 0) {\n      // Do not show decimals when the number is two-digit, or if the number has no\n      // decimal component.\n      return (neg ? '-' : '') + num.toFixed(0) + ' ' + unit\n    } else {\n      return (neg ? '-' : '') + num.toFixed(1) + ' ' + unit\n    }\n  };\n\n  /* jshint node: true */\n\n  /**\n    # wildcard\n\n    Very simple wildcard matching, which is designed to provide the same\n    functionality that is found in the\n    [eve](https://github.com/adobe-webplatform/eve) eventing library.\n\n    ## Usage\n\n    It works with strings:\n\n    <<< examples/strings.js\n\n    Arrays:\n\n    <<< examples/arrays.js\n\n    Objects (matching against keys):\n\n    <<< examples/objects.js\n\n    While the library works in Node, if you are are looking for file-based\n    wildcard matching then you should have a look at:\n\n    <https://github.com/isaacs/node-glob>\n  **/\n\n  function WildcardMatcher(text, separator) {\n    this.text = text = text || '';\n    this.hasWild = ~text.indexOf('*');\n    this.separator = separator;\n    this.parts = text.split(separator);\n  }\n\n  WildcardMatcher.prototype.match = function(input) {\n    var matches = true;\n    var parts = this.parts;\n    var ii;\n    var partsCount = parts.length;\n    var testParts;\n\n    if (typeof input == 'string' || input instanceof String) {\n      if (!this.hasWild && this.text != input) {\n        matches = false;\n      } else {\n        testParts = (input || '').split(this.separator);\n        for (ii = 0; matches && ii < partsCount; ii++) {\n          if (parts[ii] === '*')  {\n            continue;\n          } else if (ii < testParts.length) {\n            matches = parts[ii] === testParts[ii];\n          } else {\n            matches = false;\n          }\n        }\n\n        // If matches, then return the component parts\n        matches = matches && testParts;\n      }\n    }\n    else if (typeof input.splice == 'function') {\n      matches = [];\n\n      for (ii = input.length; ii--; ) {\n        if (this.match(input[ii])) {\n          matches[matches.length] = input[ii];\n        }\n      }\n    }\n    else if (typeof input == 'object') {\n      matches = {};\n\n      for (var key in input) {\n        if (this.match(key)) {\n          matches[key] = input[key];\n        }\n      }\n    }\n\n    return matches;\n  };\n\n  var wildcard = function(text, test, separator) {\n    var matcher = new WildcardMatcher(text, separator || /[\\/\\.]/);\n    if (typeof test != 'undefined') {\n      return matcher.match(test);\n    }\n\n    return matcher;\n  };\n\n  var reMimePartSplit = /[\\/\\+\\.]/;\n\n  /**\n    # mime-match\n\n    A simple function to checker whether a target mime type matches a mime-type\n    pattern (e.g. image/jpeg matches image/jpeg OR image/*).\n\n    ## Example Usage\n\n    <<< example.js\n\n  **/\n  var mimeMatch = function(target, pattern) {\n    function test(pattern) {\n      var result = wildcard(pattern, target, reMimePartSplit);\n\n      // ensure that we have a valid mime type (should have two parts)\n      return result && result.length >= 2;\n    }\n\n    return pattern ? test(pattern.split(';')[0]) : test;\n  };\n\n  function _classPrivateFieldLooseBase$7(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$7 = 0;\n\n  function _classPrivateFieldLooseKey$7(name) { return \"__private_\" + id$7++ + \"_\" + name; }\n\n  var _publish = /*#__PURE__*/_classPrivateFieldLooseKey$7(\"publish\");\n\n  /**\n   * Default store that keeps state in a simple object.\n   */\n  class DefaultStore {\n    constructor() {\n      Object.defineProperty(this, _publish, {\n        value: _publish2\n      });\n      this.state = {};\n      this.callbacks = [];\n    }\n\n    getState() {\n      return this.state;\n    }\n\n    setState(patch) {\n      const prevState = { ...this.state\n      };\n      const nextState = { ...this.state,\n        ...patch\n      };\n      this.state = nextState;\n\n      _classPrivateFieldLooseBase$7(this, _publish)[_publish](prevState, nextState, patch);\n    }\n\n    subscribe(listener) {\n      this.callbacks.push(listener);\n      return () => {\n        // Remove the listener.\n        this.callbacks.splice(this.callbacks.indexOf(listener), 1);\n      };\n    }\n\n  }\n\n  function _publish2() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    this.callbacks.forEach(listener => {\n      listener(...args);\n    });\n  }\n\n  DefaultStore.VERSION = \"2.0.3\";\n\n  var lib$3 = function defaultStore() {\n    return new DefaultStore();\n  };\n\n  /**\n   * Takes a full filename string and returns an object {name, extension}\n   *\n   * @param {string} fullFileName\n   * @returns {object} {name, extension}\n   */\n  var getFileNameAndExtension = function getFileNameAndExtension(fullFileName) {\n    const lastDot = fullFileName.lastIndexOf('.'); // these count as no extension: \"no-dot\", \"trailing-dot.\"\n\n    if (lastDot === -1 || lastDot === fullFileName.length - 1) {\n      return {\n        name: fullFileName,\n        extension: undefined\n      };\n    }\n\n    return {\n      name: fullFileName.slice(0, lastDot),\n      extension: fullFileName.slice(lastDot + 1)\n    };\n  };\n\n  // ___Why not add the mime-types package?\n  //    It's 19.7kB gzipped, and we only need mime types for well-known extensions (for file previews).\n  // ___Where to take new extensions from?\n  //    https://github.com/jshttp/mime-db/blob/master/db.json\n  var mimeTypes = {\n    md: 'text/markdown',\n    markdown: 'text/markdown',\n    mp4: 'video/mp4',\n    mp3: 'audio/mp3',\n    svg: 'image/svg+xml',\n    jpg: 'image/jpeg',\n    png: 'image/png',\n    gif: 'image/gif',\n    heic: 'image/heic',\n    heif: 'image/heif',\n    yaml: 'text/yaml',\n    yml: 'text/yaml',\n    csv: 'text/csv',\n    tsv: 'text/tab-separated-values',\n    tab: 'text/tab-separated-values',\n    avi: 'video/x-msvideo',\n    mks: 'video/x-matroska',\n    mkv: 'video/x-matroska',\n    mov: 'video/quicktime',\n    doc: 'application/msword',\n    docm: 'application/vnd.ms-word.document.macroenabled.12',\n    docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n    dot: 'application/msword',\n    dotm: 'application/vnd.ms-word.template.macroenabled.12',\n    dotx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n    xla: 'application/vnd.ms-excel',\n    xlam: 'application/vnd.ms-excel.addin.macroenabled.12',\n    xlc: 'application/vnd.ms-excel',\n    xlf: 'application/x-xliff+xml',\n    xlm: 'application/vnd.ms-excel',\n    xls: 'application/vnd.ms-excel',\n    xlsb: 'application/vnd.ms-excel.sheet.binary.macroenabled.12',\n    xlsm: 'application/vnd.ms-excel.sheet.macroenabled.12',\n    xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n    xlt: 'application/vnd.ms-excel',\n    xltm: 'application/vnd.ms-excel.template.macroenabled.12',\n    xltx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n    xlw: 'application/vnd.ms-excel',\n    txt: 'text/plain',\n    text: 'text/plain',\n    conf: 'text/plain',\n    log: 'text/plain',\n    pdf: 'application/pdf',\n    zip: 'application/zip',\n    '7z': 'application/x-7z-compressed',\n    rar: 'application/x-rar-compressed',\n    tar: 'application/x-tar',\n    gz: 'application/gzip',\n    dmg: 'application/x-apple-diskimage'\n  };\n\n  var getFileType = function getFileType(file) {\n    var _getFileNameAndExtens;\n\n    if (file.type) return file.type;\n    const fileExtension = file.name ? (_getFileNameAndExtens = getFileNameAndExtension(file.name).extension) == null ? void 0 : _getFileNameAndExtens.toLowerCase() : null;\n\n    if (fileExtension && fileExtension in mimeTypes) {\n      // else, see if we can map extension to a mime type\n      return mimeTypes[fileExtension];\n    } // if all fails, fall back to a generic byte stream type\n\n\n    return 'application/octet-stream';\n  };\n\n  function encodeCharacter(character) {\n    return character.charCodeAt(0).toString(32);\n  }\n\n  function encodeFilename(name) {\n    let suffix = '';\n    return name.replace(/[^A-Z0-9]/ig, character => {\n      suffix += `-${encodeCharacter(character)}`;\n      return '/';\n    }) + suffix;\n  }\n  /**\n   * Takes a file object and turns it into fileID, by converting file.name to lowercase,\n   * removing extra characters and adding type, size and lastModified\n   *\n   * @param {object} file\n   * @returns {string} the fileID\n   */\n\n\n  var generateFileID = function generateFileID(file) {\n    // It's tempting to do `[items].filter(Boolean).join('-')` here, but that\n    // is slower! simple string concatenation is fast\n    let id = 'uppy';\n\n    if (typeof file.name === 'string') {\n      id += `-${encodeFilename(file.name.toLowerCase())}`;\n    }\n\n    if (file.type !== undefined) {\n      id += `-${file.type}`;\n    }\n\n    if (file.meta && typeof file.meta.relativePath === 'string') {\n      id += `-${encodeFilename(file.meta.relativePath.toLowerCase())}`;\n    }\n\n    if (file.data.size !== undefined) {\n      id += `-${file.data.size}`;\n    }\n\n    if (file.data.lastModified !== undefined) {\n      id += `-${file.data.lastModified}`;\n    }\n\n    return id;\n  };\n\n  // Edge 15.x does not fire 'progress' events on uploads.\n  // See https://github.com/transloadit/uppy/issues/945\n  // And https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12224510/\n  var supportsUploadProgress = function supportsUploadProgress(userAgent) {\n    // Allow passing in userAgent for tests\n    if (userAgent == null) {\n      userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : null;\n    } // Assume it works because basically everything supports progress events.\n\n\n    if (!userAgent) return true;\n    const m = /Edge\\/(\\d+\\.\\d+)/.exec(userAgent);\n    if (!m) return true;\n    const edgeVersion = m[1];\n    let [major, minor] = edgeVersion.split('.');\n    major = parseInt(major, 10);\n    minor = parseInt(minor, 10); // Worked before:\n    // Edge 40.15063.0.0\n    // Microsoft EdgeHTML 15.15063\n\n    if (major < 15 || major === 15 && minor < 15063) {\n      return true;\n    } // Fixed in:\n    // Microsoft EdgeHTML 18.18218\n\n\n    if (major > 18 || major === 18 && minor >= 18218) {\n      return true;\n    } // other versions don't work.\n\n\n    return false;\n  };\n\n  var getFileName = function getFileName(fileType, fileDescriptor) {\n    if (fileDescriptor.name) {\n      return fileDescriptor.name;\n    }\n\n    if (fileType.split('/')[0] === 'image') {\n      return `${fileType.split('/')[0]}.${fileType.split('/')[1]}`;\n    }\n\n    return 'noname';\n  };\n\n  /**\n   * Adds zero to strings shorter than two characters.\n   *\n   * @param {number} number\n   * @returns {string}\n   */\n  function pad(number) {\n    return number < 10 ? `0${number}` : number.toString();\n  }\n  /**\n   * Returns a timestamp in the format of `hours:minutes:seconds`\n   */\n\n\n  var getTimeStamp = function getTimeStamp() {\n    const date = new Date();\n    const hours = pad(date.getHours());\n    const minutes = pad(date.getMinutes());\n    const seconds = pad(date.getSeconds());\n    return `${hours}:${minutes}:${seconds}`;\n  };\n\n  /* eslint-disable no-console */\n   // Swallow all logs, except errors.\n  // default if logger is not set or debug: false\n\n\n  const justErrorsLogger$1 = {\n    debug: () => {},\n    warn: () => {},\n    error: function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return console.error(`[Uppy] [${getTimeStamp()}]`, ...args);\n    }\n  }; // Print logs to console with namespace + timestamp,\n  // set by logger: Uppy.debugLogger or debug: true\n\n  const debugLogger$2 = {\n    debug: function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return console.debug(`[Uppy] [${getTimeStamp()}]`, ...args);\n    },\n    warn: function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return console.warn(`[Uppy] [${getTimeStamp()}]`, ...args);\n    },\n    error: function () {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return console.error(`[Uppy] [${getTimeStamp()}]`, ...args);\n    }\n  };\n  var loggers = {\n    justErrorsLogger: justErrorsLogger$1,\n    debugLogger: debugLogger$2\n  };\n\n  var locale$1 = {\n    strings: {\n      addBulkFilesFailed: {\n        0: 'Failed to add %{smart_count} file due to an internal error',\n        1: 'Failed to add %{smart_count} files due to internal errors'\n      },\n      youCanOnlyUploadX: {\n        0: 'You can only upload %{smart_count} file',\n        1: 'You can only upload %{smart_count} files'\n      },\n      youHaveToAtLeastSelectX: {\n        0: 'You have to select at least %{smart_count} file',\n        1: 'You have to select at least %{smart_count} files'\n      },\n      exceedsSize: '%{file} exceeds maximum allowed size of %{size}',\n      missingRequiredMetaField: 'Missing required meta fields',\n      missingRequiredMetaFieldOnFile: 'Missing required meta fields in %{fileName}',\n      inferiorSize: 'This file is smaller than the allowed size of %{size}',\n      youCanOnlyUploadFileTypes: 'You can only upload: %{types}',\n      noMoreFilesAllowed: 'Cannot add more files',\n      noDuplicates: \"Cannot add the duplicate file '%{fileName}', it already exists\",\n      companionError: 'Connection with Companion failed',\n      authAborted: 'Authentication aborted',\n      companionUnauthorizeHint: 'To unauthorize to your %{provider} account, please go to %{url}',\n      failedToUpload: 'Failed to upload %{file}',\n      noInternetConnection: 'No Internet connection',\n      connectedToInternet: 'Connected to the Internet',\n      // Strings for remote providers\n      noFilesFound: 'You have no files or folders here',\n      selectX: {\n        0: 'Select %{smart_count}',\n        1: 'Select %{smart_count}'\n      },\n      allFilesFromFolderNamed: 'All files from folder %{name}',\n      openFolderNamed: 'Open folder %{name}',\n      cancel: 'Cancel',\n      logOut: 'Log out',\n      filter: 'Filter',\n      resetFilter: 'Reset filter',\n      loading: 'Loading...',\n      authenticateWithTitle: 'Please authenticate with %{pluginName} to select files',\n      authenticateWith: 'Connect to %{pluginName}',\n      signInWithGoogle: 'Sign in with Google',\n      searchImages: 'Search for images',\n      enterTextToSearch: 'Enter text to search for images',\n      backToSearch: 'Back to Search',\n      emptyFolderAdded: 'No files were added from empty folder',\n      folderAlreadyAdded: 'The folder \"%{folder}\" was already added',\n      folderAdded: {\n        0: 'Added %{smart_count} file from %{folder}',\n        1: 'Added %{smart_count} files from %{folder}'\n      }\n    }\n  };\n\n  var require$$4 = index_browser;\n\n  /* global AggregateError */\n\n  let _Symbol$for$1, _Symbol$for2$1;\n\n  function _classPrivateFieldLooseBase$6(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$6 = 0;\n\n  function _classPrivateFieldLooseKey$6(name) { return \"__private_\" + id$6++ + \"_\" + name; }\n\n\n\n\n\n  const {\n    nanoid: nanoid$1\n  } = require$$4;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  const {\n    justErrorsLogger,\n    debugLogger: debugLogger$1\n  } = loggers;\n\n   // Exported from here.\n\n\n  class RestrictionError extends Error {\n    constructor() {\n      super(...arguments);\n      this.isRestriction = true;\n    }\n\n  }\n\n  if (typeof AggregateError === 'undefined') {\n    // eslint-disable-next-line no-global-assign\n    globalThis.AggregateError = class AggregateError extends Error {\n      constructor(errors, message) {\n        super(message);\n        this.errors = errors;\n      }\n\n    };\n  }\n\n  class AggregateRestrictionError extends AggregateError {\n    constructor() {\n      super(...arguments);\n      this.isRestriction = true;\n    }\n\n  }\n  /**\n   * Uppy Core module.\n   * Manages plugins, state updates, acts as an event bus,\n   * adds/removes files and metadata.\n   */\n\n\n  var _plugins = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"plugins\");\n\n  var _storeUnsubscribe = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"storeUnsubscribe\");\n\n  var _emitter$2 = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"emitter\");\n\n  var _preProcessors = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"preProcessors\");\n\n  var _uploaders = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"uploaders\");\n\n  var _postProcessors = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"postProcessors\");\n\n  var _checkRestrictions = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"checkRestrictions\");\n\n  var _checkMinNumberOfFiles = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"checkMinNumberOfFiles\");\n\n  var _checkRequiredMetaFieldsOnFile = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"checkRequiredMetaFieldsOnFile\");\n\n  var _checkRequiredMetaFields = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"checkRequiredMetaFields\");\n\n  var _showOrLogErrorAndThrow = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"showOrLogErrorAndThrow\");\n\n  var _assertNewUploadAllowed = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"assertNewUploadAllowed\");\n\n  var _checkAndCreateFileStateObject = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"checkAndCreateFileStateObject\");\n\n  var _startIfAutoProceed = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"startIfAutoProceed\");\n\n  var _addListeners = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"addListeners\");\n\n  var _updateOnlineStatus = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"updateOnlineStatus\");\n\n  var _createUpload = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"createUpload\");\n\n  var _getUpload = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"getUpload\");\n\n  var _removeUpload = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"removeUpload\");\n\n  var _runUpload = /*#__PURE__*/_classPrivateFieldLooseKey$6(\"runUpload\");\n\n  _Symbol$for$1 = Symbol.for('uppy test: getPlugins');\n  _Symbol$for2$1 = Symbol.for('uppy test: createUpload');\n\n  class Uppy {\n    // eslint-disable-next-line global-require\n\n    /** @type {Record<string, BasePlugin[]>} */\n\n    /**\n     * Instantiate Uppy\n     *\n     * @param {object} opts — Uppy options\n     */\n    constructor(_opts) {\n      Object.defineProperty(this, _runUpload, {\n        value: _runUpload2\n      });\n      Object.defineProperty(this, _removeUpload, {\n        value: _removeUpload2\n      });\n      Object.defineProperty(this, _getUpload, {\n        value: _getUpload2\n      });\n      Object.defineProperty(this, _createUpload, {\n        value: _createUpload2\n      });\n      Object.defineProperty(this, _addListeners, {\n        value: _addListeners2\n      });\n      Object.defineProperty(this, _startIfAutoProceed, {\n        value: _startIfAutoProceed2\n      });\n      Object.defineProperty(this, _checkAndCreateFileStateObject, {\n        value: _checkAndCreateFileStateObject2\n      });\n      Object.defineProperty(this, _assertNewUploadAllowed, {\n        value: _assertNewUploadAllowed2\n      });\n      Object.defineProperty(this, _showOrLogErrorAndThrow, {\n        value: _showOrLogErrorAndThrow2\n      });\n      Object.defineProperty(this, _checkRequiredMetaFields, {\n        value: _checkRequiredMetaFields2\n      });\n      Object.defineProperty(this, _checkRequiredMetaFieldsOnFile, {\n        value: _checkRequiredMetaFieldsOnFile2\n      });\n      Object.defineProperty(this, _checkMinNumberOfFiles, {\n        value: _checkMinNumberOfFiles2\n      });\n      Object.defineProperty(this, _checkRestrictions, {\n        value: _checkRestrictions2\n      });\n      Object.defineProperty(this, _plugins, {\n        writable: true,\n        value: Object.create(null)\n      });\n      Object.defineProperty(this, _storeUnsubscribe, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _emitter$2, {\n        writable: true,\n        value: namespaceEmitter()\n      });\n      Object.defineProperty(this, _preProcessors, {\n        writable: true,\n        value: new Set()\n      });\n      Object.defineProperty(this, _uploaders, {\n        writable: true,\n        value: new Set()\n      });\n      Object.defineProperty(this, _postProcessors, {\n        writable: true,\n        value: new Set()\n      });\n      Object.defineProperty(this, _updateOnlineStatus, {\n        writable: true,\n        value: this.updateOnlineStatus.bind(this)\n      });\n      this.defaultLocale = locale$1;\n      const defaultOptions = {\n        id: 'uppy',\n        autoProceed: false,\n\n        /**\n         * @deprecated The method should not be used\n         */\n        allowMultipleUploads: true,\n        allowMultipleUploadBatches: true,\n        debug: false,\n        restrictions: {\n          maxFileSize: null,\n          minFileSize: null,\n          maxTotalFileSize: null,\n          maxNumberOfFiles: null,\n          minNumberOfFiles: null,\n          allowedFileTypes: null,\n          requiredMetaFields: []\n        },\n        meta: {},\n        onBeforeFileAdded: currentFile => currentFile,\n        onBeforeUpload: files => files,\n        store: lib$3(),\n        logger: justErrorsLogger,\n        infoTimeout: 5000\n      }; // Merge default options with the ones set by user,\n      // making sure to merge restrictions too\n\n      this.opts = { ...defaultOptions,\n        ..._opts,\n        restrictions: { ...defaultOptions.restrictions,\n          ...(_opts && _opts.restrictions)\n        }\n      }; // Support debug: true for backwards-compatability, unless logger is set in opts\n      // opts instead of this.opts to avoid comparing objects — we set logger: justErrorsLogger in defaultOptions\n\n      if (_opts && _opts.logger && _opts.debug) {\n        this.log('You are using a custom `logger`, but also set `debug: true`, which uses built-in logger to output logs to console. Ignoring `debug: true` and using your custom `logger`.', 'warning');\n      } else if (_opts && _opts.debug) {\n        this.opts.logger = debugLogger$1;\n      }\n\n      this.log(`Using Core v${this.constructor.VERSION}`);\n\n      if (this.opts.restrictions.allowedFileTypes && this.opts.restrictions.allowedFileTypes !== null && !Array.isArray(this.opts.restrictions.allowedFileTypes)) {\n        throw new TypeError('`restrictions.allowedFileTypes` must be an array');\n      }\n\n      this.i18nInit(); // ___Why throttle at 500ms?\n      //    - We must throttle at >250ms for superfocus in Dashboard to work well\n      //    (because animation takes 0.25s, and we want to wait for all animations to be over before refocusing).\n      //    [Practical Check]: if thottle is at 100ms, then if you are uploading a file,\n      //    and click 'ADD MORE FILES', - focus won't activate in Firefox.\n      //    - We must throttle at around >500ms to avoid performance lags.\n      //    [Practical Check] Firefox, try to upload a big file for a prolonged period of time. Laptop will start to heat up.\n\n      this.calculateProgress = lodash_throttle(this.calculateProgress.bind(this), 500, {\n        leading: true,\n        trailing: true\n      });\n      this.store = this.opts.store;\n      this.setState({\n        plugins: {},\n        files: {},\n        currentUploads: {},\n        allowNewUpload: true,\n        capabilities: {\n          uploadProgress: supportsUploadProgress(),\n          individualCancellation: true,\n          resumableUploads: false\n        },\n        totalProgress: 0,\n        meta: { ...this.opts.meta\n        },\n        info: [],\n        recoveredState: null\n      });\n      _classPrivateFieldLooseBase$6(this, _storeUnsubscribe)[_storeUnsubscribe] = this.store.subscribe((prevState, nextState, patch) => {\n        this.emit('state-update', prevState, nextState, patch);\n        this.updateAll(nextState);\n      }); // Exposing uppy object on window for debugging and testing\n\n      if (this.opts.debug && typeof window !== 'undefined') {\n        window[this.opts.id] = this;\n      }\n\n      _classPrivateFieldLooseBase$6(this, _addListeners)[_addListeners]();\n    }\n\n    emit(event) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      _classPrivateFieldLooseBase$6(this, _emitter$2)[_emitter$2].emit(event, ...args);\n    }\n\n    on(event, callback) {\n      _classPrivateFieldLooseBase$6(this, _emitter$2)[_emitter$2].on(event, callback);\n\n      return this;\n    }\n\n    once(event, callback) {\n      _classPrivateFieldLooseBase$6(this, _emitter$2)[_emitter$2].once(event, callback);\n\n      return this;\n    }\n\n    off(event, callback) {\n      _classPrivateFieldLooseBase$6(this, _emitter$2)[_emitter$2].off(event, callback);\n\n      return this;\n    }\n    /**\n     * Iterate on all plugins and run `update` on them.\n     * Called each time state changes.\n     *\n     */\n\n\n    updateAll(state) {\n      this.iteratePlugins(plugin => {\n        plugin.update(state);\n      });\n    }\n    /**\n     * Updates state with a patch\n     *\n     * @param {object} patch {foo: 'bar'}\n     */\n\n\n    setState(patch) {\n      this.store.setState(patch);\n    }\n    /**\n     * Returns current state.\n     *\n     * @returns {object}\n     */\n\n\n    getState() {\n      return this.store.getState();\n    }\n    /**\n     * Back compat for when uppy.state is used instead of uppy.getState().\n     *\n     * @deprecated\n     */\n\n\n    get state() {\n      // Here, state is a non-enumerable property.\n      return this.getState();\n    }\n    /**\n     * Shorthand to set state for a specific file.\n     */\n\n\n    setFileState(fileID, state) {\n      if (!this.getState().files[fileID]) {\n        throw new Error(`Can’t set state for ${fileID} (the file could have been removed)`);\n      }\n\n      this.setState({\n        files: { ...this.getState().files,\n          [fileID]: { ...this.getState().files[fileID],\n            ...state\n          }\n        }\n      });\n    }\n\n    i18nInit() {\n      const translator = new Translator_1([this.defaultLocale, this.opts.locale]);\n      this.i18n = translator.translate.bind(translator);\n      this.i18nArray = translator.translateArray.bind(translator);\n      this.locale = translator.locale;\n    }\n\n    setOptions(newOpts) {\n      this.opts = { ...this.opts,\n        ...newOpts,\n        restrictions: { ...this.opts.restrictions,\n          ...(newOpts && newOpts.restrictions)\n        }\n      };\n\n      if (newOpts.meta) {\n        this.setMeta(newOpts.meta);\n      }\n\n      this.i18nInit();\n\n      if (newOpts.locale) {\n        this.iteratePlugins(plugin => {\n          plugin.setOptions();\n        });\n      } // Note: this is not the preact `setState`, it's an internal function that has the same name.\n\n\n      this.setState(); // so that UI re-renders with new options\n    }\n\n    resetProgress() {\n      const defaultProgress = {\n        percentage: 0,\n        bytesUploaded: 0,\n        uploadComplete: false,\n        uploadStarted: null\n      };\n      const files = { ...this.getState().files\n      };\n      const updatedFiles = {};\n      Object.keys(files).forEach(fileID => {\n        const updatedFile = { ...files[fileID]\n        };\n        updatedFile.progress = { ...updatedFile.progress,\n          ...defaultProgress\n        };\n        updatedFiles[fileID] = updatedFile;\n      });\n      this.setState({\n        files: updatedFiles,\n        totalProgress: 0\n      });\n      this.emit('reset-progress');\n    }\n\n    addPreProcessor(fn) {\n      _classPrivateFieldLooseBase$6(this, _preProcessors)[_preProcessors].add(fn);\n    }\n\n    removePreProcessor(fn) {\n      return _classPrivateFieldLooseBase$6(this, _preProcessors)[_preProcessors].delete(fn);\n    }\n\n    addPostProcessor(fn) {\n      _classPrivateFieldLooseBase$6(this, _postProcessors)[_postProcessors].add(fn);\n    }\n\n    removePostProcessor(fn) {\n      return _classPrivateFieldLooseBase$6(this, _postProcessors)[_postProcessors].delete(fn);\n    }\n\n    addUploader(fn) {\n      _classPrivateFieldLooseBase$6(this, _uploaders)[_uploaders].add(fn);\n    }\n\n    removeUploader(fn) {\n      return _classPrivateFieldLooseBase$6(this, _uploaders)[_uploaders].delete(fn);\n    }\n\n    setMeta(data) {\n      const updatedMeta = { ...this.getState().meta,\n        ...data\n      };\n      const updatedFiles = { ...this.getState().files\n      };\n      Object.keys(updatedFiles).forEach(fileID => {\n        updatedFiles[fileID] = { ...updatedFiles[fileID],\n          meta: { ...updatedFiles[fileID].meta,\n            ...data\n          }\n        };\n      });\n      this.log('Adding metadata:');\n      this.log(data);\n      this.setState({\n        meta: updatedMeta,\n        files: updatedFiles\n      });\n    }\n\n    setFileMeta(fileID, data) {\n      const updatedFiles = { ...this.getState().files\n      };\n\n      if (!updatedFiles[fileID]) {\n        this.log('Was trying to set metadata for a file that has been removed: ', fileID);\n        return;\n      }\n\n      const newMeta = { ...updatedFiles[fileID].meta,\n        ...data\n      };\n      updatedFiles[fileID] = { ...updatedFiles[fileID],\n        meta: newMeta\n      };\n      this.setState({\n        files: updatedFiles\n      });\n    }\n    /**\n     * Get a file object.\n     *\n     * @param {string} fileID The ID of the file object to return.\n     */\n\n\n    getFile(fileID) {\n      return this.getState().files[fileID];\n    }\n    /**\n     * Get all files in an array.\n     */\n\n\n    getFiles() {\n      const {\n        files\n      } = this.getState();\n      return Object.values(files);\n    }\n\n    getObjectOfFilesPerState() {\n      const {\n        files: filesObject,\n        totalProgress,\n        error\n      } = this.getState();\n      const files = Object.values(filesObject);\n      const inProgressFiles = files.filter(_ref => {\n        let {\n          progress\n        } = _ref;\n        return !progress.uploadComplete && progress.uploadStarted;\n      });\n      const newFiles = files.filter(file => !file.progress.uploadStarted);\n      const startedFiles = files.filter(file => file.progress.uploadStarted || file.progress.preprocess || file.progress.postprocess);\n      const uploadStartedFiles = files.filter(file => file.progress.uploadStarted);\n      const pausedFiles = files.filter(file => file.isPaused);\n      const completeFiles = files.filter(file => file.progress.uploadComplete);\n      const erroredFiles = files.filter(file => file.error);\n      const inProgressNotPausedFiles = inProgressFiles.filter(file => !file.isPaused);\n      const processingFiles = files.filter(file => file.progress.preprocess || file.progress.postprocess);\n      return {\n        newFiles,\n        startedFiles,\n        uploadStartedFiles,\n        pausedFiles,\n        completeFiles,\n        erroredFiles,\n        inProgressFiles,\n        inProgressNotPausedFiles,\n        processingFiles,\n        isUploadStarted: uploadStartedFiles.length > 0,\n        isAllComplete: totalProgress === 100 && completeFiles.length === files.length && processingFiles.length === 0,\n        isAllErrored: !!error && erroredFiles.length === files.length,\n        isAllPaused: inProgressFiles.length !== 0 && pausedFiles.length === inProgressFiles.length,\n        isUploadInProgress: inProgressFiles.length > 0,\n        isSomeGhost: files.some(file => file.isGhost)\n      };\n    }\n    /**\n     * A public wrapper for _checkRestrictions — checks if a file passes a set of restrictions.\n     * For use in UI pluigins (like Providers), to disallow selecting files that won’t pass restrictions.\n     *\n     * @param {object} file object to check\n     * @param {Array} [files] array to check maxNumberOfFiles and maxTotalFileSize\n     * @returns {object} { result: true/false, reason: why file didn’t pass restrictions }\n     */\n\n\n    validateRestrictions(file, files) {\n      try {\n        _classPrivateFieldLooseBase$6(this, _checkRestrictions)[_checkRestrictions](file, files);\n\n        return {\n          result: true\n        };\n      } catch (err) {\n        return {\n          result: false,\n          reason: err.message\n        };\n      }\n    }\n    /**\n     * Check if file passes a set of restrictions set in options: maxFileSize, minFileSize,\n     * maxNumberOfFiles and allowedFileTypes.\n     *\n     * @param {object} file object to check\n     * @param {Array} [files] array to check maxNumberOfFiles and maxTotalFileSize\n     * @private\n     */\n\n\n    checkIfFileAlreadyExists(fileID) {\n      const {\n        files\n      } = this.getState();\n\n      if (files[fileID] && !files[fileID].isGhost) {\n        return true;\n      }\n\n      return false;\n    }\n    /**\n     * Create a file state object based on user-provided `addFile()` options.\n     *\n     * Note this is extremely side-effectful and should only be done when a file state object\n     * will be added to state immediately afterward!\n     *\n     * The `files` value is passed in because it may be updated by the caller without updating the store.\n     */\n\n\n    /**\n     * Add a new file to `state.files`. This will run `onBeforeFileAdded`,\n     * try to guess file type in a clever way, check file against restrictions,\n     * and start an upload if `autoProceed === true`.\n     *\n     * @param {object} file object to add\n     * @returns {string} id for the added file\n     */\n    addFile(file) {\n      _classPrivateFieldLooseBase$6(this, _assertNewUploadAllowed)[_assertNewUploadAllowed](file);\n\n      const {\n        files\n      } = this.getState();\n\n      let newFile = _classPrivateFieldLooseBase$6(this, _checkAndCreateFileStateObject)[_checkAndCreateFileStateObject](files, file); // Users are asked to re-select recovered files without data,\n      // and to keep the progress, meta and everthing else, we only replace said data\n\n\n      if (files[newFile.id] && files[newFile.id].isGhost) {\n        newFile = { ...files[newFile.id],\n          data: file.data,\n          isGhost: false\n        };\n        this.log(`Replaced the blob in the restored ghost file: ${newFile.name}, ${newFile.id}`);\n      }\n\n      this.setState({\n        files: { ...files,\n          [newFile.id]: newFile\n        }\n      });\n      this.emit('file-added', newFile);\n      this.emit('files-added', [newFile]);\n      this.log(`Added file: ${newFile.name}, ${newFile.id}, mime type: ${newFile.type}`);\n\n      _classPrivateFieldLooseBase$6(this, _startIfAutoProceed)[_startIfAutoProceed]();\n\n      return newFile.id;\n    }\n    /**\n     * Add multiple files to `state.files`. See the `addFile()` documentation.\n     *\n     * If an error occurs while adding a file, it is logged and the user is notified.\n     * This is good for UI plugins, but not for programmatic use.\n     * Programmatic users should usually still use `addFile()` on individual files.\n     */\n\n\n    addFiles(fileDescriptors) {\n      _classPrivateFieldLooseBase$6(this, _assertNewUploadAllowed)[_assertNewUploadAllowed](); // create a copy of the files object only once\n\n\n      const files = { ...this.getState().files\n      };\n      const newFiles = [];\n      const errors = [];\n\n      for (let i = 0; i < fileDescriptors.length; i++) {\n        try {\n          let newFile = _classPrivateFieldLooseBase$6(this, _checkAndCreateFileStateObject)[_checkAndCreateFileStateObject](files, fileDescriptors[i]); // Users are asked to re-select recovered files without data,\n          // and to keep the progress, meta and everthing else, we only replace said data\n\n\n          if (files[newFile.id] && files[newFile.id].isGhost) {\n            newFile = { ...files[newFile.id],\n              data: fileDescriptors[i].data,\n              isGhost: false\n            };\n            this.log(`Replaced blob in a ghost file: ${newFile.name}, ${newFile.id}`);\n          }\n\n          files[newFile.id] = newFile;\n          newFiles.push(newFile);\n        } catch (err) {\n          if (!err.isRestriction) {\n            errors.push(err);\n          }\n        }\n      }\n\n      this.setState({\n        files\n      });\n      newFiles.forEach(newFile => {\n        this.emit('file-added', newFile);\n      });\n      this.emit('files-added', newFiles);\n\n      if (newFiles.length > 5) {\n        this.log(`Added batch of ${newFiles.length} files`);\n      } else {\n        Object.keys(newFiles).forEach(fileID => {\n          this.log(`Added file: ${newFiles[fileID].name}\\n id: ${newFiles[fileID].id}\\n type: ${newFiles[fileID].type}`);\n        });\n      }\n\n      if (newFiles.length > 0) {\n        _classPrivateFieldLooseBase$6(this, _startIfAutoProceed)[_startIfAutoProceed]();\n      }\n\n      if (errors.length > 0) {\n        let message = 'Multiple errors occurred while adding files:\\n';\n        errors.forEach(subError => {\n          message += `\\n * ${subError.message}`;\n        });\n        this.info({\n          message: this.i18n('addBulkFilesFailed', {\n            smart_count: errors.length\n          }),\n          details: message\n        }, 'error', this.opts.infoTimeout);\n\n        if (typeof AggregateError === 'function') {\n          throw new AggregateError(errors, message);\n        } else {\n          const err = new Error(message);\n          err.errors = errors;\n          throw err;\n        }\n      }\n    }\n\n    removeFiles(fileIDs, reason) {\n      const {\n        files,\n        currentUploads\n      } = this.getState();\n      const updatedFiles = { ...files\n      };\n      const updatedUploads = { ...currentUploads\n      };\n      const removedFiles = Object.create(null);\n      fileIDs.forEach(fileID => {\n        if (files[fileID]) {\n          removedFiles[fileID] = files[fileID];\n          delete updatedFiles[fileID];\n        }\n      }); // Remove files from the `fileIDs` list in each upload.\n\n      function fileIsNotRemoved(uploadFileID) {\n        return removedFiles[uploadFileID] === undefined;\n      }\n\n      Object.keys(updatedUploads).forEach(uploadID => {\n        const newFileIDs = currentUploads[uploadID].fileIDs.filter(fileIsNotRemoved); // Remove the upload if no files are associated with it anymore.\n\n        if (newFileIDs.length === 0) {\n          delete updatedUploads[uploadID];\n          return;\n        }\n\n        updatedUploads[uploadID] = { ...currentUploads[uploadID],\n          fileIDs: newFileIDs\n        };\n      });\n      const stateUpdate = {\n        currentUploads: updatedUploads,\n        files: updatedFiles\n      }; // If all files were removed - allow new uploads,\n      // and clear recoveredState\n\n      if (Object.keys(updatedFiles).length === 0) {\n        stateUpdate.allowNewUpload = true;\n        stateUpdate.error = null;\n        stateUpdate.recoveredState = null;\n      }\n\n      this.setState(stateUpdate);\n      this.calculateTotalProgress();\n      const removedFileIDs = Object.keys(removedFiles);\n      removedFileIDs.forEach(fileID => {\n        this.emit('file-removed', removedFiles[fileID], reason);\n      });\n\n      if (removedFileIDs.length > 5) {\n        this.log(`Removed ${removedFileIDs.length} files`);\n      } else {\n        this.log(`Removed files: ${removedFileIDs.join(', ')}`);\n      }\n    }\n\n    removeFile(fileID, reason) {\n      if (reason === void 0) {\n        reason = null;\n      }\n\n      this.removeFiles([fileID], reason);\n    }\n\n    pauseResume(fileID) {\n      if (!this.getState().capabilities.resumableUploads || this.getFile(fileID).uploadComplete) {\n        return undefined;\n      }\n\n      const wasPaused = this.getFile(fileID).isPaused || false;\n      const isPaused = !wasPaused;\n      this.setFileState(fileID, {\n        isPaused\n      });\n      this.emit('upload-pause', fileID, isPaused);\n      return isPaused;\n    }\n\n    pauseAll() {\n      const updatedFiles = { ...this.getState().files\n      };\n      const inProgressUpdatedFiles = Object.keys(updatedFiles).filter(file => {\n        return !updatedFiles[file].progress.uploadComplete && updatedFiles[file].progress.uploadStarted;\n      });\n      inProgressUpdatedFiles.forEach(file => {\n        const updatedFile = { ...updatedFiles[file],\n          isPaused: true\n        };\n        updatedFiles[file] = updatedFile;\n      });\n      this.setState({\n        files: updatedFiles\n      });\n      this.emit('pause-all');\n    }\n\n    resumeAll() {\n      const updatedFiles = { ...this.getState().files\n      };\n      const inProgressUpdatedFiles = Object.keys(updatedFiles).filter(file => {\n        return !updatedFiles[file].progress.uploadComplete && updatedFiles[file].progress.uploadStarted;\n      });\n      inProgressUpdatedFiles.forEach(file => {\n        const updatedFile = { ...updatedFiles[file],\n          isPaused: false,\n          error: null\n        };\n        updatedFiles[file] = updatedFile;\n      });\n      this.setState({\n        files: updatedFiles\n      });\n      this.emit('resume-all');\n    }\n\n    retryAll() {\n      const updatedFiles = { ...this.getState().files\n      };\n      const filesToRetry = Object.keys(updatedFiles).filter(file => {\n        return updatedFiles[file].error;\n      });\n      filesToRetry.forEach(file => {\n        const updatedFile = { ...updatedFiles[file],\n          isPaused: false,\n          error: null\n        };\n        updatedFiles[file] = updatedFile;\n      });\n      this.setState({\n        files: updatedFiles,\n        error: null\n      });\n      this.emit('retry-all', filesToRetry);\n\n      if (filesToRetry.length === 0) {\n        return Promise.resolve({\n          successful: [],\n          failed: []\n        });\n      }\n\n      const uploadID = _classPrivateFieldLooseBase$6(this, _createUpload)[_createUpload](filesToRetry, {\n        forceAllowNewUpload: true // create new upload even if allowNewUpload: false\n\n      });\n\n      return _classPrivateFieldLooseBase$6(this, _runUpload)[_runUpload](uploadID);\n    }\n\n    cancelAll() {\n      this.emit('cancel-all');\n      const {\n        files\n      } = this.getState();\n      const fileIDs = Object.keys(files);\n\n      if (fileIDs.length) {\n        this.removeFiles(fileIDs, 'cancel-all');\n      }\n\n      this.setState({\n        totalProgress: 0,\n        error: null,\n        recoveredState: null\n      });\n    }\n\n    retryUpload(fileID) {\n      this.setFileState(fileID, {\n        error: null,\n        isPaused: false\n      });\n      this.emit('upload-retry', fileID);\n\n      const uploadID = _classPrivateFieldLooseBase$6(this, _createUpload)[_createUpload]([fileID], {\n        forceAllowNewUpload: true // create new upload even if allowNewUpload: false\n\n      });\n\n      return _classPrivateFieldLooseBase$6(this, _runUpload)[_runUpload](uploadID);\n    }\n\n    reset() {\n      this.cancelAll();\n    }\n\n    logout() {\n      this.iteratePlugins(plugin => {\n        if (plugin.provider && plugin.provider.logout) {\n          plugin.provider.logout();\n        }\n      });\n    }\n\n    calculateProgress(file, data) {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      } // bytesTotal may be null or zero; in that case we can't divide by it\n\n\n      const canHavePercentage = Number.isFinite(data.bytesTotal) && data.bytesTotal > 0;\n      this.setFileState(file.id, {\n        progress: { ...this.getFile(file.id).progress,\n          bytesUploaded: data.bytesUploaded,\n          bytesTotal: data.bytesTotal,\n          percentage: canHavePercentage ? Math.round(data.bytesUploaded / data.bytesTotal * 100) : 0\n        }\n      });\n      this.calculateTotalProgress();\n    }\n\n    calculateTotalProgress() {\n      // calculate total progress, using the number of files currently uploading,\n      // multiplied by 100 and the summ of individual progress of each file\n      const files = this.getFiles();\n      const inProgress = files.filter(file => {\n        return file.progress.uploadStarted || file.progress.preprocess || file.progress.postprocess;\n      });\n\n      if (inProgress.length === 0) {\n        this.emit('progress', 0);\n        this.setState({\n          totalProgress: 0\n        });\n        return;\n      }\n\n      const sizedFiles = inProgress.filter(file => file.progress.bytesTotal != null);\n      const unsizedFiles = inProgress.filter(file => file.progress.bytesTotal == null);\n\n      if (sizedFiles.length === 0) {\n        const progressMax = inProgress.length * 100;\n        const currentProgress = unsizedFiles.reduce((acc, file) => {\n          return acc + file.progress.percentage;\n        }, 0);\n        const totalProgress = Math.round(currentProgress / progressMax * 100);\n        this.setState({\n          totalProgress\n        });\n        return;\n      }\n\n      let totalSize = sizedFiles.reduce((acc, file) => {\n        return acc + file.progress.bytesTotal;\n      }, 0);\n      const averageSize = totalSize / sizedFiles.length;\n      totalSize += averageSize * unsizedFiles.length;\n      let uploadedSize = 0;\n      sizedFiles.forEach(file => {\n        uploadedSize += file.progress.bytesUploaded;\n      });\n      unsizedFiles.forEach(file => {\n        uploadedSize += averageSize * (file.progress.percentage || 0) / 100;\n      });\n      let totalProgress = totalSize === 0 ? 0 : Math.round(uploadedSize / totalSize * 100); // hot fix, because:\n      // uploadedSize ended up larger than totalSize, resulting in 1325% total\n\n      if (totalProgress > 100) {\n        totalProgress = 100;\n      }\n\n      this.setState({\n        totalProgress\n      });\n      this.emit('progress', totalProgress);\n    }\n    /**\n     * Registers listeners for all global actions, like:\n     * `error`, `file-removed`, `upload-progress`\n     */\n\n\n    updateOnlineStatus() {\n      const online = typeof window.navigator.onLine !== 'undefined' ? window.navigator.onLine : true;\n\n      if (!online) {\n        this.emit('is-offline');\n        this.info(this.i18n('noInternetConnection'), 'error', 0);\n        this.wasOffline = true;\n      } else {\n        this.emit('is-online');\n\n        if (this.wasOffline) {\n          this.emit('back-online');\n          this.info(this.i18n('connectedToInternet'), 'success', 3000);\n          this.wasOffline = false;\n        }\n      }\n    }\n\n    getID() {\n      return this.opts.id;\n    }\n    /**\n     * Registers a plugin with Core.\n     *\n     * @param {object} Plugin object\n     * @param {object} [opts] object with options to be passed to Plugin\n     * @returns {object} self for chaining\n     */\n    // eslint-disable-next-line no-shadow\n\n\n    use(Plugin, opts) {\n      if (typeof Plugin !== 'function') {\n        const msg = `Expected a plugin class, but got ${Plugin === null ? 'null' : typeof Plugin}.` + ' Please verify that the plugin was imported and spelled correctly.';\n        throw new TypeError(msg);\n      } // Instantiate\n\n\n      const plugin = new Plugin(this, opts);\n      const pluginId = plugin.id;\n\n      if (!pluginId) {\n        throw new Error('Your plugin must have an id');\n      }\n\n      if (!plugin.type) {\n        throw new Error('Your plugin must have a type');\n      }\n\n      const existsPluginAlready = this.getPlugin(pluginId);\n\n      if (existsPluginAlready) {\n        const msg = `Already found a plugin named '${existsPluginAlready.id}'. ` + `Tried to use: '${pluginId}'.\\n` + 'Uppy plugins must have unique `id` options. See https://uppy.io/docs/plugins/#id.';\n        throw new Error(msg);\n      }\n\n      if (Plugin.VERSION) {\n        this.log(`Using ${pluginId} v${Plugin.VERSION}`);\n      }\n\n      if (plugin.type in _classPrivateFieldLooseBase$6(this, _plugins)[_plugins]) {\n        _classPrivateFieldLooseBase$6(this, _plugins)[_plugins][plugin.type].push(plugin);\n      } else {\n        _classPrivateFieldLooseBase$6(this, _plugins)[_plugins][plugin.type] = [plugin];\n      }\n\n      plugin.install();\n      return this;\n    }\n    /**\n     * Find one Plugin by name.\n     *\n     * @param {string} id plugin id\n     * @returns {BasePlugin|undefined}\n     */\n\n\n    getPlugin(id) {\n      for (const plugins of Object.values(_classPrivateFieldLooseBase$6(this, _plugins)[_plugins])) {\n        const foundPlugin = plugins.find(plugin => plugin.id === id);\n        if (foundPlugin != null) return foundPlugin;\n      }\n\n      return undefined;\n    }\n\n    [_Symbol$for$1](type) {\n      return _classPrivateFieldLooseBase$6(this, _plugins)[_plugins][type];\n    }\n    /**\n     * Iterate through all `use`d plugins.\n     *\n     * @param {Function} method that will be run on each plugin\n     */\n\n\n    iteratePlugins(method) {\n      Object.values(_classPrivateFieldLooseBase$6(this, _plugins)[_plugins]).flat(1).forEach(method);\n    }\n    /**\n     * Uninstall and remove a plugin.\n     *\n     * @param {object} instance The plugin instance to remove.\n     */\n\n\n    removePlugin(instance) {\n      this.log(`Removing plugin ${instance.id}`);\n      this.emit('plugin-remove', instance);\n\n      if (instance.uninstall) {\n        instance.uninstall();\n      }\n\n      const list = _classPrivateFieldLooseBase$6(this, _plugins)[_plugins][instance.type]; // list.indexOf failed here, because Vue3 converted the plugin instance\n      // to a Proxy object, which failed the strict comparison test:\n      // obj !== objProxy\n\n\n      const index = list.findIndex(item => item.id === instance.id);\n\n      if (index !== -1) {\n        list.splice(index, 1);\n      }\n\n      const state = this.getState();\n      const updatedState = {\n        plugins: { ...state.plugins,\n          [instance.id]: undefined\n        }\n      };\n      this.setState(updatedState);\n    }\n    /**\n     * Uninstall all plugins and close down this Uppy instance.\n     */\n\n\n    close() {\n      this.log(`Closing Uppy instance ${this.opts.id}: removing all files and uninstalling plugins`);\n      this.reset();\n\n      _classPrivateFieldLooseBase$6(this, _storeUnsubscribe)[_storeUnsubscribe]();\n\n      this.iteratePlugins(plugin => {\n        this.removePlugin(plugin);\n      });\n\n      if (typeof window !== 'undefined' && window.removeEventListener) {\n        window.removeEventListener('online', _classPrivateFieldLooseBase$6(this, _updateOnlineStatus)[_updateOnlineStatus]);\n        window.removeEventListener('offline', _classPrivateFieldLooseBase$6(this, _updateOnlineStatus)[_updateOnlineStatus]);\n      }\n    }\n\n    hideInfo() {\n      const {\n        info\n      } = this.getState();\n      this.setState({\n        info: info.slice(1)\n      });\n      this.emit('info-hidden');\n    }\n    /**\n     * Set info message in `state.info`, so that UI plugins like `Informer`\n     * can display the message.\n     *\n     * @param {string | object} message Message to be displayed by the informer\n     * @param {string} [type]\n     * @param {number} [duration]\n     */\n\n\n    info(message, type, duration) {\n      if (type === void 0) {\n        type = 'info';\n      }\n\n      if (duration === void 0) {\n        duration = 3000;\n      }\n\n      const isComplexMessage = typeof message === 'object';\n      this.setState({\n        info: [...this.getState().info, {\n          type,\n          message: isComplexMessage ? message.message : message,\n          details: isComplexMessage ? message.details : null\n        }]\n      });\n      setTimeout(() => this.hideInfo(), duration);\n      this.emit('info-visible');\n    }\n    /**\n     * Passes messages to a function, provided in `opts.logger`.\n     * If `opts.logger: Uppy.debugLogger` or `opts.debug: true`, logs to the browser console.\n     *\n     * @param {string|object} message to log\n     * @param {string} [type] optional `error` or `warning`\n     */\n\n\n    log(message, type) {\n      const {\n        logger\n      } = this.opts;\n\n      switch (type) {\n        case 'error':\n          logger.error(message);\n          break;\n\n        case 'warning':\n          logger.warn(message);\n          break;\n\n        default:\n          logger.debug(message);\n          break;\n      }\n    }\n    /**\n     * Restore an upload by its ID.\n     */\n\n\n    restore(uploadID) {\n      this.log(`Core: attempting to restore upload \"${uploadID}\"`);\n\n      if (!this.getState().currentUploads[uploadID]) {\n        _classPrivateFieldLooseBase$6(this, _removeUpload)[_removeUpload](uploadID);\n\n        return Promise.reject(new Error('Nonexistent upload'));\n      }\n\n      return _classPrivateFieldLooseBase$6(this, _runUpload)[_runUpload](uploadID);\n    }\n    /**\n     * Create an upload for a bunch of files.\n     *\n     * @param {Array<string>} fileIDs File IDs to include in this upload.\n     * @returns {string} ID of this upload.\n     */\n\n\n    [_Symbol$for2$1]() {\n      return _classPrivateFieldLooseBase$6(this, _createUpload)[_createUpload](...arguments);\n    }\n\n    /**\n     * Add data to an upload's result object.\n     *\n     * @param {string} uploadID The ID of the upload.\n     * @param {object} data Data properties to add to the result object.\n     */\n    addResultData(uploadID, data) {\n      if (!_classPrivateFieldLooseBase$6(this, _getUpload)[_getUpload](uploadID)) {\n        this.log(`Not setting result for an upload that has been removed: ${uploadID}`);\n        return;\n      }\n\n      const {\n        currentUploads\n      } = this.getState();\n      const currentUpload = { ...currentUploads[uploadID],\n        result: { ...currentUploads[uploadID].result,\n          ...data\n        }\n      };\n      this.setState({\n        currentUploads: { ...currentUploads,\n          [uploadID]: currentUpload\n        }\n      });\n    }\n    /**\n     * Remove an upload, eg. if it has been canceled or completed.\n     *\n     * @param {string} uploadID The ID of the upload.\n     */\n\n\n    /**\n     * Start an upload for all the files that are not currently being uploaded.\n     *\n     * @returns {Promise}\n     */\n    upload() {\n      var _classPrivateFieldLoo;\n\n      if (!((_classPrivateFieldLoo = _classPrivateFieldLooseBase$6(this, _plugins)[_plugins].uploader) != null && _classPrivateFieldLoo.length)) {\n        this.log('No uploader type plugins are used', 'warning');\n      }\n\n      let {\n        files\n      } = this.getState();\n      const onBeforeUploadResult = this.opts.onBeforeUpload(files);\n\n      if (onBeforeUploadResult === false) {\n        return Promise.reject(new Error('Not starting the upload because onBeforeUpload returned false'));\n      }\n\n      if (onBeforeUploadResult && typeof onBeforeUploadResult === 'object') {\n        files = onBeforeUploadResult; // Updating files in state, because uploader plugins receive file IDs,\n        // and then fetch the actual file object from state\n\n        this.setState({\n          files\n        });\n      }\n\n      return Promise.resolve().then(() => {\n        _classPrivateFieldLooseBase$6(this, _checkMinNumberOfFiles)[_checkMinNumberOfFiles](files);\n\n        _classPrivateFieldLooseBase$6(this, _checkRequiredMetaFields)[_checkRequiredMetaFields](files);\n      }).catch(err => {\n        _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](err);\n      }).then(() => {\n        const {\n          currentUploads\n        } = this.getState(); // get a list of files that are currently assigned to uploads\n\n        const currentlyUploadingFiles = Object.values(currentUploads).flatMap(curr => curr.fileIDs);\n        const waitingFileIDs = [];\n        Object.keys(files).forEach(fileID => {\n          const file = this.getFile(fileID); // if the file hasn't started uploading and hasn't already been assigned to an upload..\n\n          if (!file.progress.uploadStarted && currentlyUploadingFiles.indexOf(fileID) === -1) {\n            waitingFileIDs.push(file.id);\n          }\n        });\n\n        const uploadID = _classPrivateFieldLooseBase$6(this, _createUpload)[_createUpload](waitingFileIDs);\n\n        return _classPrivateFieldLooseBase$6(this, _runUpload)[_runUpload](uploadID);\n      }).catch(err => {\n        _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](err, {\n          showInformer: false\n        });\n      });\n    }\n\n  }\n\n  function _checkRestrictions2(file, files) {\n    if (files === void 0) {\n      files = this.getFiles();\n    }\n\n    const {\n      maxFileSize,\n      minFileSize,\n      maxTotalFileSize,\n      maxNumberOfFiles,\n      allowedFileTypes\n    } = this.opts.restrictions;\n\n    if (maxNumberOfFiles) {\n      if (files.length + 1 > maxNumberOfFiles) {\n        throw new RestrictionError(`${this.i18n('youCanOnlyUploadX', {\n        smart_count: maxNumberOfFiles\n      })}`);\n      }\n    }\n\n    if (allowedFileTypes) {\n      const isCorrectFileType = allowedFileTypes.some(type => {\n        // check if this is a mime-type\n        if (type.indexOf('/') > -1) {\n          if (!file.type) return false;\n          return mimeMatch(file.type.replace(/;.*?$/, ''), type);\n        } // otherwise this is likely an extension\n\n\n        if (type[0] === '.' && file.extension) {\n          return file.extension.toLowerCase() === type.substr(1).toLowerCase();\n        }\n\n        return false;\n      });\n\n      if (!isCorrectFileType) {\n        const allowedFileTypesString = allowedFileTypes.join(', ');\n        throw new RestrictionError(this.i18n('youCanOnlyUploadFileTypes', {\n          types: allowedFileTypesString\n        }));\n      }\n    } // We can't check maxTotalFileSize if the size is unknown.\n\n\n    if (maxTotalFileSize && file.size != null) {\n      let totalFilesSize = 0;\n      totalFilesSize += file.size;\n      files.forEach(f => {\n        totalFilesSize += f.size;\n      });\n\n      if (totalFilesSize > maxTotalFileSize) {\n        throw new RestrictionError(this.i18n('exceedsSize', {\n          size: prettierBytes(maxTotalFileSize),\n          file: file.name\n        }));\n      }\n    } // We can't check maxFileSize if the size is unknown.\n\n\n    if (maxFileSize && file.size != null) {\n      if (file.size > maxFileSize) {\n        throw new RestrictionError(this.i18n('exceedsSize', {\n          size: prettierBytes(maxFileSize),\n          file: file.name\n        }));\n      }\n    } // We can't check minFileSize if the size is unknown.\n\n\n    if (minFileSize && file.size != null) {\n      if (file.size < minFileSize) {\n        throw new RestrictionError(this.i18n('inferiorSize', {\n          size: prettierBytes(minFileSize)\n        }));\n      }\n    }\n  }\n\n  function _checkMinNumberOfFiles2(files) {\n    const {\n      minNumberOfFiles\n    } = this.opts.restrictions;\n\n    if (Object.keys(files).length < minNumberOfFiles) {\n      throw new RestrictionError(`${this.i18n('youHaveToAtLeastSelectX', {\n      smart_count: minNumberOfFiles\n    })}`);\n    }\n  }\n\n  function _checkRequiredMetaFieldsOnFile2(file) {\n    const {\n      requiredMetaFields\n    } = this.opts.restrictions;\n    const {\n      hasOwnProperty\n    } = Object.prototype;\n    const errors = [];\n    const missingFields = [];\n\n    for (let i = 0; i < requiredMetaFields.length; i++) {\n      if (!hasOwnProperty.call(file.meta, requiredMetaFields[i]) || file.meta[requiredMetaFields[i]] === '') {\n        const err = new RestrictionError(`${this.i18n('missingRequiredMetaFieldOnFile', {\n        fileName: file.name\n      })}`);\n        errors.push(err);\n        missingFields.push(requiredMetaFields[i]);\n\n        _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](err, {\n          file,\n          showInformer: false,\n          throwErr: false\n        });\n      }\n    }\n\n    this.setFileState(file.id, {\n      missingRequiredMetaFields: missingFields\n    });\n    return errors;\n  }\n\n  function _checkRequiredMetaFields2(files) {\n    const errors = Object.keys(files).flatMap(fileID => {\n      const file = this.getFile(fileID);\n      return _classPrivateFieldLooseBase$6(this, _checkRequiredMetaFieldsOnFile)[_checkRequiredMetaFieldsOnFile](file);\n    });\n\n    if (errors.length) {\n      throw new AggregateRestrictionError(errors, `${this.i18n('missingRequiredMetaField')}`);\n    }\n  }\n\n  function _showOrLogErrorAndThrow2(err, _temp) {\n    let {\n      showInformer = true,\n      file = null,\n      throwErr = true\n    } = _temp === void 0 ? {} : _temp;\n    const message = typeof err === 'object' ? err.message : err;\n    const details = typeof err === 'object' && err.details ? err.details : ''; // Restriction errors should be logged, but not as errors,\n    // as they are expected and shown in the UI.\n\n    let logMessageWithDetails = message;\n\n    if (details) {\n      logMessageWithDetails += ` ${details}`;\n    }\n\n    if (err.isRestriction) {\n      this.log(logMessageWithDetails);\n      this.emit('restriction-failed', file, err);\n    } else {\n      this.log(logMessageWithDetails, 'error');\n    } // Sometimes informer has to be shown manually by the developer,\n    // for example, in `onBeforeFileAdded`.\n\n\n    if (showInformer) {\n      this.info({\n        message,\n        details\n      }, 'error', this.opts.infoTimeout);\n    }\n\n    if (throwErr) {\n      throw typeof err === 'object' ? err : new Error(err);\n    }\n  }\n\n  function _assertNewUploadAllowed2(file) {\n    const {\n      allowNewUpload\n    } = this.getState();\n\n    if (allowNewUpload === false) {\n      _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](new RestrictionError(this.i18n('noMoreFilesAllowed')), {\n        file\n      });\n    }\n  }\n\n  function _checkAndCreateFileStateObject2(files, fileDescriptor) {\n    const fileType = getFileType(fileDescriptor);\n    const fileName = getFileName(fileType, fileDescriptor);\n    const fileExtension = getFileNameAndExtension(fileName).extension;\n    const isRemote = Boolean(fileDescriptor.isRemote);\n    const fileID = generateFileID({ ...fileDescriptor,\n      type: fileType\n    });\n\n    if (this.checkIfFileAlreadyExists(fileID)) {\n      const error = new RestrictionError(this.i18n('noDuplicates', {\n        fileName\n      }));\n\n      _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](error, {\n        file: fileDescriptor\n      });\n    }\n\n    const meta = fileDescriptor.meta || {};\n    meta.name = fileName;\n    meta.type = fileType; // `null` means the size is unknown.\n\n    const size = Number.isFinite(fileDescriptor.data.size) ? fileDescriptor.data.size : null;\n    let newFile = {\n      source: fileDescriptor.source || '',\n      id: fileID,\n      name: fileName,\n      extension: fileExtension || '',\n      meta: { ...this.getState().meta,\n        ...meta\n      },\n      type: fileType,\n      data: fileDescriptor.data,\n      progress: {\n        percentage: 0,\n        bytesUploaded: 0,\n        bytesTotal: size,\n        uploadComplete: false,\n        uploadStarted: null\n      },\n      size,\n      isRemote,\n      remote: fileDescriptor.remote || '',\n      preview: fileDescriptor.preview\n    };\n    const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(newFile, files);\n\n    if (onBeforeFileAddedResult === false) {\n      // Don’t show UI info for this error, as it should be done by the developer\n      _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](new RestrictionError('Cannot add the file because onBeforeFileAdded returned false.'), {\n        showInformer: false,\n        fileDescriptor\n      });\n    } else if (typeof onBeforeFileAddedResult === 'object' && onBeforeFileAddedResult !== null) {\n      newFile = onBeforeFileAddedResult;\n    }\n\n    try {\n      const filesArray = Object.keys(files).map(i => files[i]);\n\n      _classPrivateFieldLooseBase$6(this, _checkRestrictions)[_checkRestrictions](newFile, filesArray);\n    } catch (err) {\n      _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](err, {\n        file: newFile\n      });\n    }\n\n    return newFile;\n  }\n\n  function _startIfAutoProceed2() {\n    if (this.opts.autoProceed && !this.scheduledAutoProceed) {\n      this.scheduledAutoProceed = setTimeout(() => {\n        this.scheduledAutoProceed = null;\n        this.upload().catch(err => {\n          if (!err.isRestriction) {\n            this.log(err.stack || err.message || err);\n          }\n        });\n      }, 4);\n    }\n  }\n\n  function _addListeners2() {\n    /**\n     * @param {Error} error\n     * @param {object} [file]\n     * @param {object} [response]\n     */\n    const errorHandler = (error, file, response) => {\n      let errorMsg = error.message || 'Unknown error';\n\n      if (error.details) {\n        errorMsg += ` ${error.details}`;\n      }\n\n      this.setState({\n        error: errorMsg\n      });\n\n      if (file != null && file.id in this.getState().files) {\n        this.setFileState(file.id, {\n          error: errorMsg,\n          response\n        });\n      }\n    };\n\n    this.on('error', errorHandler);\n    this.on('upload-error', (file, error, response) => {\n      errorHandler(error, file, response);\n\n      if (typeof error === 'object' && error.message) {\n        const newError = new Error(error.message);\n        newError.details = error.message;\n\n        if (error.details) {\n          newError.details += ` ${error.details}`;\n        }\n\n        newError.message = this.i18n('failedToUpload', {\n          file: file.name\n        });\n\n        _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](newError, {\n          throwErr: false\n        });\n      } else {\n        _classPrivateFieldLooseBase$6(this, _showOrLogErrorAndThrow)[_showOrLogErrorAndThrow](error, {\n          throwErr: false\n        });\n      }\n    });\n    this.on('upload', () => {\n      this.setState({\n        error: null\n      });\n    });\n    this.on('upload-started', file => {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      }\n\n      this.setFileState(file.id, {\n        progress: {\n          uploadStarted: Date.now(),\n          uploadComplete: false,\n          percentage: 0,\n          bytesUploaded: 0,\n          bytesTotal: file.size\n        }\n      });\n    });\n    this.on('upload-progress', this.calculateProgress);\n    this.on('upload-success', (file, uploadResp) => {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      }\n\n      const currentProgress = this.getFile(file.id).progress;\n      this.setFileState(file.id, {\n        progress: { ...currentProgress,\n          postprocess: _classPrivateFieldLooseBase$6(this, _postProcessors)[_postProcessors].size > 0 ? {\n            mode: 'indeterminate'\n          } : null,\n          uploadComplete: true,\n          percentage: 100,\n          bytesUploaded: currentProgress.bytesTotal\n        },\n        response: uploadResp,\n        uploadURL: uploadResp.uploadURL,\n        isPaused: false\n      }); // Remote providers sometimes don't tell us the file size,\n      // but we can know how many bytes we uploaded once the upload is complete.\n\n      if (file.size == null) {\n        this.setFileState(file.id, {\n          size: uploadResp.bytesUploaded || currentProgress.bytesTotal\n        });\n      }\n\n      this.calculateTotalProgress();\n    });\n    this.on('preprocess-progress', (file, progress) => {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      }\n\n      this.setFileState(file.id, {\n        progress: { ...this.getFile(file.id).progress,\n          preprocess: progress\n        }\n      });\n    });\n    this.on('preprocess-complete', file => {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      }\n\n      const files = { ...this.getState().files\n      };\n      files[file.id] = { ...files[file.id],\n        progress: { ...files[file.id].progress\n        }\n      };\n      delete files[file.id].progress.preprocess;\n      this.setState({\n        files\n      });\n    });\n    this.on('postprocess-progress', (file, progress) => {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      }\n\n      this.setFileState(file.id, {\n        progress: { ...this.getState().files[file.id].progress,\n          postprocess: progress\n        }\n      });\n    });\n    this.on('postprocess-complete', file => {\n      if (!this.getFile(file.id)) {\n        this.log(`Not setting progress for a file that has been removed: ${file.id}`);\n        return;\n      }\n\n      const files = { ...this.getState().files\n      };\n      files[file.id] = { ...files[file.id],\n        progress: { ...files[file.id].progress\n        }\n      };\n      delete files[file.id].progress.postprocess;\n      this.setState({\n        files\n      });\n    });\n    this.on('restored', () => {\n      // Files may have changed--ensure progress is still accurate.\n      this.calculateTotalProgress();\n    });\n    this.on('dashboard:file-edit-complete', file => {\n      if (file) {\n        _classPrivateFieldLooseBase$6(this, _checkRequiredMetaFieldsOnFile)[_checkRequiredMetaFieldsOnFile](file);\n      }\n    }); // show informer if offline\n\n    if (typeof window !== 'undefined' && window.addEventListener) {\n      window.addEventListener('online', _classPrivateFieldLooseBase$6(this, _updateOnlineStatus)[_updateOnlineStatus]);\n      window.addEventListener('offline', _classPrivateFieldLooseBase$6(this, _updateOnlineStatus)[_updateOnlineStatus]);\n      setTimeout(_classPrivateFieldLooseBase$6(this, _updateOnlineStatus)[_updateOnlineStatus], 3000);\n    }\n  }\n\n  function _createUpload2(fileIDs, opts) {\n    if (opts === void 0) {\n      opts = {};\n    }\n\n    // uppy.retryAll sets this to true — when retrying we want to ignore `allowNewUpload: false`\n    const {\n      forceAllowNewUpload = false\n    } = opts;\n    const {\n      allowNewUpload,\n      currentUploads\n    } = this.getState();\n\n    if (!allowNewUpload && !forceAllowNewUpload) {\n      throw new Error('Cannot create a new upload: already uploading.');\n    }\n\n    const uploadID = nanoid$1();\n    this.emit('upload', {\n      id: uploadID,\n      fileIDs\n    });\n    this.setState({\n      allowNewUpload: this.opts.allowMultipleUploadBatches !== false && this.opts.allowMultipleUploads !== false,\n      currentUploads: { ...currentUploads,\n        [uploadID]: {\n          fileIDs,\n          step: 0,\n          result: {}\n        }\n      }\n    });\n    return uploadID;\n  }\n\n  function _getUpload2(uploadID) {\n    const {\n      currentUploads\n    } = this.getState();\n    return currentUploads[uploadID];\n  }\n\n  function _removeUpload2(uploadID) {\n    const currentUploads = { ...this.getState().currentUploads\n    };\n    delete currentUploads[uploadID];\n    this.setState({\n      currentUploads\n    });\n  }\n\n  async function _runUpload2(uploadID) {\n    let {\n      currentUploads\n    } = this.getState();\n    let currentUpload = currentUploads[uploadID];\n    const restoreStep = currentUpload.step || 0;\n    const steps = [..._classPrivateFieldLooseBase$6(this, _preProcessors)[_preProcessors], ..._classPrivateFieldLooseBase$6(this, _uploaders)[_uploaders], ..._classPrivateFieldLooseBase$6(this, _postProcessors)[_postProcessors]];\n\n    try {\n      for (let step = restoreStep; step < steps.length; step++) {\n        if (!currentUpload) {\n          break;\n        }\n\n        const fn = steps[step];\n        const updatedUpload = { ...currentUpload,\n          step\n        };\n        this.setState({\n          currentUploads: { ...currentUploads,\n            [uploadID]: updatedUpload\n          }\n        }); // TODO give this the `updatedUpload` object as its only parameter maybe?\n        // Otherwise when more metadata may be added to the upload this would keep getting more parameters\n\n        await fn(updatedUpload.fileIDs, uploadID); // Update currentUpload value in case it was modified asynchronously.\n\n        currentUploads = this.getState().currentUploads;\n        currentUpload = currentUploads[uploadID];\n      }\n    } catch (err) {\n      this.emit('error', err);\n\n      _classPrivateFieldLooseBase$6(this, _removeUpload)[_removeUpload](uploadID);\n\n      throw err;\n    } // Set result data.\n\n\n    if (currentUpload) {\n      // Mark postprocessing step as complete if necessary; this addresses a case where we might get\n      // stuck in the postprocessing UI while the upload is fully complete.\n      // If the postprocessing steps do not do any work, they may not emit postprocessing events at\n      // all, and never mark the postprocessing as complete. This is fine on its own but we\n      // introduced code in the @uppy/core upload-success handler to prepare postprocessing progress\n      // state if any postprocessors are registered. That is to avoid a \"flash of completed state\"\n      // before the postprocessing plugins can emit events.\n      //\n      // So, just in case an upload with postprocessing plugins *has* completed *without* emitting\n      // postprocessing completion, we do it instead.\n      currentUpload.fileIDs.forEach(fileID => {\n        const file = this.getFile(fileID);\n\n        if (file && file.progress.postprocess) {\n          this.emit('postprocess-complete', file);\n        }\n      });\n      const files = currentUpload.fileIDs.map(fileID => this.getFile(fileID));\n      const successful = files.filter(file => !file.error);\n      const failed = files.filter(file => file.error);\n      await this.addResultData(uploadID, {\n        successful,\n        failed,\n        uploadID\n      }); // Update currentUpload value in case it was modified asynchronously.\n\n      currentUploads = this.getState().currentUploads;\n      currentUpload = currentUploads[uploadID];\n    } // Emit completion events.\n    // This is in a separate function so that the `currentUploads` variable\n    // always refers to the latest state. In the handler right above it refers\n    // to an outdated object without the `.result` property.\n\n\n    let result;\n\n    if (currentUpload) {\n      result = currentUpload.result;\n      this.emit('complete', result);\n\n      _classPrivateFieldLooseBase$6(this, _removeUpload)[_removeUpload](uploadID);\n    }\n\n    if (result == null) {\n      this.log(`Not setting result for an upload that has been removed: ${uploadID}`);\n    }\n\n    return result;\n  }\n\n  Uppy.VERSION = \"2.1.3\";\n  var Uppy_1$1 = Uppy;\n\n  var preact = createCommonjsModule$1(function (module, exports) {\n  var n,l,u,t,i,r,o,f,e={},c=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function a(n,l){for(var u in l)n[u]=l[u];return n}function v(n){var l=n.parentNode;l&&l.removeChild(n);}function h(l,u,t){var i,r,o,f={};for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=u[o];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===f[o]&&(f[o]=l.defaultProps[o]);return p(l,f,i,r,null)}function p(n,t,i,r,o){var f={type:n,props:t,key:i,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++u:o};return null==o&&null!=l.vnode&&l.vnode(f),f}function y(n){return n.children}function d(n,l){this.props=n,this.context=l;}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return \"function\"==typeof n.type?_(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function x(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!b.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||r)(b);}function b(){for(var n;b.__r=i.length;)n=i.sort(function(n,l){return n.__v.__b-l.__v.__b}),i=[],n.some(function(n){var l,u,t,i,r,o;n.__d&&(r=(i=(l=n).__v).__e,(o=l.__P)&&(u=[],(t=a({},i)).__v=i.__v+1,I(o,i,t,l.__n,void 0!==o.ownerSVGElement,null!=i.__h?[r]:null,u,null==r?_(i):r,i.__h),T(u,i),i.__e!=r&&k(i)));});}function m(n,l,u,t,i,r,o,f,s,a){var v,h,d,k,x,b,m,A=t&&t.__k||c,P=A.length;for(u.__k=[],v=0;v<l.length;v++)if(null!=(k=u.__k[v]=null==(k=l[v])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?p(null,k,null,null,k):Array.isArray(k)?p(y,{children:k},null,null,null):k.__b>0?p(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=A[v])||d&&k.key==d.key&&k.type===d.type)A[v]=void 0;else for(h=0;h<P;h++){if((d=A[h])&&k.key==d.key&&k.type===d.type){A[h]=void 0;break}d=null;}I(n,k,d=d||e,i,r,o,f,s,a),x=k.__e,(h=k.ref)&&d.ref!=h&&(m||(m=[]),d.ref&&m.push(d.ref,null,k),m.push(h,k.__c||x,k)),null!=x?(null==b&&(b=x),\"function\"==typeof k.type&&k.__k===d.__k?k.__d=s=g(k,s,n):s=w(n,k,d,A,x,s),\"function\"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_(d));}for(u.__e=b,v=P;v--;)null!=A[v]&&(\"function\"==typeof u.type&&null!=A[v].__e&&A[v].__e==u.__d&&(u.__d=_(t,v+1)),L(A[v],A[v]));if(m)for(v=0;v<m.length;v++)z(m[v],m[++v],m[++v]);}function g(n,l,u){for(var t,i=n.__k,r=0;i&&r<i.length;r++)(t=i[r])&&(t.__=n,l=\"function\"==typeof t.type?g(t,l,u):w(u,t,t,i,t.__e,l));return l}function w(n,l,u,t,i,r){var o,f,e;if(void 0!==l.__d)o=l.__d,l.__d=void 0;else if(null==u||i!=r||null==i.parentNode)n:if(null==r||r.parentNode!==n)n.appendChild(i),o=null;else {for(f=r,e=0;(f=f.nextSibling)&&e<t.length;e+=2)if(f==i)break n;n.insertBefore(i,r),o=r;}return void 0!==o?o:i.nextSibling}function A(n,l,u,t,i){var r;for(r in u)\"children\"===r||\"key\"===r||r in l||C(n,r,null,u[r],t);for(r in l)i&&\"function\"!=typeof l[r]||\"children\"===r||\"key\"===r||\"value\"===r||\"checked\"===r||u[r]===l[r]||C(n,r,l[r],u[r],t);}function P(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||s.test(l)?u:u+\"px\";}function C(n,l,u,t,i){var r;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else {if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||P(n.style,l,\"\");if(u)for(l in u)t&&u[l]===t[l]||P(n.style,l,u[l]);}else if(\"o\"===l[0]&&\"n\"===l[1])r=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?t||n.addEventListener(l,r?H:$,r):n.removeEventListener(l,r?H:$,r);else if(\"dangerouslySetInnerHTML\"!==l){if(i)l=l.replace(/xlink[H:h]/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l));}}function $(n){this.l[n.type+!1](l.event?l.event(n):n);}function H(n){this.l[n.type+!0](l.event?l.event(n):n);}function I(n,u,t,i,r,o,f,e,c){var s,v,h,p,_,k,x,b,g,w,A,P=u.type;if(void 0!==u.constructor)return null;null!=t.__h&&(c=t.__h,e=u.__e=t.__e,u.__h=null,o=[e]),(s=l.__b)&&s(u);try{n:if(\"function\"==typeof P){if(b=u.props,g=(s=P.contextType)&&i[s.__c],w=s?g?g.props.value:s.__:i,t.__c?x=(v=u.__c=t.__c).__=v.__E:(\"prototype\"in P&&P.prototype.render?u.__c=v=new P(b,w):(u.__c=v=new d(b,w),v.constructor=P,v.render=M),g&&g.sub(v),v.props=b,v.state||(v.state={}),v.context=w,v.__n=i,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=P.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=a({},v.__s)),a(v.__s,P.getDerivedStateFromProps(b,v.__s))),p=v.props,_=v.state,h)null==P.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else {if(null==P.getDerivedStateFromProps&&b!==p&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(b,w),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(b,v.__s,w)||u.__v===t.__v){v.props=b,v.state=v.__s,u.__v!==t.__v&&(v.__d=!1),v.__v=u,u.__e=t.__e,u.__k=t.__k,u.__k.forEach(function(n){n&&(n.__=u);}),v.__h.length&&f.push(v);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(b,v.__s,w),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(p,_,k);});}v.context=w,v.props=b,v.state=v.__s,(s=l.__r)&&s(u),v.__d=!1,v.__v=u,v.__P=n,s=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(i=a(a({},i),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(k=v.getSnapshotBeforeUpdate(p,_)),A=null!=s&&s.type===y&&null==s.key?s.props.children:s,m(n,Array.isArray(A)?A:[A],u,t,i,r,o,f,e,c),v.base=u.__e,u.__h=null,v.__h.length&&f.push(v),x&&(v.__E=v.__=null),v.__e=!1;}else null==o&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=j(t.__e,u,t,i,r,o,f,c);(s=l.diffed)&&s(u);}catch(n){u.__v=null,(c||null!=o)&&(u.__e=e,u.__h=!!c,o[o.indexOf(e)]=null),l.__e(n,u,t);}}function T(n,u){l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l.__e(n,u.__v);}});}function j(l,u,t,i,r,o,f,c){var s,a,h,p=t.props,y=u.props,d=u.type,k=0;if(\"svg\"===d&&(r=!0),null!=o)for(;k<o.length;k++)if((s=o[k])&&\"setAttribute\"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,o[k]=null;break}if(null==l){if(null===d)return document.createTextNode(y);l=r?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,y.is&&y),o=null,c=!1;}if(null===d)p===y||c&&l.data===y||(l.data=y);else {if(o=o&&n.call(l.childNodes),a=(p=t.props||e).dangerouslySetInnerHTML,h=y.dangerouslySetInnerHTML,!c){if(null!=o)for(p={},k=0;k<l.attributes.length;k++)p[l.attributes[k].name]=l.attributes[k].value;(h||a)&&(h&&(a&&h.__html==a.__html||h.__html===l.innerHTML)||(l.innerHTML=h&&h.__html||\"\"));}if(A(l,y,p,r,c),h)u.__k=[];else if(k=u.props.children,m(l,Array.isArray(k)?k:[k],u,t,i,r&&\"foreignObject\"!==d,o,f,o?o[0]:t.__k&&_(t,0),c),null!=o)for(k=o.length;k--;)null!=o[k]&&v(o[k]);c||(\"value\"in y&&void 0!==(k=y.value)&&(k!==p.value||k!==l.value||\"progress\"===d&&!k)&&C(l,\"value\",k,p.value,!1),\"checked\"in y&&void 0!==(k=y.checked)&&k!==l.checked&&C(l,\"checked\",k,p.checked,!1));}return l}function z(n,u,t){try{\"function\"==typeof n?n(u):n.current=u;}catch(n){l.__e(n,t);}}function L(n,u,t){var i,r;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!==n.__e||z(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount();}catch(n){l.__e(n,u);}i.base=i.__P=null;}if(i=n.__k)for(r=0;r<i.length;r++)i[r]&&L(i[r],u,\"function\"!=typeof n.type);t||null==n.__e||v(n.__e),n.__e=n.__d=void 0;}function M(n,l,u){return this.constructor(n,u)}function N(u,t,i){var r,o,f;l.__&&l.__(u,t),o=(r=\"function\"==typeof i)?null:i&&i.__k||t.__k,f=[],I(t,u=(!r&&i||t).__k=h(y,null,[u]),o||e,e,void 0!==t.ownerSVGElement,!r&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,f,!r&&i?i:o?o.__e:t.firstChild,r),T(f,u);}n=c.slice,l={__e:function(n,l){for(var u,t,i;l=l.__;)if((u=l.__c)&&!u.__)try{if((t=u.constructor)&&null!=t.getDerivedStateFromError&&(u.setState(t.getDerivedStateFromError(n)),i=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),i=u.__d),i)return u.__E=u}catch(l){n=l;}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=a({},this.state),\"function\"==typeof n&&(n=n(a({},u),this.props)),n&&a(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),x(this));},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),x(this));},d.prototype.render=y,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,b.__r=0,f=0,exports.Component=d,exports.Fragment=y,exports.cloneElement=function(l,u,t){var i,r,o,f=a({},l.props);for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),p(l.type,f,i||l.key,r||l.ref,null)},exports.createContext=function(n,l){var u={__c:l=\"__cC\"+f++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(x);},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Provider.__=u.Consumer.contextType=u},exports.createElement=h,exports.createRef=function(){return {current:null}},exports.h=h,exports.hydrate=function n(l,u){N(l,u,n);},exports.isValidElement=t,exports.options=l,exports.render=N,exports.toChildArray=function n(l,u){return u=u||[],null==l||\"boolean\"==typeof l||(Array.isArray(l)?l.some(function(l){n(l,u);}):u.push(l)),u};\n\n  });\n\n  /**\n   * Check if an object is a DOM element. Duck-typing based on `nodeType`.\n   *\n   * @param {*} obj\n   */\n  var isDOMElement = function isDOMElement(obj) {\n    return (obj == null ? void 0 : obj.nodeType) === Node.ELEMENT_NODE;\n  };\n\n  /**\n   * Find a DOM element.\n   *\n   * @param {Node|string} element\n   * @returns {Node|null}\n   */\n\n\n  var findDOMElement = function findDOMElement(element, context) {\n    if (context === void 0) {\n      context = document;\n    }\n\n    if (typeof element === 'string') {\n      return context.querySelector(element);\n    }\n\n    if (isDOMElement(element)) {\n      return element;\n    }\n\n    return null;\n  };\n\n  /**\n   * Core plugin logic that all plugins share.\n   *\n   * BasePlugin does not contain DOM rendering so it can be used for plugins\n   * without a user interface.\n   *\n   * See `Plugin` for the extended version with Preact rendering for interfaces.\n   */\n\n\n  var BasePlugin_1$1 = class BasePlugin {\n    constructor(uppy, opts) {\n      if (opts === void 0) {\n        opts = {};\n      }\n\n      this.uppy = uppy;\n      this.opts = opts;\n    }\n\n    getPluginState() {\n      const {\n        plugins\n      } = this.uppy.getState();\n      return plugins[this.id] || {};\n    }\n\n    setPluginState(update) {\n      const {\n        plugins\n      } = this.uppy.getState();\n      this.uppy.setState({\n        plugins: { ...plugins,\n          [this.id]: { ...plugins[this.id],\n            ...update\n          }\n        }\n      });\n    }\n\n    setOptions(newOpts) {\n      this.opts = { ...this.opts,\n        ...newOpts\n      };\n      this.setPluginState(); // so that UI re-renders with new options\n\n      this.i18nInit();\n    }\n\n    i18nInit() {\n      const translator = new Translator_1([this.defaultLocale, this.uppy.locale, this.opts.locale]);\n      this.i18n = translator.translate.bind(translator);\n      this.i18nArray = translator.translateArray.bind(translator);\n      this.setPluginState(); // so that UI re-renders and we see the updated locale\n    }\n    /**\n     * Extendable methods\n     * ==================\n     * These methods are here to serve as an overview of the extendable methods as well as\n     * making them not conditional in use, such as `if (this.afterUpdate)`.\n     */\n    // eslint-disable-next-line class-methods-use-this\n\n\n    addTarget() {\n      throw new Error('Extend the addTarget method to add your plugin to another plugin\\'s target');\n    } // eslint-disable-next-line class-methods-use-this\n\n\n    install() {} // eslint-disable-next-line class-methods-use-this\n\n\n    uninstall() {}\n    /**\n     * Called when plugin is mounted, whether in DOM or into another plugin.\n     * Needed because sometimes plugins are mounted separately/after `install`,\n     * so this.el and this.parent might not be available in `install`.\n     * This is the case with @uppy/react plugins, for example.\n     */\n\n\n    render() {\n      throw new Error('Extend the render method to add your plugin to a DOM element');\n    } // eslint-disable-next-line class-methods-use-this\n\n\n    update() {} // Called after every state update, after everything's mounted. Debounced.\n    // eslint-disable-next-line class-methods-use-this\n\n\n    afterUpdate() {}\n\n  };\n\n  function _classPrivateFieldLooseBase$5(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$5 = 0;\n\n  function _classPrivateFieldLooseKey$5(name) { return \"__private_\" + id$5++ + \"_\" + name; }\n\n  const {\n    render\n  } = preact;\n\n\n\n\n  /**\n   * Defer a frequent call to the microtask queue.\n   *\n   * @param {() => T} fn\n   * @returns {Promise<T>}\n   */\n\n\n  function debounce(fn) {\n    let calling = null;\n    let latestArgs = null;\n    return function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      latestArgs = args;\n\n      if (!calling) {\n        calling = Promise.resolve().then(() => {\n          calling = null; // At this point `args` may be different from the most\n          // recent state, if multiple calls happened since this task\n          // was queued. So we use the `latestArgs`, which definitely\n          // is the most recent call.\n\n          return fn(...latestArgs);\n        });\n      }\n\n      return calling;\n    };\n  }\n  /**\n   * UIPlugin is the extended version of BasePlugin to incorporate rendering with Preact.\n   * Use this for plugins that need a user interface.\n   *\n   * For plugins without an user interface, see BasePlugin.\n   */\n\n\n  var _updateUI = /*#__PURE__*/_classPrivateFieldLooseKey$5(\"updateUI\");\n\n  class UIPlugin extends BasePlugin_1$1 {\n    constructor() {\n      super(...arguments);\n      Object.defineProperty(this, _updateUI, {\n        writable: true,\n        value: void 0\n      });\n    }\n\n    /**\n     * Check if supplied `target` is a DOM element or an `object`.\n     * If it’s an object — target is a plugin, and we search `plugins`\n     * for a plugin with same name and return its target.\n     */\n    mount(target, plugin) {\n      const callerPluginName = plugin.id;\n      const targetElement = findDOMElement(target);\n\n      if (targetElement) {\n        this.isTargetDOMEl = true; // When target is <body> with a single <div> element,\n        // Preact thinks it’s the Uppy root element in there when doing a diff,\n        // and destroys it. So we are creating a fragment (could be empty div)\n\n        const uppyRootElement = document.createDocumentFragment(); // API for plugins that require a synchronous rerender.\n\n        _classPrivateFieldLooseBase$5(this, _updateUI)[_updateUI] = debounce(state => {\n          // plugin could be removed, but this.rerender is debounced below,\n          // so it could still be called even after uppy.removePlugin or uppy.close\n          // hence the check\n          if (!this.uppy.getPlugin(this.id)) return;\n          render(this.render(state), uppyRootElement);\n          this.afterUpdate();\n        });\n        this.uppy.log(`Installing ${callerPluginName} to a DOM element '${target}'`);\n\n        if (this.opts.replaceTargetContent) {\n          // Doing render(h(null), targetElement), which should have been\n          // a better way, since because the component might need to do additional cleanup when it is removed,\n          // stopped working — Preact just adds null into target, not replacing\n          targetElement.innerHTML = '';\n        }\n\n        render(this.render(this.uppy.getState()), uppyRootElement);\n        this.el = uppyRootElement.firstElementChild;\n        targetElement.appendChild(uppyRootElement);\n        this.onMount();\n        return this.el;\n      }\n\n      let targetPlugin;\n\n      if (typeof target === 'object' && target instanceof UIPlugin) {\n        // Targeting a plugin *instance*\n        targetPlugin = target;\n      } else if (typeof target === 'function') {\n        // Targeting a plugin type\n        const Target = target; // Find the target plugin instance.\n\n        this.uppy.iteratePlugins(p => {\n          if (p instanceof Target) {\n            targetPlugin = p;\n            return false;\n          }\n        });\n      }\n\n      if (targetPlugin) {\n        this.uppy.log(`Installing ${callerPluginName} to ${targetPlugin.id}`);\n        this.parent = targetPlugin;\n        this.el = targetPlugin.addTarget(plugin);\n        this.onMount();\n        return this.el;\n      }\n\n      this.uppy.log(`Not installing ${callerPluginName}`);\n      let message = `Invalid target option given to ${callerPluginName}.`;\n\n      if (typeof target === 'function') {\n        message += ' The given target is not a Plugin class. ' + 'Please check that you\\'re not specifying a React Component instead of a plugin. ' + 'If you are using @uppy/* packages directly, make sure you have only 1 version of @uppy/core installed: ' + 'run `npm ls @uppy/core` on the command line and verify that all the versions match and are deduped correctly.';\n      } else {\n        message += 'If you meant to target an HTML element, please make sure that the element exists. ' + 'Check that the <script> tag initializing Uppy is right before the closing </body> tag at the end of the page. ' + '(see https://github.com/transloadit/uppy/issues/1042)\\n\\n' + 'If you meant to target a plugin, please confirm that your `import` statements or `require` calls are correct.';\n      }\n\n      throw new Error(message);\n    }\n\n    update(state) {\n      if (this.el != null) {\n        var _classPrivateFieldLoo, _classPrivateFieldLoo2;\n\n        (_classPrivateFieldLoo = (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase$5(this, _updateUI))[_updateUI]) == null ? void 0 : _classPrivateFieldLoo.call(_classPrivateFieldLoo2, state);\n      }\n    }\n\n    unmount() {\n      if (this.isTargetDOMEl) {\n        var _this$el;\n\n        (_this$el = this.el) == null ? void 0 : _this$el.remove();\n      }\n\n      this.onUnmount();\n    } // eslint-disable-next-line class-methods-use-this\n\n\n    onMount() {} // eslint-disable-next-line class-methods-use-this\n\n\n    onUnmount() {}\n\n  }\n\n  var UIPlugin_1$1 = UIPlugin;\n\n  const {\n    debugLogger\n  } = loggers;\n\n  var lib$2 = Uppy_1$1;\n  var Uppy_1 = Uppy_1$1;\n  var UIPlugin_1 = UIPlugin_1$1;\n  var BasePlugin_1 = BasePlugin_1$1;\n  var debugLogger_1 = debugLogger;\n  lib$2.Uppy = Uppy_1;\n  lib$2.UIPlugin = UIPlugin_1;\n  lib$2.BasePlugin = BasePlugin_1;\n  lib$2.debugLogger = debugLogger_1;\n\n  class NetworkError extends Error {\n    constructor(error, xhr) {\n      if (xhr === void 0) {\n        xhr = null;\n      }\n\n      super(`This looks like a network error, the endpoint might be blocked by an internet provider or a firewall.`);\n      this.cause = error;\n      this.isNetworkError = true;\n      this.request = xhr;\n    }\n\n  }\n\n  var NetworkError_1 = NetworkError;\n\n  /**\n   * Wrapper around window.fetch that throws a NetworkError when appropriate\n   */\n\n\n  var fetchWithNetworkError = function fetchWithNetworkError() {\n    return fetch(...arguments).catch(err => {\n      if (err.name === 'AbortError') {\n        throw err;\n      } else {\n        throw new NetworkError_1(err);\n      }\n    });\n  };\n\n  class AuthError extends Error {\n    constructor() {\n      super('Authorization required');\n      this.name = 'AuthError';\n      this.isAuthError = true;\n    }\n\n  }\n\n  var AuthError_1 = AuthError;\n\n  var _class$1, _getPostResponseFunc, _getUrl, _errorHandler, _temp$1;\n\n  function _classPrivateFieldLooseBase$4(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$4 = 0;\n\n  function _classPrivateFieldLooseKey$4(name) { return \"__private_\" + id$4++ + \"_\" + name; }\n\n\n\n   // Remove the trailing slash so we can always safely append /xyz.\n\n\n  function stripSlash(url) {\n    return url.replace(/\\/$/, '');\n  }\n\n  async function handleJSONResponse(res) {\n    if (res.status === 401) {\n      throw new AuthError_1();\n    }\n\n    const jsonPromise = res.json();\n\n    if (res.status < 200 || res.status > 300) {\n      let errMsg = `Failed request with status: ${res.status}. ${res.statusText}`;\n\n      try {\n        const errData = await jsonPromise;\n        errMsg = errData.message ? `${errMsg} message: ${errData.message}` : errMsg;\n        errMsg = errData.requestId ? `${errMsg} request-Id: ${errData.requestId}` : errMsg;\n      } finally {\n        // eslint-disable-next-line no-unsafe-finally\n        throw new Error(errMsg);\n      }\n    }\n\n    return jsonPromise;\n  }\n\n  var RequestClient_1 = (_temp$1 = (_getPostResponseFunc = /*#__PURE__*/_classPrivateFieldLooseKey$4(\"getPostResponseFunc\"), _getUrl = /*#__PURE__*/_classPrivateFieldLooseKey$4(\"getUrl\"), _errorHandler = /*#__PURE__*/_classPrivateFieldLooseKey$4(\"errorHandler\"), _class$1 = class RequestClient {\n    // eslint-disable-next-line global-require\n    constructor(uppy, opts) {\n      Object.defineProperty(this, _errorHandler, {\n        value: _errorHandler2\n      });\n      Object.defineProperty(this, _getUrl, {\n        value: _getUrl2\n      });\n      Object.defineProperty(this, _getPostResponseFunc, {\n        writable: true,\n        value: skip => response => skip ? response : this.onReceiveResponse(response)\n      });\n      this.uppy = uppy;\n      this.opts = opts;\n      this.onReceiveResponse = this.onReceiveResponse.bind(this);\n      this.allowedHeaders = ['accept', 'content-type', 'uppy-auth-token'];\n      this.preflightDone = false;\n    }\n\n    get hostname() {\n      const {\n        companion\n      } = this.uppy.getState();\n      const host = this.opts.companionUrl;\n      return stripSlash(companion && companion[host] ? companion[host] : host);\n    }\n\n    headers() {\n      const userHeaders = this.opts.companionHeaders || {};\n      return Promise.resolve({ ...RequestClient.defaultHeaders,\n        ...userHeaders\n      });\n    }\n\n    onReceiveResponse(response) {\n      const state = this.uppy.getState();\n      const companion = state.companion || {};\n      const host = this.opts.companionUrl;\n      const {\n        headers\n      } = response; // Store the self-identified domain name for the Companion instance we just hit.\n\n      if (headers.has('i-am') && headers.get('i-am') !== companion[host]) {\n        this.uppy.setState({\n          companion: { ...companion,\n            [host]: headers.get('i-am')\n          }\n        });\n      }\n\n      return response;\n    }\n\n    preflight(path) {\n      if (this.preflightDone) {\n        return Promise.resolve(this.allowedHeaders.slice());\n      }\n\n      return fetch(_classPrivateFieldLooseBase$4(this, _getUrl)[_getUrl](path), {\n        method: 'OPTIONS'\n      }).then(response => {\n        if (response.headers.has('access-control-allow-headers')) {\n          this.allowedHeaders = response.headers.get('access-control-allow-headers').split(',').map(headerName => headerName.trim().toLowerCase());\n        }\n\n        this.preflightDone = true;\n        return this.allowedHeaders.slice();\n      }).catch(err => {\n        this.uppy.log(`[CompanionClient] unable to make preflight request ${err}`, 'warning');\n        this.preflightDone = true;\n        return this.allowedHeaders.slice();\n      });\n    }\n\n    preflightAndHeaders(path) {\n      return Promise.all([this.preflight(path), this.headers()]).then(_ref => {\n        let [allowedHeaders, headers] = _ref;\n        // filter to keep only allowed Headers\n        Object.keys(headers).forEach(header => {\n          if (!allowedHeaders.includes(header.toLowerCase())) {\n            this.uppy.log(`[CompanionClient] excluding disallowed header ${header}`);\n            delete headers[header]; // eslint-disable-line no-param-reassign\n          }\n        });\n        return headers;\n      });\n    }\n\n    get(path, skipPostResponse) {\n      const method = 'get';\n      return this.preflightAndHeaders(path).then(headers => fetchWithNetworkError(_classPrivateFieldLooseBase$4(this, _getUrl)[_getUrl](path), {\n        method,\n        headers,\n        credentials: this.opts.companionCookiesRule || 'same-origin'\n      })).then(_classPrivateFieldLooseBase$4(this, _getPostResponseFunc)[_getPostResponseFunc](skipPostResponse)).then(handleJSONResponse).catch(_classPrivateFieldLooseBase$4(this, _errorHandler)[_errorHandler](method, path));\n    }\n\n    post(path, data, skipPostResponse) {\n      const method = 'post';\n      return this.preflightAndHeaders(path).then(headers => fetchWithNetworkError(_classPrivateFieldLooseBase$4(this, _getUrl)[_getUrl](path), {\n        method,\n        headers,\n        credentials: this.opts.companionCookiesRule || 'same-origin',\n        body: JSON.stringify(data)\n      })).then(_classPrivateFieldLooseBase$4(this, _getPostResponseFunc)[_getPostResponseFunc](skipPostResponse)).then(handleJSONResponse).catch(_classPrivateFieldLooseBase$4(this, _errorHandler)[_errorHandler](method, path));\n    }\n\n    delete(path, data, skipPostResponse) {\n      const method = 'delete';\n      return this.preflightAndHeaders(path).then(headers => fetchWithNetworkError(`${this.hostname}/${path}`, {\n        method,\n        headers,\n        credentials: this.opts.companionCookiesRule || 'same-origin',\n        body: data ? JSON.stringify(data) : null\n      })).then(_classPrivateFieldLooseBase$4(this, _getPostResponseFunc)[_getPostResponseFunc](skipPostResponse)).then(handleJSONResponse).catch(_classPrivateFieldLooseBase$4(this, _errorHandler)[_errorHandler](method, path));\n    }\n\n  }), _class$1.VERSION = \"2.0.4\", _class$1.defaultHeaders = {\n    Accept: 'application/json',\n    'Content-Type': 'application/json',\n    'Uppy-Versions': `@uppy/companion-client=${_class$1.VERSION}`\n  }, _temp$1);\n\n  function _getUrl2(url) {\n    if (/^(https?:|)\\/\\//.test(url)) {\n      return url;\n    }\n\n    return `${this.hostname}/${url}`;\n  }\n\n  function _errorHandler2(method, path) {\n    return err => {\n      var _err;\n\n      if (!((_err = err) != null && _err.isAuthError)) {\n        const error = new Error(`Could not ${method} ${_classPrivateFieldLooseBase$4(this, _getUrl)[_getUrl](path)}`);\n        error.cause = err;\n        err = error; // eslint-disable-line no-param-reassign\n      }\n\n      return Promise.reject(err);\n    };\n  }\n\n  /**\n   * This module serves as an Async wrapper for LocalStorage\n   */\n\n  var setItem = (key, value) => {\n    return new Promise(resolve => {\n      localStorage.setItem(key, value);\n      resolve();\n    });\n  };\n\n  var getItem = key => {\n    return Promise.resolve(localStorage.getItem(key));\n  };\n\n  var removeItem = key => {\n    return new Promise(resolve => {\n      localStorage.removeItem(key);\n      resolve();\n    });\n  };\n\n  var tokenStorage = {\n  \tsetItem: setItem,\n  \tgetItem: getItem,\n  \tremoveItem: removeItem\n  };\n\n  const getName$1 = id => {\n    return id.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');\n  };\n\n  var Provider_1 = class Provider extends RequestClient_1 {\n    constructor(uppy, opts) {\n      super(uppy, opts);\n      this.provider = opts.provider;\n      this.id = this.provider;\n      this.name = this.opts.name || getName$1(this.id);\n      this.pluginId = this.opts.pluginId;\n      this.tokenKey = `companion-${this.pluginId}-auth-token`;\n      this.companionKeysParams = this.opts.companionKeysParams;\n      this.preAuthToken = null;\n    }\n\n    headers() {\n      return Promise.all([super.headers(), this.getAuthToken()]).then(_ref => {\n        let [headers, token] = _ref;\n        const authHeaders = {};\n\n        if (token) {\n          authHeaders['uppy-auth-token'] = token;\n        }\n\n        if (this.companionKeysParams) {\n          authHeaders['uppy-credentials-params'] = btoa(JSON.stringify({\n            params: this.companionKeysParams\n          }));\n        }\n\n        return { ...headers,\n          ...authHeaders\n        };\n      });\n    }\n\n    onReceiveResponse(response) {\n      response = super.onReceiveResponse(response);\n      const plugin = this.uppy.getPlugin(this.pluginId);\n      const oldAuthenticated = plugin.getPluginState().authenticated;\n      const authenticated = oldAuthenticated ? response.status !== 401 : response.status < 400;\n      plugin.setPluginState({\n        authenticated\n      });\n      return response;\n    }\n\n    setAuthToken(token) {\n      return this.uppy.getPlugin(this.pluginId).storage.setItem(this.tokenKey, token);\n    }\n\n    getAuthToken() {\n      return this.uppy.getPlugin(this.pluginId).storage.getItem(this.tokenKey);\n    }\n\n    authUrl(queries) {\n      if (queries === void 0) {\n        queries = {};\n      }\n\n      if (this.preAuthToken) {\n        queries.uppyPreAuthToken = this.preAuthToken;\n      }\n\n      return `${this.hostname}/${this.id}/connect?${new URLSearchParams(queries)}`;\n    }\n\n    fileUrl(id) {\n      return `${this.hostname}/${this.id}/get/${id}`;\n    }\n\n    fetchPreAuthToken() {\n      if (!this.companionKeysParams) {\n        return Promise.resolve();\n      }\n\n      return this.post(`${this.id}/preauth/`, {\n        params: this.companionKeysParams\n      }).then(res => {\n        this.preAuthToken = res.token;\n      }).catch(err => {\n        this.uppy.log(`[CompanionClient] unable to fetch preAuthToken ${err}`, 'warning');\n      });\n    }\n\n    list(directory) {\n      return this.get(`${this.id}/list/${directory || ''}`);\n    }\n\n    logout() {\n      return this.get(`${this.id}/logout`).then(response => Promise.all([response, this.uppy.getPlugin(this.pluginId).storage.removeItem(this.tokenKey)])).then(_ref2 => {\n        let [response] = _ref2;\n        return response;\n      });\n    }\n\n    static initPlugin(plugin, opts, defaultOpts) {\n      plugin.type = 'acquirer';\n      plugin.files = [];\n\n      if (defaultOpts) {\n        plugin.opts = { ...defaultOpts,\n          ...opts\n        };\n      }\n\n      if (opts.serverUrl || opts.serverPattern) {\n        throw new Error('`serverUrl` and `serverPattern` have been renamed to `companionUrl` and `companionAllowedHosts` respectively in the 0.30.5 release. Please consult the docs (for example, https://uppy.io/docs/instagram/ for the Instagram plugin) and use the updated options.`');\n      }\n\n      if (opts.companionAllowedHosts) {\n        const pattern = opts.companionAllowedHosts; // validate companionAllowedHosts param\n\n        if (typeof pattern !== 'string' && !Array.isArray(pattern) && !(pattern instanceof RegExp)) {\n          throw new TypeError(`${plugin.id}: the option \"companionAllowedHosts\" must be one of string, Array, RegExp`);\n        }\n\n        plugin.opts.companionAllowedHosts = pattern;\n      } else if (/^(?!https?:\\/\\/).*$/i.test(opts.companionUrl)) {\n        // does not start with https://\n        plugin.opts.companionAllowedHosts = `https://${opts.companionUrl.replace(/^\\/\\//, '')}`;\n      } else {\n        plugin.opts.companionAllowedHosts = new URL(opts.companionUrl).origin;\n      }\n\n      plugin.storage = plugin.opts.storage || tokenStorage;\n    }\n\n  };\n\n  const getName = id => {\n    return id.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');\n  };\n\n  var SearchProvider_1 = class SearchProvider extends RequestClient_1 {\n    constructor(uppy, opts) {\n      super(uppy, opts);\n      this.provider = opts.provider;\n      this.id = this.provider;\n      this.name = this.opts.name || getName(this.id);\n      this.pluginId = this.opts.pluginId;\n    }\n\n    fileUrl(id) {\n      return `${this.hostname}/search/${this.id}/get/${id}`;\n    }\n\n    search(text, queries) {\n      queries = queries ? `&${queries}` : '';\n      return this.get(`search/${this.id}/list?q=${encodeURIComponent(text)}${queries}`);\n    }\n\n  };\n\n  var _queued, _emitter$1, _isOpen, _socket, _handleMessage;\n\n  let _Symbol$for, _Symbol$for2;\n\n  function _classPrivateFieldLooseBase$3(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$3 = 0;\n\n  function _classPrivateFieldLooseKey$3(name) { return \"__private_\" + id$3++ + \"_\" + name; }\n\n\n\n  var Socket$1 = (_queued = /*#__PURE__*/_classPrivateFieldLooseKey$3(\"queued\"), _emitter$1 = /*#__PURE__*/_classPrivateFieldLooseKey$3(\"emitter\"), _isOpen = /*#__PURE__*/_classPrivateFieldLooseKey$3(\"isOpen\"), _socket = /*#__PURE__*/_classPrivateFieldLooseKey$3(\"socket\"), _handleMessage = /*#__PURE__*/_classPrivateFieldLooseKey$3(\"handleMessage\"), _Symbol$for = Symbol.for('uppy test: getSocket'), _Symbol$for2 = Symbol.for('uppy test: getQueued'), class UppySocket {\n    constructor(opts) {\n      Object.defineProperty(this, _queued, {\n        writable: true,\n        value: []\n      });\n      Object.defineProperty(this, _emitter$1, {\n        writable: true,\n        value: namespaceEmitter()\n      });\n      Object.defineProperty(this, _isOpen, {\n        writable: true,\n        value: false\n      });\n      Object.defineProperty(this, _socket, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _handleMessage, {\n        writable: true,\n        value: e => {\n          try {\n            const message = JSON.parse(e.data);\n            this.emit(message.action, message.payload);\n          } catch (err) {\n            // TODO: use a more robust error handler.\n            console.log(err); // eslint-disable-line no-console\n          }\n        }\n      });\n      this.opts = opts;\n\n      if (!opts || opts.autoOpen !== false) {\n        this.open();\n      }\n    }\n\n    get isOpen() {\n      return _classPrivateFieldLooseBase$3(this, _isOpen)[_isOpen];\n    }\n\n    [_Symbol$for]() {\n      return _classPrivateFieldLooseBase$3(this, _socket)[_socket];\n    }\n\n    [_Symbol$for2]() {\n      return _classPrivateFieldLooseBase$3(this, _queued)[_queued];\n    }\n\n    open() {\n      _classPrivateFieldLooseBase$3(this, _socket)[_socket] = new WebSocket(this.opts.target);\n\n      _classPrivateFieldLooseBase$3(this, _socket)[_socket].onopen = () => {\n        _classPrivateFieldLooseBase$3(this, _isOpen)[_isOpen] = true;\n\n        while (_classPrivateFieldLooseBase$3(this, _queued)[_queued].length > 0 && _classPrivateFieldLooseBase$3(this, _isOpen)[_isOpen]) {\n          const first = _classPrivateFieldLooseBase$3(this, _queued)[_queued].shift();\n\n          this.send(first.action, first.payload);\n        }\n      };\n\n      _classPrivateFieldLooseBase$3(this, _socket)[_socket].onclose = () => {\n        _classPrivateFieldLooseBase$3(this, _isOpen)[_isOpen] = false;\n      };\n\n      _classPrivateFieldLooseBase$3(this, _socket)[_socket].onmessage = _classPrivateFieldLooseBase$3(this, _handleMessage)[_handleMessage];\n    }\n\n    close() {\n      var _classPrivateFieldLoo;\n\n      (_classPrivateFieldLoo = _classPrivateFieldLooseBase$3(this, _socket)[_socket]) == null ? void 0 : _classPrivateFieldLoo.close();\n    }\n\n    send(action, payload) {\n      // attach uuid\n      if (!_classPrivateFieldLooseBase$3(this, _isOpen)[_isOpen]) {\n        _classPrivateFieldLooseBase$3(this, _queued)[_queued].push({\n          action,\n          payload\n        });\n\n        return;\n      }\n\n      _classPrivateFieldLooseBase$3(this, _socket)[_socket].send(JSON.stringify({\n        action,\n        payload\n      }));\n    }\n\n    on(action, handler) {\n      _classPrivateFieldLooseBase$3(this, _emitter$1)[_emitter$1].on(action, handler);\n    }\n\n    emit(action, payload) {\n      _classPrivateFieldLooseBase$3(this, _emitter$1)[_emitter$1].emit(action, payload);\n    }\n\n    once(action, handler) {\n      _classPrivateFieldLooseBase$3(this, _emitter$1)[_emitter$1].once(action, handler);\n    }\n\n  });\n\n  /**\n   * Manages communications with Companion\n   */\n\n\n\n\n\n\n\n\n\n  var lib$1 = {\n    RequestClient: RequestClient_1,\n    Provider: Provider_1,\n    SearchProvider: SearchProvider_1,\n    Socket: Socket$1\n  };\n\n  function emitSocketProgress(uploader, progressData, file) {\n    const {\n      progress,\n      bytesUploaded,\n      bytesTotal\n    } = progressData;\n\n    if (progress) {\n      uploader.uppy.log(`Upload progress: ${progress}`);\n      uploader.uppy.emit('upload-progress', file, {\n        uploader,\n        bytesUploaded,\n        bytesTotal\n      });\n    }\n  }\n\n  var emitSocketProgress_1 = lodash_throttle(emitSocketProgress, 300, {\n    leading: true,\n    trailing: true\n  });\n\n  var getSocketHost = function getSocketHost(url) {\n    // get the host domain\n    const regex = /^(?:https?:\\/\\/|\\/\\/)?(?:[^@\\n]+@)?(?:www\\.)?([^\\n]+)/i;\n    const host = regex.exec(url)[1];\n    const socketProtocol = /^http:\\/\\//i.test(url) ? 'ws' : 'wss';\n    return `${socketProtocol}://${host}`;\n  };\n\n  var settle = function settle(promises) {\n    const resolutions = [];\n    const rejections = [];\n\n    function resolved(value) {\n      resolutions.push(value);\n    }\n\n    function rejected(error) {\n      rejections.push(error);\n    }\n\n    const wait = Promise.all(promises.map(promise => promise.then(resolved, rejected)));\n    return wait.then(() => {\n      return {\n        successful: resolutions,\n        failed: rejections\n      };\n    });\n  };\n\n  var _emitter, _events;\n\n  function _classPrivateFieldLooseBase$2(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$2 = 0;\n\n  function _classPrivateFieldLooseKey$2(name) { return \"__private_\" + id$2++ + \"_\" + name; }\n\n  /**\n   * Create a wrapper around an event emitter with a `remove` method to remove\n   * all events that were added using the wrapped emitter.\n   */\n  var EventTracker_1 = (_emitter = /*#__PURE__*/_classPrivateFieldLooseKey$2(\"emitter\"), _events = /*#__PURE__*/_classPrivateFieldLooseKey$2(\"events\"), class EventTracker {\n    constructor(emitter) {\n      Object.defineProperty(this, _emitter, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _events, {\n        writable: true,\n        value: []\n      });\n      _classPrivateFieldLooseBase$2(this, _emitter)[_emitter] = emitter;\n    }\n\n    on(event, fn) {\n      _classPrivateFieldLooseBase$2(this, _events)[_events].push([event, fn]);\n\n      return _classPrivateFieldLooseBase$2(this, _emitter)[_emitter].on(event, fn);\n    }\n\n    remove() {\n      for (const [event, fn] of _classPrivateFieldLooseBase$2(this, _events)[_events].splice(0)) {\n        _classPrivateFieldLooseBase$2(this, _emitter)[_emitter].off(event, fn);\n      }\n    }\n\n  });\n\n  function _classPrivateFieldLooseBase$1(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id$1 = 0;\n\n  function _classPrivateFieldLooseKey$1(name) { return \"__private_\" + id$1++ + \"_\" + name; }\n\n  var _aliveTimer = /*#__PURE__*/_classPrivateFieldLooseKey$1(\"aliveTimer\");\n\n  var _isDone = /*#__PURE__*/_classPrivateFieldLooseKey$1(\"isDone\");\n\n  var _onTimedOut = /*#__PURE__*/_classPrivateFieldLooseKey$1(\"onTimedOut\");\n\n  var _timeout = /*#__PURE__*/_classPrivateFieldLooseKey$1(\"timeout\");\n\n  /**\n   * Helper to abort upload requests if there has not been any progress for `timeout` ms.\n   * Create an instance using `timer = new ProgressTimeout(10000, onTimeout)`\n   * Call `timer.progress()` to signal that there has been progress of any kind.\n   * Call `timer.done()` when the upload has completed.\n   */\n  class ProgressTimeout {\n    constructor(timeout, timeoutHandler) {\n      Object.defineProperty(this, _aliveTimer, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _isDone, {\n        writable: true,\n        value: false\n      });\n      Object.defineProperty(this, _onTimedOut, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _timeout, {\n        writable: true,\n        value: void 0\n      });\n      _classPrivateFieldLooseBase$1(this, _timeout)[_timeout] = timeout;\n      _classPrivateFieldLooseBase$1(this, _onTimedOut)[_onTimedOut] = timeoutHandler;\n    }\n\n    progress() {\n      // Some browsers fire another progress event when the upload is\n      // cancelled, so we have to ignore progress after the timer was\n      // told to stop.\n      if (_classPrivateFieldLooseBase$1(this, _isDone)[_isDone]) return;\n\n      if (_classPrivateFieldLooseBase$1(this, _timeout)[_timeout] > 0) {\n        clearTimeout(_classPrivateFieldLooseBase$1(this, _aliveTimer)[_aliveTimer]);\n        _classPrivateFieldLooseBase$1(this, _aliveTimer)[_aliveTimer] = setTimeout(_classPrivateFieldLooseBase$1(this, _onTimedOut)[_onTimedOut], _classPrivateFieldLooseBase$1(this, _timeout)[_timeout]);\n      }\n    }\n\n    done() {\n      if (!_classPrivateFieldLooseBase$1(this, _isDone)[_isDone]) {\n        clearTimeout(_classPrivateFieldLooseBase$1(this, _aliveTimer)[_aliveTimer]);\n        _classPrivateFieldLooseBase$1(this, _aliveTimer)[_aliveTimer] = null;\n        _classPrivateFieldLooseBase$1(this, _isDone)[_isDone] = true;\n      }\n    }\n\n  }\n\n  var ProgressTimeout_1 = ProgressTimeout;\n\n  function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n\n  var id = 0;\n\n  function _classPrivateFieldLooseKey(name) { return \"__private_\" + id++ + \"_\" + name; }\n\n  function createCancelError() {\n    return new Error('Cancelled');\n  }\n\n  var _activeRequests = /*#__PURE__*/_classPrivateFieldLooseKey(\"activeRequests\");\n\n  var _queuedHandlers = /*#__PURE__*/_classPrivateFieldLooseKey(\"queuedHandlers\");\n\n  var _call = /*#__PURE__*/_classPrivateFieldLooseKey(\"call\");\n\n  var _queueNext = /*#__PURE__*/_classPrivateFieldLooseKey(\"queueNext\");\n\n  var _next = /*#__PURE__*/_classPrivateFieldLooseKey(\"next\");\n\n  var _queue = /*#__PURE__*/_classPrivateFieldLooseKey(\"queue\");\n\n  var _dequeue = /*#__PURE__*/_classPrivateFieldLooseKey(\"dequeue\");\n\n  class RateLimitedQueue$1 {\n    constructor(limit) {\n      Object.defineProperty(this, _dequeue, {\n        value: _dequeue2\n      });\n      Object.defineProperty(this, _queue, {\n        value: _queue2\n      });\n      Object.defineProperty(this, _next, {\n        value: _next2\n      });\n      Object.defineProperty(this, _queueNext, {\n        value: _queueNext2\n      });\n      Object.defineProperty(this, _call, {\n        value: _call2\n      });\n      Object.defineProperty(this, _activeRequests, {\n        writable: true,\n        value: 0\n      });\n      Object.defineProperty(this, _queuedHandlers, {\n        writable: true,\n        value: []\n      });\n\n      if (typeof limit !== 'number' || limit === 0) {\n        this.limit = Infinity;\n      } else {\n        this.limit = limit;\n      }\n    }\n\n    run(fn, queueOptions) {\n      if (_classPrivateFieldLooseBase(this, _activeRequests)[_activeRequests] < this.limit) {\n        return _classPrivateFieldLooseBase(this, _call)[_call](fn);\n      }\n\n      return _classPrivateFieldLooseBase(this, _queue)[_queue](fn, queueOptions);\n    }\n\n    wrapPromiseFunction(fn, queueOptions) {\n      var _this = this;\n\n      return function () {\n        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key];\n        }\n\n        let queuedRequest;\n        const outerPromise = new Promise((resolve, reject) => {\n          queuedRequest = _this.run(() => {\n            let cancelError;\n            let innerPromise;\n\n            try {\n              innerPromise = Promise.resolve(fn(...args));\n            } catch (err) {\n              innerPromise = Promise.reject(err);\n            }\n\n            innerPromise.then(result => {\n              if (cancelError) {\n                reject(cancelError);\n              } else {\n                queuedRequest.done();\n                resolve(result);\n              }\n            }, err => {\n              if (cancelError) {\n                reject(cancelError);\n              } else {\n                queuedRequest.done();\n                reject(err);\n              }\n            });\n            return () => {\n              cancelError = createCancelError();\n            };\n          }, queueOptions);\n        });\n\n        outerPromise.abort = () => {\n          queuedRequest.abort();\n        };\n\n        return outerPromise;\n      };\n    }\n\n  }\n\n  function _call2(fn) {\n    _classPrivateFieldLooseBase(this, _activeRequests)[_activeRequests] += 1;\n    let done = false;\n    let cancelActive;\n\n    try {\n      cancelActive = fn();\n    } catch (err) {\n      _classPrivateFieldLooseBase(this, _activeRequests)[_activeRequests] -= 1;\n      throw err;\n    }\n\n    return {\n      abort: () => {\n        if (done) return;\n        done = true;\n        _classPrivateFieldLooseBase(this, _activeRequests)[_activeRequests] -= 1;\n        cancelActive();\n\n        _classPrivateFieldLooseBase(this, _queueNext)[_queueNext]();\n      },\n      done: () => {\n        if (done) return;\n        done = true;\n        _classPrivateFieldLooseBase(this, _activeRequests)[_activeRequests] -= 1;\n\n        _classPrivateFieldLooseBase(this, _queueNext)[_queueNext]();\n      }\n    };\n  }\n\n  function _queueNext2() {\n    // Do it soon but not immediately, this allows clearing out the entire queue synchronously\n    // one by one without continuously _advancing_ it (and starting new tasks before immediately\n    // aborting them)\n    queueMicrotask(() => _classPrivateFieldLooseBase(this, _next)[_next]());\n  }\n\n  function _next2() {\n    if (_classPrivateFieldLooseBase(this, _activeRequests)[_activeRequests] >= this.limit) {\n      return;\n    }\n\n    if (_classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].length === 0) {\n      return;\n    } // Dispatch the next request, and update the abort/done handlers\n    // so that cancelling it does the Right Thing (and doesn't just try\n    // to dequeue an already-running request).\n\n\n    const next = _classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].shift();\n\n    const handler = _classPrivateFieldLooseBase(this, _call)[_call](next.fn);\n\n    next.abort = handler.abort;\n    next.done = handler.done;\n  }\n\n  function _queue2(fn, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    const handler = {\n      fn,\n      priority: options.priority || 0,\n      abort: () => {\n        _classPrivateFieldLooseBase(this, _dequeue)[_dequeue](handler);\n      },\n      done: () => {\n        throw new Error('Cannot mark a queued request as done: this indicates a bug');\n      }\n    };\n\n    const index = _classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].findIndex(other => {\n      return handler.priority > other.priority;\n    });\n\n    if (index === -1) {\n      _classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].push(handler);\n    } else {\n      _classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].splice(index, 0, handler);\n    }\n\n    return handler;\n  }\n\n  function _dequeue2(handler) {\n    const index = _classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].indexOf(handler);\n\n    if (index !== -1) {\n      _classPrivateFieldLooseBase(this, _queuedHandlers)[_queuedHandlers].splice(index, 1);\n    }\n  }\n\n  var RateLimitedQueue_1 = {\n    RateLimitedQueue: RateLimitedQueue$1,\n    internalRateLimitedQueue: Symbol('__queue')\n  };\n\n  function isNetworkError(xhr) {\n    if (!xhr) {\n      return false;\n    }\n\n    return xhr.readyState !== 0 && xhr.readyState !== 4 || xhr.status === 0;\n  }\n\n  var isNetworkError_1 = isNetworkError;\n\n  var locale = {\n    strings: {\n      // Shown in the Informer if an upload is being canceled because it stalled for too long.\n      timedOut: 'Upload stalled for %{seconds} seconds, aborting.'\n    }\n  };\n\n  var _class, _temp;\n\n\n\n  const {\n    nanoid\n  } = require$$4;\n\n  const {\n    Provider,\n    RequestClient,\n    Socket\n  } = lib$1;\n\n\n\n\n\n\n\n\n\n\n\n  const {\n    RateLimitedQueue,\n    internalRateLimitedQueue\n  } = RateLimitedQueue_1;\n\n\n\n\n\n\n\n  function buildResponseError(xhr, err) {\n    let error = err; // No error message\n\n    if (!error) error = new Error('Upload error'); // Got an error message string\n\n    if (typeof error === 'string') error = new Error(error); // Got something else\n\n    if (!(error instanceof Error)) {\n      error = Object.assign(new Error('Upload error'), {\n        data: error\n      });\n    }\n\n    if (isNetworkError_1(xhr)) {\n      error = new NetworkError_1(error, xhr);\n      return error;\n    }\n\n    error.request = xhr;\n    return error;\n  }\n  /**\n   * Set `data.type` in the blob to `file.meta.type`,\n   * because we might have detected a more accurate file type in Uppy\n   * https://stackoverflow.com/a/50875615\n   *\n   * @param {object} file File object with `data`, `size` and `meta` properties\n   * @returns {object} blob updated with the new `type` set from `file.meta.type`\n   */\n\n\n  function setTypeInBlob(file) {\n    const dataWithUpdatedType = file.data.slice(0, file.data.size, file.meta.type);\n    return dataWithUpdatedType;\n  }\n\n  var lib = (_temp = _class = class XHRUpload extends BasePlugin_1$1 {\n    // eslint-disable-next-line global-require\n    constructor(uppy, opts) {\n      super(uppy, opts);\n      this.type = 'uploader';\n      this.id = this.opts.id || 'XHRUpload';\n      this.title = 'XHRUpload';\n      this.defaultLocale = locale; // Default options\n\n      const defaultOptions = {\n        formData: true,\n        fieldName: opts.bundle ? 'files[]' : 'file',\n        method: 'post',\n        metaFields: null,\n        responseUrlFieldName: 'url',\n        bundle: false,\n        headers: {},\n        timeout: 30 * 1000,\n        limit: 5,\n        withCredentials: false,\n        responseType: '',\n\n        /**\n         * @typedef respObj\n         * @property {string} responseText\n         * @property {number} status\n         * @property {string} statusText\n         * @property {object.<string, string>} headers\n         *\n         * @param {string} responseText the response body string\n         * @param {XMLHttpRequest | respObj} response the response object (XHR or similar)\n         */\n        getResponseData(responseText) {\n          let parsedResponse = {};\n\n          try {\n            parsedResponse = JSON.parse(responseText);\n          } catch (err) {\n            uppy.log(err);\n          }\n\n          return parsedResponse;\n        },\n\n        /**\n         *\n         * @param {string} responseText the response body string\n         * @param {XMLHttpRequest | respObj} response the response object (XHR or similar)\n         */\n        getResponseError(_, response) {\n          let error = new Error('Upload error');\n\n          if (isNetworkError_1(response)) {\n            error = new NetworkError_1(error, response);\n          }\n\n          return error;\n        },\n\n        /**\n         * Check if the response from the upload endpoint indicates that the upload was successful.\n         *\n         * @param {number} status the response status code\n         */\n        validateStatus(status) {\n          return status >= 200 && status < 300;\n        }\n\n      };\n      this.opts = { ...defaultOptions,\n        ...opts\n      };\n      this.i18nInit();\n      this.handleUpload = this.handleUpload.bind(this); // Simultaneous upload limiting is shared across all uploads with this plugin.\n\n      if (internalRateLimitedQueue in this.opts) {\n        this.requests = this.opts[internalRateLimitedQueue];\n      } else {\n        this.requests = new RateLimitedQueue(this.opts.limit);\n      }\n\n      if (this.opts.bundle && !this.opts.formData) {\n        throw new Error('`opts.formData` must be true when `opts.bundle` is enabled.');\n      }\n\n      this.uploaderEvents = Object.create(null);\n    }\n\n    getOptions(file) {\n      const overrides = this.uppy.getState().xhrUpload;\n      const {\n        headers\n      } = this.opts;\n      const opts = { ...this.opts,\n        ...(overrides || {}),\n        ...(file.xhrUpload || {}),\n        headers: {}\n      }; // Support for `headers` as a function, only in the XHRUpload settings.\n      // Options set by other plugins in Uppy state or on the files themselves are still merged in afterward.\n      //\n      // ```js\n      // headers: (file) => ({ expires: file.meta.expires })\n      // ```\n\n      if (typeof headers === 'function') {\n        opts.headers = headers(file);\n      } else {\n        Object.assign(opts.headers, this.opts.headers);\n      }\n\n      if (overrides) {\n        Object.assign(opts.headers, overrides.headers);\n      }\n\n      if (file.xhrUpload) {\n        Object.assign(opts.headers, file.xhrUpload.headers);\n      }\n\n      return opts;\n    } // eslint-disable-next-line class-methods-use-this\n\n\n    addMetadata(formData, meta, opts) {\n      const metaFields = Array.isArray(opts.metaFields) ? opts.metaFields : Object.keys(meta); // Send along all fields by default.\n\n      metaFields.forEach(item => {\n        formData.append(item, meta[item]);\n      });\n    }\n\n    createFormDataUpload(file, opts) {\n      const formPost = new FormData();\n      this.addMetadata(formPost, file.meta, opts);\n      const dataWithUpdatedType = setTypeInBlob(file);\n\n      if (file.name) {\n        formPost.append(opts.fieldName, dataWithUpdatedType, file.meta.name);\n      } else {\n        formPost.append(opts.fieldName, dataWithUpdatedType);\n      }\n\n      return formPost;\n    }\n\n    createBundledUpload(files, opts) {\n      const formPost = new FormData();\n      const {\n        meta\n      } = this.uppy.getState();\n      this.addMetadata(formPost, meta, opts);\n      files.forEach(file => {\n        const options = this.getOptions(file);\n        const dataWithUpdatedType = setTypeInBlob(file);\n\n        if (file.name) {\n          formPost.append(options.fieldName, dataWithUpdatedType, file.name);\n        } else {\n          formPost.append(options.fieldName, dataWithUpdatedType);\n        }\n      });\n      return formPost;\n    }\n\n    upload(file, current, total) {\n      const opts = this.getOptions(file);\n      this.uppy.log(`uploading ${current} of ${total}`);\n      return new Promise((resolve, reject) => {\n        this.uppy.emit('upload-started', file);\n        const data = opts.formData ? this.createFormDataUpload(file, opts) : file.data;\n        const xhr = new XMLHttpRequest();\n        this.uploaderEvents[file.id] = new EventTracker_1(this.uppy);\n        const timer = new ProgressTimeout_1(opts.timeout, () => {\n          xhr.abort();\n          queuedRequest.done();\n          const error = new Error(this.i18n('timedOut', {\n            seconds: Math.ceil(opts.timeout / 1000)\n          }));\n          this.uppy.emit('upload-error', file, error);\n          reject(error);\n        });\n        const id = nanoid();\n        xhr.upload.addEventListener('loadstart', () => {\n          this.uppy.log(`[XHRUpload] ${id} started`);\n        });\n        xhr.upload.addEventListener('progress', ev => {\n          this.uppy.log(`[XHRUpload] ${id} progress: ${ev.loaded} / ${ev.total}`); // Begin checking for timeouts when progress starts, instead of loading,\n          // to avoid timing out requests on browser concurrency queue\n\n          timer.progress();\n\n          if (ev.lengthComputable) {\n            this.uppy.emit('upload-progress', file, {\n              uploader: this,\n              bytesUploaded: ev.loaded,\n              bytesTotal: ev.total\n            });\n          }\n        });\n        xhr.addEventListener('load', ev => {\n          this.uppy.log(`[XHRUpload] ${id} finished`);\n          timer.done();\n          queuedRequest.done();\n\n          if (this.uploaderEvents[file.id]) {\n            this.uploaderEvents[file.id].remove();\n            this.uploaderEvents[file.id] = null;\n          }\n\n          if (opts.validateStatus(ev.target.status, xhr.responseText, xhr)) {\n            const body = opts.getResponseData(xhr.responseText, xhr);\n            const uploadURL = body[opts.responseUrlFieldName];\n            const uploadResp = {\n              status: ev.target.status,\n              body,\n              uploadURL\n            };\n            this.uppy.emit('upload-success', file, uploadResp);\n\n            if (uploadURL) {\n              this.uppy.log(`Download ${file.name} from ${uploadURL}`);\n            }\n\n            return resolve(file);\n          }\n\n          const body = opts.getResponseData(xhr.responseText, xhr);\n          const error = buildResponseError(xhr, opts.getResponseError(xhr.responseText, xhr));\n          const response = {\n            status: ev.target.status,\n            body\n          };\n          this.uppy.emit('upload-error', file, error, response);\n          return reject(error);\n        });\n        xhr.addEventListener('error', () => {\n          this.uppy.log(`[XHRUpload] ${id} errored`);\n          timer.done();\n          queuedRequest.done();\n\n          if (this.uploaderEvents[file.id]) {\n            this.uploaderEvents[file.id].remove();\n            this.uploaderEvents[file.id] = null;\n          }\n\n          const error = buildResponseError(xhr, opts.getResponseError(xhr.responseText, xhr));\n          this.uppy.emit('upload-error', file, error);\n          return reject(error);\n        });\n        xhr.open(opts.method.toUpperCase(), opts.endpoint, true); // IE10 does not allow setting `withCredentials` and `responseType`\n        // before `open()` is called.\n\n        xhr.withCredentials = opts.withCredentials;\n\n        if (opts.responseType !== '') {\n          xhr.responseType = opts.responseType;\n        }\n\n        const queuedRequest = this.requests.run(() => {\n          this.uppy.emit('upload-started', file); // When using an authentication system like JWT, the bearer token goes as a header. This\n          // header needs to be fresh each time the token is refreshed so computing and setting the\n          // headers just before the upload starts enables this kind of authentication to work properly.\n          // Otherwise, half-way through the list of uploads the token could be stale and the upload would fail.\n\n          const currentOpts = this.getOptions(file);\n          Object.keys(currentOpts.headers).forEach(header => {\n            xhr.setRequestHeader(header, currentOpts.headers[header]);\n          });\n          xhr.send(data);\n          return () => {\n            timer.done();\n            xhr.abort();\n          };\n        });\n        this.onFileRemove(file.id, () => {\n          queuedRequest.abort();\n          reject(new Error('File removed'));\n        });\n        this.onCancelAll(file.id, () => {\n          queuedRequest.abort();\n          reject(new Error('Upload cancelled'));\n        });\n      });\n    }\n\n    uploadRemote(file) {\n      const opts = this.getOptions(file);\n      return new Promise((resolve, reject) => {\n        this.uppy.emit('upload-started', file);\n        const fields = {};\n        const metaFields = Array.isArray(opts.metaFields) ? opts.metaFields // Send along all fields by default.\n        : Object.keys(file.meta);\n        metaFields.forEach(name => {\n          fields[name] = file.meta[name];\n        });\n        const Client = file.remote.providerOptions.provider ? Provider : RequestClient;\n        const client = new Client(this.uppy, file.remote.providerOptions);\n        client.post(file.remote.url, { ...file.remote.body,\n          endpoint: opts.endpoint,\n          size: file.data.size,\n          fieldname: opts.fieldName,\n          metadata: fields,\n          httpMethod: opts.method,\n          useFormData: opts.formData,\n          headers: opts.headers\n        }).then(res => {\n          const {\n            token\n          } = res;\n          const host = getSocketHost(file.remote.companionUrl);\n          const socket = new Socket({\n            target: `${host}/api/${token}`,\n            autoOpen: false\n          });\n          this.uploaderEvents[file.id] = new EventTracker_1(this.uppy);\n          this.onFileRemove(file.id, () => {\n            socket.send('cancel', {});\n            queuedRequest.abort();\n            resolve(`upload ${file.id} was removed`);\n          });\n          this.onCancelAll(file.id, () => {\n            socket.send('cancel', {});\n            queuedRequest.abort();\n            resolve(`upload ${file.id} was canceled`);\n          });\n          this.onRetry(file.id, () => {\n            socket.send('pause', {});\n            socket.send('resume', {});\n          });\n          this.onRetryAll(file.id, () => {\n            socket.send('pause', {});\n            socket.send('resume', {});\n          });\n          socket.on('progress', progressData => emitSocketProgress_1(this, progressData, file));\n          socket.on('success', data => {\n            const body = opts.getResponseData(data.response.responseText, data.response);\n            const uploadURL = body[opts.responseUrlFieldName];\n            const uploadResp = {\n              status: data.response.status,\n              body,\n              uploadURL\n            };\n            this.uppy.emit('upload-success', file, uploadResp);\n            queuedRequest.done();\n\n            if (this.uploaderEvents[file.id]) {\n              this.uploaderEvents[file.id].remove();\n              this.uploaderEvents[file.id] = null;\n            }\n\n            return resolve();\n          });\n          socket.on('error', errData => {\n            const resp = errData.response;\n            const error = resp ? opts.getResponseError(resp.responseText, resp) : Object.assign(new Error(errData.error.message), {\n              cause: errData.error\n            });\n            this.uppy.emit('upload-error', file, error);\n            queuedRequest.done();\n\n            if (this.uploaderEvents[file.id]) {\n              this.uploaderEvents[file.id].remove();\n              this.uploaderEvents[file.id] = null;\n            }\n\n            reject(error);\n          });\n          const queuedRequest = this.requests.run(() => {\n            socket.open();\n\n            if (file.isPaused) {\n              socket.send('pause', {});\n            }\n\n            return () => socket.close();\n          });\n        }).catch(err => {\n          this.uppy.emit('upload-error', file, err);\n          reject(err);\n        });\n      });\n    }\n\n    uploadBundle(files) {\n      return new Promise((resolve, reject) => {\n        const {\n          endpoint\n        } = this.opts;\n        const {\n          method\n        } = this.opts;\n        const optsFromState = this.uppy.getState().xhrUpload;\n        const formData = this.createBundledUpload(files, { ...this.opts,\n          ...(optsFromState || {})\n        });\n        const xhr = new XMLHttpRequest();\n        const timer = new ProgressTimeout_1(this.opts.timeout, () => {\n          xhr.abort();\n          const error = new Error(this.i18n('timedOut', {\n            seconds: Math.ceil(this.opts.timeout / 1000)\n          }));\n          emitError(error);\n          reject(error);\n        });\n\n        const emitError = error => {\n          files.forEach(file => {\n            this.uppy.emit('upload-error', file, error);\n          });\n        };\n\n        xhr.upload.addEventListener('loadstart', () => {\n          this.uppy.log('[XHRUpload] started uploading bundle');\n          timer.progress();\n        });\n        xhr.upload.addEventListener('progress', ev => {\n          timer.progress();\n          if (!ev.lengthComputable) return;\n          files.forEach(file => {\n            this.uppy.emit('upload-progress', file, {\n              uploader: this,\n              bytesUploaded: ev.loaded / ev.total * file.size,\n              bytesTotal: file.size\n            });\n          });\n        });\n        xhr.addEventListener('load', ev => {\n          timer.done();\n\n          if (this.opts.validateStatus(ev.target.status, xhr.responseText, xhr)) {\n            const body = this.opts.getResponseData(xhr.responseText, xhr);\n            const uploadResp = {\n              status: ev.target.status,\n              body\n            };\n            files.forEach(file => {\n              this.uppy.emit('upload-success', file, uploadResp);\n            });\n            return resolve();\n          }\n\n          const error = this.opts.getResponseError(xhr.responseText, xhr) || new Error('Upload error');\n          error.request = xhr;\n          emitError(error);\n          return reject(error);\n        });\n        xhr.addEventListener('error', () => {\n          timer.done();\n          const error = this.opts.getResponseError(xhr.responseText, xhr) || new Error('Upload error');\n          emitError(error);\n          return reject(error);\n        });\n        this.uppy.on('cancel-all', () => {\n          timer.done();\n          xhr.abort();\n        });\n        xhr.open(method.toUpperCase(), endpoint, true); // IE10 does not allow setting `withCredentials` and `responseType`\n        // before `open()` is called.\n\n        xhr.withCredentials = this.opts.withCredentials;\n\n        if (this.opts.responseType !== '') {\n          xhr.responseType = this.opts.responseType;\n        }\n\n        Object.keys(this.opts.headers).forEach(header => {\n          xhr.setRequestHeader(header, this.opts.headers[header]);\n        });\n        xhr.send(formData);\n        files.forEach(file => {\n          this.uppy.emit('upload-started', file);\n        });\n      });\n    }\n\n    uploadFiles(files) {\n      const promises = files.map((file, i) => {\n        const current = parseInt(i, 10) + 1;\n        const total = files.length;\n\n        if (file.error) {\n          return Promise.reject(new Error(file.error));\n        }\n\n        if (file.isRemote) {\n          return this.uploadRemote(file, current, total);\n        }\n\n        return this.upload(file, current, total);\n      });\n      return settle(promises);\n    }\n\n    onFileRemove(fileID, cb) {\n      this.uploaderEvents[fileID].on('file-removed', file => {\n        if (fileID === file.id) cb(file.id);\n      });\n    }\n\n    onRetry(fileID, cb) {\n      this.uploaderEvents[fileID].on('upload-retry', targetFileID => {\n        if (fileID === targetFileID) {\n          cb();\n        }\n      });\n    }\n\n    onRetryAll(fileID, cb) {\n      this.uploaderEvents[fileID].on('retry-all', () => {\n        if (!this.uppy.getFile(fileID)) return;\n        cb();\n      });\n    }\n\n    onCancelAll(fileID, cb) {\n      this.uploaderEvents[fileID].on('cancel-all', () => {\n        if (!this.uppy.getFile(fileID)) return;\n        cb();\n      });\n    }\n\n    handleUpload(fileIDs) {\n      if (fileIDs.length === 0) {\n        this.uppy.log('[XHRUpload] No files to upload!');\n        return Promise.resolve();\n      } // No limit configured by the user, and no RateLimitedQueue passed in by a \"parent\" plugin\n      // (basically just AwsS3) using the internal symbol\n\n\n      if (this.opts.limit === 0 && !this.opts[internalRateLimitedQueue]) {\n        this.uppy.log('[XHRUpload] When uploading multiple files at once, consider setting the `limit` option (to `10` for example), to limit the number of concurrent uploads, which helps prevent memory and network issues: https://uppy.io/docs/xhr-upload/#limit-0', 'warning');\n      }\n\n      this.uppy.log('[XHRUpload] Uploading...');\n      const files = fileIDs.map(fileID => this.uppy.getFile(fileID));\n\n      if (this.opts.bundle) {\n        // if bundle: true, we don’t support remote uploads\n        const isSomeFileRemote = files.some(file => file.isRemote);\n\n        if (isSomeFileRemote) {\n          throw new Error('Can’t upload remote files when the `bundle: true` option is set');\n        }\n\n        if (typeof this.opts.headers === 'function') {\n          throw new TypeError('`headers` may not be a function when the `bundle: true` option is set');\n        }\n\n        return this.uploadBundle(files);\n      }\n\n      return this.uploadFiles(files).then(() => null);\n    }\n\n    install() {\n      if (this.opts.bundle) {\n        const {\n          capabilities\n        } = this.uppy.getState();\n        this.uppy.setState({\n          capabilities: { ...capabilities,\n            individualCancellation: false\n          }\n        });\n      }\n\n      this.uppy.addUploader(this.handleUpload);\n    }\n\n    uninstall() {\n      if (this.opts.bundle) {\n        const {\n          capabilities\n        } = this.uppy.getState();\n        this.uppy.setState({\n          capabilities: { ...capabilities,\n            individualCancellation: true\n          }\n        });\n      }\n\n      this.uppy.removeUploader(this.handleUpload);\n    }\n\n  }, _class.VERSION = \"2.0.6\", _temp);\n\n  var require$$2$1 = dist$7;\n\n  var require$$1 = dom7_cjs;\n\n  var require$$2 = snabbdom_cjs;\n\n  var dist$6 = createCommonjsModule$1(function (module, exports) {\n  !function(e,t){t(exports,require$$2$1,lodash_toarray,require$$1,lodash_foreach,require$$4,lodash_throttle,require$$2,lodash_camelcase,lib$4,lodash_debounce,lodash_clonedeep,lib$2,lib);}(commonjsGlobal,(function(e,t,n,r,o,i,a,s,l,u,c,f,d,p){function h(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var g=h(t),v=h(n),y=h(r),m=h(o),b=h(a),w=h(l),x=h(c),E=h(f),S=h(d),k=h(p),O=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function C(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}function T(e){var t={exports:{}};return e(t,t.exports),t.exports}var N,M,L=function(e){return e&&e.Math==Math&&e},P=L(\"object\"==typeof globalThis&&globalThis)||L(\"object\"==typeof window&&window)||L(\"object\"==typeof self&&self)||L(\"object\"==typeof O&&O)||function(){return this}()||Function(\"return this\")(),R=Object.defineProperty,D=function(e,t){try{R(P,e,{value:t,configurable:!0,writable:!0});}catch(n){P[e]=t;}return t},j=\"__core-js_shared__\",A=P[j]||D(j,{}),_=T((function(e){(e.exports=function(e,t){return A[e]||(A[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),F=Function.prototype,I=F.bind,B=F.call,$=I&&I.bind(B),W=I?function(e){return e&&$(B,e)}:function(e){return e&&function(){return B.apply(e,arguments)}},H=P.TypeError,V=function(e){if(null==e)throw H(\"Can't call method on \"+e);return e},z=P.Object,U=function(e){return z(V(e))},K=W({}.hasOwnProperty),q=Object.hasOwn||function(e,t){return K(U(e),t)},G=0,J=Math.random(),Y=W(1..toString),X=function(e){return \"Symbol(\"+(void 0===e?\"\":e)+\")_\"+Y(++G+J,36)},Q=function(e){return \"function\"==typeof e},Z=function(e){return Q(e)?e:void 0},ee=function(e,t){return arguments.length<2?Z(P[e]):P[e]&&P[e][t]},te=ee(\"navigator\",\"userAgent\")||\"\",ne=P.process,re=P.Deno,oe=ne&&ne.versions||re&&re.version,ie=oe&&oe.v8;ie&&(M=(N=ie.split(\".\"))[0]>0&&N[0]<4?1:+(N[0]+N[1])),!M&&te&&(!(N=te.match(/Edge\\/(\\d+)/))||N[1]>=74)&&(N=te.match(/Chrome\\/(\\d+)/))&&(M=+N[1]);var ae=M,se=function(e){try{return !!e()}catch(e){return !0}},le=!!Object.getOwnPropertySymbols&&!se((function(){var e=Symbol();return !String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&ae&&ae<41})),ue=le&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,ce=_(\"wks\"),fe=P.Symbol,de=fe&&fe.for,pe=ue?fe:fe&&fe.withoutSetter||X,he=function(e){if(!q(ce,e)||!le&&\"string\"!=typeof ce[e]){var t=\"Symbol.\"+e;le&&q(fe,e)?ce[e]=fe[e]:ce[e]=ue&&de?de(t):pe(t);}return ce[e]},ge={};ge[he(\"toStringTag\")]=\"z\";var ve=\"[object z]\"===String(ge),ye=!se((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),me=function(e){return \"object\"==typeof e?null!==e:Q(e)},be=P.document,we=me(be)&&me(be.createElement),xe=function(e){return we?be.createElement(e):{}},Ee=!ye&&!se((function(){return 7!=Object.defineProperty(xe(\"div\"),\"a\",{get:function(){return 7}}).a})),Se=P.String,ke=P.TypeError,Oe=function(e){if(me(e))return e;throw ke(Se(e)+\" is not an object\")},Ce=Function.prototype.call,Te=Ce.bind?Ce.bind(Ce):function(){return Ce.apply(Ce,arguments)},Ne=W({}.isPrototypeOf),Me=P.Object,Le=ue?function(e){return \"symbol\"==typeof e}:function(e){var t=ee(\"Symbol\");return Q(t)&&Ne(t.prototype,Me(e))},Pe=P.String,Re=function(e){try{return Pe(e)}catch(e){return \"Object\"}},De=P.TypeError,je=function(e){if(Q(e))return e;throw De(Re(e)+\" is not a function\")},Ae=function(e,t){var n=e[t];return null==n?void 0:je(n)},_e=P.TypeError,Fe=P.TypeError,Ie=he(\"toPrimitive\"),Be=function(e,t){if(!me(e)||Le(e))return e;var n,r=Ae(e,Ie);if(r){if(void 0===t&&(t=\"default\"),n=Te(r,e,t),!me(n)||Le(n))return n;throw Fe(\"Can't convert object to primitive value\")}return void 0===t&&(t=\"number\"),function(e,t){var n,r;if(\"string\"===t&&Q(n=e.toString)&&!me(r=Te(n,e)))return r;if(Q(n=e.valueOf)&&!me(r=Te(n,e)))return r;if(\"string\"!==t&&Q(n=e.toString)&&!me(r=Te(n,e)))return r;throw _e(\"Can't convert object to primitive value\")}(e,t)},$e=function(e){var t=Be(e,\"string\");return Le(t)?t:t+\"\"},We=P.TypeError,He=Object.defineProperty,Ve={f:ye?He:function(e,t,n){if(Oe(e),t=$e(t),Oe(n),Ee)try{return He(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw We(\"Accessors not supported\");return \"value\"in n&&(e[t]=n.value),e}},ze=function(e,t){return {enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Ue=ye?function(e,t,n){return Ve.f(e,t,ze(1,n))}:function(e,t,n){return e[t]=n,e},Ke=W(Function.toString);Q(A.inspectSource)||(A.inspectSource=function(e){return Ke(e)});var qe,Ge,Je,Ye=A.inspectSource,Xe=P.WeakMap,Qe=Q(Xe)&&/native code/.test(Ye(Xe)),Ze=_(\"keys\"),et=function(e){return Ze[e]||(Ze[e]=X(e))},tt={},nt=\"Object already initialized\",rt=P.TypeError,ot=P.WeakMap;if(Qe||A.state){var it=A.state||(A.state=new ot),at=W(it.get),st=W(it.has),lt=W(it.set);qe=function(e,t){if(st(it,e))throw new rt(nt);return t.facade=e,lt(it,e,t),t},Ge=function(e){return at(it,e)||{}},Je=function(e){return st(it,e)};}else {var ut=et(\"state\");tt[ut]=!0,qe=function(e,t){if(q(e,ut))throw new rt(nt);return t.facade=e,Ue(e,ut,t),t},Ge=function(e){return q(e,ut)?e[ut]:{}},Je=function(e){return q(e,ut)};}var ct={set:qe,get:Ge,has:Je,enforce:function(e){return Je(e)?Ge(e):qe(e,{})},getterFor:function(e){return function(t){var n;if(!me(t)||(n=Ge(t)).type!==e)throw rt(\"Incompatible receiver, \"+e+\" required\");return n}}},ft=Function.prototype,dt=ye&&Object.getOwnPropertyDescriptor,pt=q(ft,\"name\"),ht={EXISTS:pt,PROPER:pt&&\"something\"===function(){}.name,CONFIGURABLE:pt&&(!ye||ye&&dt(ft,\"name\").configurable)},gt=T((function(e){var t=ht.CONFIGURABLE,n=ct.get,r=ct.enforce,o=String(String).split(\"String\");(e.exports=function(e,n,i,a){var s,l=!!a&&!!a.unsafe,u=!!a&&!!a.enumerable,c=!!a&&!!a.noTargetGet,f=a&&void 0!==a.name?a.name:n;Q(i)&&(\"Symbol(\"===String(f).slice(0,7)&&(f=\"[\"+String(f).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!q(i,\"name\")||t&&i.name!==f)&&Ue(i,\"name\",f),(s=r(i)).source||(s.source=o.join(\"string\"==typeof f?f:\"\"))),e!==P?(l?!c&&e[n]&&(u=!0):delete e[n],u?e[n]=i:Ue(e,n,i)):u?e[n]=i:D(n,i);})(Function.prototype,\"toString\",(function(){return Q(this)&&n(this).source||Ye(this)}));})),vt=W({}.toString),yt=W(\"\".slice),mt=function(e){return yt(vt(e),8,-1)},bt=he(\"toStringTag\"),wt=P.Object,xt=\"Arguments\"==mt(function(){return arguments}()),Et=ve?mt:function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=wt(e),bt))?n:xt?mt(t):\"Object\"==(r=mt(t))&&Q(t.callee)?\"Arguments\":r},St=ve?{}.toString:function(){return \"[object \"+Et(this)+\"]\"};ve||gt(Object.prototype,\"toString\",St,{unsafe:!0});var kt={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Ot=xe(\"span\").classList,Ct=Ot&&Ot.constructor&&Ot.constructor.prototype,Tt=Ct===Object.prototype?void 0:Ct,Nt=W(W.bind),Mt=function(e,t){return je(e),void 0===t?e:Nt?Nt(e,t):function(){return e.apply(t,arguments)}},Lt=P.Object,Pt=W(\"\".split),Rt=se((function(){return !Lt(\"z\").propertyIsEnumerable(0)}))?function(e){return \"String\"==mt(e)?Pt(e,\"\"):Lt(e)}:Lt,Dt=Math.ceil,jt=Math.floor,At=function(e){var t=+e;return t!=t||0===t?0:(t>0?jt:Dt)(t)},_t=Math.min,Ft=function(e){return e>0?_t(At(e),9007199254740991):0},It=function(e){return Ft(e.length)},Bt=Array.isArray||function(e){return \"Array\"==mt(e)},$t=function(){},Wt=[],Ht=ee(\"Reflect\",\"construct\"),Vt=/^\\s*(?:class|function)\\b/,zt=W(Vt.exec),Ut=!Vt.exec($t),Kt=function(e){if(!Q(e))return !1;try{return Ht($t,Wt,e),!0}catch(e){return !1}},qt=!Ht||se((function(){var e;return Kt(Kt.call)||!Kt(Object)||!Kt((function(){e=!0;}))||e}))?function(e){if(!Q(e))return !1;switch(Et(e)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Ut||!!zt(Vt,Ye(e))}:Kt,Gt=he(\"species\"),Jt=P.Array,Yt=function(e,t){return new(function(e){var t;return Bt(e)&&(t=e.constructor,(qt(t)&&(t===Jt||Bt(t.prototype))||me(t)&&null===(t=t[Gt]))&&(t=void 0)),void 0===t?Jt:t}(e))(0===t?0:t)},Xt=W([].push),Qt=function(e){var t=1==e,n=2==e,r=3==e,o=4==e,i=6==e,a=7==e,s=5==e||i;return function(l,u,c,f){for(var d,p,h=U(l),g=Rt(h),v=Mt(u,c),y=It(g),m=0,b=f||Yt,w=t?b(l,y):n||a?b(l,0):void 0;y>m;m++)if((s||m in g)&&(p=v(d=g[m],m,h),e))if(t)w[m]=p;else if(p)switch(e){case 3:return !0;case 5:return d;case 6:return m;case 2:Xt(w,d);}else switch(e){case 4:return !1;case 7:Xt(w,d);}return i?-1:r||o?o:w}},Zt={forEach:Qt(0),map:Qt(1),filter:Qt(2),some:Qt(3),every:Qt(4),find:Qt(5),findIndex:Qt(6),filterReject:Qt(7)},en=function(e,t){var n=[][e];return !!n&&se((function(){n.call(null,t||function(){throw 1},1);}))},tn=Zt.forEach,nn=en(\"forEach\")?[].forEach:function(e){return tn(this,e,arguments.length>1?arguments[1]:void 0)},rn=function(e){if(e&&e.forEach!==nn)try{Ue(e,\"forEach\",nn);}catch(t){e.forEach=nn;}};for(var on in kt)kt[on]&&rn(P[on]&&P[on].prototype);rn(Tt);var an={}.propertyIsEnumerable,sn=Object.getOwnPropertyDescriptor,ln=sn&&!an.call({1:2},1)?function(e){var t=sn(this,e);return !!t&&t.enumerable}:an,un={f:ln},cn=function(e){return Rt(V(e))},fn=Object.getOwnPropertyDescriptor,dn={f:ye?fn:function(e,t){if(e=cn(e),t=$e(t),Ee)try{return fn(e,t)}catch(e){}if(q(e,t))return ze(!Te(un.f,e,t),e[t])}},pn=Math.max,hn=Math.min,gn=function(e,t){var n=At(e);return n<0?pn(n+t,0):hn(n,t)},vn=function(e){return function(t,n,r){var o,i=cn(t),a=It(i),s=gn(r,a);if(e&&n!=n){for(;a>s;)if((o=i[s++])!=o)return !0}else for(;a>s;s++)if((e||s in i)&&i[s]===n)return e||s||0;return !e&&-1}},yn={includes:vn(!0),indexOf:vn(!1)},mn=yn.indexOf,bn=W([].push),wn=function(e,t){var n,r=cn(e),o=0,i=[];for(n in r)!q(tt,n)&&q(r,n)&&bn(i,n);for(;t.length>o;)q(r,n=t[o++])&&(~mn(i,n)||bn(i,n));return i},xn=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],En=xn.concat(\"length\",\"prototype\"),Sn={f:Object.getOwnPropertyNames||function(e){return wn(e,En)}},kn={f:Object.getOwnPropertySymbols},On=W([].concat),Cn=ee(\"Reflect\",\"ownKeys\")||function(e){var t=Sn.f(Oe(e)),n=kn.f;return n?On(t,n(e)):t},Tn=function(e,t){for(var n=Cn(t),r=Ve.f,o=dn.f,i=0;i<n.length;i++){var a=n[i];q(e,a)||r(e,a,o(t,a));}},Nn=/#|\\.prototype\\./,Mn=function(e,t){var n=Pn[Ln(e)];return n==Dn||n!=Rn&&(Q(t)?se(t):!!t)},Ln=Mn.normalize=function(e){return String(e).replace(Nn,\".\").toLowerCase()},Pn=Mn.data={},Rn=Mn.NATIVE=\"N\",Dn=Mn.POLYFILL=\"P\",jn=Mn,An=dn.f,_n=function(e,t){var n,r,o,i,a,s=e.target,l=e.global,u=e.stat;if(n=l?P:u?P[s]||D(s,{}):(P[s]||{}).prototype)for(r in t){if(i=t[r],o=e.noTargetGet?(a=An(n,r))&&a.value:n[r],!jn(l?r:s+(u?\".\":\"#\")+r,e.forced)&&void 0!==o){if(typeof i==typeof o)continue;Tn(i,o);}(e.sham||o&&o.sham)&&Ue(i,\"sham\",!0),gt(n,r,i,e);}},Fn=Object.keys||function(e){return wn(e,xn)},In=se((function(){Fn(1);}));\n  /*!\n  \t * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n  \t *\n  \t * Copyright (c) 2014-2017, Jon Schlinkert.\n  \t * Released under the MIT License.\n  \t */\n  function Bn(e){return \"[object Object]\"===Object.prototype.toString.call(e)}_n({target:\"Object\",stat:!0,forced:In},{keys:function(e){return Fn(U(e))}});var $n=function(e){var t,n;return !1!==Bn(e)&&(void 0===(t=e.constructor)||!1!==Bn(n=t.prototype)&&!1!==n.hasOwnProperty(\"isPrototypeOf\"))},Wn=Object.defineProperty({isPlainObject:$n},\"__esModule\",{value:!0}),Hn=function(e){return Wn.isPlainObject(e)&&Array.isArray(e.redos)&&Array.isArray(e.undos)&&(0===e.redos.length||g.default.Operation.isOperationList(e.redos[0]))&&(0===e.undos.length||g.default.Operation.isOperationList(e.undos[0]))},Vn=new WeakMap,zn=new WeakMap,Un={isHistoryEditor:function(e){return Hn(e.history)&&g.default.Editor.isEditor(e)},isMerging:function(e){return zn.get(e)},isSaving:function(e){return Vn.get(e)},redo:function(e){e.redo();},undo:function(e){e.undo();},withoutMerging:function(e,t){var n=Un.isMerging(e);zn.set(e,!1),t(),zn.set(e,n);},withoutSaving:function(e,t){var n=Un.isSaving(e);Vn.set(e,!1),t(),Vn.set(e,n);}};function Kn(e,t){var n=\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if(\"string\"==typeof e)return qn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return qn(e,t)}(e))||t&&e&&\"number\"==typeof e.length){n&&(e=n);var r=0,o=function(){};return {s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}var i,a=!0,s=!1;return {s:function(){n=n.call(e);},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,i=e;},f:function(){try{a||null==n.return||n.return();}finally{if(s)throw i}}}}function qn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Gn=function(e,t){return \"set_selection\"===e.type||(!(!t||\"insert_text\"!==e.type||\"insert_text\"!==t.type||e.offset!==t.offset+t.text.length||!g.default.Path.equals(e.path,t.path))||!(!t||\"remove_text\"!==e.type||\"remove_text\"!==t.type||e.offset+e.text.length!==t.offset||!g.default.Path.equals(e.path,t.path)))},Jn=function(e,t){return \"set_selection\"!==e.type||null!=e.properties&&null!=e.newProperties},Yn=function(e,t){return !(!t||\"set_selection\"!==e.type||\"set_selection\"!==t.type)},Xn=function(e){return \"set_selection\"!==e.type},Qn=function(e){var t=e,n=t.apply;return t.history={undos:[],redos:[]},t.redo=function(){var e=t.history,n=e.redos;if(n.length>0){var r=n[n.length-1];Un.withoutSaving(t,(function(){g.default.Editor.withoutNormalizing(t,(function(){var e,n=Kn(r);try{for(n.s();!(e=n.n()).done;){var o=e.value;t.apply(o);}}catch(e){n.e(e);}finally{n.f();}}));})),e.redos.pop(),e.undos.push(r);}},t.undo=function(){var e=t.history,n=e.undos;if(n.length>0){var r=n[n.length-1];Un.withoutSaving(t,(function(){g.default.Editor.withoutNormalizing(t,(function(){var e,n=Kn(r.map(g.default.Operation.inverse).reverse());try{for(n.s();!(e=n.n()).done;){var o=e.value;t.apply(o);}}catch(e){n.e(e);}finally{n.f();}}));})),e.redos.push(r),e.undos.pop();}},t.apply=function(e){var r=t.operations,o=t.history,i=o.undos,a=i[i.length-1],s=a&&a[a.length-1],l=Yn(e,s),u=Un.isSaving(t),c=Un.isMerging(t);if(null==u&&(u=Jn(e)),u){if(null==c&&(c=null!=a&&(0!==r.length||(Gn(e,s)||l))),a&&c)l&&a.pop(),a.push(e);else {var f=[e];i.push(f);}for(;i.length>100;)i.shift();Xn(e)&&(o.redos=[]);}n(e);},t},Zn=P.String,er=function(e){if(\"Symbol\"===Et(e))throw TypeError(\"Cannot convert a Symbol value to a string\");return Zn(e)},tr=function(){var e=Oe(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.dotAll&&(t+=\"s\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t},nr=ht.PROPER,rr=\"toString\",or=RegExp.prototype,ir=or.toString,ar=W(tr),sr=se((function(){return \"/a/b\"!=ir.call({source:\"a\",flags:\"b\"})})),lr=nr&&ir.name!=rr;(sr||lr)&&gt(RegExp.prototype,rr,(function(){var e=Oe(this),t=er(e.source),n=e.flags;return \"/\"+t+\"/\"+er(void 0===n&&Ne(or,e)&&!(\"flags\"in or)?ar(e):n)}),{unsafe:!0});var ur,cr=ye?Object.defineProperties:function(e,t){Oe(e);for(var n,r=cn(t),o=Fn(t),i=o.length,a=0;i>a;)Ve.f(e,n=o[a++],r[n]);return e},fr=ee(\"document\",\"documentElement\"),dr=et(\"IE_PROTO\"),pr=function(){},hr=function(e){return \"<script>\"+e+\"</\"+\"script>\"},gr=function(e){e.write(hr(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t},vr=function(){try{ur=new ActiveXObject(\"htmlfile\");}catch(e){}var e,t;vr=\"undefined\"!=typeof document?document.domain&&ur?gr(ur):((t=xe(\"iframe\")).style.display=\"none\",fr.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(hr(\"document.F=Object\")),e.close(),e.F):gr(ur);for(var n=xn.length;n--;)delete vr.prototype[xn[n]];return vr()};tt[dr]=!0;var yr=Object.create||function(e,t){var n;return null!==e?(pr.prototype=Oe(e),n=new pr,pr.prototype=null,n[dr]=e):n=vr(),void 0===t?n:cr(n,t)},mr=he(\"unscopables\"),br=Array.prototype;null==br[mr]&&Ve.f(br,mr,{configurable:!0,value:yr(null)});var wr=function(e){br[mr][e]=!0;},xr=yn.includes;_n({target:\"Array\",proto:!0},{includes:function(e){return xr(this,e,arguments.length>1?arguments[1]:void 0)}}),wr(\"includes\");var Er=he(\"match\"),Sr=function(e){var t;return me(e)&&(void 0!==(t=e[Er])?!!t:\"RegExp\"==mt(e))},kr=P.TypeError,Or=function(e){if(Sr(e))throw kr(\"The method doesn't accept regular expressions\");return e},Cr=he(\"match\"),Tr=function(e){var t=/./;try{\"/./\"[e](t);}catch(n){try{return t[Cr]=!1,\"/./\"[e](t)}catch(e){}}return !1},Nr=W(\"\".indexOf);_n({target:\"String\",proto:!0,forced:!Tr(\"includes\")},{includes:function(e){return !!~Nr(er(V(this)),er(Or(e)),arguments.length>1?arguments[1]:void 0)}});var Mr,Lr=/\"/g,Pr=W(\"\".replace);_n({target:\"String\",proto:!0,forced:(Mr=\"anchor\",se((function(){var e=\"\"[Mr]('\"');return e!==e.toLowerCase()||e.split('\"').length>3})))},{anchor:function(e){return t=\"a\",n=\"name\",r=e,o=er(V(this)),i=\"<\"+t,\"\"!==n&&(i+=\" \"+n+'=\"'+Pr(er(r),Lr,\"&quot;\")+'\"'),i+\">\"+o+\"</\"+t+\">\";var t,n,r,o,i;}});var Rr=function(e,t,n){var r,o;Oe(e);try{if(!(r=Ae(e,\"return\"))){if(\"throw\"===t)throw n;return n}r=Te(r,e);}catch(e){o=!0,r=e;}if(\"throw\"===t)throw n;if(o)throw r;return Oe(r),n},Dr=function(e,t,n,r){try{return r?t(Oe(n)[0],n[1]):t(n)}catch(t){Rr(e,\"throw\",t);}},jr={},Ar=he(\"iterator\"),_r=Array.prototype,Fr=function(e){return void 0!==e&&(jr.Array===e||_r[Ar]===e)},Ir=function(e,t,n){var r=$e(t);r in e?Ve.f(e,r,ze(0,n)):e[r]=n;},Br=he(\"iterator\"),$r=function(e){if(null!=e)return Ae(e,Br)||Ae(e,\"@@iterator\")||jr[Et(e)]},Wr=P.TypeError,Hr=function(e,t){var n=arguments.length<2?$r(e):t;if(je(n))return Oe(Te(n,e));throw Wr(Re(e)+\" is not iterable\")},Vr=P.Array,zr=he(\"iterator\"),Ur=!1;try{var Kr=0,qr={next:function(){return {done:!!Kr++}},return:function(){Ur=!0;}};qr[zr]=function(){return this},Array.from(qr,(function(){throw 2}));}catch(e){}var Gr=function(e,t){if(!t&&!Ur)return !1;var n=!1;try{var r={};r[zr]=function(){return {next:function(){return {done:n=!0}}}},e(r);}catch(e){}return n},Jr=!Gr((function(e){Array.from(e);}));_n({target:\"Array\",stat:!0,forced:Jr},{from:function(e){var t=U(e),n=qt(this),r=arguments.length,o=r>1?arguments[1]:void 0,i=void 0!==o;i&&(o=Mt(o,r>2?arguments[2]:void 0));var a,s,l,u,c,f,d=$r(t),p=0;if(!d||this==Vr&&Fr(d))for(a=It(t),s=n?new this(a):Vr(a);a>p;p++)f=i?o(t[p],p):t[p],Ir(s,p,f);else for(c=(u=Hr(t,d)).next,s=n?new this:[];!(l=Te(c,u)).done;p++)f=i?Dr(u,o,[l.value,p],!0):l.value,Ir(s,p,f);return s.length=p,s}});var Yr,Xr,Qr,Zr=W(\"\".charAt),eo=W(\"\".charCodeAt),to=W(\"\".slice),no=function(e){return function(t,n){var r,o,i=er(V(t)),a=At(n),s=i.length;return a<0||a>=s?e?\"\":void 0:(r=eo(i,a))<55296||r>56319||a+1===s||(o=eo(i,a+1))<56320||o>57343?e?Zr(i,a):r:e?to(i,a,a+2):o-56320+(r-55296<<10)+65536}},ro={codeAt:no(!1),charAt:no(!0)},oo=!se((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),io=et(\"IE_PROTO\"),ao=P.Object,so=ao.prototype,lo=oo?ao.getPrototypeOf:function(e){var t=U(e);if(q(t,io))return t[io];var n=t.constructor;return Q(n)&&t instanceof n?n.prototype:t instanceof ao?so:null},uo=he(\"iterator\"),co=!1;[].keys&&(\"next\"in(Qr=[].keys())?(Xr=lo(lo(Qr)))!==Object.prototype&&(Yr=Xr):co=!0);var fo=null==Yr||se((function(){var e={};return Yr[uo].call(e)!==e}));fo&&(Yr={}),Q(Yr[uo])||gt(Yr,uo,(function(){return this}));var po={IteratorPrototype:Yr,BUGGY_SAFARI_ITERATORS:co},ho=Ve.f,go=he(\"toStringTag\"),vo=function(e,t,n){e&&!q(e=n?e:e.prototype,go)&&ho(e,go,{configurable:!0,value:t});},yo=po.IteratorPrototype,mo=function(){return this},bo=P.String,wo=P.TypeError,xo=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=W(Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set))(n,[]),t=n instanceof Array;}catch(e){}return function(n,r){return Oe(n),function(e){if(\"object\"==typeof e||Q(e))return e;throw wo(\"Can't set \"+bo(e)+\" as a prototype\")}(r),t?e(n,r):n.__proto__=r,n}}():void 0),Eo=ht.PROPER,So=ht.CONFIGURABLE,ko=po.IteratorPrototype,Oo=po.BUGGY_SAFARI_ITERATORS,Co=he(\"iterator\"),To=\"keys\",No=\"values\",Mo=\"entries\",Lo=function(){return this},Po=function(e,t,n,r,o,i,a){!function(e,t,n,r){var o=t+\" Iterator\";e.prototype=yr(yo,{next:ze(+!r,n)}),vo(e,o,!1),jr[o]=mo;}(n,t,r);var s,l,u,c=function(e){if(e===o&&g)return g;if(!Oo&&e in p)return p[e];switch(e){case To:case No:case Mo:return function(){return new n(this,e)}}return function(){return new n(this)}},f=t+\" Iterator\",d=!1,p=e.prototype,h=p[Co]||p[\"@@iterator\"]||o&&p[o],g=!Oo&&h||c(o),v=\"Array\"==t&&p.entries||h;if(v&&(s=lo(v.call(new e)))!==Object.prototype&&s.next&&(lo(s)!==ko&&(xo?xo(s,ko):Q(s[Co])||gt(s,Co,Lo)),vo(s,f,!0)),Eo&&o==No&&h&&h.name!==No&&(So?Ue(p,\"name\",No):(d=!0,g=function(){return Te(h,this)})),o)if(l={values:c(No),keys:i?g:c(To),entries:c(Mo)},a)for(u in l)(Oo||d||!(u in p))&&gt(p,u,l[u]);else _n({target:t,proto:!0,forced:Oo||d},l);return p[Co]!==g&&gt(p,Co,g,{name:o}),jr[t]=g,l},Ro=ro.charAt,Do=\"String Iterator\",jo=ct.set,Ao=ct.getterFor(Do);Po(String,\"String\",(function(e){jo(this,{type:Do,string:er(e),index:0});}),(function(){var e,t=Ao(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=Ro(n,r),t.index+=e.length,{value:e,done:!1})}));var _o,Fo=dn.f,Io=W(\"\".endsWith),Bo=W(\"\".slice),$o=Math.min,Wo=Tr(\"endsWith\"),Ho=!(Wo||(_o=Fo(String.prototype,\"endsWith\"),!_o||_o.writable));_n({target:\"String\",proto:!0,forced:!Ho&&!Wo},{endsWith:function(e){var t=er(V(this));Or(e);var n=arguments.length>1?arguments[1]:void 0,r=t.length,o=void 0===n?r:$o(Ft(n),r),i=er(e);return Io?Io(t,i,o):Bo(t,o-i.length,o)===i}});var Vo=W([].join),zo=Rt!=Object,Uo=en(\"join\",\",\");_n({target:\"Array\",proto:!0,forced:zo||!Uo},{join:function(e){return Vo(cn(this),void 0===e?\",\":e)}});var Ko=he(\"species\"),qo=function(e){return ae>=51||!se((function(){var t=[];return (t.constructor={})[Ko]=function(){return {foo:1}},1!==t[e](Boolean).foo}))},Go=Zt.map,Jo=qo(\"map\");_n({target:\"Array\",proto:!0,forced:!Jo},{map:function(e){return Go(this,e,arguments.length>1?arguments[1]:void 0)}});var Yo=P.RegExp,Xo=se((function(){var e=Yo(\"a\",\"y\");return e.lastIndex=2,null!=e.exec(\"abcd\")})),Qo=Xo||se((function(){return !Yo(\"a\",\"y\").sticky})),Zo={BROKEN_CARET:Xo||se((function(){var e=Yo(\"^r\",\"gy\");return e.lastIndex=2,null!=e.exec(\"str\")})),MISSED_STICKY:Qo,UNSUPPORTED_Y:Xo},ei=P.RegExp,ti=se((function(){var e=ei(\".\",\"s\");return !(e.dotAll&&e.exec(\"\\n\")&&\"s\"===e.flags)})),ni=P.RegExp,ri=se((function(){var e=ni(\"(?<a>b)\",\"g\");return \"b\"!==e.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(e,\"$<a>c\")})),oi=ct.get,ii=_(\"native-string-replace\",String.prototype.replace),ai=RegExp.prototype.exec,si=ai,li=W(\"\".charAt),ui=W(\"\".indexOf),ci=W(\"\".replace),fi=W(\"\".slice),di=function(){var e=/a/,t=/b*/g;return Te(ai,e,\"a\"),Te(ai,t,\"a\"),0!==e.lastIndex||0!==t.lastIndex}(),pi=Zo.BROKEN_CARET,hi=void 0!==/()??/.exec(\"\")[1];(di||hi||pi||ti||ri)&&(si=function(e){var t,n,r,o,i,a,s,l=this,u=oi(l),c=er(e),f=u.raw;if(f)return f.lastIndex=l.lastIndex,t=Te(si,f,c),l.lastIndex=f.lastIndex,t;var d=u.groups,p=pi&&l.sticky,h=Te(tr,l),g=l.source,v=0,y=c;if(p&&(h=ci(h,\"y\",\"\"),-1===ui(h,\"g\")&&(h+=\"g\"),y=fi(c,l.lastIndex),l.lastIndex>0&&(!l.multiline||l.multiline&&\"\\n\"!==li(c,l.lastIndex-1))&&(g=\"(?: \"+g+\")\",y=\" \"+y,v++),n=new RegExp(\"^(?:\"+g+\")\",h)),hi&&(n=new RegExp(\"^\"+g+\"$(?!\\\\s)\",h)),di&&(r=l.lastIndex),o=Te(ai,p?n:l,y),p?o?(o.input=fi(o.input,v),o[0]=fi(o[0],v),o.index=l.lastIndex,l.lastIndex+=o[0].length):l.lastIndex=0:di&&o&&(l.lastIndex=l.global?o.index+o[0].length:r),hi&&o&&o.length>1&&Te(ii,o[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0);})),o&&d)for(o.groups=a=yr(null),i=0;i<d.length;i++)a[(s=d[i])[0]]=o[s[1]];return o});var gi=si;_n({target:\"RegExp\",proto:!0,forced:/./.exec!==gi},{exec:gi});var vi=Function.prototype,yi=vi.apply,mi=vi.bind,bi=vi.call,wi=\"object\"==typeof Reflect&&Reflect.apply||(mi?bi.bind(yi):function(){return bi.apply(yi,arguments)}),xi=he(\"species\"),Ei=RegExp.prototype,Si=function(e,t,n,r){var o=he(e),i=!se((function(){var t={};return t[o]=function(){return 7},7!=\"\"[e](t)})),a=i&&!se((function(){var t=!1,n=/a/;return \"split\"===e&&((n={}).constructor={},n.constructor[xi]=function(){return n},n.flags=\"\",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](\"\"),!t}));if(!i||!a||n){var s=W(/./[o]),l=t(o,\"\"[e],(function(e,t,n,r,o){var a=W(e),l=t.exec;return l===gi||l===Ei.exec?i&&!o?{done:!0,value:s(t,n,r)}:{done:!0,value:a(n,t,r)}:{done:!1}}));gt(String.prototype,e,l[0]),gt(Ei,o,l[1]);}r&&Ue(Ei[o],\"sham\",!0);},ki=ro.charAt,Oi=function(e,t,n){return t+(n?ki(e,t).length:1)},Ci=Math.floor,Ti=W(\"\".charAt),Ni=W(\"\".replace),Mi=W(\"\".slice),Li=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,Pi=/\\$([$&'`]|\\d{1,2})/g,Ri=function(e,t,n,r,o,i){var a=n+e.length,s=r.length,l=Pi;return void 0!==o&&(o=U(o),l=Li),Ni(i,l,(function(i,l){var u;switch(Ti(l,0)){case\"$\":return \"$\";case\"&\":return e;case\"`\":return Mi(t,0,n);case\"'\":return Mi(t,a);case\"<\":u=o[Mi(l,1,-1)];break;default:var c=+l;if(0===c)return i;if(c>s){var f=Ci(c/10);return 0===f?i:f<=s?void 0===r[f-1]?Ti(l,1):r[f-1]+Ti(l,1):i}u=r[c-1];}return void 0===u?\"\":u}))},Di=P.TypeError,ji=function(e,t){var n=e.exec;if(Q(n)){var r=Te(n,e,t);return null!==r&&Oe(r),r}if(\"RegExp\"===mt(e))return Te(gi,e,t);throw Di(\"RegExp#exec called on incompatible receiver\")},Ai=he(\"replace\"),_i=Math.max,Fi=Math.min,Ii=W([].concat),Bi=W([].push),$i=W(\"\".indexOf),Wi=W(\"\".slice),Hi=\"$0\"===\"a\".replace(/./,\"$0\"),Vi=!!/./[Ai]&&\"\"===/./[Ai](\"a\",\"$0\");Si(\"replace\",(function(e,t,n){var r=Vi?\"$\":\"$0\";return [function(e,n){var r=V(this),o=null==e?void 0:Ae(e,Ai);return o?Te(o,e,r,n):Te(t,er(r),e,n)},function(e,o){var i=Oe(this),a=er(e);if(\"string\"==typeof o&&-1===$i(o,r)&&-1===$i(o,\"$<\")){var s=n(t,i,a,o);if(s.done)return s.value}var l=Q(o);l||(o=er(o));var u=i.global;if(u){var c=i.unicode;i.lastIndex=0;}for(var f=[];;){var d=ji(i,a);if(null===d)break;if(Bi(f,d),!u)break;\"\"===er(d[0])&&(i.lastIndex=Oi(a,Ft(i.lastIndex),c));}for(var p,h=\"\",g=0,v=0;v<f.length;v++){for(var y=er((d=f[v])[0]),m=_i(Fi(At(d.index),a.length),0),b=[],w=1;w<d.length;w++)Bi(b,void 0===(p=d[w])?p:String(p));var x=d.groups;if(l){var E=Ii([y],b,m,a);void 0!==x&&Bi(E,x);var S=er(wi(o,void 0,E));}else S=Ri(y,a,m,b,x,o);m>=g&&(h+=Wi(a,g,m)+S,g=m+y.length);}return h+Wi(a,g)}]}),!!se((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:\"7\"},e},\"7\"!==\"\".replace(e,\"$<a>\")}))||!Hi||Vi);\n  /*! *****************************************************************************\n  \tCopyright (c) Microsoft Corporation.\n\n  \tPermission to use, copy, modify, and/or distribute this software for any\n  \tpurpose with or without fee is hereby granted.\n\n  \tTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n  \tREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n  \tAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n  \tINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n  \tLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n  \tOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n  \tPERFORMANCE OF THIS SOFTWARE.\n  \t***************************************************************************** */\n  var zi=function(e,t){return zi=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t;}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);},zi(e,t)};function Ui(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e;}zi(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n);}var Ki=function(){return Ki=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Ki.apply(this,arguments)};function qi(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return {next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}function Gi(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value);}catch(e){o={error:e};}finally{try{r&&!r.done&&(n=i.return)&&n.call(i);}finally{if(o)throw o.error}}return a}function Ji(e,t){for(var n=0,r=t.length,o=e.length;n<r;n++,o++)e[o]=t[n];return e}var Yi=0,Xi=function(){this.id=\"\"+Yi++;},Qi=\"Array Iterator\",Zi=ct.set,ea=ct.getterFor(Qi),ta=Po(Array,\"Array\",(function(e,t){Zi(this,{type:Qi,target:cn(e),index:0,kind:t});}),(function(){var e=ea(this),t=e.target,n=e.kind,r=e.index++;return !t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),\"values\");jr.Arguments=jr.Array,wr(\"keys\"),wr(\"values\"),wr(\"entries\");var na=function(e,t,n){for(var r in t)gt(e,r,t[r],n);return e},ra=P.Array,oa=Math.max,ia=function(e,t,n){for(var r=It(e),o=gn(t,r),i=gn(void 0===n?r:n,r),a=ra(oa(i-o,0)),s=0;o<i;o++,s++)Ir(a,s,e[o]);return a.length=s,a},aa=Sn.f,sa=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],la={f:function(e){return sa&&\"Window\"==mt(e)?function(e){try{return aa(e)}catch(e){return ia(sa)}}(e):aa(cn(e))}},ua=se((function(){if(\"function\"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,\"a\",{value:8});}})),ca=Object.isExtensible,fa=se((function(){ca(1);}))||ua?function(e){return !!me(e)&&((!ua||\"ArrayBuffer\"!=mt(e))&&(!ca||ca(e)))}:ca,da=!se((function(){return Object.isExtensible(Object.preventExtensions({}))})),pa=T((function(e){var t=Ve.f,n=!1,r=X(\"meta\"),o=0,i=function(e){t(e,r,{value:{objectID:\"O\"+o++,weakData:{}}});},a=e.exports={enable:function(){a.enable=function(){},n=!0;var e=Sn.f,t=W([].splice),o={};o[r]=1,e(o).length&&(Sn.f=function(n){for(var o=e(n),i=0,a=o.length;i<a;i++)if(o[i]===r){t(o,i,1);break}return o},_n({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:la.f}));},fastKey:function(e,t){if(!me(e))return \"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!q(e,r)){if(!fa(e))return \"F\";if(!t)return \"E\";i(e);}return e[r].objectID},getWeakData:function(e,t){if(!q(e,r)){if(!fa(e))return !0;if(!t)return !1;i(e);}return e[r].weakData},onFreeze:function(e){return da&&n&&fa(e)&&!q(e,r)&&i(e),e}};tt[r]=!0;})),ha=P.TypeError,ga=function(e,t){this.stopped=e,this.result=t;},va=ga.prototype,ya=function(e,t,n){var r,o,i,a,s,l,u,c=n&&n.that,f=!(!n||!n.AS_ENTRIES),d=!(!n||!n.IS_ITERATOR),p=!(!n||!n.INTERRUPTED),h=Mt(t,c),g=function(e){return r&&Rr(r,\"normal\",e),new ga(!0,e)},v=function(e){return f?(Oe(e),p?h(e[0],e[1],g):h(e[0],e[1])):p?h(e,g):h(e)};if(d)r=e;else {if(!(o=$r(e)))throw ha(Re(e)+\" is not iterable\");if(Fr(o)){for(i=0,a=It(e);a>i;i++)if((s=v(e[i]))&&Ne(va,s))return s;return new ga(!1)}r=Hr(e,o);}for(l=r.next;!(u=Te(l,r)).done;){try{s=v(u.value);}catch(e){Rr(r,\"throw\",e);}if(\"object\"==typeof s&&s&&Ne(va,s))return s}return new ga(!1)},ma=P.TypeError,ba=function(e,t){if(Ne(t,e))return e;throw ma(\"Incorrect invocation\")},wa=function(e,t,n){var r,o;return xo&&Q(r=t.constructor)&&r!==n&&me(o=r.prototype)&&o!==n.prototype&&xo(e,o),e},xa=function(e,t,n){var r=-1!==e.indexOf(\"Map\"),o=-1!==e.indexOf(\"Weak\"),i=r?\"set\":\"add\",a=P[e],s=a&&a.prototype,l=a,u={},c=function(e){var t=W(s[e]);gt(s,e,\"add\"==e?function(e){return t(this,0===e?0:e),this}:\"delete\"==e?function(e){return !(o&&!me(e))&&t(this,0===e?0:e)}:\"get\"==e?function(e){return o&&!me(e)?void 0:t(this,0===e?0:e)}:\"has\"==e?function(e){return !(o&&!me(e))&&t(this,0===e?0:e)}:function(e,n){return t(this,0===e?0:e,n),this});};if(jn(e,!Q(a)||!(o||s.forEach&&!se((function(){(new a).entries().next();})))))l=n.getConstructor(t,e,r,i),pa.enable();else if(jn(e,!0)){var f=new l,d=f[i](o?{}:-0,1)!=f,p=se((function(){f.has(1);})),h=Gr((function(e){new a(e);})),g=!o&&se((function(){for(var e=new a,t=5;t--;)e[i](t,t);return !e.has(-0)}));h||((l=t((function(e,t){ba(e,s);var n=wa(new a,e,l);return null!=t&&ya(t,n[i],{that:n,AS_ENTRIES:r}),n}))).prototype=s,s.constructor=l),(p||g)&&(c(\"delete\"),c(\"has\"),r&&c(\"get\")),(g||d)&&c(i),o&&s.clear&&delete s.clear;}return u[e]=l,_n({global:!0,forced:l!=a},u),vo(l,e),o||n.setStrong(l,e,r),l},Ea=pa.getWeakData,Sa=ct.set,ka=ct.getterFor,Oa=Zt.find,Ca=Zt.findIndex,Ta=W([].splice),Na=0,Ma=function(e){return e.frozen||(e.frozen=new La)},La=function(){this.entries=[];},Pa=function(e,t){return Oa(e.entries,(function(e){return e[0]===t}))};La.prototype={get:function(e){var t=Pa(this,e);if(t)return t[1]},has:function(e){return !!Pa(this,e)},set:function(e,t){var n=Pa(this,e);n?n[1]=t:this.entries.push([e,t]);},delete:function(e){var t=Ca(this.entries,(function(t){return t[0]===e}));return ~t&&Ta(this.entries,t,1),!!~t}};var Ra,Da={getConstructor:function(e,t,n,r){var o=e((function(e,o){ba(e,i),Sa(e,{type:t,id:Na++,frozen:void 0}),null!=o&&ya(o,e[r],{that:e,AS_ENTRIES:n});})),i=o.prototype,a=ka(t),s=function(e,t,n){var r=a(e),o=Ea(Oe(t),!0);return !0===o?Ma(r).set(t,n):o[r.id]=n,e};return na(i,{delete:function(e){var t=a(this);if(!me(e))return !1;var n=Ea(e);return !0===n?Ma(t).delete(e):n&&q(n,t.id)&&delete n[t.id]},has:function(e){var t=a(this);if(!me(e))return !1;var n=Ea(e);return !0===n?Ma(t).has(e):n&&q(n,t.id)}}),na(i,n?{get:function(e){var t=a(this);if(me(e)){var n=Ea(e);return !0===n?Ma(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return s(this,e,t)}}:{add:function(e){return s(this,e,!0)}}),o}},ja=ct.enforce,Aa=!P.ActiveXObject&&\"ActiveXObject\"in P,_a=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},Fa=xa(\"WeakMap\",_a,Da);if(Qe&&Aa){Ra=Da.getConstructor(_a,\"WeakMap\",!0),pa.enable();var Ia=Fa.prototype,Ba=W(Ia.delete),$a=W(Ia.has),Wa=W(Ia.get),Ha=W(Ia.set);na(Ia,{delete:function(e){if(me(e)&&!fa(e)){var t=ja(this);return t.frozen||(t.frozen=new Ra),Ba(this,e)||t.frozen.delete(e)}return Ba(this,e)},has:function(e){if(me(e)&&!fa(e)){var t=ja(this);return t.frozen||(t.frozen=new Ra),$a(this,e)||t.frozen.has(e)}return $a(this,e)},get:function(e){if(me(e)&&!fa(e)){var t=ja(this);return t.frozen||(t.frozen=new Ra),$a(this,e)?Wa(this,e):t.frozen.get(e)}return Wa(this,e)},set:function(e,t){if(me(e)&&!fa(e)){var n=ja(this);n.frozen||(n.frozen=new Ra),$a(this,e)?Ha(this,e,t):n.frozen.set(e,t);}else Ha(this,e,t);return this}});}var Va=he(\"iterator\"),za=he(\"toStringTag\"),Ua=ta.values,Ka=function(e,t){if(e){if(e[Va]!==Ua)try{Ue(e,Va,Ua);}catch(t){e[Va]=Ua;}if(e[za]||Ue(e,za,t),kt[t])for(var n in ta)if(e[n]!==ta[n])try{Ue(e,n,ta[n]);}catch(t){e[n]=ta[n];}}};for(var qa in kt)Ka(P[qa]&&P[qa].prototype,qa);Ka(Tt,\"DOMTokenList\");var Ga=new WeakMap,Ja=new WeakMap,Ya=new WeakMap,Xa=new WeakMap,Qa=new WeakMap,Za=new WeakMap,es=new WeakMap,ts=new WeakMap,ns=new WeakMap,rs=new WeakMap,os=new WeakMap,is=new WeakMap,as=new WeakMap,ss=new WeakMap,ls=new WeakMap,us=new WeakMap,cs=new WeakMap,fs=new WeakMap,ds=new WeakMap,ps=new WeakMap,hs=new WeakMap,gs=new WeakMap,vs=new WeakMap,ys=new WeakMap,ms=new WeakMap,bs=Zt.find,ws=\"find\",xs=!0;ws in[]&&Array(1).find((function(){xs=!1;})),_n({target:\"Array\",proto:!0,forced:xs},{find:function(e){return bs(this,e,arguments.length>1?arguments[1]:void 0)}}),wr(ws),_n({global:!0},{globalThis:P});const Es=[\"area\",\"base\",\"basefont\",\"bgsound\",\"br\",\"col\",\"command\",\"embed\",\"frame\",\"hr\",\"image\",\"img\",\"input\",\"isindex\",\"keygen\",\"link\",\"menuitem\",\"meta\",\"nextid\",\"param\",\"source\",\"track\",\"wbr\"];r.css&&(y.default.fn.css=r.css),r.append&&(y.default.fn.append=r.append),r.addClass&&(y.default.fn.addClass=r.addClass),r.removeClass&&(y.default.fn.removeClass=r.removeClass),r.hasClass&&(y.default.fn.hasClass=r.hasClass),r.on&&(y.default.fn.on=r.on),r.focus&&(y.default.fn.focus=r.focus),r.attr&&(y.default.fn.attr=r.attr),r.removeAttr&&(y.default.fn.removeAttr=r.removeAttr),r.hide&&(y.default.fn.hide=r.hide),r.show&&(y.default.fn.show=r.show),r.offset&&(y.default.fn.offset=r.offset),r.width&&(y.default.fn.width=r.width),r.height&&(y.default.fn.height=r.height),r.parent&&(y.default.fn.parent=r.parent),r.parents&&(y.default.fn.parents=r.parents),r.is&&(y.default.fn.is=r.is),r.dataset&&(y.default.fn.dataset=r.dataset),r.val&&(y.default.fn.val=r.val),r.text&&(y.default.fn.text=r.text),r.html&&(y.default.fn.html=r.html),r.children&&(y.default.fn.children=r.children),r.remove&&(y.default.fn.remove=r.remove),r.find&&(y.default.fn.find=r.find),r.each&&(y.default.fn.each=r.each),r.empty&&(y.default.fn.empty=r.empty);var Ss,ks=function(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView||null},Os=function(e){return Cs(e)&&1===e.nodeType},Cs=function(e){var t=ks(e);return !!t&&e instanceof t.Node},Ts=function(e){var t=e&&e.anchorNode&&ks(e.anchorNode);return !!t&&e instanceof t.Selection},Ns=function(e){return Cs(e)&&3===e.nodeType},Ms=function(e){var t,n,r;return null!==(t=window.document.getElementById(e))&&void 0!==t?t:(null===(r=null===(n=window.document.activeElement)||void 0===n?void 0:n.shadowRoot)||void 0===r?void 0:r.getElementById(e))||null},Ls=function(e,t,n){for(var r,o=e.childNodes,i=o[t],a=t,s=!1,l=!1;(Cs(r=i)&&8===r.nodeType||Os(i)&&0===i.childNodes.length||Os(i)&&\"false\"===i.getAttribute(\"contenteditable\"))&&(!s||!l);)a>=o.length?(s=!0,a=t-1,n=\"backward\"):a<0?(l=!0,a=t+1,n=\"forward\"):(i=o[a],t=a,a+=\"forward\"===n?1:-1);return [i,t]},Ps=function(e,t,n){return Gi(Ls(e,t,n),1)[0]},Rs=function e(t){var n,r,o=\"\";if(Ns(t)&&t.nodeValue)return t.nodeValue;if(Os(t)){try{for(var i=qi(Array.from(t.childNodes)),a=i.next();!a.done;a=i.next()){o+=e(a.value);}}catch(e){n={error:e};}finally{try{a&&!a.done&&(r=i.return)&&r.call(i);}finally{if(n)throw n.error}}var s=getComputedStyle(t).getPropertyValue(\"display\");\"block\"!==s&&\"list\"!==s&&\"table-row\"!==s&&\"BR\"!==t.tagName||(o+=\"\\n\");}return o};function Ds(e,t){if(!(e instanceof HTMLElement&&\"true\"===e.dataset.slateVoid))for(var n=e.childNodes,r=n.length;r--;){var o=n[r],i=o.nodeType;3==i?t(o,e):1!=i&&9!=i&&11!=i||Ds(o,t);}}function js(e){if(0===e.length)return \"\";var t=e[0];return t.nodeType!==Ss.ELEMENT_NODE?\"\":t.tagName.toLowerCase()}!function(e){e[e.ELEMENT_NODE=1]=\"ELEMENT_NODE\",e[e.TEXT_NODE=3]=\"TEXT_NODE\",e[e.CDATA_SECTION_NODE=4]=\"CDATA_SECTION_NODE\",e[e.PROCESSING_INSTRUCTION_NODE=7]=\"PROCESSING_INSTRUCTION_NODE\",e[e.COMMENT_NODE=8]=\"COMMENT_NODE\",e[e.DOCUMENT_NODE=9]=\"DOCUMENT_NODE\",e[e.DOCUMENT_TYPE_NODE=10]=\"DOCUMENT_TYPE_NODE\",e[e.DOCUMENT_FRAGMENT_NODE=11]=\"DOCUMENT_FRAGMENT_NODE\";}(Ss||(Ss={})),void 0!==globalThis.navigator&&void 0!==globalThis.window&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&globalThis.window.MSStream;var As=\"undefined\"!=typeof navigator&&/Mac OS X/.test(navigator.userAgent),_s=\"undefined\"!=typeof navigator&&/^(?!.*Seamonkey)(?=.*Firefox).*/i.test(navigator.userAgent);\"undefined\"!=typeof navigator&&/^(?!.*Seamonkey)(?=.*Firefox\\/(?:[0-7][0-9]|[0-8][0-6])(?:\\.)).*/i.test(navigator.userAgent);var Fs=\"undefined\"!=typeof navigator&&/Version\\/[\\d\\.]+.*Safari/.test(navigator.userAgent),Is=\"undefined\"!=typeof navigator&&/Edge?\\/(?:[0-6][0-9]|[0-7][0-8])(?:\\.)/i.test(navigator.userAgent),Bs=\"undefined\"!=typeof navigator&&/Chrome?\\/(?:[0-7][0-5]|[0-6][0-9])(?:\\.)/i.test(navigator.userAgent),$s=\"undefined\"!=typeof navigator&&/Chrome/i.test(navigator.userAgent);\"undefined\"!=typeof navigator&&/.*QQBrowser/.test(navigator.userAgent);var Ws=!Bs&&!Is&&\"undefined\"!=typeof globalThis&&globalThis.InputEvent&&\"function\"==typeof globalThis.InputEvent.prototype.getTargetRanges,Hs={getWindow:function(e){var t=hs.get(e);if(!t)throw new Error(\"Unable to find a host window element for this editor\");return t},findKey:function(e,t){var n=ps.get(t);return n||(n=new Xi,ps.set(t,n)),n},setNewKey:function(e){var t=new Xi;ps.set(e,t);},findPath:function(e,n){for(var r=[],o=n;;){var i=ls.get(o);if(null==i){if(t.Editor.isEditor(o))return r;break}var a=ss.get(o);if(null==a)break;r.unshift(a),o=i;}throw new Error(\"Unable to find the path for Slate node: \"+JSON.stringify(n))},findDocumentOrShadowRoot:function(e){if(e.isDestroyed)return window.document;var t=Hs.toDOMNode(e,e),n=t.getRootNode();return (n instanceof Document||n instanceof ShadowRoot)&&null!=n.getSelection?n:t.ownerDocument},getParentNode:function(e,t){return ls.get(t)||null},getParentsNodes:function(e,t){for(var n=[],r=t;r!==e&&null!=r;){var o=Hs.getParentNode(e,r);if(null==o)break;n.push(o),r=o;}return n},getTopNode:function(e,n){var r=[Hs.findPath(e,n)[0]];return t.Node.get(e,r)},toDOMNode:function(e,n){var r;if(t.Editor.isEditor(n))r=us.get(e);else {var o=Hs.findKey(e,n);r=fs.get(o);}if(!r)throw new Error(\"Cannot resolve a DOM node from Slate node: \"+JSON.stringify(n));return r},hasDOMNode:function(e,t,n){void 0===n&&(n={});var r,o=n.editable,i=void 0!==o&&o,a=Hs.toDOMNode(e,e);try{r=Os(t)?t:t.parentElement;}catch(e){if(!e.message.includes('Permission denied to access property \"nodeType\"'))throw e}return !!r&&(r.closest(\"[data-slate-editor]\")===a&&(!i||r.isContentEditable||!!r.getAttribute(\"data-slate-zero-width\")))},toDOMRange:function(e,n){var r=n.anchor,o=n.focus,i=t.Range.isBackward(n),a=Hs.toDOMPoint(e,r),s=t.Range.isCollapsed(n)?a:Hs.toDOMPoint(e,o),l=Hs.getWindow(e).document.createRange(),u=Gi(i?s:a,2),c=u[0],f=u[1],d=Gi(i?a:s,2),p=d[0],h=d[1],g=!!(Os(c)?c:c.parentElement).getAttribute(\"data-slate-zero-width\"),v=!!(Os(p)?p:p.parentElement).getAttribute(\"data-slate-zero-width\");return l.setStart(c,g?1:f),l.setEnd(p,v?1:h),l},toDOMPoint:function(e,n){var r,o,i,a=Gi(t.Editor.node(e,n.path),1)[0],s=Hs.toDOMNode(e,a);t.Editor.void(e,{at:n})&&(n={path:n.path,offset:0});var l=Array.from(s.querySelectorAll(\"[data-slate-string], [data-slate-zero-width]\")),u=0;try{for(var c=qi(l),f=c.next();!f.done;f=c.next()){var d=f.value,p=d.childNodes[0];if(null!=p&&null!=p.textContent){var h=p.textContent.length,g=d.getAttribute(\"data-slate-length\"),v=u+(null==g?h:parseInt(g,10));if(n.offset<=v){i=[p,Math.min(h,Math.max(0,n.offset-u))];break}u=v;}}}catch(e){r={error:e};}finally{try{f&&!f.done&&(o=c.return)&&o.call(c);}finally{if(r)throw r.error}}if(!i)throw new Error(\"Cannot resolve a DOM point from Slate point: \"+JSON.stringify(n));return i},toSlateNode:function(e,t){var n=Os(t)?t:t.parentElement;n&&!n.hasAttribute(\"data-slate-node\")&&(n=n.closest(\"[data-slate-node]\"));var r=n?cs.get(n):null;if(!r)throw new Error(\"Cannot resolve a Slate node from DOM node: \"+n);return r},findEventRange:function(e,n){\"nativeEvent\"in n&&(n=n.nativeEvent);var r=n.clientX,o=n.clientY,i=n.target;if(null==r||null==o)throw new Error(\"Cannot resolve a Slate range from a DOM event: \"+n);var a,s=Hs.toSlateNode(e,n.target),l=Hs.findPath(e,s);if(t.Editor.isVoid(e,s)){var u=i.getBoundingClientRect(),c=e.isInline(s)?r-u.left<u.left+u.width-r:o-u.top<u.top+u.height-o,f=t.Editor.point(e,l,{edge:c?\"start\":\"end\"}),d=c?t.Editor.before(e,f):t.Editor.after(e,f);if(d)return t.Editor.range(e,d)}var p=this.getWindow(e).document;if(p.caretRangeFromPoint)a=p.caretRangeFromPoint(r,o);else {var h=p.caretPositionFromPoint(r,o);h&&((a=p.createRange()).setStart(h.offsetNode,h.offset),a.setEnd(h.offsetNode,h.offset));}if(!a)throw new Error(\"Cannot resolve a Slate range from a DOM event: \"+n);return Hs.toSlateRange(e,a,{exactMatch:!1,suppressThrow:!1})},toSlateRange:function(e,n,r){var o,i,a,s,l,u=r.exactMatch,c=r.suppressThrow;if((Ts(n)?n.anchorNode:n.startContainer)&&(Ts(n)?(o=n.anchorNode,i=n.anchorOffset,a=n.focusNode,s=n.focusOffset,l=$s&&window.document.activeElement&&window.document.activeElement.shadowRoot?n.anchorNode===n.focusNode&&n.anchorOffset===n.focusOffset:n.isCollapsed):(o=n.startContainer,i=n.startOffset,a=n.endContainer,s=n.endOffset,l=n.collapsed)),null==o||null==a||null==i||null==s)throw new Error(\"Cannot resolve a Slate range from DOM range: \"+n);var f=Hs.toSlatePoint(e,[o,i],{exactMatch:u,suppressThrow:c});if(!f)return null;var d=l?f:Hs.toSlatePoint(e,[a,s],{exactMatch:u,suppressThrow:c});if(!d)return null;var p={anchor:f,focus:d};return t.Range.isExpanded(p)&&t.Range.isForward(p)&&Os(a)&&t.Editor.void(e,{at:p.focus,mode:\"highest\"})&&(p=t.Editor.unhangRange(e,p,{voids:!0})),p},toSlatePoint:function(e,t,n){var r,o=n.exactMatch,i=n.suppressThrow,a=Gi(o?t:function(e){var t,n=Gi(e,2),r=n[0],o=n[1];if(Os(r)&&r.childNodes.length){var i=o===r.childNodes.length,a=i?o-1:o;for(r=(t=Gi(Ls(r,a,i?\"backward\":\"forward\"),2))[0],i=(a=t[1])<o;Os(r)&&r.childNodes.length;){var s=i?r.childNodes.length-1:0;r=Ps(r,s,i?\"backward\":\"forward\");}o=i&&null!=r.textContent?r.textContent.length:0;}return [r,o]}(t),2),s=a[0],l=a[1],u=s.parentNode,c=null,f=0;if(u){var d=u.closest('[data-slate-void=\"true\"]'),p=u.closest(\"[data-slate-leaf]\"),h=null;if(p){c=p.closest('[data-slate-node=\"text\"]');var g=Hs.getWindow(e).document.createRange();g.setStart(c,0),g.setEnd(s,l);var y=g.cloneContents();Ji(Ji([],Gi(v.default(y.querySelectorAll(\"[data-slate-zero-width]\")))),Gi(v.default(y.querySelectorAll(\"[contenteditable=false]\")))).forEach((function(e){e.parentNode.removeChild(e);})),f=y.textContent.length,h=c;}else d&&((p=d.querySelector(\"[data-slate-leaf]\"))?(c=p.closest('[data-slate-node=\"text\"]'),f=(h=p).textContent.length,h.querySelectorAll(\"[data-slate-zero-width]\").forEach((function(e){f-=e.textContent.length;}))):f=1);h&&f===h.textContent.length&&(u.hasAttribute(\"data-slate-zero-width\")||_s&&(null===(r=h.textContent)||void 0===r?void 0:r.endsWith(\"\\n\")))&&f--;}if(!c){if(i)return null;throw new Error(\"Cannot resolve a Slate point from DOM point: \"+t)}var m=Hs.toSlateNode(e,c);return {path:Hs.findPath(e,m),offset:f}},hasRange:function(e,n){var r=n.anchor,o=n.focus;return t.Editor.hasPath(e,r.path)&&t.Editor.hasPath(e,o.path)},getNodeType:function(e){return t.Element.isElement(e)?e.type:\"\"},checkNodeType:function(e,t){return this.getNodeType(e)===t},getNodesStr:function(e){return e.map((function(e){return t.Node.string(e)})).join(\"\")},getSelectedElems:function(e){var n,r,o=[],i=t.Editor.nodes(e,{universal:!0});try{for(var a=qi(i),s=a.next();!s.done;s=a.next()){var l=Gi(s.value,1)[0];t.Element.isElement(l)&&o.push(l);}}catch(e){n={error:e};}finally{try{s&&!s.done&&(r=a.return)&&r.call(a);}finally{if(n)throw n.error}}return o},getSelectedNodeByType:function(e,n){var r=this,o=Gi(t.Editor.nodes(e,{match:function(e){return r.checkNodeType(e,n)},universal:!0}),1),i=o[0];return null==i?null:i[0]},getSelectedTextNode:function(e){var n=Gi(t.Editor.nodes(e,{match:function(e){return t.Text.isText(e)},universal:!0}),1),r=n[0];return null==r?null:r[0]},isNodeSelected:function(e,n){var r=Gi(t.Editor.nodes(e,{match:function(e){return e===n},universal:!0}),1),o=r[0];return null!=o&&Gi(o,1)[0]===n},isSelectionAtLineEnd:function(e,n){var r=e.selection;return !!r&&(t.Editor.isEnd(e,r.anchor,n)||t.Editor.isEnd(e,r.focus,n))},getTextarea:function(e){var t=Ga.get(e);if(null==t)throw new Error(\"Cannot find textarea instance by editor\");return t},getToolbar:function(e){return Xa.get(e)||null},getHoverbar:function(e){return Za.get(e)||null},normalizeContent:function(e){e.children.forEach((function(t,n){e.normalizeNode([t,[n]]);}));},getLeftLengthOfMaxLength:function(e){var t=e.getConfig(),n=t.maxLength,r=t.onMaxLength;if(\"number\"!=typeof n||n<=0)return 1/0;var o=n-e.getText().replace(/\\r|\\n|(\\r\\n)/g,\"\").length;return o<=0&&r&&r(e),o},cleanExposedTexNodeInSelectionBlock:function(e){var n,r,o,i,a=Hs.getTextarea(e).$textArea,s=null==a?void 0:a[0].childNodes;if(s)try{for(var l=qi(Array.from(s)),u=l.next();!u.done;u=l.next()){var c=u.value;if(3!==c.nodeType)break;c.remove();}}catch(e){n={error:e};}finally{try{u&&!u.done&&(r=l.return)&&r.call(l);}finally{if(n)throw n.error}}var f=t.Editor.nodes(e,{match:function(n){return !(!t.Element.isElement(n)||e.isInline(n))},universal:!0});try{for(var d=qi(f),p=d.next();!p.done;p=d.next()){var h=p.value;if(null!=h){var g=h[0];Ds(Hs.toDOMNode(e,g),(function(e,t){var n=y.default(t);n.attr(\"data-slate-string\")||n.attr(\"data-slate-zero-width\")||n.attr(\"data-w-e-reserve\")||t.removeChild(e);}));}}}catch(e){o={error:e};}finally{try{p&&!p.done&&(i=d.return)&&i.call(d);}finally{if(o)throw o.error}}},isLastNode:function(e,t){var n=e.children||[];return n[n.length-1]===t},genEmptyParagraph:function(){return {type:\"paragraph\",children:[{text:\"\"}]}},isSelectedVoidNode:function(e){var n,r,o=t.Editor.nodes(e,{match:function(t){return e.isVoid(t)}}),i=0;try{for(var a=qi(o),s=a.next();!s.done;s=a.next()){s.value;i++;}}catch(e){n={error:e};}finally{try{s&&!s.done&&(r=a.return)&&r.call(a);}finally{if(n)throw n.error}}return i>0},isSelectedEmptyParagraph:function(e){var n=e.selection;if(null==n)return !1;if(t.Range.isExpanded(n))return !1;var r=Hs.getSelectedNodeByType(e,\"paragraph\");if(null===r)return !1;var o=r.children;return 1===o.length&&(\"\"===o[0].text||void 0)},isEmptyPath:function(e,n){var r=t.Editor.node(e,n);if(null==r)return !1;var o=Gi(r,1)[0].children;if(1===o.length&&\"\"===o[0].text)return !0;return !1}},Vs=1,zs={};var Us={};var Ks=Zt.filter,qs=qo(\"filter\");_n({target:\"Array\",proto:!0,forced:!qs},{filter:function(e){return Ks(this,e,arguments.length>1?arguments[1]:void 0)}});var Gs=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\",Js=W(\"\".replace),Ys=\"[\"+Gs+\"]\",Xs=RegExp(\"^\"+Ys+Ys+\"*\"),Qs=RegExp(Ys+Ys+\"*$\"),Zs=function(e){return function(t){var n=er(V(t));return 1&e&&(n=Js(n,Xs,\"\")),2&e&&(n=Js(n,Qs,\"\")),n}},el={start:Zs(1),end:Zs(2),trim:Zs(3)},tl=ht.PROPER,nl=el.trim;_n({target:\"String\",proto:!0,forced:function(e){return se((function(){return !!Gs[e]()||\"​᠎\"!==\"​᠎\"[e]()||tl&&Gs[e].name!==e}))}(\"trim\")},{trim:function(){return nl(this)}});var rl=[];var ol={};function il(e,t,n){var r=n.isInline(e)?\"span\":\"div\";return \"<\"+r+\">\"+t+\"</\"+r+\">\"}function al(e,n){var r=e.type,o=void 0===r?\"\":r,i=e.children,a=void 0===i?[]:i,s=t.Editor.isVoid(n,e),l=\"\";s||(l=a.map((function(e){return Ku(e,n)})).join(\"\"));var u=function(e){return ol[e]||il}(o),c=u(e,l,n),f=\"\";if(f=\"string\"==typeof c?c:c.html||\"\",s||rl.forEach((function(t){return f=t(e,f)})),\"string\"==typeof c)return f;var d=c.prefix,p=void 0===d?\"\":d,h=c.suffix,g=void 0===h?\"\":h;return p&&(f=p+f),g&&(f+=g),f}var sl,ll,ul,cl,fl=P.Promise,dl=he(\"species\"),pl=function(e){var t=ee(e),n=Ve.f;ye&&t&&!t[dl]&&n(t,dl,{configurable:!0,get:function(){return this}});},hl=P.TypeError,gl=he(\"species\"),vl=function(e,t){var n,r=Oe(e).constructor;return void 0===r||null==(n=Oe(r)[gl])?t:function(e){if(qt(e))return e;throw hl(Re(e)+\" is not a constructor\")}(n)},yl=W([].slice),ml=/(?:ipad|iphone|ipod).*applewebkit/i.test(te),bl=\"process\"==mt(P.process),wl=P.setImmediate,xl=P.clearImmediate,El=P.process,Sl=P.Dispatch,kl=P.Function,Ol=P.MessageChannel,Cl=P.String,Tl=0,Nl={},Ml=\"onreadystatechange\";try{sl=P.location;}catch(e){}var Ll=function(e){if(q(Nl,e)){var t=Nl[e];delete Nl[e],t();}},Pl=function(e){return function(){Ll(e);}},Rl=function(e){Ll(e.data);},Dl=function(e){P.postMessage(Cl(e),sl.protocol+\"//\"+sl.host);};wl&&xl||(wl=function(e){var t=yl(arguments,1);return Nl[++Tl]=function(){wi(Q(e)?e:kl(e),void 0,t);},ll(Tl),Tl},xl=function(e){delete Nl[e];},bl?ll=function(e){El.nextTick(Pl(e));}:Sl&&Sl.now?ll=function(e){Sl.now(Pl(e));}:Ol&&!ml?(cl=(ul=new Ol).port2,ul.port1.onmessage=Rl,ll=Mt(cl.postMessage,cl)):P.addEventListener&&Q(P.postMessage)&&!P.importScripts&&sl&&\"file:\"!==sl.protocol&&!se(Dl)?(ll=Dl,P.addEventListener(\"message\",Rl,!1)):ll=Ml in xe(\"script\")?function(e){fr.appendChild(xe(\"script\")).onreadystatechange=function(){fr.removeChild(this),Ll(e);};}:function(e){setTimeout(Pl(e),0);});var jl,Al,_l,Fl,Il,Bl,$l,Wl,Hl={set:wl,clear:xl},Vl=/ipad|iphone|ipod/i.test(te)&&void 0!==P.Pebble,zl=/web0s(?!.*chrome)/i.test(te),Ul=dn.f,Kl=Hl.set,ql=P.MutationObserver||P.WebKitMutationObserver,Gl=P.document,Jl=P.process,Yl=P.Promise,Xl=Ul(P,\"queueMicrotask\"),Ql=Xl&&Xl.value;Ql||(jl=function(){var e,t;for(bl&&(e=Jl.domain)&&e.exit();Al;){t=Al.fn,Al=Al.next;try{t();}catch(e){throw Al?Fl():_l=void 0,e}}_l=void 0,e&&e.enter();},ml||bl||zl||!ql||!Gl?!Vl&&Yl&&Yl.resolve?(($l=Yl.resolve(void 0)).constructor=Yl,Wl=Mt($l.then,$l),Fl=function(){Wl(jl);}):bl?Fl=function(){Jl.nextTick(jl);}:(Kl=Mt(Kl,P),Fl=function(){Kl(jl);}):(Il=!0,Bl=Gl.createTextNode(\"\"),new ql(jl).observe(Bl,{characterData:!0}),Fl=function(){Bl.data=Il=!Il;}));var Zl,eu,tu,nu,ru=Ql||function(e){var t={fn:e,next:void 0};_l&&(_l.next=t),Al||(Al=t,Fl()),_l=t;},ou=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r;})),this.resolve=je(t),this.reject=je(n);},iu={f:function(e){return new ou(e)}},au=function(e){try{return {error:!1,value:e()}}catch(e){return {error:!0,value:e}}},su=\"object\"==typeof window,lu=Hl.set,uu=he(\"species\"),cu=\"Promise\",fu=ct.getterFor(cu),du=ct.set,pu=ct.getterFor(cu),hu=fl&&fl.prototype,gu=fl,vu=hu,yu=P.TypeError,mu=P.document,bu=P.process,wu=iu.f,xu=wu,Eu=!!(mu&&mu.createEvent&&P.dispatchEvent),Su=Q(P.PromiseRejectionEvent),ku=\"unhandledrejection\",Ou=!1,Cu=jn(cu,(function(){var e=Ye(gu),t=e!==String(gu);if(!t&&66===ae)return !0;if(ae>=51&&/native code/.test(e))return !1;var n=new gu((function(e){e(1);})),r=function(e){e((function(){}),(function(){}));};return (n.constructor={})[uu]=r,!(Ou=n.then((function(){}))instanceof r)||!t&&su&&!Su})),Tu=Cu||!Gr((function(e){gu.all(e).catch((function(){}));})),Nu=function(e){var t;return !(!me(e)||!Q(t=e.then))&&t},Mu=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;ru((function(){for(var r=e.value,o=1==e.state,i=0;n.length>i;){var a,s,l,u=n[i++],c=o?u.ok:u.fail,f=u.resolve,d=u.reject,p=u.domain;try{c?(o||(2===e.rejection&&Du(e),e.rejection=1),!0===c?a=r:(p&&p.enter(),a=c(r),p&&(p.exit(),l=!0)),a===u.promise?d(yu(\"Promise-chain cycle\")):(s=Nu(a))?Te(s,a,f,d):f(a)):d(r);}catch(e){p&&!l&&p.exit(),d(e);}}e.reactions=[],e.notified=!1,t&&!e.rejection&&Pu(e);}));}},Lu=function(e,t,n){var r,o;Eu?((r=mu.createEvent(\"Event\")).promise=t,r.reason=n,r.initEvent(e,!1,!0),P.dispatchEvent(r)):r={promise:t,reason:n},!Su&&(o=P[\"on\"+e])?o(r):e===ku&&function(e,t){var n=P.console;n&&n.error&&(1==arguments.length?n.error(e):n.error(e,t));}(\"Unhandled promise rejection\",n);},Pu=function(e){Te(lu,P,(function(){var t,n=e.facade,r=e.value;if(Ru(e)&&(t=au((function(){bl?bu.emit(\"unhandledRejection\",r,n):Lu(ku,n,r);})),e.rejection=bl||Ru(e)?2:1,t.error))throw t.value}));},Ru=function(e){return 1!==e.rejection&&!e.parent},Du=function(e){Te(lu,P,(function(){var t=e.facade;bl?bu.emit(\"rejectionHandled\",t):Lu(\"rejectionhandled\",t,e.value);}));},ju=function(e,t,n){return function(r){e(t,r,n);}},Au=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,Mu(e,!0));},_u=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw yu(\"Promise can't be resolved itself\");var r=Nu(t);r?ru((function(){var n={done:!1};try{Te(r,t,ju(_u,n,e),ju(Au,n,e));}catch(t){Au(n,t,e);}})):(e.value=t,e.state=1,Mu(e,!1));}catch(t){Au({done:!1},t,e);}}};if(Cu&&(vu=(gu=function(e){ba(this,vu),je(e),Te(Zl,this);var t=fu(this);try{e(ju(_u,t),ju(Au,t));}catch(e){Au(t,e);}}).prototype,(Zl=function(e){du(this,{type:cu,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0});}).prototype=na(vu,{then:function(e,t){var n=pu(this),r=n.reactions,o=wu(vl(this,gu));return o.ok=!Q(e)||e,o.fail=Q(t)&&t,o.domain=bl?bu.domain:void 0,n.parent=!0,r[r.length]=o,0!=n.state&&Mu(n,!1),o.promise},catch:function(e){return this.then(void 0,e)}}),eu=function(){var e=new Zl,t=fu(e);this.promise=e,this.resolve=ju(_u,t),this.reject=ju(Au,t);},iu.f=wu=function(e){return e===gu||e===tu?new eu(e):xu(e)},Q(fl)&&hu!==Object.prototype)){nu=hu.then,Ou||(gt(hu,\"then\",(function(e,t){var n=this;return new gu((function(e,t){Te(nu,n,e,t);})).then(e,t)}),{unsafe:!0}),gt(hu,\"catch\",vu.catch,{unsafe:!0}));try{delete hu.constructor;}catch(e){}xo&&xo(hu,vu);}_n({global:!0,wrap:!0,forced:Cu},{Promise:gu}),vo(gu,cu,!1),pl(cu),tu=ee(cu),_n({target:cu,stat:!0,forced:Cu},{reject:function(e){var t=wu(this);return Te(t.reject,void 0,e),t.promise}}),_n({target:cu,stat:!0,forced:Cu},{resolve:function(e){return function(e,t){if(Oe(e),me(t)&&t.constructor===e)return t;var n=iu.f(e);return (0, n.resolve)(t),n.promise}(this,e)}}),_n({target:cu,stat:!0,forced:Tu},{all:function(e){var t=this,n=wu(t),r=n.resolve,o=n.reject,i=au((function(){var n=je(t.resolve),i=[],a=0,s=1;ya(e,(function(e){var l=a++,u=!1;s++,Te(n,t,e).then((function(e){u||(u=!0,i[l]=e,--s||r(i));}),o);})),--s||r(i);}));return i.error&&o(i.value),n.promise},race:function(e){var t=this,n=wu(t),r=n.reject,o=au((function(){var o=je(t.resolve);ya(e,(function(e){Te(o,t,e).then(n.resolve,r);}));}));return o.error&&r(o.value),n.promise}});var Fu=Zo.UNSUPPORTED_Y,Iu=4294967295,Bu=Math.min,$u=[].push,Wu=W(/./.exec),Hu=W($u),Vu=W(\"\".slice),zu=!se((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n=\"ab\".split(e);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]}));function Uu(e){Promise.resolve().then(e);}function Ku(e,n){return t.Element.isElement(e)?al(e,n):function(e,t){var n=e.text;if(null==n)throw new Error(\"Current node is not slate Text \"+JSON.stringify(e));var r=n;r=function(e){return e.replace(/ {2}/g,\" &nbsp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/®/g,\"&reg;\").replace(/©/g,\"&copy;\").replace(/™/g,\"&trade;\")}(r);var o=Hs.getParentsNodes(t,e).some((function(e){return \"pre\"===Hs.getNodeType(e)}));if(o||(r=r.replace(/\\r\\n|\\r|\\n/g,\"<br>\")),o&&(r=r.replace(/&nbsp;/g,\" \")),\"\"===r){var i=Hs.getParentNode(null,e);if(!i||0!==i.children.length)return r;r=\"<br>\";}return rl.forEach((function(t){return r=t(e,r)})),r}(e,n)}function qu(e){return \"w-e-element-\"+e}Si(\"split\",(function(e,t,n){var r;return r=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(e,n){var r=er(V(this)),o=void 0===n?Iu:n>>>0;if(0===o)return [];if(void 0===e)return [r];if(!Sr(e))return Te(t,r,e,o);for(var i,a,s,l=[],u=(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.unicode?\"u\":\"\")+(e.sticky?\"y\":\"\"),c=0,f=new RegExp(e.source,u+\"g\");(i=Te(gi,f,r))&&!((a=f.lastIndex)>c&&(Hu(l,Vu(r,c,i.index)),i.length>1&&i.index<r.length&&wi($u,l,ia(i,1)),s=i[0].length,c=a,l.length>=o));)f.lastIndex===i.index&&f.lastIndex++;return c===r.length?!s&&Wu(f,\"\")||Hu(l,\"\"):Hu(l,Vu(r,c)),l.length>o?ia(l,0,o):l}:\"0\".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:Te(t,this,e,n)}:t,[function(t,n){var o=V(this),i=null==t?void 0:Ae(t,e);return i?Te(i,t,o,n):Te(r,er(o),t,n)},function(e,o){var i=Oe(this),a=er(e),s=n(r,i,a,o,r!==t);if(s.done)return s.value;var l=vl(i,RegExp),u=i.unicode,c=(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(Fu?\"g\":\"y\"),f=new l(Fu?\"^(?:\"+i.source+\")\":i,c),d=void 0===o?Iu:o>>>0;if(0===d)return [];if(0===a.length)return null===ji(f,a)?[a]:[];for(var p=0,h=0,g=[];h<a.length;){f.lastIndex=Fu?0:h;var v,y=ji(f,Fu?Vu(a,h):a);if(null===y||(v=Bu(Ft(f.lastIndex+(Fu?h:0)),a.length))===p)h=Oi(a,h,u);else {if(Hu(g,Vu(a,p,h)),g.length===d)return g;for(var m=1;m<=y.length-1;m++)if(Hu(g,y[m]),g.length===d)return g;h=p=v;}}return Hu(g,Vu(a,p)),g}]}),!zu,Fu);var Gu=function(e,t){var n=(t.top+t.bottom)/2;return e.top<=n&&e.bottom>=n},Ju=function(e,t,n){var r=Hs.toDOMRange(e,t).getBoundingClientRect(),o=Hs.toDOMRange(e,n).getBoundingClientRect();return Gu(r,o)&&Gu(o,r)},Yu=[\"span\",\"b\",\"strong\",\"i\",\"em\",\"s\",\"strike\",\"u\",\"font\",\"sub\",\"sup\"],Xu=[];var Qu=[];var Zu={};var ec=Ve.f,tc=Sn.f,nc=ct.enforce,rc=he(\"match\"),oc=P.RegExp,ic=oc.prototype,ac=P.SyntaxError,sc=W(tr),lc=W(ic.exec),uc=W(\"\".charAt),cc=W(\"\".replace),fc=W(\"\".indexOf),dc=W(\"\".slice),pc=/^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/,hc=/a/g,gc=/a/g,vc=new oc(hc)!==hc,yc=Zo.MISSED_STICKY,mc=Zo.UNSUPPORTED_Y,bc=ye&&(!vc||yc||ti||ri||se((function(){return gc[rc]=!1,oc(hc)!=hc||oc(gc)==gc||\"/a/i\"!=oc(hc,\"i\")})));if(jn(\"RegExp\",bc)){for(var wc=function(e,t){var n,r,o,i,a,s,l=Ne(ic,this),u=Sr(e),c=void 0===t,f=[],d=e;if(!l&&u&&c&&e.constructor===wc)return e;if((u||Ne(ic,e))&&(e=e.source,c&&(t=\"flags\"in d?d.flags:sc(d))),e=void 0===e?\"\":er(e),t=void 0===t?\"\":er(t),d=e,ti&&\"dotAll\"in hc&&(r=!!t&&fc(t,\"s\")>-1)&&(t=cc(t,/s/g,\"\")),n=t,yc&&\"sticky\"in hc&&(o=!!t&&fc(t,\"y\")>-1)&&mc&&(t=cc(t,/y/g,\"\")),ri&&(i=function(e){for(var t,n=e.length,r=0,o=\"\",i=[],a={},s=!1,l=!1,u=0,c=\"\";r<=n;r++){if(\"\\\\\"===(t=uc(e,r)))t+=uc(e,++r);else if(\"]\"===t)s=!1;else if(!s)switch(!0){case\"[\"===t:s=!0;break;case\"(\"===t:lc(pc,dc(e,r+1))&&(r+=2,l=!0),o+=t,u++;continue;case\">\"===t&&l:if(\"\"===c||q(a,c))throw new ac(\"Invalid capture group name\");a[c]=!0,i[i.length]=[c,u],l=!1,c=\"\";continue}l?c+=t:o+=t;}return [o,i]}(e),e=i[0],f=i[1]),a=wa(oc(e,t),l?this:ic,wc),(r||o||f.length)&&(s=nc(a),r&&(s.dotAll=!0,s.raw=wc(function(e){for(var t,n=e.length,r=0,o=\"\",i=!1;r<=n;r++)\"\\\\\"!==(t=uc(e,r))?i||\".\"!==t?(\"[\"===t?i=!0:\"]\"===t&&(i=!1),o+=t):o+=\"[\\\\s\\\\S]\":o+=t+uc(e,++r);return o}(e),n)),o&&(s.sticky=!0),f.length&&(s.groups=f)),e!==d)try{Ue(a,\"source\",\"\"===d?\"(?:)\":d);}catch(e){}return a},xc=function(e){e in wc||ec(wc,e,{configurable:!0,get:function(){return oc[e]},set:function(t){oc[e]=t;}});},Ec=tc(oc),Sc=0;Ec.length>Sc;)xc(Ec[Sc++]);ic.constructor=wc,wc.prototype=ic,gt(P,\"RegExp\",wc);}pl(\"RegExp\");var kc=new RegExp(String.fromCharCode(160),\"g\");function Oc(e){return e.replace(kc,\" \")}function Cc(e,n){var r=e.length;if(r){var o=e[r-1];if(t.Text.isText(o)){var i=Object.keys(o);if(1===i.length&&\"text\"===i[0])return o.text=o.text+n,!0}}return !1}function Tc(e,t,n){return {type:\"paragraph\",children:[{text:y.default(e).text().replace(/\\s+/gm,\" \")}]}}function Nc(e,n){var r=function(e,t){var n=[];if(null!=e.attr(\"data-w-e-is-void\"))return n;var r=e[0].childNodes;return 1===r.length&&\"BR\"===r[0].nodeName?(n.push({text:\"\"}),n):(r.forEach((function(e){if(e.nodeType!==Ss.ELEMENT_NODE)if(e.nodeType!==Ss.TEXT_NODE);else {var r=e.textContent||\"\";if(\"\"===r.trim()&&r.indexOf(\"\\n\")>=0)return;r&&(r=Oc(r),Cc(n,r)||n.push({text:r}));}else {if(\"BR\"===e.nodeName)return void(Cc(n,\"\\n\")||n.push({text:\"\\n\"}));var o=Lc(y.default(e),t);Array.isArray(o)?o.forEach((function(e){return n.push(e)})):n.push(o);}})),n)}(e,n),o=function(e){for(var t in Zu)if(e[0].matches(t))return Zu[t];return Tc}(e),i=o(e[0],r,n);return Array.isArray(i)||(i=[i]),i.forEach((function(o){t.Editor.isVoid(n,o)||(0===r.length&&(o.children=[{text:e.text().replace(/\\s+/gm,\" \")}]),Qu.forEach((function(t){o=t(e[0],o,n);})));})),i}function Mc(e,t){0===e.parents(\"pre\").length&&(e[0].innerHTML=e[0].innerHTML.replace(/\\s+/gm,\" \").replace(/<br>/g,\"\\n\"));var n=e[0].textContent||\"\";n=function(e){return e.replace(/&nbsp;/g,\" \").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&reg;/g,\"®\").replace(/&copy;/g,\"©\").replace(/&trade;/g,\"™\").replace(/&quot;/g,'\"')}(n);var r={text:n=Oc(n)};return Qu.forEach((function(n){r=n(e[0],r,t);})),r}function Lc(e,t){Xu.forEach((function(t){var n=t.selector,r=t.preParseHtml;e[0].matches(n)&&(e=y.default(r(e[0])));}));var n=js(e);return \"span\"===n?e.attr(\"data-w-e-type\")?Nc(e,t):Mc(e,t):\"code\"===n?\"pre\"===js(e.parent())?Nc(e,t):Mc(e,t):Yu.includes(n)?Mc(e,t):Nc(e,t)}function Pc(e,t,n){var r=y.default(n);return !!r.attr(t)||(r.attr(t,\"true\"),e.on(\"destroyed\",(function(){r.removeAttr(t);})),!1)}function Rc(e,t){void 0===t&&(t=\"\");var n=[];\"\"===t&&(t=\"<p><br></p>\"),0!==t.indexOf(\"<\")&&(t=t.split(/\\n/).map((function(e){return \"<p>\"+e+\"</p>\"})).join(\"\"));var r=y.default(\"<div>\"+t+\"</div>\");return Array.from(r.children()).forEach((function(t){var r=Lc(y.default(t),e);Array.isArray(r)?r.forEach((function(e){return n.push(e)})):n.push(r);})),n}var Dc=Ve.f,jc=pa.fastKey,Ac=ct.set,_c=ct.getterFor,Fc={getConstructor:function(e,t,n,r){var o=e((function(e,o){ba(e,i),Ac(e,{type:t,index:yr(null),first:void 0,last:void 0,size:0}),ye||(e.size=0),null!=o&&ya(o,e[r],{that:e,AS_ENTRIES:n});})),i=o.prototype,a=_c(t),s=function(e,t,n){var r,o,i=a(e),s=l(e,t);return s?s.value=n:(i.last=s={index:o=jc(t,!0),key:t,value:n,previous:r=i.last,next:void 0,removed:!1},i.first||(i.first=s),r&&(r.next=s),ye?i.size++:e.size++,\"F\"!==o&&(i.index[o]=s)),e},l=function(e,t){var n,r=a(e),o=jc(t);if(\"F\"!==o)return r.index[o];for(n=r.first;n;n=n.next)if(n.key==t)return n};return na(i,{clear:function(){for(var e=a(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete t[n.index],n=n.next;e.first=e.last=void 0,ye?e.size=0:this.size=0;},delete:function(e){var t=this,n=a(t),r=l(t,e);if(r){var o=r.next,i=r.previous;delete n.index[r.index],r.removed=!0,i&&(i.next=o),o&&(o.previous=i),n.first==r&&(n.first=o),n.last==r&&(n.last=i),ye?n.size--:t.size--;}return !!r},forEach:function(e){for(var t,n=a(this),r=Mt(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous;},has:function(e){return !!l(this,e)}}),na(i,n?{get:function(e){var t=l(this,e);return t&&t.value},set:function(e,t){return s(this,0===e?0:e,t)}}:{add:function(e){return s(this,e=0===e?0:e,e)}}),ye&&Dc(i,\"size\",{get:function(){return a(this).size}}),o},setStrong:function(e,t,n){var r=t+\" Iterator\",o=_c(t),i=_c(r);Po(e,t,(function(e,t){Ac(this,{type:r,target:e,state:o(e),kind:t,last:void 0});}),(function(){for(var e=i(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?\"keys\"==t?{value:n.key,done:!1}:\"values\"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?\"entries\":\"values\",!n,!0),pl(t);}};xa(\"Set\",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),Fc);var Ic=new Set([\"doctype\",\"!doctype\",\"meta\",\"script\",\"style\",\"link\",\"frame\",\"iframe\",\"title\",\"svg\"]);function Bc(e,n){e.isInline(n)?(e.insertNode(n),\"link\"===n.type&&e.insertFragment([{text:\"\"}])):t.Transforms.insertNodes(e,n,{mode:\"highest\"});}var $c=function(e){var n=e,r=n.onChange,o=n.insertText,i=n.apply,a=n.deleteBackward;return n.insertText=function(e){n.getConfig().readOnly||o(e);},n.apply=function(e){var r,o,a,s,l,u,c,f,d=[];switch(e.type){case\"insert_text\":case\"remove_text\":case\"set_node\":try{for(var p=qi(t.Editor.levels(n,{at:e.path})),h=p.next();!h.done;h=p.next()){var g=Gi(h.value,2),v=g[0],y=g[1],m=Hs.findKey(n,v);d.push([y,m]);}}catch(e){r={error:e};}finally{try{h&&!h.done&&(o=p.return)&&o.call(p);}finally{if(r)throw r.error}}break;case\"insert_node\":case\"remove_node\":case\"merge_node\":case\"split_node\":try{for(var b=qi(t.Editor.levels(n,{at:t.Path.parent(e.path)})),w=b.next();!w.done;w=b.next()){var x=Gi(w.value,2);v=x[0],y=x[1],m=Hs.findKey(n,v);d.push([y,m]);}}catch(e){a={error:e};}finally{try{w&&!w.done&&(s=b.return)&&s.call(b);}finally{if(a)throw a.error}}break;case\"move_node\":try{for(var E=qi(t.Editor.levels(n,{at:t.Path.common(t.Path.parent(e.path),t.Path.parent(e.newPath))})),S=E.next();!S.done;S=E.next()){var k=Gi(S.value,2);v=k[0],y=k[1],m=Hs.findKey(n,v);d.push([y,m]);}}catch(e){l={error:e};}finally{try{S&&!S.done&&(u=E.return)&&u.call(E);}finally{if(l)throw l.error}}}i(e);try{for(var O=qi(d),C=O.next();!C.done;C=O.next()){var T=Gi(C.value,2);y=T[0],m=T[1],v=Gi(t.Editor.node(n,y),1)[0];ps.set(v,m);}}catch(e){c={error:e};}finally{try{C&&!C.done&&(f=O.return)&&f.call(O);}finally{if(c)throw c.error}}},n.deleteBackward=function(r){if(\"line\"!==r)return a(r);if(e.selection&&t.Range.isCollapsed(e.selection)){var o=t.Editor.above(e,{match:function(n){return t.Editor.isBlock(e,n)},at:e.selection});if(o){var i=Gi(o,2)[1],s=t.Editor.range(e,i,e.selection.anchor),l=function(e,n){var r=t.Editor.range(e,t.Range.end(n)),o=Array.from(t.Editor.positions(e,{at:n})),i=0,a=o.length,s=Math.floor(a/2);if(Ju(e,t.Editor.range(e,o[i]),r))return t.Editor.range(e,o[i],r);if(o.length<2)return t.Editor.range(e,o[o.length-1],r);for(;s!==o.length&&s!==i;)Ju(e,t.Editor.range(e,o[s]),r)?a=s:i=s,s=Math.floor((i+a)/2);return t.Editor.range(e,o[a],r)}(n,s);t.Range.isCollapsed(l)||t.Transforms.delete(e,{at:l});}}},n.onChange=function(){var e=n.selection;null!=e&&vs.set(n,e),n.emit(\"change\"),r();},n.handleTab=function(){n.insertText(\"    \");},n.getHtml=function(){var e=n.children;return (void 0===e?[]:e).map((function(e){return Ku(e,n)})).join(\"\")},n.getText=function(){var e=n.children;return (void 0===e?[]:e).map((function(e){return t.Node.string(e)})).join(\"\\n\")},n.getSelectionText=function(){var r=n.selection;return null==r?\"\":t.Editor.string(e,r)},n.getElemsByType=function(e,r){var o,i;void 0===r&&(r=!1);var a=[],s=t.Editor.nodes(n,{at:[],universal:!0});try{for(var l=qi(s),u=l.next();!u.done;u=l.next()){var c=Gi(u.value,1)[0];if(t.Element.isElement(c))if(r?c.type.indexOf(e)>=0:c.type===e){var f=qu(Hs.findKey(n,c).id);a.push(Ki(Ki({},c),{id:f}));}}}catch(e){o={error:e};}finally{try{u&&!u.done&&(i=l.return)&&i.call(l);}finally{if(o)throw o.error}}return a},n.getElemsByTypePrefix=function(e){return n.getElemsByType(e,!0)},n.isEmpty=function(){var e=n.children,r=void 0===e?[]:e;if(r.length>1)return !1;var o=r[0];if(null==o)return !0;if(t.Element.isElement(o)&&\"paragraph\"===o.type){var i=o.children,a=void 0===i?[]:i;if(a.length>1)return !1;var s=a[0];if(null==s)return !0;if(t.Text.isText(s)&&\"\"===s.text)return !0}return !1},n.clear=function(){t.Transforms.delete(n,{at:{anchor:t.Editor.start(n,[]),focus:t.Editor.end(n,[])}}),0===n.children.length&&t.Transforms.insertNodes(n,[{type:\"paragraph\",children:[{text:\"\"}]}]);},n.getParentNode=function(e){return Hs.getParentNode(n,e)},n.dangerouslyInsertHtml=function(e,r){if(void 0===e&&(e=\"\"),void 0===r&&(r=!1),e){var o=document.createElement(\"div\");o.innerHTML=e;var i=Array.from(o.childNodes);if(i=i.filter((function(e){var t=e.nodeType,n=e.nodeName;return t===Ss.TEXT_NODE||t===Ss.ELEMENT_NODE&&!Ic.has(n.toLowerCase())})),0!==i.length){var a=n.selection;if(null!=a){var s=null;if(Hs.isSelectedEmptyParagraph(n)&&!r)s=[a.focus.path[0]];o.setAttribute(\"hidden\",\"true\"),document.body.appendChild(o);var l=0;i.forEach((function(e){var t=e.nodeType,r=e.nodeName,o=e.textContent,i=void 0===o?\"\":o;if(t!==Ss.TEXT_NODE)if(\"BR\"!==r){var a=e,s=!1;if(Yu.includes(r.toLowerCase()))s=!0;else for(var u in Zu)if(a.matches(u)){s=!0;break}if(s){var c=Lc(y.default(a),n);return Array.isArray(c)?(c.forEach((function(e){return Bc(n,e)})),l++):(Bc(n,c),l++),void(Hs.isSelectedVoidNode(n)&&n.move(1))}var f=window.getComputedStyle(a).display;Hs.isSelectedEmptyParagraph(n)||f.indexOf(\"inline\")<0&&n.insertBreak(),n.dangerouslyInsertHtml(a.innerHTML,!0);}else n.insertText(\"\\n\");else {if(!i||!i.trim())return;n.insertNode({text:i});}})),l&&s&&Hs.isEmptyPath(n,s)&&t.Transforms.removeNodes(n,{at:s}),o.remove();}}}},n.setHtml=function(e){void 0===e&&(e=\"\");var r=n.isDisabled(),o=n.isFocused(),i=JSON.stringify(n.selection);n.enable(),n.focus(),n.clear();var a=Rc(n,e);if(t.Transforms.insertFragment(n,a),o||(n.deselect(),n.blur()),r&&(n.deselect(),n.disable()),n.isFocused())try{n.select(JSON.parse(i));}catch(e){n.select(t.Editor.start(n,[]));}},n},Wc=function(e){var n=e,r=n.insertText;return n.insertFragment,n.setFragmentData=function(e){var r=n.selection;if(r){var o=Gi(t.Range.edges(r),2),i=o[0],a=o[1],s=t.Editor.void(n,{at:i.path}),l=t.Editor.void(n,{at:a.path});if(!t.Range.isCollapsed(r)||s){var u=Hs.toDOMRange(n,r),c=u.cloneContents(),f=c.childNodes[0];if(c.childNodes.forEach((function(e){e.textContent&&\"\"!==e.textContent.trim()&&(f=e);})),l){var d=Gi(l,1)[0],p=u.cloneRange(),h=Hs.toDOMNode(n,d);p.setEndAfter(h),c=p.cloneContents();}if(s&&(f=c.querySelector(\"[data-slate-spacer]\")),Array.from(c.querySelectorAll(\"[data-slate-zero-width]\")).forEach((function(e){var t=\"n\"===e.getAttribute(\"data-slate-zero-width\");e.textContent=t?\"\\n\":\"\";})),Ns(f)){var g=f.ownerDocument.createElement(\"span\");g.style.whiteSpace=\"pre\",g.appendChild(f),c.appendChild(g),f=g;}var v=n.getFragment(),y=JSON.stringify(v),m=window.btoa(encodeURIComponent(y));f.setAttribute(\"data-slate-fragment\",m),e.setData(\"application/x-slate-fragment\",m);var b=c.ownerDocument.createElement(\"div\");return b.appendChild(c),b.setAttribute(\"hidden\",\"true\"),c.ownerDocument.body.appendChild(b),e.setData(\"text/html\",b.innerHTML),e.setData(\"text/plain\",Rs(b)),c.ownerDocument.body.removeChild(b),e}}},n.insertData=function(e){var o,i,a=e.getData(\"application/x-slate-fragment\");if(a){var s=decodeURIComponent(window.atob(a)),l=JSON.parse(s);n.insertFragment(l);}else {var u=e.getData(\"text/plain\"),c=e.getData(\"text/html\");if(c)n.dangerouslyInsertHtml(c);else if(u){var f=u.split(/\\r\\n|\\r|\\n/),d=!1;try{for(var p=qi(f),h=p.next();!h.done;h=p.next()){var g=h.value;d&&t.Transforms.splitNodes(n,{always:!0}),r(g),d=!0;}}catch(e){o={error:e};}finally{try{h&&!h.done&&(i=p.return)&&i.call(p);}finally{if(o)throw o.error}}}else;}},n},Hc=function(e){return null!=e},Vc={object:!0,function:!0,undefined:!0},zc=function(e){if(!function(e){return !!Hc(e)&&hasOwnProperty.call(Vc,typeof e)}(e))return !1;try{return !!e.constructor&&e.constructor.prototype===e}catch(e){return !1}},Uc=/^\\s*class[\\s{/}]/,Kc=Function.prototype.toString,qc=function(e){return !!function(e){if(\"function\"!=typeof e)return !1;if(!hasOwnProperty.call(e,\"length\"))return !1;try{if(\"number\"!=typeof e.length)return !1;if(\"function\"!=typeof e.call)return !1;if(\"function\"!=typeof e.apply)return !1}catch(e){return !1}return !zc(e)}(e)&&!Uc.test(Kc.call(e))},Gc=function(e){return null!=e},Jc=Object.keys,Yc=function(){try{return Object.keys(\"primitive\"),!0}catch(e){return !1}}()?Object.keys:function(e){return Jc(Gc(e)?Object(e):e)},Xc=function(e){if(!Gc(e))throw new TypeError(\"Cannot use null or undefined\");return e},Qc=Math.max,Zc=function(){var e,t=Object.assign;return \"function\"==typeof t&&(t(e={foo:\"raz\"},{bar:\"dwa\"},{trzy:\"trzy\"}),e.foo+e.bar+e.trzy===\"razdwatrzy\")}()?Object.assign:function(e,t){var n,r,o,i=Qc(arguments.length,2);for(e=Object(Xc(e)),o=function(r){try{e[r]=t[r];}catch(e){n||(n=e);}},r=1;r<i;++r)Yc(t=arguments[r]).forEach(o);if(void 0!==n)throw n;return e},ef=Array.prototype.forEach,tf=Object.create,nf=function(e,t){var n;for(n in e)t[n]=e[n];},rf=function(e){var t=tf(null);return ef.call(arguments,(function(e){Gc(e)&&nf(Object(e),t);})),t},of=\"razdwatrzy\",af=String.prototype.indexOf,sf=\"function\"==typeof of.contains&&!0===of.contains(\"dwa\")&&!1===of.contains(\"foo\")?String.prototype.contains:function(e){return af.call(this,e,arguments[1])>-1},lf=T((function(e){var t=e.exports=function(e,t){var n,r,o,i,a;return arguments.length<2||\"string\"!=typeof e?(i=t,t=e,e=null):i=arguments[2],Hc(e)?(n=sf.call(e,\"c\"),r=sf.call(e,\"e\"),o=sf.call(e,\"w\")):(n=o=!0,r=!1),a={value:t,configurable:n,enumerable:r,writable:o},i?Zc(rf(i),a):a};t.gs=function(e,t,n){var r,o,i,a;return \"string\"!=typeof e?(i=n,n=t,t=e,e=null):i=arguments[3],Hc(t)?qc(t)?Hc(n)?qc(n)||(i=n,n=void 0):n=void 0:(i=t,t=n=void 0):t=void 0,Hc(e)?(r=sf.call(e,\"c\"),o=sf.call(e,\"e\")):(r=!0,o=!1),a={get:t,set:n,configurable:r,enumerable:o},i?Zc(rf(i),a):a};})),uf=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e},cf=T((function(e,t){var n,r,o,i,a,s,l,u=Function.prototype.apply,c=Function.prototype.call,f=Object.create,d=Object.defineProperty,p=Object.defineProperties,h=Object.prototype.hasOwnProperty,g={configurable:!0,enumerable:!1,writable:!0};n=function(e,t){var n;return uf(t),h.call(this,\"__ee__\")?n=this.__ee__:(n=g.value=f(null),d(this,\"__ee__\",g),g.value=null),n[e]?\"object\"==typeof n[e]?n[e].push(t):n[e]=[n[e],t]:n[e]=t,this},r=function(e,t){var r,i;return uf(t),i=this,n.call(this,e,r=function(){o.call(i,e,r),u.call(t,this,arguments);}),r.__eeOnceListener__=t,this},o=function(e,t){var n,r,o,i;if(uf(t),!h.call(this,\"__ee__\"))return this;if(!(n=this.__ee__)[e])return this;if(\"object\"==typeof(r=n[e]))for(i=0;o=r[i];++i)o!==t&&o.__eeOnceListener__!==t||(2===r.length?n[e]=r[i?0:1]:r.splice(i,1));else r!==t&&r.__eeOnceListener__!==t||delete n[e];return this},i=function(e){var t,n,r,o,i;if(h.call(this,\"__ee__\")&&(o=this.__ee__[e]))if(\"object\"==typeof o){for(n=arguments.length,i=new Array(n-1),t=1;t<n;++t)i[t-1]=arguments[t];for(o=o.slice(),t=0;r=o[t];++t)u.call(r,this,i);}else switch(arguments.length){case 1:c.call(o,this);break;case 2:c.call(o,this,arguments[1]);break;case 3:c.call(o,this,arguments[1],arguments[2]);break;default:for(n=arguments.length,i=new Array(n-1),t=1;t<n;++t)i[t-1]=arguments[t];u.call(o,this,i);}},a={on:n,once:r,off:o,emit:i},s={on:lf(n),once:lf(r),off:lf(o),emit:lf(i)},l=p({},s),e.exports=t=function(e){return null==e?f(l):p(Object(e),s)},t.methods=a;}));function ff(e){var t=ys.get(e);return null==t&&(t=cf(),ys.set(e,t)),t}var df=new WeakMap;function pf(e,t){var n=df.get(e);null==n&&(n=new Set,df.set(e,n)),n.add(t);}function hf(e){return df.get(e)||new Set}function gf(e){df.set(e,new Set);}function vf(e){var t=Hs.getTextarea(e).$textAreaContainer,n=t.width(),r=t.height(),o=t.offset();return {top:o.top,left:o.left,width:n,height:r}}function yf(e){var t={top:\"0\",left:\"0\"},n=e.selection;if(null==n)return t;var r=vf(e);if(null==r)return t;var o=r.top,i=r.left,a=r.width,s=r.height,l=Hs.toDOMRange(e,n).getClientRects()[0];if(null==l)return t;l.width;var u=l.height,c={},f=l.top-o,d=l.left-i;if(d>a/2){var p=a-d;c.right=p+5+\"px\";}else c.left=d+5+\"px\";if(f>s/2){var h=s-f;c.bottom=h+5+\"px\";}else {var g=f+u;g<0&&(g=0),c.top=g+5+\"px\";}return c}function mf(e,n,r){void 0===r&&(r=\"modal\");var o={top:\"0\",left:\"0\"};if(null==e.selection)return o;var i=t.Element.isElement(n)&&e.isVoid(n),a=t.Element.isElement(n)&&e.isInline(n),s=ds.get(n);if(null==s)return o;var l=s.getBoundingClientRect(),u=l.top,c=l.left,f=l.height,d=l.width;if(i){var p=function(e){var t=[];t.push(e);for(var n=0;t.length>0;){var r=t.pop();if(null==r)break;if(++n>1e4)break;var o=r.nodeName;if(1===r.nodeType){var i=o.toLowerCase();if(Es.includes(i)||\"iframe\"===i||\"video\"===i)return r;var a=r.children||[],s=a.length;if(s)for(var l=s-1;l>=0;l--)t.push(a[l]);}}return null}(s);if(null!=p){var h=p.getBoundingClientRect();u=h.top,f=h.height;}}var g=vf(e);if(null==g)return o;var v=g.top,y=g.left,m=g.width,b=g.height,w={},x=u-v,E=c-y;if(\"bar\"===r)return w.left=E+\"px\",x>40?w.bottom=b-x+5+\"px\":w.top=x+f+5+\"px\",w;if(\"modal\"===r){var S;if(i?a?E>(m-d)/2?w.right=m-E+5+\"px\":w.left=E+d+5+\"px\":w.left=\"20px\":w.left=E+\"px\",i)(S=x)<0&&(S=0),w.top=S+\"px\";else if(x>(b-f)/2)w.bottom=b-x+5+\"px\";else (S=x+f)<0&&(S=0),w.top=S+5+\"px\";return w}throw new Error(\"type '\"+r+\"' is invalid\")}function bf(e,t){Uu((function(){var n=vf(e);if(null!=n){var r,o=n.top,i=n.left,a=n.width,s=n.height,l=t.offset(),u=l.top,c=l.left,f=t.width(),d=t.height(),p=u-o,h=c-i,g=t.attr(\"style\");if(g.indexOf(\"top\")>=0)if((r=p+d-s)>0){var v=t.css(\"top\"),y=parseInt(v.toString())-r;y<0&&(y=0),t.css(\"top\",y+\"px\");}if(g.indexOf(\"bottom\")>=0&&u<0){var m=t.css(\"bottom\"),b=parseInt(m.toString())-Math.abs(u);t.css(\"bottom\",b+\"px\");}if(g.indexOf(\"left\")>=0)if((r=h+f-a)>0){var w=t.css(\"left\"),x=parseInt(w.toString())-r;x<0&&(x=0),t.css(\"left\",x+\"px\");}if(g.indexOf(\"right\")>=0&&c<0){var E=t.css(\"right\"),S=parseInt(E.toString())-Math.abs(c);t.css(\"right\",S+\"px\");}}}));}var wf=qo(\"slice\"),xf=he(\"species\"),Ef=P.Array,Sf=Math.max;_n({target:\"Array\",proto:!0,forced:!wf},{slice:function(e,t){var n,r,o,i=cn(this),a=It(i),s=gn(e,a),l=gn(void 0===t?a:t,a);if(Bt(i)&&(n=i.constructor,(qt(n)&&(n===Ef||Bt(n.prototype))||me(n)&&null===(n=n[xf]))&&(n=void 0),n===Ef||void 0===n))return yl(i,s,l);for(r=new(void 0===n?Ef:n)(Sf(l-s,0)),o=0;s<l;s++,o++)s in i&&Ir(r,o,i[s]);return r.length=o,r}});var kf=dn.f,Of=W(\"\".startsWith),Cf=W(\"\".slice),Tf=Math.min,Nf=Tr(\"startsWith\"),Mf=!Nf&&!!function(){var e=kf(String.prototype,\"startsWith\");return e&&!e.writable}();_n({target:\"String\",proto:!0,forced:!Mf&&!Nf},{startsWith:function(e){var t=er(V(this));Or(e);var n=Ft(Tf(arguments.length>1?arguments[1]:void 0,t.length)),r=er(e);return Of?Of(t,r,n):Cf(t,n,n+r.length)===r}});var Lf=Object.assign,Pf=Object.defineProperty,Rf=W([].concat),Df=!Lf||se((function(){if(ye&&1!==Lf({b:1},Lf(Pf({},\"a\",{enumerable:!0,get:function(){Pf(this,\"b\",{value:3,enumerable:!1});}}),{b:2})).b)return !0;var e={},t={},n=Symbol(),r=\"abcdefghijklmnopqrst\";return e[n]=7,r.split(\"\").forEach((function(e){t[e]=e;})),7!=Lf({},e)[n]||Fn(Lf({},t)).join(\"\")!=r}))?function(e,t){for(var n=U(e),r=arguments.length,o=1,i=kn.f,a=un.f;r>o;)for(var s,l=Rt(arguments[o++]),u=i?Rf(Fn(l),i(l)):Fn(l),c=u.length,f=0;c>f;)s=u[f++],ye&&!Te(a,l,s)||(n[s]=l[s]);return n}:Lf;_n({target:\"Object\",stat:!0,forced:Object.assign!==Df},{assign:Df});var jf=[\"props\",\"attrs\",\"style\",\"dataset\",\"on\",\"hook\"];function Af(e){var t=e.data,n=void 0===t?{}:t,r=e.children,o=void 0===r?[]:r;Object.keys(n).forEach((function(t){var r,o,i=n[t];if(\"key\"!==t){if(!jf.includes(t)){if(t.startsWith(\"data-\")){var a=t.slice(5);return a=w.default(a),function(e,t){null==e.data&&(e.data={});var n=e.data;null==n.dataset&&(n.dataset={});Object.assign(n.dataset,t);}(e,((r={})[a]=i,r)),void delete n[t]}!function(e,t){null==e.data&&(e.data={});var n=e.data;null==n.props&&(n.props={});Object.assign(n.props,t);}(e,(o={},o[t]=i,o)),delete n[t];}}else e.key=i;})),o.length>0&&o.forEach((function(e){\"string\"!=typeof e&&Af(e);}));}var _f=[];var Ff={};function If(e,t,n){var r=n.isInline(e)?\"span\":\"div\";return s.jsx(r,null,t)}function Bf(e,n){var r,o=Hs.findKey(n,e),i=n.isInline(e),a=t.Editor.isVoid(n,e),l=qu(o.id),u={id:l,key:o.id,\"data-slate-node\":\"element\",\"data-slate-inline\":i},c=e.type,f=e.children,d=void 0===f?[]:f,p=function(e){return Ff[e]||If}(c);r=a?null:d.map((function(t,r){return Vf(t,r,e,n)}));var h=p(e,r,n);if(a){u[\"data-slate-void\"]=!0;var g=i?\"span\":\"div\",v=Gi(t.Node.texts(e),1),y=Gi(v[0],1)[0],m=Vf(y,0,e,n),b=s.jsx(g,{\"data-slate-spacer\":!0,style:{height:\"0\",color:\"transparent\",outline:\"none\",position:\"absolute\"}},m);h=s.jsx(g,{style:{position:\"relative\"}},h,b),ss.set(y,0),ls.set(y,e);}return null==h.data&&(h.data={}),Object.assign(h.data,u),a||i||(h=function(e,t){var n=t;return _f.forEach((function(r){n=r(e,t);})),n}(e,h)),Uu((function(){var t=Ms(l);null!=t&&(fs.set(o,t),ds.set(e,t),cs.set(t,e));})),h}function $f(e,t){return void 0===t&&(t=!1),s.jsx(\"span\",{\"data-slate-string\":!0},t?e+\"\\n\":e)}function Wf(e,t){return void 0===e&&(e=0),void 0===t&&(t=!1),s.jsx(\"span\",{\"data-slate-zero-width\":t?\"n\":\"z\",\"data-slate-length\":e},\"\\ufeff\",t?s.jsx(\"br\",null):null)}function Hf(e,n,r){if(null==e.text)throw new Error(\"Current node is not slate Text \"+JSON.stringify(e));var o=Hs.findKey(r,e),i=r.getConfig().decorate;if(null==i)throw new Error(\"Can not get config.decorate\");var a=Hs.findPath(r,e),l=i([e,a]),u=t.Text.decorations(e,l),c=u.map((function(o,i){var a=function(e,n,r,o,i){void 0===n&&(n=!1);var a=e.text,s=Hs.findPath(i,r),l=t.Path.parent(s);if(t.Editor.isEditor(o))throw new Error(\"Text node \"+JSON.stringify(r)+\" parent is Editor\");return i.isVoid(o)?Wf(t.Node.string(o).length):\"\"!==a||o.children[o.children.length-1]!==r||i.isInline(o)||\"\"!==t.Editor.string(i,l)?\"\"===a?Wf():n&&\"\\n\"===a.slice(-1)?$f(a,!0):$f(a):Wf(0,!0)}(o,i===u.length-1,e,n,r);return a=function(e,t){var n=t;return _f.forEach((function(t){n=t(e,n);})),n}(o,a),s.jsx(\"span\",{\"data-slate-leaf\":!0},a)})),f=function(e){return \"w-e-text-\"+e}(o.id),d=s.jsx(\"span\",{\"data-slate-node\":\"text\",id:f,key:o.id},c);return Uu((function(){var t=Ms(f);null!=t&&(fs.set(o,t),ds.set(e,t),cs.set(t,e));})),d}function Vf(e,n,r,o){return ss.set(e,n),ls.set(e,r),t.Element.isElement(e)?Bf(e,o):Hf(e,r,o)}function zf(e,t){var n,r=e.$scroll,o=function(e){return \"w-e-textarea-\"+e}(e.id),i=t.getConfig(),a=i.readOnly,l=i.autoFocus,u=function(e,t){return void 0===t&&(t=!1),s.h(\"div#\"+e,{props:{contentEditable:!t}})}(o,a),c=t.children||[];u.children=c.map((function(e,n){var r=Vf(e,n,t,t);return Af(r),r}));var f=os.get(e);if(null==f&&(f=!0),f){var d=function(e,t){return y.default('<div\\n        id=\"'+e+'\"\\n        data-slate-editor\\n        data-slate-node=\"value\"\\n        suppressContentEditableWarning\\n        role=\"textarea\"\\n        spellCheck=\"true\"\\n        autoCorrect=\"true\"\\n        autoCapitalize=\"true\"\\n    ></div>')}(o);r.append(d),e.$textArea=d,n=d[0],(h=s.init([s.classModule,s.propsModule,s.styleModule,s.datasetModule,s.eventListenersModule,s.attributesModule]))(n,u),os.set(e,!1),is.set(e,h);}else {var p=as.get(e),h=is.get(e);if(null==p||null==h)return;n=p.elm,h(p,u);}if(null!=n||null!=(n=Ms(o))){if((f?l:t.isFocused())&&n.focus({preventScroll:!0}),f){var g=ks(n);g&&hs.set(t,g);}us.set(t,n),ds.set(t,n),cs.set(n,t),as.set(e,u);}}function Uf(e){return \"object\"==typeof e&&null!=e&&1===e.nodeType}function Kf(e,t){return (!t||\"hidden\"!==e)&&\"visible\"!==e&&\"clip\"!==e}function qf(e,t){if(e.clientHeight<e.scrollHeight||e.clientWidth<e.scrollWidth){var n=getComputedStyle(e,null);return Kf(n.overflowY,t)||Kf(n.overflowX,t)||function(e){var t=function(e){if(!e.ownerDocument||!e.ownerDocument.defaultView)return null;try{return e.ownerDocument.defaultView.frameElement}catch(e){return null}}(e);return !!t&&(t.clientHeight<e.scrollHeight||t.clientWidth<e.scrollWidth)}(e)}return !1}function Gf(e,t,n,r,o,i,a,s){return i<e&&a>t||i>e&&a<t?0:i<=e&&s<=n||a>=t&&s>=n?i-e-r:a>t&&s<n||i<e&&s>n?a-t+o:0}var Jf=function(e,t){var n=window,r=t.scrollMode,o=t.block,i=t.inline,a=t.boundary,s=t.skipOverflowHiddenElements,l=\"function\"==typeof a?a:function(e){return e!==a};if(!Uf(e))throw new TypeError(\"Invalid target\");for(var u=document.scrollingElement||document.documentElement,c=[],f=e;Uf(f)&&l(f);){if((f=f.parentElement)===u){c.push(f);break}null!=f&&f===document.body&&qf(f)&&!qf(document.documentElement)||null!=f&&qf(f,s)&&c.push(f);}for(var d=n.visualViewport?n.visualViewport.width:innerWidth,p=n.visualViewport?n.visualViewport.height:innerHeight,h=window.scrollX||pageXOffset,g=window.scrollY||pageYOffset,v=e.getBoundingClientRect(),y=v.height,m=v.width,b=v.top,w=v.right,x=v.bottom,E=v.left,S=\"start\"===o||\"nearest\"===o?b:\"end\"===o?x:b+y/2,k=\"center\"===i?E+m/2:\"end\"===i?w:E,O=[],C=0;C<c.length;C++){var T=c[C],N=T.getBoundingClientRect(),M=N.height,L=N.width,P=N.top,R=N.right,D=N.bottom,j=N.left;if(\"if-needed\"===r&&b>=0&&E>=0&&x<=p&&w<=d&&b>=P&&x<=D&&E>=j&&w<=R)return O;var A=getComputedStyle(T),_=parseInt(A.borderLeftWidth,10),F=parseInt(A.borderTopWidth,10),I=parseInt(A.borderRightWidth,10),B=parseInt(A.borderBottomWidth,10),$=0,W=0,H=\"offsetWidth\"in T?T.offsetWidth-T.clientWidth-_-I:0,V=\"offsetHeight\"in T?T.offsetHeight-T.clientHeight-F-B:0;if(u===T)$=\"start\"===o?S:\"end\"===o?S-p:\"nearest\"===o?Gf(g,g+p,p,F,B,g+S,g+S+y,y):S-p/2,W=\"start\"===i?k:\"center\"===i?k-d/2:\"end\"===i?k-d:Gf(h,h+d,d,_,I,h+k,h+k+m,m),$=Math.max(0,$+g),W=Math.max(0,W+h);else {$=\"start\"===o?S-P-F:\"end\"===o?S-D+B+V:\"nearest\"===o?Gf(P,D,M,F,B+V,S,S+y,y):S-(P+M/2)+V/2,W=\"start\"===i?k-j-_:\"center\"===i?k-(j+L/2)+H/2:\"end\"===i?k-R+I+H:Gf(j,R,L,_,I+H,k,k+m,m);var z=T.scrollLeft,U=T.scrollTop;S+=U-($=Math.max(0,Math.min(U+$,T.scrollHeight-M+V))),k+=z-(W=Math.max(0,Math.min(z+W,T.scrollWidth-L+H)));}O.push({el:T,top:$,left:W});}return O},Yf=T((function(e,t){t.__esModule=!0,t.default=void 0;var n,r=(n=Jf)&&n.__esModule?n:{default:n};function o(e){return e===Object(e)&&0!==Object.keys(e).length}var i=function(e,t){var n=!e.ownerDocument.documentElement.contains(e);if(o(t)&&\"function\"==typeof t.behavior)return t.behavior(n?[]:(0, r.default)(e,t));if(!n){var i=function(e){return !1===e?{block:\"end\",inline:\"nearest\"}:o(e)?e:{block:\"start\",inline:\"nearest\"}}(t);return function(e,t){void 0===t&&(t=\"auto\");var n=\"scrollBehavior\"in document.body.style;e.forEach((function(e){var r=e.el,o=e.top,i=e.left;r.scroll&&n?r.scroll({top:o,left:i,behavior:t}):(r.scrollTop=o,r.scrollLeft=i);}));}((0, r.default)(e,i),i.behavior)}};t.default=i,e.exports=t.default;})),Xf=C(Yf);function Qf(e,t){return Cs(t)&&Hs.hasDOMNode(e,t,{editable:!0})}function Zf(e,n){if(e.getConfig().readOnly)return !1;var r=ed(e,n)&&Hs.toSlateNode(e,n);return t.Editor.isVoid(e,r)}function ed(e,t){return Cs(t)&&Hs.hasDOMNode(e,t)}function td(e,n,r){void 0===r&&(r=!1);var o=n.selection,i=n.getConfig(),a=Hs.findDocumentOrShadowRoot(n).getSelection();if(a&&(!e.isComposing||r)&&n.isFocused()){var s=\"None\"!==a.type;if(o||s){var l=us.get(n),u=!1;if(l.contains(a.anchorNode)&&l.contains(a.focusNode)&&(u=!0),s&&u&&o){var c=Hs.toSlateRange(n,a,{exactMatch:!0,suppressThrow:!0});if(c&&t.Range.equals(c,o)){var f=!0;if(t.Range.isCollapsed(o)){var d=a.anchorNode,p=a.anchorOffset;if(d===l){var h=l.childNodes,g=void 0;(g=h[p])&&g.matches(\"table\")&&(f=!1),(g=h[p-1])&&g.matches(\"table\")&&(f=!1);}}if(f)return}}if(!o||Hs.hasRange(n,o)){e.isUpdatingSelection=!0;var v=o&&Hs.toDOMRange(n,o);if(v){t.Range.isBackward(o)?a.setBaseAndExtent(v.endContainer,v.endOffset,v.startContainer,v.startOffset):a.setBaseAndExtent(v.startContainer,v.startOffset,v.endContainer,v.endOffset);var y=v.startContainer.parentElement;if(!y.closest(\"[data-slate-spacer]\")){y.getBoundingClientRect=v.getBoundingClientRect.bind(v);var m=document.body;Xf(y,{scrollMode:\"if-needed\",boundary:i.scroll?l.parentElement:m,block:\"end\",behavior:\"smooth\"}),delete y.getBoundingClientRect;}}else a.removeAllRanges();setTimeout((function(){v&&_s&&l.focus(),e.isUpdatingSelection=!1;}));}else n.selection=Hs.toSlateRange(n,a,{exactMatch:!1,suppressThrow:!1});}}}var nd=new WeakMap,rd=new WeakMap;var od={bold:\"mod+b\",compose:[\"down\",\"left\",\"right\",\"up\",\"backspace\",\"enter\"],moveBackward:\"left\",moveForward:\"right\",moveWordBackward:\"ctrl+left\",moveWordForward:\"ctrl+right\",deleteBackward:\"shift?+backspace\",deleteForward:\"shift?+delete\",extendBackward:\"shift+left\",extendForward:\"shift+right\",italic:\"mod+i\",splitBlock:\"shift?+enter\",undo:\"mod+z\",tab:\"tab\",selectAll:\"mod+a\"},id={moveLineBackward:\"opt+up\",moveLineForward:\"opt+down\",moveWordBackward:\"opt+left\",moveWordForward:\"opt+right\",deleteBackward:[\"ctrl+backspace\",\"ctrl+h\"],deleteForward:[\"ctrl+delete\",\"ctrl+d\"],deleteLineBackward:\"cmd+shift?+backspace\",deleteLineForward:[\"cmd+shift?+delete\",\"ctrl+k\"],deleteWordBackward:\"opt+shift?+backspace\",deleteWordForward:\"opt+shift?+delete\",extendLineBackward:\"opt+shift+up\",extendLineForward:\"opt+shift+down\",redo:\"cmd+shift+z\",transposeCharacter:\"ctrl+t\"},ad={deleteWordBackward:\"ctrl+shift?+backspace\",deleteWordForward:\"ctrl+shift?+delete\",redo:[\"ctrl+y\",\"ctrl+shift+z\"]},sd=function(e){var t=od[e],n=id[e],r=ad[e],o=t&&u.isKeyHotkey(t),i=n&&u.isKeyHotkey(n),a=r&&u.isKeyHotkey(r);return function(e){return !(!o||!o(e))||(!!(As&&i&&i(e))||!(As||!a||!a(e)))}},ld={isBold:sd(\"bold\"),isCompose:sd(\"compose\"),isMoveBackward:sd(\"moveBackward\"),isMoveForward:sd(\"moveForward\"),isDeleteBackward:sd(\"deleteBackward\"),isDeleteForward:sd(\"deleteForward\"),isDeleteLineBackward:sd(\"deleteLineBackward\"),isDeleteLineForward:sd(\"deleteLineForward\"),isDeleteWordBackward:sd(\"deleteWordBackward\"),isDeleteWordForward:sd(\"deleteWordForward\"),isExtendBackward:sd(\"extendBackward\"),isExtendForward:sd(\"extendForward\"),isExtendLineBackward:sd(\"extendLineBackward\"),isExtendLineForward:sd(\"extendLineForward\"),isItalic:sd(\"italic\"),isMoveLineBackward:sd(\"moveLineBackward\"),isMoveLineForward:sd(\"moveLineForward\"),isMoveWordBackward:sd(\"moveWordBackward\"),isMoveWordForward:sd(\"moveWordForward\"),isRedo:sd(\"redo\"),isSplitBlock:sd(\"splitBlock\"),isTransposeCharacter:sd(\"transposeCharacter\"),isUndo:sd(\"undo\"),isTab:sd(\"tab\"),isSelectAll:sd(\"selectAll\")};function ud(e){e.preventDefault();}var cd={beforeinput:function(e,n,r){var o=e,i=r.getConfig().readOnly;if(Ws&&!i&&Qf(r,o.target)){var a=r.selection,s=o.inputType,l=o.dataTransfer||o.data||void 0;if(\"insertCompositionText\"!==s&&\"deleteCompositionText\"!==s){if(o.preventDefault(),!s.startsWith(\"delete\")||s.startsWith(\"deleteBy\")){var u=Gi(o.getTargetRanges(),1)[0];if(u){var c=Hs.toSlateRange(r,u,{exactMatch:!1,suppressThrow:!1});a&&t.Range.equals(a,c)||t.Transforms.select(r,c);}}if(a&&t.Range.isExpanded(a)&&s.startsWith(\"delete\")){var f=s.endsWith(\"Backward\")?\"backward\":\"forward\";t.Editor.deleteFragment(r,{direction:f});}else switch(s){case\"deleteByComposition\":case\"deleteByCut\":case\"deleteByDrag\":t.Editor.deleteFragment(r);break;case\"deleteContent\":case\"deleteContentForward\":t.Editor.deleteForward(r);break;case\"deleteContentBackward\":t.Editor.deleteBackward(r);break;case\"deleteEntireSoftLine\":t.Editor.deleteBackward(r,{unit:\"line\"}),t.Editor.deleteForward(r,{unit:\"line\"});break;case\"deleteHardLineBackward\":t.Editor.deleteBackward(r,{unit:\"block\"});break;case\"deleteSoftLineBackward\":t.Editor.deleteBackward(r,{unit:\"line\"});break;case\"deleteHardLineForward\":t.Editor.deleteForward(r,{unit:\"block\"});break;case\"deleteSoftLineForward\":t.Editor.deleteForward(r,{unit:\"line\"});break;case\"deleteWordBackward\":t.Editor.deleteBackward(r,{unit:\"word\"});break;case\"deleteWordForward\":t.Editor.deleteForward(r,{unit:\"word\"});break;case\"insertLineBreak\":case\"insertParagraph\":t.Editor.insertBreak(r);break;case\"insertFromDrop\":case\"insertFromPaste\":case\"insertFromYank\":case\"insertReplacementText\":case\"insertText\":if(\"insertFromPaste\"===s&&!ms.get(r))break;l instanceof DataTransfer?r.insertData(l):\"string\"==typeof l&&t.Editor.insertText(r,l);}}}},blur:function(e,n,r){var o=e,i=n.isUpdatingSelection,a=n.latestElement;if(!r.getConfig().readOnly&&!i&&Qf(r,o.target)){var s=Hs.findDocumentOrShadowRoot(r);if(a!==s.activeElement){var l=o.relatedTarget;if(!(l===Hs.toDOMNode(r,r)||Os(l)&&l.hasAttribute(\"data-slate-spacer\"))){if(null!=l&&Cs(l)&&Hs.hasDOMNode(r,l)){var u=Hs.toSlateNode(r,l);if(t.Element.isElement(u)&&!r.isVoid(u))return}if(Fs){var c=s.getSelection();null==c||c.removeAllRanges();}gs.delete(r);}}}},focus:function(e,t,n){var r=Hs.toDOMNode(n,n),o=Hs.findDocumentOrShadowRoot(n);t.latestElement=o.activeElement,_s&&e.target!==r?r.focus():gs.set(n,!0);},click:function(e,n,r){if(!r.getConfig().readOnly&&ed(r,e.target)&&Cs(e.target)){var o=Hs.toSlateNode(r,e.target),i=Hs.findPath(r,o);if(t.Editor.hasPath(r,i))if(t.Node.get(r,i)===o){var a=t.Editor.start(r,i),s=t.Editor.end(r,i),l=t.Editor.void(r,{at:a}),u=t.Editor.void(r,{at:s});if(l&&u&&t.Path.equals(l[1],u[1])){var c=t.Editor.range(r,a);t.Transforms.select(r,c);}}}},compositionstart:function(e,n,r){if(Qf(r,e.target)){var o=r.selection;if(o&&t.Range.isExpanded(o)&&(t.Editor.deleteFragment(r),Promise.resolve().then((function(){td(n,r,!0);}))),o&&t.Range.isCollapsed(o)){var i=Hs.toDOMRange(r,o).startContainer,a=i.textContent||\"\";nd.set(r,a),rd.set(r,i);}n.isComposing=!0,function(e,t){var n;t.getConfig().placeholder&&t.isEmpty()&&e.showPlaceholder&&(null===(n=e.$placeholder)||void 0===n||n.hide(),e.showPlaceholder=!1);}(n,r);}},compositionend:function(e,n,r){var o=e;if(Qf(r,o.target)){n.isComposing=!1;var i=r.selection;if(null!=i){($s||_s)&&Hs.cleanExposedTexNodeInSelectionBlock(r);for(var a=t.Range.isBackward(i)?i.focus:i.anchor,s=Gi(t.Editor.node(r,[a.path[0]]),1)[0],l=0;l<a.path.length;l++){var u=Gi(t.Editor.node(r,a.path.slice(0,l+1)),1)[0];if(t.Element.isElement(u)&&((Fs||_s)&&\"link\"===u.type||\"code\"===u.type)){Hs.setNewKey(s);break}}var c=o.data;if(c){if(r.getConfig().maxLength){var f=Hs.getLeftLengthOfMaxLength(r);if(f<c.length)Hs.toDOMRange(r,i).startContainer.textContent=nd.get(r)||\"\",f>0&&t.Editor.insertText(r,c.slice(0,f)),n.changeViewState();else t.Editor.insertText(r,c);}else t.Editor.insertText(r,c);Fs||setTimeout((function(){var e=r.selection;if(null!=e){var t=rd.get(r);if(null!=t)Hs.toDOMRange(r,e).startContainer!==t&&(t.textContent=nd.get(r)||\"\");}}));}}}},compositionupdate:function(e,t,n){Qf(n,e.target)&&(t.isComposing=!0);},keydown:function(e,n,r){var o=e,i=r.selection;if(!r.getConfig().readOnly&&!n.isComposing&&Qf(r,o.target)){if(function(e,t){var n=Xa.get(e),r=n&&n.getMenus(),o=Za.get(e),i=o&&o.getMenus(),a=Ki(Ki({},r),i);for(var s in a){var l=a[s],c=l.hotkey;if(c&&u.isHotkey(c,t)&&!l.isDisabled(e)){var f=l.getValue(e);l.exec(e,f);}}}(r,o),ld.isTab(o))return ud(o),void r.handleTab();if(ld.isRedo(o))return ud(o),void(\"function\"==typeof r.redo&&r.redo());if(ld.isUndo(o))return ud(o),void(\"function\"==typeof r.undo&&r.undo());if(ld.isMoveLineBackward(o))return ud(o),void t.Transforms.move(r,{unit:\"line\",reverse:!0});if(ld.isMoveLineForward(o))return ud(o),void t.Transforms.move(r,{unit:\"line\"});if(ld.isExtendLineBackward(o))return ud(o),void t.Transforms.move(r,{unit:\"line\",edge:\"focus\",reverse:!0});if(ld.isExtendLineForward(o))return ud(o),void t.Transforms.move(r,{unit:\"line\",edge:\"focus\"});if(ld.isMoveBackward(o))return ud(o),void(i&&t.Range.isCollapsed(i)?t.Transforms.move(r,{reverse:!0}):t.Transforms.collapse(r,{edge:\"start\"}));if(ld.isMoveForward(o))return ud(o),void(i&&t.Range.isCollapsed(i)?t.Transforms.move(r):t.Transforms.collapse(r,{edge:\"end\"}));if(ld.isMoveWordBackward(o))return ud(o),i&&t.Range.isExpanded(i)&&t.Transforms.collapse(r,{edge:\"focus\"}),void t.Transforms.move(r,{unit:\"word\",reverse:!0});if(ld.isMoveWordForward(o))return ud(o),i&&t.Range.isExpanded(i)&&t.Transforms.collapse(r,{edge:\"focus\"}),void t.Transforms.move(r,{unit:\"word\"});if(ld.isSelectAll(o))return ud(o),void r.selectAll();if(Ws){if(($s||Fs)&&i&&(ld.isDeleteBackward(o)||ld.isDeleteForward(o))&&t.Range.isCollapsed(i)){var a=t.Node.parent(r,i.anchor.path);if(t.Element.isElement(a)&&t.Editor.isVoid(r,a)&&t.Editor.isInline(r,a))return o.preventDefault(),void t.Transforms.delete(r,{unit:\"block\"})}}else {if(ld.isBold(o)||ld.isItalic(o)||ld.isTransposeCharacter(o))return void ud(o);if(ld.isSplitBlock(o))return ud(o),void t.Editor.insertBreak(r);if(ld.isDeleteBackward(o))return ud(o),void(i&&t.Range.isExpanded(i)?t.Editor.deleteFragment(r,{direction:\"backward\"}):t.Editor.deleteBackward(r));if(ld.isDeleteForward(o))return ud(o),void(i&&t.Range.isExpanded(i)?t.Editor.deleteFragment(r,{direction:\"forward\"}):t.Editor.deleteForward(r));if(ld.isDeleteLineBackward(o))return ud(o),void(i&&t.Range.isExpanded(i)?t.Editor.deleteFragment(r,{direction:\"backward\"}):t.Editor.deleteBackward(r,{unit:\"line\"}));if(ld.isDeleteLineForward(o))return ud(o),void(i&&t.Range.isExpanded(i)?t.Editor.deleteFragment(r,{direction:\"forward\"}):t.Editor.deleteForward(r,{unit:\"line\"}));if(ld.isDeleteWordBackward(o))return ud(o),void(i&&t.Range.isExpanded(i)?t.Editor.deleteFragment(r,{direction:\"backward\"}):t.Editor.deleteBackward(r,{unit:\"word\"}));if(ld.isDeleteWordForward(o))return ud(o),void(i&&t.Range.isExpanded(i)?t.Editor.deleteFragment(r,{direction:\"forward\"}):t.Editor.deleteForward(r,{unit:\"word\"}))}}},keypress:function(e,n,r){if(!Ws&&!r.getConfig().readOnly&&Qf(r,e.target)){e.preventDefault();var o=e.key;t.Editor.insertText(r,o);}},copy:function(e,t,n){var r=e;if(Qf(n,r.target)){r.preventDefault();var o=r.clipboardData;null!=o&&n.setFragmentData(o);}},cut:function(e,n,r){var o=e,i=r.selection;if(!r.getConfig().readOnly&&Qf(r,o.target)){o.preventDefault();var a=o.clipboardData;if(null!=a&&(r.setFragmentData(a),i))if(t.Range.isExpanded(i))t.Editor.deleteFragment(r);else {var s=t.Node.parent(r,i.anchor.path);t.Editor.isVoid(r,s)&&t.Transforms.delete(r);}}},paste:function(e,t,n){ms.set(n,!0);var r=e;if(!n.getConfig().readOnly&&Qf(n,r.target)){var o=n.getConfig().customPaste;if(o)if(!1===o(n,r))return void ms.set(n,!1);if(!Ws||function(e){return e.clipboardData&&\"\"!==e.clipboardData.getData(\"text/plain\")&&1===e.clipboardData.types.length}(r)){r.preventDefault();var i=r.clipboardData;null!=i&&n.insertData(i);}}},dragover:function(e,n,r){if(ed(r,e.target)){var o=Hs.toSlateNode(r,e.target);t.Editor.isVoid(r,o)&&e.preventDefault();}},dragstart:function(e,n,r){var o=e;if(ed(r,o.target)&&!r.getConfig().readOnly){var i=Hs.toSlateNode(r,o.target),a=Hs.findPath(r,i);if(t.Editor.isVoid(r,i)||t.Editor.void(r,{at:a,voids:!0})){var s=t.Editor.range(r,a);t.Transforms.select(r,s);}var l=o.dataTransfer;null!=l&&(n.isDraggingInternally=!0,r.setFragmentData(l));}},dragend:function(e,t,n){var r=e;n.getConfig().readOnly||t.isDraggingInternally&&ed(n,r.target)&&(t.isDraggingInternally=!1);},drop:function(e,n,r){var o=e,i=o.dataTransfer;if(!r.getConfig().readOnly&&ed(r,o.target)&&null!=i&&!(Ws&&Fs&&i.files.length>0)){o.preventDefault();var a=r.selection,s=Hs.findEventRange(r,o);t.Transforms.select(r,s),n.isDraggingInternally&&(a&&t.Transforms.delete(r,{at:a}),n.isDraggingInternally=!1),r.insertData(i),r.isFocused()||r.focus();}}},fd=1,dd=function(){function e(e){var n=this;this.id=fd++,this.$textArea=null,this.$progressBar=y.default('<div class=\"w-e-progress-bar\"></div>'),this.$maxLengthInfo=y.default('<div class=\"w-e-max-length-info\"></div>'),this.isComposing=!1,this.isUpdatingSelection=!1,this.isDraggingInternally=!1,this.latestElement=null,this.showPlaceholder=!1,this.$placeholder=null,this.latestEditorSelection=null,this.onDOMSelectionChange=b.default((function(){var e=n.editorInstance;!function(e,n){var r=e.isComposing,o=e.isUpdatingSelection,i=e.isDraggingInternally;if(!(n.getConfig().readOnly||r||o||i)){var a=Hs.findDocumentOrShadowRoot(n),s=a.activeElement,l=Hs.toDOMNode(n,n),u=a.getSelection();if(s===l?(e.latestElement=s,gs.set(n,!0)):gs.delete(n),!u)return t.Transforms.deselect(n);var c=u.anchorNode,f=u.focusNode,d=Qf(n,c)||Zf(n,c),p=Qf(n,f)||Zf(n,f);if(d&&p){var h=Hs.toSlateRange(n,u,{exactMatch:!1,suppressThrow:!1});t.Transforms.select(n,h);}else t.Transforms.deselect(n);}}(n,e);}),100);var r=y.default(e);if(0===r.length)throw new Error(\"Cannot find textarea DOM by selector '\"+e+\"'\");this.$box=r;var o=y.default('<div class=\"w-e-text-container\"></div>');o.append(this.$progressBar),o.append(this.$maxLengthInfo),r.append(o);var i=y.default('<div class=\"w-e-scroll\"></div>');o.append(i),this.$scroll=i,this.$textAreaContainer=o,Uu((function(){var e=n.editorInstance,t=Hs.getWindow(e);t.document.addEventListener(\"selectionchange\",n.onDOMSelectionChange),e.on(\"destroyed\",(function(){t.document.removeEventListener(\"selectionchange\",n.onDOMSelectionChange);})),o.on(\"click\",(function(){return e.hidePanelOrModal()})),e.on(\"change\",n.changeViewState.bind(n));var r=e.getConfig().onChange;r&&e.on(\"change\",(function(){return r(e)})),n.onFocusAndOnBlur(),e.on(\"change\",n.changeMaxLengthInfo.bind(n)),n.bindEvent();}));}return Object.defineProperty(e.prototype,\"editorInstance\",{get:function(){var e=Ja.get(this);if(null==e)throw new Error(\"Can not get editor instance\");return e},enumerable:!1,configurable:!0}),e.prototype.bindEvent=function(){var e=this,t=this.$textArea,n=this.$scroll,r=this.editorInstance;null!=t&&(m.default(cd,(function(n,o){t.on(o,(function(t){n(t,e,r);}));})),r.getConfig().scroll&&(n.css(\"overflow-y\",\"auto\"),n.on(\"scroll\",b.default((function(){r.emit(\"scroll\");}),100))));},e.prototype.onFocusAndOnBlur=function(){var e=this,t=this.editorInstance,n=t.getConfig(),r=n.onBlur,o=n.onFocus;this.latestEditorSelection=t.selection,t.on(\"change\",(function(){null==e.latestEditorSelection&&null!=t.selection?setTimeout((function(){return o&&o(t)})):null!=e.latestEditorSelection&&null==t.selection&&setTimeout((function(){return r&&r(t)})),e.latestEditorSelection=t.selection;}));},e.prototype.changeMaxLengthInfo=function(){var e=this.editorInstance,t=e.getConfig().maxLength;if(t){var n=t-Hs.getLeftLengthOfMaxLength(e);this.$maxLengthInfo[0].innerHTML=n+\"/\"+t;}},e.prototype.changeProgress=function(e){var t=this.$progressBar;t.css(\"width\",e+\"%\"),e>=100&&setTimeout((function(){t.hide(),t.css(\"width\",\"0\"),t.show();}),1e3);},e.prototype.changeViewState=function(){var e=this,t=this.editorInstance;zf(this,t),function(e,t){var n,r=t.getConfig().placeholder;if(r){var o=t.isEmpty();if(o&&!e.showPlaceholder&&!e.isComposing){if(null==e.$placeholder){var i=y.default('<div class=\"w-e-text-placeholder\">'+r+\"</div>\");e.$textAreaContainer.append(i),e.$placeholder=i;}return e.$placeholder.show(),void(e.showPlaceholder=!0)}!o&&e.showPlaceholder&&(null===(n=e.$placeholder)||void 0===n||n.hide(),e.showPlaceholder=!1);}}(this,t),Uu((function(){td(e,t);}));},e.prototype.destroy=function(){this.$textAreaContainer.remove();},e}();Si(\"match\",(function(e,t,n){return [function(t){var n=V(this),r=null==t?void 0:Ae(t,e);return r?Te(r,t,n):new RegExp(t)[e](er(n))},function(e){var r=Oe(this),o=er(e),i=n(t,r,o);if(i.done)return i.value;if(!r.global)return ji(r,o);var a=r.unicode;r.lastIndex=0;for(var s,l=[],u=0;null!==(s=ji(r,o));){var c=er(s[0]);l[u]=c,\"\"===c&&(r.lastIndex=Oi(o,Ft(r.lastIndex),a)),u++;}return 0===u?null:l}]}));function pd(e){e.removeAttr(\"width\"),e.removeAttr(\"height\"),e.removeAttr(\"fill\"),e.removeAttr(\"class\"),e.removeAttr(\"t\"),e.removeAttr(\"p-id\");var t=e.children();t.length&&pd(t);}function hd(){return y.default('<svg viewBox=\"0 0 1024 1024\"><path d=\"M498.7 655.8l-197.6-268c-8.1-10.9-0.3-26.4 13.3-26.4h395.2c13.6 0 21.4 15.4 13.3 26.4l-197.6 268c-6.6 9-20 9-26.6 0z\"></path></svg>')}function gd(){return y.default('<div class=\"w-e-bar-divider\"></div>')}function vd(e,t,n,r,o){if(void 0===o&&(o=!1),t){if(r){var i=As?\"cmd\":\"ctrl\";r=r.replace(\"mod\",i);}if(o)r&&(e.attr(\"data-tooltip\",r),e.addClass(\"w-e-menu-tooltip-v5\"),e.addClass(\"tooltip-right\"));else {var a=r?n+\"\\n\"+r:n;e.attr(\"data-tooltip\",a),e.addClass(\"w-e-menu-tooltip-v5\");}}}var yd=function(){function e(e,t,n){var r=this;void 0===n&&(n=!1),this.$elem=y.default('<div class=\"w-e-bar-item\"></div>'),this.$button=y.default('<button type=\"button\"></button>'),this.disabled=!1,this.menu=t;var o=t.tag,i=t.width;if(\"button\"!==o)throw new Error(\"Invalid tag '\"+o+\"', expected 'button'\");var a=t.title,s=t.hotkey,l=void 0===s?\"\":s,u=t.iconSvg,c=void 0===u?\"\":u,f=this.$button;if(c){var d=y.default(c);pd(d),f.append(d);}else f.text(a);vd(f,c,a,l,n),n&&c&&f.append(y.default('<span class=\"title\">'+a+\"</span>\")),i&&f.css(\"width\",i+\"px\"),f.attr(\"data-menu-key\",e),this.$elem.append(f),Uu((function(){return r.init()}));}return e.prototype.init=function(){var e=this;this.setActive(),this.setDisabled(),this.$button.on(\"click\",(function(t){t.preventDefault(),Nd(e).hidePanelOrModal(),e.disabled||(e.exec(),e.onButtonClick());}));},e.prototype.exec=function(){var e=Nd(this),t=this.menu,n=t.getValue(e);t.exec(e,n);},e.prototype.setActive=function(){var e=Nd(this),t=this.$button,n=\"active\";this.menu.isActive(e)?t.addClass(n):t.removeClass(n);},e.prototype.setDisabled=function(){var e=Nd(this),t=this.$button,n=this.menu.isDisabled(e);(null==e.selection||e.isDisabled())&&(n=!0),this.menu.alwaysEnable&&(n=!1);var r=\"disabled\";n?t.addClass(r):t.removeClass(r),this.disabled=n;},e.prototype.changeMenuState=function(){this.setActive(),this.setDisabled();},e}(),md=function(e){function t(t,n,r){return void 0===r&&(r=!1),e.call(this,t,n,r)||this}return Ui(t,e),t.prototype.onButtonClick=function(){},t}(yd),bd=function(){function e(e){this.isShow=!1,this.showTime=0,this.record(e);}return e.prototype.record=function(e){var t=ts.get(e);null==t&&(t=new Set,ts.set(e,t)),t.add(this),ns.set(this,e);},e.prototype.renderContent=function(e){var t=this.$elem;t.empty(),t.append(e);var n=this.genSelfElem();n&&t.append(n);},e.prototype.appendTo=function(e){var t=this.$elem;e.append(t);},e.prototype.show=function(){if(!this.isShow){this.showTime=Date.now(),this.$elem.show(),this.isShow=!0;var e=ns.get(this);e&&e.emit(\"modalOrPanelShow\",this);}},e.prototype.hide=function(){if(this.isShow&&!(Date.now()-this.showTime<200)){this.$elem.hide(),this.isShow=!1;var e=ns.get(this);e&&e.emit(\"modalOrPanelHide\");}},e}(),wd=function(e){function t(t){var n=e.call(this,t)||this;return n.type=\"dropPanel\",n.$elem=y.default('<div class=\"w-e-drop-panel\"></div>'),n}return Ui(t,e),t.prototype.genSelfElem=function(){return null},t}(bd),xd=function(e){function t(t,n,r){void 0===r&&(r=!1);var o=e.call(this,t,n,r)||this;if(o.dropPanel=null,o.menu=n,n.showDropPanel){var i=hd();o.$button.append(i);}return o}return Ui(t,e),t.prototype.onButtonClick=function(){this.menu.showDropPanel&&this.handleDropPanel();},t.prototype.handleDropPanel=function(){var e=this.menu;if(null!=e.getPanelContentElem){var t=Nd(this);if(null==this.dropPanel){var n=new wd(t),r=e.getPanelContentElem(t);n.renderContent(r),n.appendTo(this.$elem),n.show(),this.dropPanel=n;}else {var o=this.dropPanel;if(o.isShow)o.hide();else {r=e.getPanelContentElem(t);o.renderContent(r),o.show();}}var i=this.dropPanel;if(i.isShow){var a=this.$elem,s=a.offset().left,l=a.parents(\".w-e-bar\");s-l.offset().left>=l.width()/2?i.$elem.css({left:\"none\",right:\"0\"}):i.$elem.css({left:\"0\",right:\"none\"});}}},t}(yd),Ed=function(e){function t(t,n){void 0===n&&(n=0);var r=e.call(this,t)||this;r.type=\"modal\",r.$elem=y.default('<div class=\"w-e-modal\"></div>'),r.width=0,n&&(r.width=n);var o=r.$elem;return o.on(\"click\",(function(e){return e.stopPropagation()})),o.on(\"keyup\",(function(e){\"Escape\"===e.code&&(r.hide(),t.restoreSelection());})),r}return Ui(t,e),t.prototype.genSelfElem=function(){var e=this,t=y.default('<span class=\"btn-close\"><svg viewBox=\"0 0 1024 1024\"><path d=\"M1024 896.1024l-128 128L512 640 128 1024 0 896 384 512 0 128 128 0 512 384 896.1024 0l128 128L640 512z\"></path></svg></span>'),n=ns.get(this);return t.on(\"click\",(function(){e.hide(),null==n||n.restoreSelection();})),t},t.prototype.setStyle=function(e){var t=this.width,n=this.$elem;n.attr(\"style\",\"\"),t&&n.css(\"width\",t+\"px\"),n.css(e);},t}(bd);var Sd=function(e){function n(t,n,r){void 0===r&&(r=!1);var o=e.call(this,t,n,r)||this;return o.$body=y.default(\"body\"),o.modal=null,o.menu=n,o}return Ui(n,e),n.prototype.onButtonClick=function(){this.menu.showModal&&this.handleModal();},n.prototype.getPosition=function(){var e=Nd(this),n=this.menu.getModalPositionNode(e);return t.Element.isElement(n)?mf(e,n,\"modal\"):yf(e)},n.prototype.handleModal=function(){var e=Nd(this),t=this.menu;if(null==this.modal){var n=new Ed(e,t.modalWidth);this.renderAndShowModal(n,!0),this.modal=n;}else {(n=this.modal).isShow?n.hide():this.renderAndShowModal(n,!1);}},n.prototype.renderAndShowModal=function(e,t){void 0===t&&(t=!1);var n=Nd(this),r=this.menu;if(null!=r.getModalContentElem){var o=Hs.getTextarea(n),i=Hs.getToolbar(n),a=((null==i?void 0:i.getConfig())||{}).modalAppendToBody,s=r.getModalContentElem(n);if(e.renderContent(s),a)e.setStyle({left:\"0\",right:\"0\"});else {var l=this.getPosition();e.setStyle(l);}t&&(a?e.appendTo(this.$body):e.appendTo(o.$textAreaContainer)),e.show(),a||bf(n,e.$elem),setTimeout((function(){n.blur();}));}},n}(yd);var kd=function(e){function t(t,n){var r=e.call(this,t)||this;return r.type=\"selectList\",r.$elem=y.default('<div class=\"w-e-select-list\"></div>'),n&&r.$elem.css(\"width\",n+\"px\"),r.$elem.on(\"click\",(function(e){e.stopPropagation();})),r}return Ui(t,e),t.prototype.renderList=function(e){var t=this.$elem;t.empty();var n=y.default(\"<ul></ul>\");e.forEach((function(e){var t=e.value,r=e.text,o=e.selected,i=e.styleForRenderMenuList,a=y.default('<li data-value=\"'+t+'\"></li>');if(i&&a.css(i),o){var s=y.default('<svg viewBox=\"0 0 1446 1024\"><path d=\"M574.116299 786.736392 1238.811249 48.517862C1272.390222 11.224635 1329.414799 7.827718 1366.75664 41.450462 1403.840015 74.840484 1406.731043 132.084741 1373.10189 169.433699L655.118888 966.834607C653.072421 969.716875 650.835807 972.514337 648.407938 975.210759 615.017957 1012.29409 558.292155 1015.652019 521.195664 982.250188L72.778218 578.493306C35.910826 545.297758 32.859041 488.584019 66.481825 451.242134 99.871807 414.158803 156.597563 410.800834 193.694055 444.202665L574.116299 786.736392Z\"></path></svg>');a.append(s),a.addClass(\"selected\");}a.append(y.default('<span data-value=\"'+t+'\">'+r+\"</span>\")),a.attr(\"title\",r),n.append(a);})),t.append(n);},t.prototype.genSelfElem=function(){return null},t}(bd);var Od=function(){function e(e,t,n){var r=this;void 0===n&&(n=!1),this.$elem=y.default('<div class=\"w-e-bar-item\"></div>'),this.$button=y.default('<button type=\"button\" class=\"select-button\"></button>'),this.disabled=!1,this.selectList=null;var o=t.tag,i=t.title,a=t.width,s=t.iconSvg,l=void 0===s?\"\":s,u=t.hotkey,c=void 0===u?\"\":u;if(\"select\"!==o)throw new Error(\"Invalid tag '\"+o+\"', expected 'select'\");var f=this.$button;a&&f.css(\"width\",a+\"px\"),f.attr(\"data-menu-key\",e),vd(f,l,i,c,n),this.$elem.append(f),this.menu=t,Uu((function(){return r.init()}));}return e.prototype.init=function(){var e=this;this.setSelectedValue(),this.$button.on(\"click\",(function(t){t.preventDefault(),Nd(e).hidePanelOrModal(),e.trigger();}));},e.prototype.trigger=function(){var e=this,t=Nd(this);if(!t.isDisabled()&&!this.disabled){var n=this.menu;if(null==this.selectList){this.selectList=new kd(t,n.selectPanelWidth);var r=this.selectList,o=n.getOptions(t);r.renderList(o),r.appendTo(this.$elem),r.show(),r.$elem.on(\"click\",\"li\",(function(t){var n=t.target;if(null!=n){t.preventDefault();var r=y.default(n).attr(\"data-value\");e.onChange(r);}}));}else {if((r=this.selectList).isShow)r.hide();else {o=n.getOptions(t);r.renderList(o),r.show();}}}},e.prototype.onChange=function(e){var t=Nd(this),n=this.menu;n.exec&&n.exec(t,e);},e.prototype.setSelectedValue=function(){var e=Nd(this),t=this.menu,n=t.getValue(e),r=function(e,t){for(var n=e.length,r=\"\",o=0;o<n;o++){var i=e[o];if(i.value===t){r=i.text;break}}return r}(t.getOptions(e),n.toString()),o=this.$button,i=hd();o.empty(),o.text(r),o.append(i);},e.prototype.setDisabled=function(){var e=Nd(this),t=this.menu.isDisabled(e),n=this.$button;(null==e.selection||e.isDisabled())&&(t=!0);var r=\"disabled\";t?n.addClass(r):n.removeClass(r),this.disabled=t;},e.prototype.changeMenuState=function(){this.setSelectedValue(),this.setDisabled();},e}(),Cd=function(){function e(e){this.$elem=y.default('<div class=\"w-e-bar-item w-e-bar-item-group\"></div>'),this.$container=y.default('<div class=\"w-e-bar-item-menus-container\"></div>'),this.$button=y.default('<button type=\"button\"></button>');var t=e.key,n=e.iconSvg,r=e.title,o=this.$elem,i=this.$button;if(n){var a=y.default(n);pd(a),i.append(a);}else i.text(r);i.attr(\"data-menu-key\",t);var s=hd();i.append(s),o.append(i);var l=this.$container;o.append(l);var u=this.createObserver();this.observe(u);}return e.prototype.appendBarItem=function(e){var t=e.$elem;this.$container.append(t);},e.prototype.observe=function(e){var t=this.$container;e.observe(t[0],{childList:!0,subtree:!0,attributes:!0});},e.prototype.createObserver=function(){var e=this,t=this.$container,n=this.$button,r=new MutationObserver((function(){var o=t.find(\"button\"),i=o.length;if(0!==i){var a=0;o.each((function(e){y.default(e).hasClass(\"disabled\")&&a++;})),r.disconnect(),a===i?n.addClass(\"disabled\"):n.removeClass(\"disabled\"),e.observe(r);}}));return r},e}(),Td=new WeakMap;function Nd(e){var t=es.get(e);if(null==t)throw new Error(\"Can not get editor instance\");return t}function Md(e,t,n){void 0===n&&(n=!1);var r=Td.get(t);if(r)return r;var o=t.tag;if(\"button\"===o){var i=t.showDropPanel,a=t.showModal;r=i?new xd(e,t,n):a?new Sd(e,t,n):new md(e,t,n);}if(\"select\"===o&&(r=new Od(e,t,n)),null==r)throw new Error(\"Invalid tag in menu \"+JSON.stringify(t));return Td.set(t,r),r}function Ld(e,n){var r=e.selection;return null!=r&&(!t.Range.isCollapsed(r)&&(!Hs.getSelectedElems(e).some((function(t){if(e.isVoid(t))return !0;var n=t.type;return !![\"pre\",\"code\",\"table\"].includes(n)||void 0}))&&!!t.Text.isText(n)))}var Pd=function(){function e(){var e=this;this.$elem=y.default('<div class=\"w-e-bar w-e-bar-hidden w-e-hover-bar\"></div>'),this.menus={},this.hoverbarItems=[],this.prevSelectedNode=null,this.isShow=!1,this.changeHoverbarState=x.default((function(){var n=e.isShow,r=e.getSelectedNodeAndMenuKeys()||{},o=r.node,i=void 0===o?null:o,a=r.menuKeys,s=void 0===a?[]:a;if((null!=i&&e.changeItemsState(),i&&t.Element.isElement(i))&&(n&&e.isSamePath(i,e.prevSelectedNode)))return;e.hideAndClean(),null!=i&&(e.registerItems(s),e.setPosition(i),e.show()),e.prevSelectedNode=i;}),200),Uu((function(){var t=e.getEditorInstance(),n=e.$elem;n.on(\"mousedown\",(function(e){return e.preventDefault()}),{passive:!1}),Hs.getTextarea(t).$textAreaContainer.append(n),t.on(\"change\",e.changeHoverbarState);var r=e.hideAndClean.bind(e);t.on(\"scroll\",r),t.on(\"fullScreen\",r),t.on(\"unFullScreen\",r);}));}return e.prototype.getMenus=function(){return this.menus},e.prototype.hideAndClean=function(){var e=this.$elem;e.removeClass(\"w-e-bar-show\").addClass(\"w-e-bar-hidden\"),this.hoverbarItems=[],e.empty(),this.isShow=!1;},e.prototype.checkPositionBottom=function(){var e=this.$elem,t=!1,n=window.innerHeight;n&&n>=360&&(n-e[0].getBoundingClientRect().bottom<360&&(t=!0));t?e.addClass(\"w-e-bar-bottom\"):e.removeClass(\"w-e-bar-bottom\");},e.prototype.show=function(){this.$elem.removeClass(\"w-e-bar-hidden\").addClass(\"w-e-bar-show\"),this.isShow=!0,this.checkPositionBottom();},e.prototype.changeItemsState=function(){var e=this;Uu((function(){e.hoverbarItems.forEach((function(e){e.changeMenuState();}));}));},e.prototype.registerItems=function(e){var t=this,n=this.$elem;e.forEach((function(e){if(\"|\"!==e)t.registerSingleItem(e);else {var r=gd();n.append(r);}}));},e.prototype.registerSingleItem=function(e){var t=this.getEditorInstance(),n=this.menus,r=n[e];if(null==r){var o=Us[e];if(null==o)throw new Error(\"Not found menu item factory by key '\"+e+\"'\");if(\"function\"!=typeof o)throw new Error(\"Menu item factory (key='\"+e+\"') is not a function\");r=o(),n[e]=r;}var i=Md(e,r);this.hoverbarItems.push(i),es.set(i,t),this.$elem.append(i.$elem);},e.prototype.setPosition=function(e){var n=this.getEditorInstance(),r=this.$elem;if(r.attr(\"style\",\"\"),t.Element.isElement(e)){var o=mf(n,e,\"bar\");return r.css(o),void bf(n,r)}if(t.Text.isText(e)){o=yf(n);return r.css(o),void bf(n,r)}throw new Error(\"hoverbar.setPosition error, current selected node is not elem nor text\")},e.prototype.getSelectedNodeAndMenuKeys=function(){var e=this.getEditorInstance();if(null==e.selection)return null;var n=this.getHoverbarKeysConf(),r=null,o=[],i=function(i){var a=n[i],s=a.match,l=a.menuKeys,u=void 0===l?[]:l,c=s||function(e,t){return Hs.checkNodeType(t,i)},f=Gi(t.Editor.nodes(e,{match:function(t){return c(e,t)},universal:!0}),1),d=f[0];if(null!=d)return r=d[0],o=u,\"break\"};for(var a in n){if(\"break\"===i(a))break}return null==r||0===o.length?null:{node:r,menuKeys:o}},e.prototype.getEditorInstance=function(){var e=Qa.get(this);if(null==e)throw new Error(\"Can not get editor instance\");return e},e.prototype.getHoverbarKeysConf=function(){var e=this.getEditorInstance().getConfig().hoverbarKeys,t=void 0===e?{}:e,n=t.text;return n&&null==n.match&&(n.match=Ld),t},e.prototype.isSamePath=function(e,n){if(null==e||null==n)return !1;var r=Hs.findPath(null,e),o=Hs.findPath(null,n);return t.Path.equals(r,o)},e.prototype.destroy=function(){this.changeHoverbarState.cancel(),this.$elem.remove(),this.menus={},this.hoverbarItems=[],this.prevSelectedNode=null;},e}();function Rd(e,n,r,o){if(ss.set(e,n),ls.set(e,r),t.Element.isElement(e)){var i=e.children;if((void 0===i?[]:i).forEach((function(t,n){return Rd(t,n,e,o)})),t.Editor.isVoid(o,e)){var a=Gi(t.Node.texts(e),1),s=Gi(a[0],1)[0];ss.set(s,0),ls.set(s,e);}}}var Dd=qo(\"splice\"),jd=P.TypeError,Ad=Math.max,_d=Math.min,Fd=9007199254740991,Id=\"Maximum allowed length exceeded\";_n({target:\"Array\",proto:!0,forced:!Dd},{splice:function(e,t){var n,r,o,i,a,s,l=U(this),u=It(l),c=gn(e,u),f=arguments.length;if(0===f?n=r=0:1===f?(n=0,r=u-c):(n=f-2,r=_d(Ad(At(t),0),u-c)),u+n-r>Fd)throw jd(Id);for(o=Yt(l,r),i=0;i<r;i++)(a=c+i)in l&&Ir(o,i,l[a]);if(o.length=r,n<r){for(i=c;i<u-r;i++)s=i+n,(a=i+r)in l?l[s]=l[a]:delete l[s];for(i=u;i>u-r+n;i--)delete l[i-1];}else if(n>r)for(i=u-r;i>c;i--)s=i+n-1,(a=i+r-1)in l?l[s]=l[a]:delete l[s];for(i=0;i<n;i++)l[i+c]=arguments[i+2];return l.length=u-r+n,o}});var Bd=function(){function e(e,t){var n=this;this.$toolbar=y.default('<div class=\"w-e-bar w-e-bar-show w-e-toolbar\"></div>'),this.menus={},this.toolbarItems=[],this.config={},this.changeToolbarState=x.default((function(){n.toolbarItems.forEach((function(e){e.changeMenuState();}));}),200),this.config=t;var r=y.default(e);if(0===r.length)throw new Error(\"Cannot find toolbar DOM by selector '\"+e+\"'\");this.$box=r;var o=this.$toolbar;o.on(\"mousedown\",(function(e){return e.preventDefault()}),{passive:!1}),r.append(o),Uu((function(){n.registerItems(),n.changeToolbarState(),n.getEditorInstance().on(\"change\",n.changeToolbarState);}));}return e.prototype.getMenus=function(){return this.menus},e.prototype.getConfig=function(){return this.config},e.prototype.registerItems=function(){var e=this,t=\"\",n=this.$toolbar,r=this.config,o=r.toolbarKeys,i=void 0===o?[]:o,a=r.insertKeys,s=void 0===a?{index:0,keys:[]}:a,l=r.excludeKeys,u=void 0===l?[]:l,c=E.default(i);s.keys.length>0&&(\"string\"==typeof s.keys&&(s.keys=[s.keys]),s.keys.forEach((function(e,t){c.splice(s.index+t,0,e);})));var f=c.filter((function(e){if(\"string\"==typeof e){if(u.includes(e))return !1}else if(u.includes(e.key))return !1;return !0})),d=f.length;f.forEach((function(r,o){if(\"|\"===r){if(0===o)return;if(o+1===d)return;if(\"|\"===t)return;var i=gd();return n.append(i),void(t=r)}if(\"string\"==typeof r)return e.registerSingleItem(r,e),void(t=r);e.registerGroup(r),t=\"group\";}));},e.prototype.registerGroup=function(e){var t=this,n=this.$toolbar,r=function(e){return new Cd(e)}(e),o=e.menuKeys,i=void 0===o?[]:o,a=this.config.excludeKeys,s=void 0===a?[]:a;i.forEach((function(e){s.includes(e)||t.registerSingleItem(e,r);})),n.append(r.$elem);},e.prototype.registerSingleItem=function(e,t){var n=this.getEditorInstance(),r=t instanceof Cd,o=this.menus,i=o[e];if(null==i){var a=Us[e];if(null==a)throw new Error(\"Not found menu item factory by key '\"+e+\"'\");if(\"function\"!=typeof a)throw new Error(\"Menu item factory (key='\"+e+\"') is not a function\");i=a(),o[e]=i;}else console.warn(\"Duplicated toolbar menu key '\"+e+\"'\\n重复注册了菜单栏 menu '\"+e+\"'\");var s=Md(e,i,r);(this.toolbarItems.push(s),es.set(s,n),r)?t.appendBarItem(s):t.$toolbar.append(s.$elem);},e.prototype.getEditorInstance=function(){var e=Ya.get(this);if(null==e)throw new Error(\"Can not get editor instance\");return e},e.prototype.destroy=function(){this.$toolbar.remove(),this.menus={},this.toolbarItems=[];},e}();var $d=ht.EXISTS,Wd=Ve.f,Hd=Function.prototype,Vd=W(Hd.toString),zd=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,Ud=W(zd.exec);ye&&!$d&&Wd(Hd,\"name\",{configurable:!0,get:function(){try{return Ud(zd,Vd(this))[1]}catch(e){return \"\"}}});var Kd=T((function(e){function t(n){return \"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?(e.exports=t=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=t=function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),t(n)}e.exports=t,e.exports.default=e.exports,e.exports.__esModule=!0;})),qd=T((function(e){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.default=e.exports,e.exports.__esModule=!0;})),Gd=T((function(e){e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?Object(arguments[t]):{},r=Object.keys(n);\"function\"==typeof Object.getOwnPropertySymbols&&r.push.apply(r,Object.getOwnPropertySymbols(n).filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach((function(t){qd(e,t,n[t]);}));}return e},e.exports.default=e.exports,e.exports.__esModule=!0;})),Jd=T((function(e){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},e.exports.default=e.exports,e.exports.__esModule=!0;})),Yd=T((function(e){function t(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r);}}e.exports=function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e},e.exports.default=e.exports,e.exports.__esModule=!0;})),Xd=T((function(e){e.exports=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},e.exports.default=e.exports,e.exports.__esModule=!0;})),Qd=T((function(e){var t=Kd.default;e.exports=function(e,n){if(n&&(\"object\"===t(n)||\"function\"==typeof n))return n;if(void 0!==n)throw new TypeError(\"Derived constructors may only return object or undefined\");return Xd(e)},e.exports.default=e.exports,e.exports.__esModule=!0;})),Zd=T((function(e){function t(n){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.default=e.exports,e.exports.__esModule=!0,t(n)}e.exports=t,e.exports.default=e.exports,e.exports.__esModule=!0;})),ep=T((function(e){function t(n,r){return e.exports=t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,t(n,r)}e.exports=t,e.exports.default=e.exports,e.exports.__esModule=!0;})),tp=T((function(e){e.exports=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&ep(e,t);},e.exports.default=e.exports,e.exports.__esModule=!0;}));function np(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var rp=np(Kd),op=np(Gd),ip=np(Jd),ap=np(Yd),sp=np(Qd),lp=np(Zd),up=np(Xd),cp=np(tp),fp={type:\"logger\",log:function(e){this.output(\"log\",e);},warn:function(e){this.output(\"warn\",e);},error:function(e){this.output(\"error\",e);},output:function(e,t){console&&console[e]&&console[e].apply(console,t);}},dp=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};ip.default(this,e),this.init(t,n);}return ap.default(e,[{key:\"init\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=t.prefix||\"i18next:\",this.logger=e||fp,this.options=t,this.debug=t.debug;}},{key:\"setDebug\",value:function(e){this.debug=e;}},{key:\"log\",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.forward(t,\"log\",\"\",!0)}},{key:\"warn\",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.forward(t,\"warn\",\"\",!0)}},{key:\"error\",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.forward(t,\"error\",\"\")}},{key:\"deprecate\",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.forward(t,\"warn\",\"WARNING DEPRECATED: \",!0)}},{key:\"forward\",value:function(e,t,n,r){return r&&!this.debug?null:(\"string\"==typeof e[0]&&(e[0]=\"\".concat(n).concat(this.prefix,\" \").concat(e[0])),this.logger[t](e))}},{key:\"create\",value:function(t){return new e(this.logger,op.default({},{prefix:\"\".concat(this.prefix,\":\").concat(t,\":\")},this.options))}}]),e}(),pp=new dp,hp=function(){function e(){ip.default(this,e),this.observers={};}return ap.default(e,[{key:\"on\",value:function(e,t){var n=this;return e.split(\" \").forEach((function(e){n.observers[e]=n.observers[e]||[],n.observers[e].push(t);})),this}},{key:\"off\",value:function(e,t){this.observers[e]&&(t?this.observers[e]=this.observers[e].filter((function(e){return e!==t})):delete this.observers[e]);}},{key:\"emit\",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(this.observers[e]){var o=[].concat(this.observers[e]);o.forEach((function(e){e.apply(void 0,n);}));}if(this.observers[\"*\"]){var i=[].concat(this.observers[\"*\"]);i.forEach((function(t){t.apply(t,[e].concat(n));}));}}}]),e}();function gp(){var e,t,n=new Promise((function(n,r){e=n,t=r;}));return n.resolve=e,n.reject=t,n}function vp(e){return null==e?\"\":\"\"+e}function yp(e,t,n){e.forEach((function(e){t[e]&&(n[e]=t[e]);}));}function mp(e,t,n){function r(e){return e&&e.indexOf(\"###\")>-1?e.replace(/###/g,\".\"):e}function o(){return !e||\"string\"==typeof e}for(var i=\"string\"!=typeof t?[].concat(t):t.split(\".\");i.length>1;){if(o())return {};var a=r(i.shift());!e[a]&&n&&(e[a]=new n),e=Object.prototype.hasOwnProperty.call(e,a)?e[a]:{};}return o()?{}:{obj:e,k:r(i.shift())}}function bp(e,t,n){var r=mp(e,t,Object);r.obj[r.k]=n;}function wp(e,t){var n=mp(e,t),r=n.obj,o=n.k;if(r)return r[o]}function xp(e,t,n){var r=wp(e,n);return void 0!==r?r:wp(t,n)}function Ep(e,t,n){for(var r in t)\"__proto__\"!==r&&\"constructor\"!==r&&(r in e?\"string\"==typeof e[r]||e[r]instanceof String||\"string\"==typeof t[r]||t[r]instanceof String?n&&(e[r]=t[r]):Ep(e[r],t[r],n):e[r]=t[r]);return e}function Sp(e){return e.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\")}var kp={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#x2F;\"};function Op(e){return \"string\"==typeof e?e.replace(/[&<>\"'\\/]/g,(function(e){return kp[e]})):e}var Cp=\"undefined\"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf(\"MSIE\")>-1;function Tp(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\".\";if(e){if(e[t])return e[t];for(var r=t.split(n),o=e,i=0;i<r.length;++i){if(!o)return;if(\"string\"==typeof o[r[i]]&&i+1<r.length)return;if(void 0===o[r[i]]){for(var a=2,s=r.slice(i,i+a).join(n),l=o[s];void 0===l&&r.length>i+a;)a++,l=o[s=r.slice(i,i+a).join(n)];if(void 0===l)return;if(\"string\"==typeof l)return l;if(s&&\"string\"==typeof l[s])return l[s];var u=r.slice(i+a).join(n);return u?Tp(l,u,n):void 0}o=o[r[i]];}return o}}var Np=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:[\"translation\"],defaultNS:\"translation\"};return ip.default(this,t),n=sp.default(this,lp.default(t).call(this)),Cp&&hp.call(up.default(n)),n.data=e||{},n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator=\".\"),void 0===n.options.ignoreJSONStructure&&(n.options.ignoreJSONStructure=!0),n}return cp.default(t,e),ap.default(t,[{key:\"addNamespaces\",value:function(e){this.options.ns.indexOf(e)<0&&this.options.ns.push(e);}},{key:\"removeNamespaces\",value:function(e){var t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1);}},{key:\"getResource\",value:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==r.keySeparator?r.keySeparator:this.options.keySeparator,i=void 0!==r.ignoreJSONStructure?r.ignoreJSONStructure:this.options.ignoreJSONStructure,a=[e,t];n&&\"string\"!=typeof n&&(a=a.concat(n)),n&&\"string\"==typeof n&&(a=a.concat(o?n.split(o):n)),e.indexOf(\".\")>-1&&(a=e.split(\".\"));var s=wp(this.data,a);return s||!i||\"string\"!=typeof n?s:Tp(this.data&&this.data[e]&&this.data[e][t],n,o)}},{key:\"addResource\",value:function(e,t,n,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},i=this.options.keySeparator;void 0===i&&(i=\".\");var a=[e,t];n&&(a=a.concat(i?n.split(i):n)),e.indexOf(\".\")>-1&&(r=t,t=(a=e.split(\".\"))[1]),this.addNamespaces(t),bp(this.data,a,r),o.silent||this.emit(\"added\",e,t,n,r);}},{key:\"addResources\",value:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in n)\"string\"!=typeof n[o]&&\"[object Array]\"!==Object.prototype.toString.apply(n[o])||this.addResource(e,t,o,n[o],{silent:!0});r.silent||this.emit(\"added\",e,t,n);}},{key:\"addResourceBundle\",value:function(e,t,n,r,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},a=[e,t];e.indexOf(\".\")>-1&&(r=n,n=t,t=(a=e.split(\".\"))[1]),this.addNamespaces(t);var s=wp(this.data,a)||{};r?Ep(s,n,o):s=op.default({},s,n),bp(this.data,a,s),i.silent||this.emit(\"added\",e,t,n);}},{key:\"removeResourceBundle\",value:function(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(\"removed\",e,t);}},{key:\"hasResourceBundle\",value:function(e,t){return void 0!==this.getResource(e,t)}},{key:\"getResourceBundle\",value:function(e,t){return t||(t=this.options.defaultNS),\"v1\"===this.options.compatibilityAPI?op.default({},{},this.getResource(e,t)):this.getResource(e,t)}},{key:\"getDataByLanguage\",value:function(e){return this.data[e]}},{key:\"toJSON\",value:function(){return this.data}}]),t}(hp),Mp={processors:{},addPostProcessor:function(e){this.processors[e.name]=e;},handle:function(e,t,n,r,o){var i=this;return e.forEach((function(e){i.processors[e]&&(t=i.processors[e].process(t,n,r,o));})),t}},Lp={},Pp=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return ip.default(this,t),n=sp.default(this,lp.default(t).call(this)),Cp&&hp.call(up.default(n)),yp([\"resourceStore\",\"languageUtils\",\"pluralResolver\",\"interpolator\",\"backendConnector\",\"i18nFormat\",\"utils\"],e,up.default(n)),n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator=\".\"),n.logger=pp.create(\"translator\"),n}return cp.default(t,e),ap.default(t,[{key:\"changeLanguage\",value:function(e){e&&(this.language=e);}},{key:\"exists\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}};if(null==e)return !1;var n=this.resolve(e,t);return n&&void 0!==n.res}},{key:\"extractFromKey\",value:function(e,t){var n=void 0!==t.nsSeparator?t.nsSeparator:this.options.nsSeparator;void 0===n&&(n=\":\");var r=void 0!==t.keySeparator?t.keySeparator:this.options.keySeparator,o=t.ns||this.options.defaultNS;if(n&&e.indexOf(n)>-1){var i=e.match(this.interpolator.nestingRegexp);if(i&&i.length>0)return {key:e,namespaces:o};var a=e.split(n);(n!==r||n===r&&this.options.ns.indexOf(a[0])>-1)&&(o=a.shift()),e=a.join(r);}return \"string\"==typeof o&&(o=[o]),{key:e,namespaces:o}}},{key:\"translate\",value:function(e,n,r){var o=this;if(\"object\"!==rp.default(n)&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),n||(n={}),null==e)return \"\";Array.isArray(e)||(e=[String(e)]);var i=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,a=this.extractFromKey(e[e.length-1],n),s=a.key,l=a.namespaces,u=l[l.length-1],c=n.lng||this.language,f=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(c&&\"cimode\"===c.toLowerCase()){if(f){var d=n.nsSeparator||this.options.nsSeparator;return u+d+s}return s}var p=this.resolve(e,n),h=p&&p.res,g=p&&p.usedKey||s,v=p&&p.exactUsedKey||s,y=Object.prototype.toString.apply(h),m=[\"[object Number]\",\"[object Function]\",\"[object RegExp]\"],b=void 0!==n.joinArrays?n.joinArrays:this.options.joinArrays,w=!this.i18nFormat||this.i18nFormat.handleAsObject,x=\"string\"!=typeof h&&\"boolean\"!=typeof h&&\"number\"!=typeof h;if(w&&h&&x&&m.indexOf(y)<0&&(\"string\"!=typeof b||\"[object Array]\"!==y)){if(!n.returnObjects&&!this.options.returnObjects)return this.options.returnedObjectHandler||this.logger.warn(\"accessing an object - but returnObjects options is not enabled!\"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,h,op.default({},n,{ns:l})):\"key '\".concat(s,\" (\").concat(this.language,\")' returned an object instead of string.\");if(i){var E=\"[object Array]\"===y,S=E?[]:{},k=E?v:g;for(var O in h)if(Object.prototype.hasOwnProperty.call(h,O)){var C=\"\".concat(k).concat(i).concat(O);S[O]=this.translate(C,op.default({},n,{joinArrays:!1,ns:l})),S[O]===C&&(S[O]=h[O]);}h=S;}}else if(w&&\"string\"==typeof b&&\"[object Array]\"===y)(h=h.join(b))&&(h=this.extendTranslation(h,e,n,r));else {var T=!1,N=!1,M=void 0!==n.count&&\"string\"!=typeof n.count,L=t.hasDefaultValue(n),P=M?this.pluralResolver.getSuffix(c,n.count):\"\",R=n[\"defaultValue\".concat(P)]||n.defaultValue;!this.isValidLookup(h)&&L&&(T=!0,h=R),this.isValidLookup(h)||(N=!0,h=s);var D=n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey,j=D&&N?void 0:h,A=L&&R!==h&&this.options.updateMissing;if(N||T||A){if(this.logger.log(A?\"updateKey\":\"missingKey\",c,u,s,A?R:h),i){var _=this.resolve(s,op.default({},n,{keySeparator:!1}));_&&_.res&&this.logger.warn(\"Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.\");}var F=[],I=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(\"fallback\"===this.options.saveMissingTo&&I&&I[0])for(var B=0;B<I.length;B++)F.push(I[B]);else \"all\"===this.options.saveMissingTo?F=this.languageUtils.toResolveHierarchy(n.lng||this.language):F.push(n.lng||this.language);var $=function(e,t,r){o.options.missingKeyHandler?o.options.missingKeyHandler(e,u,t,A?r:j,A,n):o.backendConnector&&o.backendConnector.saveMissing&&o.backendConnector.saveMissing(e,u,t,A?r:j,A,n),o.emit(\"missingKey\",e,u,t,h);};this.options.saveMissing&&(this.options.saveMissingPlurals&&M?F.forEach((function(e){o.pluralResolver.getSuffixes(e).forEach((function(t){$([e],s+t,n[\"defaultValue\".concat(t)]||R);}));})):$(F,s,R));}h=this.extendTranslation(h,e,n,p,r),N&&h===s&&this.options.appendNamespaceToMissingKey&&(h=\"\".concat(u,\":\").concat(s)),(N||T)&&this.options.parseMissingKeyHandler&&(h=this.options.parseMissingKeyHandler(h));}return h}},{key:\"extendTranslation\",value:function(e,t,n,r,o){var i=this;if(this.i18nFormat&&this.i18nFormat.parse)e=this.i18nFormat.parse(e,n,r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init(op.default({},n,{interpolation:op.default({},this.options.interpolation,n.interpolation)}));var a,s=n.interpolation&&n.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables;if(s){var l=e.match(this.interpolator.nestingRegexp);a=l&&l.length;}var u=n.replace&&\"string\"!=typeof n.replace?n.replace:n;if(this.options.interpolation.defaultVariables&&(u=op.default({},this.options.interpolation.defaultVariables,u)),e=this.interpolator.interpolate(e,u,n.lng||this.language,n),s){var c=e.match(this.interpolator.nestingRegexp);a<(c&&c.length)&&(n.nest=!1);}!1!==n.nest&&(e=this.interpolator.nest(e,(function(){for(var e=arguments.length,r=new Array(e),a=0;a<e;a++)r[a]=arguments[a];return o&&o[0]===r[0]&&!n.context?(i.logger.warn(\"It seems you are nesting recursively key: \".concat(r[0],\" in key: \").concat(t[0])),null):i.translate.apply(i,r.concat([t]))}),n)),n.interpolation&&this.interpolator.reset();}var f=n.postProcess||this.options.postProcess,d=\"string\"==typeof f?[f]:f;return null!=e&&d&&d.length&&!1!==n.applyPostProcessor&&(e=Mp.handle(d,e,t,this.options&&this.options.postProcessPassResolved?op.default({i18nResolved:r},n):n,this)),e}},{key:\"resolve\",value:function(e){var t,n,r,o,i,a=this,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return \"string\"==typeof e&&(e=[e]),e.forEach((function(e){if(!a.isValidLookup(t)){var l=a.extractFromKey(e,s),u=l.key;n=u;var c=l.namespaces;a.options.fallbackNS&&(c=c.concat(a.options.fallbackNS));var f=void 0!==s.count&&\"string\"!=typeof s.count,d=void 0!==s.context&&(\"string\"==typeof s.context||\"number\"==typeof s.context)&&\"\"!==s.context,p=s.lngs?s.lngs:a.languageUtils.toResolveHierarchy(s.lng||a.language,s.fallbackLng);c.forEach((function(e){a.isValidLookup(t)||(i=e,!Lp[\"\".concat(p[0],\"-\").concat(e)]&&a.utils&&a.utils.hasLoadedNamespace&&!a.utils.hasLoadedNamespace(i)&&(Lp[\"\".concat(p[0],\"-\").concat(e)]=!0,a.logger.warn('key \"'.concat(n,'\" for languages \"').concat(p.join(\", \"),'\" won\\'t get resolved as namespace \"').concat(i,'\" was not yet loaded'),\"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!\")),p.forEach((function(n){if(!a.isValidLookup(t)){o=n;var i,l,c=u,p=[c];if(a.i18nFormat&&a.i18nFormat.addLookupKeys)a.i18nFormat.addLookupKeys(p,u,n,e,s);else f&&(i=a.pluralResolver.getSuffix(n,s.count)),f&&d&&p.push(c+i),d&&p.push(c+=\"\".concat(a.options.contextSeparator).concat(s.context)),f&&p.push(c+=i);for(;l=p.pop();)a.isValidLookup(t)||(r=l,t=a.getResource(n,e,l,s));}})));}));}})),{res:t,usedKey:n,exactUsedKey:r,usedLng:o,usedNS:i}}},{key:\"isValidLookup\",value:function(e){return !(void 0===e||!this.options.returnNull&&null===e||!this.options.returnEmptyString&&\"\"===e)}},{key:\"getResource\",value:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}}],[{key:\"hasDefaultValue\",value:function(e){var t=\"defaultValue\";for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t===n.substring(0,t.length)&&void 0!==e[n])return !0;return !1}}]),t}(hp);function Rp(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Dp=function(){function e(t){ip.default(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=pp.create(\"languageUtils\");}return ap.default(e,[{key:\"getScriptPartFromCode\",value:function(e){if(!e||e.indexOf(\"-\")<0)return null;var t=e.split(\"-\");return 2===t.length?null:(t.pop(),\"x\"===t[t.length-1].toLowerCase()?null:this.formatLanguageCode(t.join(\"-\")))}},{key:\"getLanguagePartFromCode\",value:function(e){if(!e||e.indexOf(\"-\")<0)return e;var t=e.split(\"-\");return this.formatLanguageCode(t[0])}},{key:\"formatLanguageCode\",value:function(e){if(\"string\"==typeof e&&e.indexOf(\"-\")>-1){var t=[\"hans\",\"hant\",\"latn\",\"cyrl\",\"cans\",\"mong\",\"arab\"],n=e.split(\"-\");return this.options.lowerCaseLng?n=n.map((function(e){return e.toLowerCase()})):2===n.length?(n[0]=n[0].toLowerCase(),n[1]=n[1].toUpperCase(),t.indexOf(n[1].toLowerCase())>-1&&(n[1]=Rp(n[1].toLowerCase()))):3===n.length&&(n[0]=n[0].toLowerCase(),2===n[1].length&&(n[1]=n[1].toUpperCase()),\"sgn\"!==n[0]&&2===n[2].length&&(n[2]=n[2].toUpperCase()),t.indexOf(n[1].toLowerCase())>-1&&(n[1]=Rp(n[1].toLowerCase())),t.indexOf(n[2].toLowerCase())>-1&&(n[2]=Rp(n[2].toLowerCase()))),n.join(\"-\")}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}},{key:\"isWhitelisted\",value:function(e){return this.logger.deprecate(\"languageUtils.isWhitelisted\",'function \"isWhitelisted\" will be renamed to \"isSupportedCode\" in the next major - please make sure to rename it\\'s usage asap.'),this.isSupportedCode(e)}},{key:\"isSupportedCode\",value:function(e){return (\"languageOnly\"===this.options.load||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}},{key:\"getBestMatchFromCodes\",value:function(e){var t,n=this;return e?(e.forEach((function(e){if(!t){var r=n.formatLanguageCode(e);n.options.supportedLngs&&!n.isSupportedCode(r)||(t=r);}})),!t&&this.options.supportedLngs&&e.forEach((function(e){if(!t){var r=n.getLanguagePartFromCode(e);if(n.isSupportedCode(r))return t=r;t=n.options.supportedLngs.find((function(e){if(0===e.indexOf(r))return e}));}})),t||(t=this.getFallbackCodes(this.options.fallbackLng)[0]),t):null}},{key:\"getFallbackCodes\",value:function(e,t){if(!e)return [];if(\"function\"==typeof e&&(e=e(t)),\"string\"==typeof e&&(e=[e]),\"[object Array]\"===Object.prototype.toString.apply(e))return e;if(!t)return e.default||[];var n=e[t];return n||(n=e[this.getScriptPartFromCode(t)]),n||(n=e[this.formatLanguageCode(t)]),n||(n=e[this.getLanguagePartFromCode(t)]),n||(n=e.default),n||[]}},{key:\"toResolveHierarchy\",value:function(e,t){var n=this,r=this.getFallbackCodes(t||this.options.fallbackLng||[],e),o=[],i=function(e){e&&(n.isSupportedCode(e)?o.push(e):n.logger.warn(\"rejecting language code not found in supportedLngs: \".concat(e)));};return \"string\"==typeof e&&e.indexOf(\"-\")>-1?(\"languageOnly\"!==this.options.load&&i(this.formatLanguageCode(e)),\"languageOnly\"!==this.options.load&&\"currentOnly\"!==this.options.load&&i(this.getScriptPartFromCode(e)),\"currentOnly\"!==this.options.load&&i(this.getLanguagePartFromCode(e))):\"string\"==typeof e&&i(this.formatLanguageCode(e)),r.forEach((function(e){o.indexOf(e)<0&&i(n.formatLanguageCode(e));})),o}}]),e}(),jp=[{lngs:[\"ach\",\"ak\",\"am\",\"arn\",\"br\",\"fil\",\"gun\",\"ln\",\"mfe\",\"mg\",\"mi\",\"oc\",\"pt\",\"pt-BR\",\"tg\",\"tl\",\"ti\",\"tr\",\"uz\",\"wa\"],nr:[1,2],fc:1},{lngs:[\"af\",\"an\",\"ast\",\"az\",\"bg\",\"bn\",\"ca\",\"da\",\"de\",\"dev\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fi\",\"fo\",\"fur\",\"fy\",\"gl\",\"gu\",\"ha\",\"hi\",\"hu\",\"hy\",\"ia\",\"it\",\"kk\",\"kn\",\"ku\",\"lb\",\"mai\",\"ml\",\"mn\",\"mr\",\"nah\",\"nap\",\"nb\",\"ne\",\"nl\",\"nn\",\"no\",\"nso\",\"pa\",\"pap\",\"pms\",\"ps\",\"pt-PT\",\"rm\",\"sco\",\"se\",\"si\",\"so\",\"son\",\"sq\",\"sv\",\"sw\",\"ta\",\"te\",\"tk\",\"ur\",\"yo\"],nr:[1,2],fc:2},{lngs:[\"ay\",\"bo\",\"cgg\",\"fa\",\"ht\",\"id\",\"ja\",\"jbo\",\"ka\",\"km\",\"ko\",\"ky\",\"lo\",\"ms\",\"sah\",\"su\",\"th\",\"tt\",\"ug\",\"vi\",\"wo\",\"zh\"],nr:[1],fc:3},{lngs:[\"be\",\"bs\",\"cnr\",\"dz\",\"hr\",\"ru\",\"sr\",\"uk\"],nr:[1,2,5],fc:4},{lngs:[\"ar\"],nr:[0,1,2,3,11,100],fc:5},{lngs:[\"cs\",\"sk\"],nr:[1,2,5],fc:6},{lngs:[\"csb\",\"pl\"],nr:[1,2,5],fc:7},{lngs:[\"cy\"],nr:[1,2,3,8],fc:8},{lngs:[\"fr\"],nr:[1,2],fc:9},{lngs:[\"ga\"],nr:[1,2,3,7,11],fc:10},{lngs:[\"gd\"],nr:[1,2,3,20],fc:11},{lngs:[\"is\"],nr:[1,2],fc:12},{lngs:[\"jv\"],nr:[0,1],fc:13},{lngs:[\"kw\"],nr:[1,2,3,4],fc:14},{lngs:[\"lt\"],nr:[1,2,10],fc:15},{lngs:[\"lv\"],nr:[1,2,0],fc:16},{lngs:[\"mk\"],nr:[1,2],fc:17},{lngs:[\"mnk\"],nr:[0,1,2],fc:18},{lngs:[\"mt\"],nr:[1,2,11,20],fc:19},{lngs:[\"or\"],nr:[2,1],fc:2},{lngs:[\"ro\"],nr:[1,2,20],fc:20},{lngs:[\"sl\"],nr:[5,1,2,3],fc:21},{lngs:[\"he\",\"iw\"],nr:[1,2,20,21],fc:22}],Ap={1:function(e){return Number(e>1)},2:function(e){return Number(1!=e)},3:function(e){return 0},4:function(e){return Number(e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2)},5:function(e){return Number(0==e?0:1==e?1:2==e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5)},6:function(e){return Number(1==e?0:e>=2&&e<=4?1:2)},7:function(e){return Number(1==e?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2)},8:function(e){return Number(1==e?0:2==e?1:8!=e&&11!=e?2:3)},9:function(e){return Number(e>=2)},10:function(e){return Number(1==e?0:2==e?1:e<7?2:e<11?3:4)},11:function(e){return Number(1==e||11==e?0:2==e||12==e?1:e>2&&e<20?2:3)},12:function(e){return Number(e%10!=1||e%100==11)},13:function(e){return Number(0!==e)},14:function(e){return Number(1==e?0:2==e?1:3==e?2:3)},15:function(e){return Number(e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2)},16:function(e){return Number(e%10==1&&e%100!=11?0:0!==e?1:2)},17:function(e){return Number(1==e||e%10==1&&e%100!=11?0:1)},18:function(e){return Number(0==e?0:1==e?1:2)},19:function(e){return Number(1==e?0:0==e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3)},20:function(e){return Number(1==e?0:0==e||e%100>0&&e%100<20?1:2)},21:function(e){return Number(e%100==1?1:e%100==2?2:e%100==3||e%100==4?3:0)},22:function(e){return Number(1==e?0:2==e?1:(e<0||e>10)&&e%10==0?2:3)}};function _p(){var e={};return jp.forEach((function(t){t.lngs.forEach((function(n){e[n]={numbers:t.nr,plurals:Ap[t.fc]};}));})),e}var Fp=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};ip.default(this,e),this.languageUtils=t,this.options=n,this.logger=pp.create(\"pluralResolver\"),this.rules=_p();}return ap.default(e,[{key:\"addRule\",value:function(e,t){this.rules[e]=t;}},{key:\"getRule\",value:function(e){return this.rules[e]||this.rules[this.languageUtils.getLanguagePartFromCode(e)]}},{key:\"needsPlural\",value:function(e){var t=this.getRule(e);return t&&t.numbers.length>1}},{key:\"getPluralFormsOfKey\",value:function(e,t){return this.getSuffixes(e).map((function(e){return t+e}))}},{key:\"getSuffixes\",value:function(e){var t=this,n=this.getRule(e);return n?n.numbers.map((function(n){return t.getSuffix(e,n)})):[]}},{key:\"getSuffix\",value:function(e,t){var n=this,r=this.getRule(e);if(r){var o=r.noAbs?r.plurals(t):r.plurals(Math.abs(t)),i=r.numbers[o];this.options.simplifyPluralSuffix&&2===r.numbers.length&&1===r.numbers[0]&&(2===i?i=\"plural\":1===i&&(i=\"\"));var a=function(){return n.options.prepend&&i.toString()?n.options.prepend+i.toString():i.toString()};return \"v1\"===this.options.compatibilityJSON?1===i?\"\":\"number\"==typeof i?\"_plural_\".concat(i.toString()):a():\"v2\"===this.options.compatibilityJSON||this.options.simplifyPluralSuffix&&2===r.numbers.length&&1===r.numbers[0]?a():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn(\"no plural rule found for: \".concat(e)),\"\"}}]),e}(),Ip=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};ip.default(this,e),this.logger=pp.create(\"interpolator\"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t);}return ap.default(e,[{key:\"init\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e.interpolation||(e.interpolation={escapeValue:!0});var t=e.interpolation;this.escape=void 0!==t.escape?t.escape:Op,this.escapeValue=void 0===t.escapeValue||t.escapeValue,this.useRawValueToEscape=void 0!==t.useRawValueToEscape&&t.useRawValueToEscape,this.prefix=t.prefix?Sp(t.prefix):t.prefixEscaped||\"{{\",this.suffix=t.suffix?Sp(t.suffix):t.suffixEscaped||\"}}\",this.formatSeparator=t.formatSeparator?t.formatSeparator:t.formatSeparator||\",\",this.unescapePrefix=t.unescapeSuffix?\"\":t.unescapePrefix||\"-\",this.unescapeSuffix=this.unescapePrefix?\"\":t.unescapeSuffix||\"\",this.nestingPrefix=t.nestingPrefix?Sp(t.nestingPrefix):t.nestingPrefixEscaped||Sp(\"$t(\"),this.nestingSuffix=t.nestingSuffix?Sp(t.nestingSuffix):t.nestingSuffixEscaped||Sp(\")\"),this.nestingOptionsSeparator=t.nestingOptionsSeparator?t.nestingOptionsSeparator:t.nestingOptionsSeparator||\",\",this.maxReplaces=t.maxReplaces?t.maxReplaces:1e3,this.alwaysFormat=void 0!==t.alwaysFormat&&t.alwaysFormat,this.resetRegExp();}},{key:\"reset\",value:function(){this.options&&this.init(this.options);}},{key:\"resetRegExp\",value:function(){var e=\"\".concat(this.prefix,\"(.+?)\").concat(this.suffix);this.regexp=new RegExp(e,\"g\");var t=\"\".concat(this.prefix).concat(this.unescapePrefix,\"(.+?)\").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(t,\"g\");var n=\"\".concat(this.nestingPrefix,\"(.+?)\").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(n,\"g\");}},{key:\"interpolate\",value:function(e,t,n,r){var o,i,a,s=this,l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function u(e){return e.replace(/\\$/g,\"$$$$\")}var c=function(e){if(e.indexOf(s.formatSeparator)<0){var o=xp(t,l,e);return s.alwaysFormat?s.format(o,void 0,n,op.default({},r,t,{interpolationkey:e})):o}var i=e.split(s.formatSeparator),a=i.shift().trim(),u=i.join(s.formatSeparator).trim();return s.format(xp(t,l,a),u,n,op.default({},r,t,{interpolationkey:a}))};this.resetRegExp();var f=r&&r.missingInterpolationHandler||this.options.missingInterpolationHandler,d=r&&r.interpolation&&r.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables;return [{regex:this.regexpUnescape,safeValue:function(e){return u(e)}},{regex:this.regexp,safeValue:function(e){return s.escapeValue?u(s.escape(e)):u(e)}}].forEach((function(t){for(a=0;o=t.regex.exec(e);){if(void 0===(i=c(o[1].trim())))if(\"function\"==typeof f){var n=f(e,o,r);i=\"string\"==typeof n?n:\"\";}else {if(d){i=o[0];continue}s.logger.warn(\"missed to pass in variable \".concat(o[1],\" for interpolating \").concat(e)),i=\"\";}else \"string\"==typeof i||s.useRawValueToEscape||(i=vp(i));var l=t.safeValue(i);if(e=e.replace(o[0],l),d?(t.regex.lastIndex+=l.length,t.regex.lastIndex-=o[0].length):t.regex.lastIndex=0,++a>=s.maxReplaces)break}})),e}},{key:\"nest\",value:function(e,t){var n,r,o=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=op.default({},i);function s(e,t){var n=this.nestingOptionsSeparator;if(e.indexOf(n)<0)return e;var r=e.split(new RegExp(\"\".concat(n,\"[ ]*{\"))),o=\"{\".concat(r[1]);e=r[0],o=(o=this.interpolate(o,a)).replace(/'/g,'\"');try{a=JSON.parse(o),t&&(a=op.default({},t,a));}catch(t){return this.logger.warn(\"failed parsing options string in nesting for key \".concat(e),t),\"\".concat(e).concat(n).concat(o)}return delete a.defaultValue,e}for(a.applyPostProcessor=!1,delete a.defaultValue;n=this.nestingRegexp.exec(e);){var l=[],u=!1;if(-1!==n[0].indexOf(this.formatSeparator)&&!/{.*}/.test(n[1])){var c=n[1].split(this.formatSeparator).map((function(e){return e.trim()}));n[1]=c.shift(),l=c,u=!0;}if((r=t(s.call(this,n[1].trim(),a),a))&&n[0]===e&&\"string\"!=typeof r)return r;\"string\"!=typeof r&&(r=vp(r)),r||(this.logger.warn(\"missed to resolve \".concat(n[1],\" for nesting \").concat(e)),r=\"\"),u&&(r=l.reduce((function(e,t){return o.format(e,t,i.lng,op.default({},i,{interpolationkey:n[1].trim()}))}),r.trim())),e=e.replace(n[0],r),this.regexp.lastIndex=0;}return e}}]),e}();var Bp=function(e){function t(e,n,r){var o,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return ip.default(this,t),o=sp.default(this,lp.default(t).call(this)),Cp&&hp.call(up.default(o)),o.backend=e,o.store=n,o.services=r,o.languageUtils=r.languageUtils,o.options=i,o.logger=pp.create(\"backendConnector\"),o.state={},o.queue=[],o.backend&&o.backend.init&&o.backend.init(r,i.backend,i),o}return cp.default(t,e),ap.default(t,[{key:\"queueLoad\",value:function(e,t,n,r){var o=this,i=[],a=[],s=[],l=[];return e.forEach((function(e){var r=!0;t.forEach((function(t){var s=\"\".concat(e,\"|\").concat(t);!n.reload&&o.store.hasResourceBundle(e,t)?o.state[s]=2:o.state[s]<0||(1===o.state[s]?a.indexOf(s)<0&&a.push(s):(o.state[s]=1,r=!1,a.indexOf(s)<0&&a.push(s),i.indexOf(s)<0&&i.push(s),l.indexOf(t)<0&&l.push(t)));})),r||s.push(e);})),(i.length||a.length)&&this.queue.push({pending:a,loaded:{},errors:[],callback:r}),{toLoad:i,pending:a,toLoadLanguages:s,toLoadNamespaces:l}}},{key:\"loaded\",value:function(e,t,n){var r=e.split(\"|\"),o=r[0],i=r[1];t&&this.emit(\"failedLoading\",o,i,t),n&&this.store.addResourceBundle(o,i,n),this.state[e]=t?-1:2;var a={};this.queue.forEach((function(n){!function(e,t,n,r){var o=mp(e,t,Object),i=o.obj,a=o.k;i[a]=i[a]||[],r&&(i[a]=i[a].concat(n)),r||i[a].push(n);}(n.loaded,[o],i),function(e,t){for(var n=e.indexOf(t);-1!==n;)e.splice(n,1),n=e.indexOf(t);}(n.pending,e),t&&n.errors.push(t),0!==n.pending.length||n.done||(Object.keys(n.loaded).forEach((function(e){a[e]||(a[e]=[]),n.loaded[e].length&&n.loaded[e].forEach((function(t){a[e].indexOf(t)<0&&a[e].push(t);}));})),n.done=!0,n.errors.length?n.callback(n.errors):n.callback());})),this.emit(\"loaded\",a),this.queue=this.queue.filter((function(e){return !e.done}));}},{key:\"read\",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,a=arguments.length>5?arguments[5]:void 0;return e.length?this.backend[n](e,t,(function(s,l){s&&l&&o<5?setTimeout((function(){r.read.call(r,e,t,n,o+1,2*i,a);}),i):a(s,l);})):a(null,{})}},{key:\"prepareLoading\",value:function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn(\"No backend was added via i18next.use. Will not load resources.\"),o&&o();\"string\"==typeof e&&(e=this.languageUtils.toResolveHierarchy(e)),\"string\"==typeof t&&(t=[t]);var i=this.queueLoad(e,t,r,o);if(!i.toLoad.length)return i.pending.length||o(),null;i.toLoad.forEach((function(e){n.loadOne(e);}));}},{key:\"load\",value:function(e,t,n){this.prepareLoading(e,t,{},n);}},{key:\"reload\",value:function(e,t,n){this.prepareLoading(e,t,{reload:!0},n);}},{key:\"loadOne\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",r=e.split(\"|\"),o=r[0],i=r[1];this.read(o,i,\"read\",void 0,void 0,(function(r,a){r&&t.logger.warn(\"\".concat(n,\"loading namespace \").concat(i,\" for language \").concat(o,\" failed\"),r),!r&&a&&t.logger.log(\"\".concat(n,\"loaded namespace \").concat(i,\" for language \").concat(o),a),t.loaded(e,r,a);}));}},{key:\"saveMissing\",value:function(e,t,n,r,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(t)?this.logger.warn('did not save key \"'.concat(n,'\" as the namespace \"').concat(t,'\" was not yet loaded'),\"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!\"):null!=n&&\"\"!==n&&(this.backend&&this.backend.create&&this.backend.create(e,t,n,r,null,op.default({},i,{isUpdate:o})),e&&e[0]&&this.store.addResource(e[0],t,n,r));}}]),t}(hp);function $p(){return {debug:!1,initImmediate:!0,ns:[\"translation\"],defaultNS:[\"translation\"],fallbackLng:[\"dev\"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:\"all\",preload:!1,simplifyPluralSuffix:!0,keySeparator:\".\",nsSeparator:\":\",pluralSeparator:\"_\",contextSeparator:\"_\",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:\"fallback\",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(e){var t={};if(\"object\"===rp.default(e[1])&&(t=e[1]),\"string\"==typeof e[1]&&(t.defaultValue=e[1]),\"string\"==typeof e[2]&&(t.tDescription=e[2]),\"object\"===rp.default(e[2])||\"object\"===rp.default(e[3])){var n=e[3]||e[2];Object.keys(n).forEach((function(e){t[e]=n[e];}));}return t},interpolation:{escapeValue:!0,format:function(e,t,n,r){return e},prefix:\"{{\",suffix:\"}}\",formatSeparator:\",\",unescapePrefix:\"-\",nestingPrefix:\"$t(\",nestingSuffix:\")\",nestingOptionsSeparator:\",\",maxReplaces:1e3,skipOnVariables:!1}}}function Wp(e){return \"string\"==typeof e.ns&&(e.ns=[e.ns]),\"string\"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),\"string\"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf(\"cimode\")<0&&(e.whitelist=e.whitelist.concat([\"cimode\"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf(\"cimode\")<0&&(e.supportedLngs=e.supportedLngs.concat([\"cimode\"])),e}function Hp(){}var Vp=function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(ip.default(this,t),e=sp.default(this,lp.default(t).call(this)),Cp&&hp.call(up.default(e)),e.options=Wp(n),e.services={},e.logger=pp,e.modules={external:[]},r&&!e.isInitialized&&!n.isClone){if(!e.options.initImmediate)return e.init(n,r),sp.default(e,up.default(e));setTimeout((function(){e.init(n,r);}),0);}return e}return cp.default(t,e),ap.default(t,[{key:\"init\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;function r(e){return e?\"function\"==typeof e?new e:e:null}if(\"function\"==typeof t&&(n=t,t={}),t.whitelist&&!t.supportedLngs&&this.logger.deprecate(\"whitelist\",'option \"whitelist\" will be renamed to \"supportedLngs\" in the next major - please make sure to rename this option asap.'),t.nonExplicitWhitelist&&!t.nonExplicitSupportedLngs&&this.logger.deprecate(\"whitelist\",'options \"nonExplicitWhitelist\" will be renamed to \"nonExplicitSupportedLngs\" in the next major - please make sure to rename this option asap.'),this.options=op.default({},$p(),this.options,Wp(t)),this.format=this.options.interpolation.format,n||(n=Hp),!this.options.isClone){this.modules.logger?pp.init(r(this.modules.logger),this.options):pp.init(null,this.options);var o=new Dp(this.options);this.store=new Np(this.options.resources,this.options);var i=this.services;i.logger=pp,i.resourceStore=this.store,i.languageUtils=o,i.pluralResolver=new Fp(o,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),i.interpolator=new Ip(this.options),i.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},i.backendConnector=new Bp(r(this.modules.backend),i.resourceStore,i,this.options),i.backendConnector.on(\"*\",(function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];e.emit.apply(e,[t].concat(r));})),this.modules.languageDetector&&(i.languageDetector=r(this.modules.languageDetector),i.languageDetector.init(i,this.options.detection,this.options)),this.modules.i18nFormat&&(i.i18nFormat=r(this.modules.i18nFormat),i.i18nFormat.init&&i.i18nFormat.init(this)),this.translator=new Pp(this.services,this.options),this.translator.on(\"*\",(function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];e.emit.apply(e,[t].concat(r));})),this.modules.external.forEach((function(t){t.init&&t.init(e);}));}if(this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){var a=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);a.length>0&&\"dev\"!==a[0]&&(this.options.lng=a[0]);}this.services.languageDetector||this.options.lng||this.logger.warn(\"init: no languageDetector is used and no lng is defined\");var s=[\"getResource\",\"hasResourceBundle\",\"getResourceBundle\",\"getDataByLanguage\"];s.forEach((function(t){e[t]=function(){var n;return (n=e.store)[t].apply(n,arguments)};}));var l=[\"addResource\",\"addResources\",\"addResourceBundle\",\"removeResourceBundle\"];l.forEach((function(t){e[t]=function(){var n;return (n=e.store)[t].apply(n,arguments),e};}));var u=gp(),c=function(){var t=function(t,r){e.isInitialized&&!e.initializedStoreOnce&&e.logger.warn(\"init: i18next is already initialized. You should call init just once!\"),e.isInitialized=!0,e.options.isClone||e.logger.log(\"initialized\",e.options),e.emit(\"initialized\",e.options),u.resolve(r),n(t,r);};if(e.languages&&\"v1\"!==e.options.compatibilityAPI&&!e.isInitialized)return t(null,e.t.bind(e));e.changeLanguage(e.options.lng,t);};return this.options.resources||!this.options.initImmediate?c():setTimeout(c,0),u}},{key:\"loadResources\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Hp,r=n,o=\"string\"==typeof e?e:this.language;if(\"function\"==typeof e&&(r=e),!this.options.resources||this.options.partialBundledLanguages){if(o&&\"cimode\"===o.toLowerCase())return r();var i=[],a=function(e){e&&t.services.languageUtils.toResolveHierarchy(e).forEach((function(e){i.indexOf(e)<0&&i.push(e);}));};if(o)a(o);else {var s=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);s.forEach((function(e){return a(e)}));}this.options.preload&&this.options.preload.forEach((function(e){return a(e)})),this.services.backendConnector.load(i,this.options.ns,r);}else r(null);}},{key:\"reloadResources\",value:function(e,t,n){var r=gp();return e||(e=this.languages),t||(t=this.options.ns),n||(n=Hp),this.services.backendConnector.reload(e,t,(function(e){r.resolve(),n(e);})),r}},{key:\"use\",value:function(e){if(!e)throw new Error(\"You are passing an undefined module! Please check the object you are passing to i18next.use()\");if(!e.type)throw new Error(\"You are passing a wrong module! Please check the object you are passing to i18next.use()\");return \"backend\"===e.type&&(this.modules.backend=e),(\"logger\"===e.type||e.log&&e.warn&&e.error)&&(this.modules.logger=e),\"languageDetector\"===e.type&&(this.modules.languageDetector=e),\"i18nFormat\"===e.type&&(this.modules.i18nFormat=e),\"postProcessor\"===e.type&&Mp.addPostProcessor(e),\"3rdParty\"===e.type&&this.modules.external.push(e),this}},{key:\"changeLanguage\",value:function(e,t){var n=this;this.isLanguageChangingTo=e;var r=gp();this.emit(\"languageChanging\",e);var o=function(o){e||o||!n.services.languageDetector||(o=[]);var i=\"string\"==typeof o?o:n.services.languageUtils.getBestMatchFromCodes(o);i&&(n.language||(n.language=i,n.languages=n.services.languageUtils.toResolveHierarchy(i)),n.translator.language||n.translator.changeLanguage(i),n.services.languageDetector&&n.services.languageDetector.cacheUserLanguage(i)),n.loadResources(i,(function(e){!function(e,o){o?(n.language=o,n.languages=n.services.languageUtils.toResolveHierarchy(o),n.translator.changeLanguage(o),n.isLanguageChangingTo=void 0,n.emit(\"languageChanged\",o),n.logger.log(\"languageChanged\",o)):n.isLanguageChangingTo=void 0,r.resolve((function(){return n.t.apply(n,arguments)})),t&&t(e,(function(){return n.t.apply(n,arguments)}));}(e,i);}));};return e||!this.services.languageDetector||this.services.languageDetector.async?!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(o):o(e):o(this.services.languageDetector.detect()),r}},{key:\"getFixedT\",value:function(e,t,n){var r=this,o=function e(t,o){var i;if(\"object\"!==rp.default(o)){for(var a=arguments.length,s=new Array(a>2?a-2:0),l=2;l<a;l++)s[l-2]=arguments[l];i=r.options.overloadTranslationOptionHandler([t,o].concat(s));}else i=op.default({},o);i.lng=i.lng||e.lng,i.lngs=i.lngs||e.lngs,i.ns=i.ns||e.ns;var u=r.options.keySeparator||\".\",c=n?\"\".concat(n).concat(u).concat(t):t;return r.t(c,i)};return \"string\"==typeof e?o.lng=e:o.lngs=e,o.ns=t,o.keyPrefix=n,o}},{key:\"t\",value:function(){var e;return this.translator&&(e=this.translator).translate.apply(e,arguments)}},{key:\"exists\",value:function(){var e;return this.translator&&(e=this.translator).exists.apply(e,arguments)}},{key:\"setDefaultNamespace\",value:function(e){this.options.defaultNS=e;}},{key:\"hasLoadedNamespace\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn(\"hasLoadedNamespace: i18next was not initialized\",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(\"hasLoadedNamespace: i18n.languages were undefined or empty\",this.languages),!1;var r=this.languages[0],o=!!this.options&&this.options.fallbackLng,i=this.languages[this.languages.length-1];if(\"cimode\"===r.toLowerCase())return !0;var a=function(e,n){var r=t.services.backendConnector.state[\"\".concat(e,\"|\").concat(n)];return -1===r||2===r};if(n.precheck){var s=n.precheck(this,a);if(void 0!==s)return s}return !!this.hasResourceBundle(r,e)||(!this.services.backendConnector.backend||!(!a(r,e)||o&&!a(i,e)))}},{key:\"loadNamespaces\",value:function(e,t){var n=this,r=gp();return this.options.ns?(\"string\"==typeof e&&(e=[e]),e.forEach((function(e){n.options.ns.indexOf(e)<0&&n.options.ns.push(e);})),this.loadResources((function(e){r.resolve(),t&&t(e);})),r):(t&&t(),Promise.resolve())}},{key:\"loadLanguages\",value:function(e,t){var n=gp();\"string\"==typeof e&&(e=[e]);var r=this.options.preload||[],o=e.filter((function(e){return r.indexOf(e)<0}));return o.length?(this.options.preload=r.concat(o),this.loadResources((function(e){n.resolve(),t&&t(e);})),n):(t&&t(),Promise.resolve())}},{key:\"dir\",value:function(e){if(e||(e=this.languages&&this.languages.length>0?this.languages[0]:this.language),!e)return \"rtl\";return [\"ar\",\"shu\",\"sqr\",\"ssh\",\"xaa\",\"yhd\",\"yud\",\"aao\",\"abh\",\"abv\",\"acm\",\"acq\",\"acw\",\"acx\",\"acy\",\"adf\",\"ads\",\"aeb\",\"aec\",\"afb\",\"ajp\",\"apc\",\"apd\",\"arb\",\"arq\",\"ars\",\"ary\",\"arz\",\"auz\",\"avl\",\"ayh\",\"ayl\",\"ayn\",\"ayp\",\"bbz\",\"pga\",\"he\",\"iw\",\"ps\",\"pbt\",\"pbu\",\"pst\",\"prp\",\"prd\",\"ug\",\"ur\",\"ydd\",\"yds\",\"yih\",\"ji\",\"yi\",\"hbo\",\"men\",\"xmn\",\"fa\",\"jpr\",\"peo\",\"pes\",\"prs\",\"dv\",\"sam\"].indexOf(this.services.languageUtils.getLanguagePartFromCode(e))>=0?\"rtl\":\"ltr\"}},{key:\"createInstance\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new t(e,n)}},{key:\"cloneInstance\",value:function(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Hp,o=op.default({},this.options,n,{isClone:!0}),i=new t(o),a=[\"store\",\"services\",\"language\"];return a.forEach((function(t){i[t]=e[t];})),i.services=op.default({},this.services),i.services.utils={hasLoadedNamespace:i.hasLoadedNamespace.bind(i)},i.translator=new Pp(i.services,i.options),i.translator.on(\"*\",(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];i.emit.apply(i,[e].concat(n));})),i.init(o,r),i.translator.options=i.options,i.translator.backendConnector.services.utils={hasLoadedNamespace:i.hasLoadedNamespace.bind(i)},i}},{key:\"toJSON\",value:function(){return {options:this.options,store:this.store,language:this.language,languages:this.languages}}}]),t}(hp),zp=new Vp,Up=\"translation\";zp.init({lng:\"zh-CN\",resources:{}});var Kp=zp.t.bind(zp);e.DomEditor=Hs,e.ELEM_TO_HTML_CONF=ol,e.PARSE_ELEM_HTML_CONF=Zu,e.PARSE_STYLE_HTML_FN_LIST=Qu,e.PRE_PARSE_HTML_CONF_LIST=Xu,e.RENDER_ELEM_CONF=Ff,e.RENDER_STYLE_HANDLER_LIST=_f,e.STYLE_TO_HTML_FN_LIST=rl,e.TEXT_TAGS=Yu,e.Toolbar=Bd,e.coreCreateEditor=function(e){var n=e.selector,r=void 0===n?\"\":n,o=e.config,i=void 0===o?{}:o,a=e.content,s=e.html,l=e.plugins,u=void 0===l?[]:l,c=Qn(function(e){var n=e,r=n.insertText,o=n.insertNode,i=n.insertFragment,a=n.dangerouslyInsertHtml;return n.insertText=function(e){if(n.getConfig().maxLength){var t=Hs.getLeftLengthOfMaxLength(n);t<=0||(t<e.length?r(e.slice(0,t)):r(e));}else r(e);},n.insertNode=function(e){if(n.getConfig().maxLength){var r=Hs.getLeftLengthOfMaxLength(n);r<=0||r<t.Node.string(e).length||o(e);}else o(e);},n.insertFragment=function(e){if(n.getConfig().maxLength)if(1!==e.length)e.forEach((function(e){n.insertNode(e);}));else {var r=e[0];if(Hs.getLeftLengthOfMaxLength(n)<t.Node.string(r).length)return;i(e);}else i(e);},n.dangerouslyInsertHtml=function(e,t){if(void 0===e&&(e=\"\"),void 0===t&&(t=!1),e)if(n.getConfig().maxLength){var r=Hs.getLeftLengthOfMaxLength(n);if(!(r<=0)){var o=document.createElement(\"div\");o.innerHTML=e;var i=Array.from(o.childNodes).reduce((function(e,t){var n=t.nodeType,r=t.nodeName;return t?n===Ss.TEXT_NODE?e+(t.textContent||\"\"):n===Ss.ELEMENT_NODE?Ic.has(r.toLowerCase())?e:e+(t.textContent||\"\"):e:e}),\"\");r<i.length||a(e,t);}}else a(e,t);},n}(function(e){var t=e;return t.on=function(e,n){var r=ff(t);if(r.on(e,n),\"destroyed\"===e&&pf(t,n),\"destroyed\"!==e){var o=function(){return r.off(e,n)};r.on(\"destroyed\",o),pf(t,o);}},t.once=function(e,n){ff(t).once(e,n);},t.off=function(e,n){ff(t).off(e,n);},t.emit=function(e){for(var n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];var o=ff(t);(o.emit.apply(o,Ji([e],Gi(n))),\"destroyed\"===e)&&(hf(t).forEach((function(e){return o.off(\"destroyed\",e)})),gf(t));},t}(function(e){var n=e;return n.select=function(e){t.Transforms.select(n,e);},n.deselect=function(){var r=n.selection,o=Hs.findDocumentOrShadowRoot(n).getSelection();o&&o.rangeCount>0&&o.removeAllRanges(),r&&t.Transforms.deselect(e);},n.move=function(n,r){void 0===r&&(r=!1),n&&(n<0||t.Transforms.move(e,{distance:n,unit:\"character\",reverse:r}));},n.moveReverse=function(e){n.move(e,!0);},n.restoreSelection=function(){var e=vs.get(n);null!=e&&(n.focus(),t.Transforms.select(n,e));},n.getSelectionPosition=function(){return yf(n)},n.getNodePosition=function(e){return mf(n,e)},n.isSelectedAll=function(){var e=n.selection;if(null==e)return !1;var r=Gi(t.Range.edges(e),2),o=r[0],i=r[1],a=Gi(t.Editor.edges(n,[]),2),s=a[0],l=a[1];return !(!t.Point.equals(o,s)||!t.Point.equals(i,l))},n.selectAll=function(){var e=t.Editor.start(n,[]),r=t.Editor.end(n,[]);t.Transforms.select(n,{anchor:e,focus:r});},n}($c(function(e){var t=e;return t.getAllMenuKeys=function(){var e=[];for(var t in Us)e.push(t);return e},t.getConfig=function(){var e=rs.get(t);if(null==e)throw new Error(\"Can not get editor config\");return e},t.getMenuConfig=function(e){var n=t.getConfig().MENU_CONF;return (void 0===n?{}:n)[e]||{}},t.alert=function(e,n){void 0===n&&(n=\"info\");var r=t.getConfig().customAlert;r&&r(e,n);},t}(function(e){var n=e;return n.id=\"wangEditor-\"+Vs++,n.isDestroyed=!1,n.isFullScreen=!1,n.focus=function(e){if(Hs.toDOMNode(n,n).focus({preventScroll:!0}),gs.set(n,!0),e){var r=t.Editor.end(n,[]);t.Transforms.select(n,r);}else {var o=vs.get(n);o?t.Transforms.select(n,o):t.Transforms.select(n,t.Editor.start(n,[]));}},n.isFocused=function(){return !!gs.get(n)},n.blur=function(){Hs.toDOMNode(n,n).blur(),t.Transforms.deselect(n),gs.set(n,!1);},n.updateView=function(){Hs.getTextarea(n).changeViewState();var e=Hs.getToolbar(n);e&&e.changeToolbarState();var t=Hs.getHoverbar(n);t&&t.changeHoverbarState();},n.destroy=function(){if(!n.isDestroyed){var e=Hs.getTextarea(n);e.destroy(),Ga.delete(n),Ja.delete(e);var t=Hs.getToolbar(n);t&&(t.destroy(),Xa.delete(n),Ya.delete(t));var r=Hs.getHoverbar(n);r&&(r.destroy(),Za.delete(n),Qa.delete(r)),n.isDestroyed=!0,n.emit(\"destroyed\");}},n.scrollToElem=function(e){if(!n.getConfig().scroll){var t=\"编辑器禁用了 scroll ，编辑器内容无法滚动，请自行实现该功能\";return t+=\"\\nYou has disabled editor scroll, please do this yourself\",void console.warn(t)}var r=y.default(\"#\"+e);if(0!==r.length){var o=r[0];if(!Hs.hasDOMNode(n,o))return t=\"Element (found by id is '\"+e+\"') is not in editor DOM\",t+=\"\\n 通过 id '\"+e+\"' 找到的 element 不在 editor DOM 之内\",void console.error(t,o);var i=Hs.getTextarea(n),a=i.$textAreaContainer,s=i.$scroll,l=r.offset().top,u=a.offset().top;s[0].scrollBy({top:l-u,behavior:\"smooth\"});}},n.showProgressBar=function(e){e<1||Hs.getTextarea(n).changeProgress(e);},n.hidePanelOrModal=function(){var e=ts.get(n);null!=e&&e.forEach((function(e){return e.hide()}));},n.enable=function(){n.getConfig().readOnly=!1,n.updateView();},n.disable=function(){n.getConfig().readOnly=!0,n.updateView();},n.isDisabled=function(){return n.getConfig().readOnly},n.toDOMNode=function(e){return Hs.toDOMNode(n,e)},n.fullScreen=function(){if(!n.isFullScreen){var e=null,t=Hs.getToolbar(n);t&&(e=t.$box);var r=Hs.getTextarea(n).$box.parent();if(e&&e.parent()[0]!==r[0])throw new Error(\"Can not set full screen, cause toolbar DOM parent is not equal to textarea DOM parent\\n不能设置全屏，因为 toolbar DOM 父节点和 textarea DOM 父节点不一致\");r.addClass(\"w-e-full-screen-container\");var o=r.css(\"z-index\");r.attr(\"data-z-index\",o.toString()),n.isFullScreen=!0,n.emit(\"fullScreen\");}},n.unFullScreen=function(){if(n.isFullScreen){var e=Hs.getTextarea(n).$box.parent();setTimeout((function(){e.removeClass(\"w-e-full-screen-container\"),n.isFullScreen=!1,n.emit(\"unFullScreen\");}),200);}},n.getEditableContainer=function(){return Hs.getTextarea(n).$textAreaContainer[0]},n}(Wc(t.createEditor()))))))));if(r&&function(e,t){return Pc(e,\"data-w-e-textarea\",t)}(c,r))throw new Error(\"Repeated create editor by selector '\"+r+\"'\");var f=function(e){void 0===e&&(e={});var t=E.default(zs),n={},r=e.MENU_CONF,o=void 0===r?{}:r;return m.default(t,(function(e,t){n[t]=Ki(Ki({},e),o[t]||{});})),delete e.MENU_CONF,Ki({scroll:!0,readOnly:!1,autoFocus:!0,decorate:function(){return []},maxLength:0,MENU_CONF:n,hoverbarKeys:{},customAlert:function(e,t){window.alert(t+\":\\n\"+e);}},e)}(i);rs.set(c,f);var d=f.hoverbarKeys,p=void 0===d?{}:d;if(u.forEach((function(e){c=e(c);})),null!=s&&(c.children=Rc(c,s)),a&&a.length&&(c.children=a),0===c.children.length&&(c.children=[{type:\"paragraph\",children:[{text:\"\"}]}]),Hs.normalizeContent(c),r){var h=new dd(r);Ga.set(c,h),Ja.set(h,c),h.changeViewState(),Uu((function(){var e=h.$scroll;if(null!=e&&e.height()<300){console.warn(\"编辑区域高度 < 300px 这可能会导致 modal hoverbar 定位异常\\nTextarea height < 300px . This may be cause modal and hoverbar position error\",e);}}));var g=void 0;Object.keys(p).length>0&&(g=new Pd,Qa.set(g,c),Za.set(c,g)),c.on(\"change\",(function(){c.hidePanelOrModal();})),c.on(\"scroll\",(function(){c.hidePanelOrModal();}));}else c.children.forEach((function(e,t){return Rd(e,t,c,c)}));var v=f.onCreated,b=f.onDestroyed;return v&&c.on(\"created\",(function(){return v(c)})),b&&c.on(\"destroyed\",(function(){return b(c)})),Uu((function(){return c.emit(\"created\")})),c},e.coreCreateToolbar=function(e,t){if(null==e)throw new Error(\"Cannot create toolbar, because editor is null\");var n=t.selector,r=t.config,o=void 0===r?{}:r;if(function(e,t){return Pc(e,\"data-w-e-toolbar\",t)}(e,n))throw new Error(\"Repeated create toolbar by selector '\"+n+\"'\");var i=Ki({toolbarKeys:[],excludeKeys:[],insertKeys:{index:0,keys:[]},modalAppendToBody:!1},o||{}),a=new Bd(n,i);return Ya.set(a,e),Xa.set(e,a),a},e.createUploader=function(e){var t=e.server,n=void 0===t?\"\":t,r=e.fieldName,o=void 0===r?\"\":r,i=e.maxFileSize,a=void 0===i?10485760:i,s=e.maxNumberOfFiles,l=void 0===s?100:s,u=e.meta,c=void 0===u?{}:u,f=e.metaWithUrl,d=void 0!==f&&f,p=e.headers,h=void 0===p?{}:p,g=e.withCredentials,v=void 0!==g&&g,y=e.timeout,b=void 0===y?1e4:y,w=e.onBeforeUpload,x=void 0===w?function(e){return e}:w,E=e.onSuccess,O=void 0===E?function(e,t){}:E,C=e.onError,T=void 0===C?function(e,t,n){console.error(e.name+\" upload error\",t,n);}:C,N=e.onProgress,M=void 0===N?function(e){}:N;if(!n)throw new Error(\"Cannot get upload server address\\n没有配置上传地址\");if(!o)throw new Error(\"Cannot get fieldName\\n没有配置 fieldName\");var L=n;d&&(L=function(e,t){var n=Gi(e.split(\"#\"),2),r=n[0],o=n[1],i=[];m.default(t,(function(e,t){i.push(t+\"=\"+e);}));var a=i.join(\"&\");return r=r.indexOf(\"?\")>0?r+\"&\"+a:r+\"?\"+a,o?r+\"#\"+o:r}(L,c));var P=new S.default({onBeforeUpload:x,restrictions:{maxFileSize:a,maxNumberOfFiles:l},meta:c}).use(k.default,{endpoint:L,headers:h,formData:!0,fieldName:o,bundle:!0,withCredentials:v,timeout:b});return P.on(\"upload-success\",(function(e,t){var n=t.body,r=void 0===n?{}:n;try{O(e,r);}catch(e){console.error(\"wangEditor upload file - onSuccess error\",e);}P.removeFile(e.id);})),P.on(\"progress\",(function(e){e<1||M(e);})),P.on(\"upload-error\",(function(e,t,n){try{T(e,t,n);}catch(e){console.error(\"wangEditor upload file - onError error\",e);}P.removeFile(e.id);})),P.on(\"restriction-failed\",(function(e,t){try{T(e,t);}catch(e){console.error(\"wangEditor upload file - onError error\",e);}P.removeFile(e.id);})),P},e.genModalButtonElems=function(e,t){var n=y.default('<div class=\"button-container\"></div>'),r=y.default('<button type=\"button\" id=\"'+e+'\">'+t+\"</button>\");return n.append(r),[n[0],r[0]]},e.genModalInputElems=function(e,t,n){var r=y.default('<label class=\"babel-container\"></label>');r.append(\"<span>\"+e+\"</span>\");var o=y.default('<input type=\"text\" id=\"'+t+'\" placeholder=\"'+(n||\"\")+'\">');return r.append(o),[r[0],o[0]]},e.genModalTextareaElems=function(e,t,n){var r=y.default('<label class=\"babel-container\"></label>');r.append(\"<span>\"+e+\"</span>\");var o=y.default('<textarea type=\"text\" id=\"'+t+'\" placeholder=\"'+(n||\"\")+'\"></textarea>');return r.append(o),[r[0],o[0]]},e.i18nAddResources=function(e,t){zp.addResourceBundle(e,Up,t,!0,!0);},e.i18nChangeLanguage=function(e){zp.changeLanguage(e);},e.i18nGetResources=function(e){return zp.getResourceBundle(e,Up)},e.registerElemToHtmlConf=function(e){var t=e.type,n=e.elemToHtml;ol[t||\"\"]=n;},e.registerMenu=function(e,t){var n=e.key,r=e.factory,o=e.config,i=Ki(Ki({},o),t||{});if(null!=Us[n])throw new Error(\"Duplicated key '\"+n+\"' in menu items\");Us[n]=r,function(e,t){null!=t&&(zs[e]=t);}(n,i);},e.registerParseElemHtmlConf=function(e){var t=e.selector,n=e.parseElemHtml;Zu[t]=n;},e.registerParseStyleHtmlHandler=function(e){Qu.push(e);},e.registerPreParseHtmlConf=function(e){Xu.push(e);},e.registerRenderElemConf=function(e){var t=e.type,n=e.renderElem;Ff[t||\"\"]=n;},e.registerStyleHandler=function(e){_f.push(e);},e.registerStyleToHtmlHandler=function(e){rl.push(e);},e.t=Kp,Object.defineProperty(e,\"__esModule\",{value:!0});}));\n\n  });\n\n  /**\n   * @description i18n en\n   * @author wangfupeng\n   */\n  var enResources = {\n      editor: {\n          more: 'More',\n          justify: 'Justify',\n          indent: 'Indent',\n          image: 'Image',\n          video: 'Video',\n      },\n  };\n\n  /**\n   * @description i18n zh-CN\n   * @author wangfupeng\n   */\n  var zhResources = {\n      editor: {\n          more: '更多',\n          justify: '对齐',\n          indent: '缩进',\n          image: '图片',\n          video: '视频',\n      },\n  };\n\n  /**\n   * @description i18n entry\n   * @author wangfupeng\n   */\n  dist$6.i18nAddResources('en', enResources);\n  dist$6.i18nAddResources('zh-CN', zhResources);\n\n  var dist$5 = createCommonjsModule$1(function (module, exports) {\n  !function(t,e){e(exports,dist$6,require$$2,require$$2$1,require$$1,require$$4,lodash_throttle);}(commonjsGlobal,(function(t,e,n,r,o,i,u){function a(t){return t&&\"object\"==typeof t&&\"default\"in t?t:{default:t}}var c=a(o),l=a(u);e.i18nAddResources(\"en\",{common:{ok:\"OK\",delete:\"Delete\",enter:\"Enter\"},blockQuote:{title:\"Quote\"},codeBlock:{title:\"Code block\"},color:{color:\"Font color\",bgColor:\"Back color\",default:\"Default color\",clear:\"Clear back color\"},divider:{title:\"Divider\"},emotion:{title:\"Emotion\"},fontSize:{title:\"Font size\",default:\"Default\"},fontFamily:{title:\"Font family\",default:\"Default\"},fullScreen:{title:\"Full screen\"},header:{title:\"Header\",text:\"Text\"},image:{netImage:\"Net image\",delete:\"Delete image\",edit:\"Edit image\",viewLink:\"View link\",src:\"Image src\",desc:\"Description\",link:\"Image link\"},indent:{decrease:\"Decrease\",increase:\"Increase\"},justify:{left:\"Left\",right:\"Right\",center:\"Center\",justify:\"Justify\"},lineHeight:{title:\"Line height\",default:\"Default\"},link:{insert:\"Insert link\",text:\"Link text\",url:\"Link source\",unLink:\"Unlink\",edit:\"Edit link\",view:\"View link\"},textStyle:{bold:\"Bold\",clear:\"Clear styles\",code:\"Inline code\",italic:\"Italic\",sub:\"Sub\",sup:\"Sup\",through:\"Through\",underline:\"Underline\"},undo:{undo:\"undo\",redo:\"Redo\"},todo:{todo:\"Todo\"}}),e.i18nAddResources(\"zh-CN\",{common:{ok:\"确定\",delete:\"删除\",enter:\"回车\"},blockQuote:{title:\"引用\"},codeBlock:{title:\"代码块\"},color:{color:\"文字颜色\",bgColor:\"背景色\",default:\"默认颜色\",clear:\"清除背景色\"},divider:{title:\"分割线\"},emotion:{title:\"表情\"},fontSize:{title:\"字号\",default:\"默认字号\"},fontFamily:{title:\"字体\",default:\"默认字体\"},fullScreen:{title:\"全屏\"},header:{title:\"标题\",text:\"正文\"},image:{netImage:\"网络图片\",delete:\"删除图片\",edit:\"编辑图片\",viewLink:\"查看链接\",src:\"图片地址\",desc:\"图片描述\",link:\"图片链接\"},indent:{decrease:\"减少缩进\",increase:\"增加缩进\"},justify:{left:\"左对齐\",right:\"右对齐\",center:\"居中对齐\",justify:\"两端对齐\"},lineHeight:{title:\"行高\",default:\"默认行高\"},link:{insert:\"插入链接\",text:\"链接文本\",url:\"链接地址\",unLink:\"取消链接\",edit:\"修改链接\",view:\"查看链接\"},textStyle:{bold:\"粗体\",clear:\"清除格式\",code:\"行内代码\",italic:\"斜体\",sub:\"下标\",sup:\"上标\",through:\"删除线\",underline:\"下划线\"},undo:{undo:\"撤销\",redo:\"重做\"},todo:{todo:\"待办\"}});var s={type:\"paragraph\",renderElem:function(t,e,r){return n.jsx(\"p\",null,e)}};var f={type:\"paragraph\",elemToHtml:function(t,e){return \"\"===e?\"<p><br></p>\":\"<p>\"+e+\"</p>\"}},d=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function p(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}function h(t){var e={exports:{}};return t(e,e.exports),e.exports}var v,g,m=function(t){return t&&t.Math==Math&&t},y=m(\"object\"==typeof globalThis&&globalThis)||m(\"object\"==typeof window&&window)||m(\"object\"==typeof self&&self)||m(\"object\"==typeof d&&d)||function(){return this}()||Function(\"return this\")(),b=function(t){try{return !!t()}catch(t){return !0}},x=!b((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),w=Function.prototype.call,E=w.bind?w.bind(w):function(){return w.apply(w,arguments)},S={}.propertyIsEnumerable,k=Object.getOwnPropertyDescriptor,T=k&&!S.call({1:2},1)?function(t){var e=k(this,t);return !!e&&e.enumerable}:S,M={f:T},I=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},N=Function.prototype,H=N.bind,O=N.call,j=H&&H.bind(O),D=H?function(t){return t&&j(O,t)}:function(t){return t&&function(){return O.apply(t,arguments)}},L=D({}.toString),z=D(\"\".slice),A=function(t){return z(L(t),8,-1)},P=y.Object,C=D(\"\".split),V=b((function(){return !P(\"z\").propertyIsEnumerable(0)}))?function(t){return \"String\"==A(t)?C(t,\"\"):P(t)}:P,B=y.TypeError,R=function(t){if(null==t)throw B(\"Can't call method on \"+t);return t},F=function(t){return V(R(t))},_=function(t){return \"function\"==typeof t},q=function(t){return \"object\"==typeof t?null!==t:_(t)},$=function(t){return _(t)?t:void 0},W=function(t,e){return arguments.length<2?$(y[t]):y[t]&&y[t][e]},G=D({}.isPrototypeOf),U=W(\"navigator\",\"userAgent\")||\"\",X=y.process,Y=y.Deno,J=X&&X.versions||Y&&Y.version,K=J&&J.v8;K&&(g=(v=K.split(\".\"))[0]>0&&v[0]<4?1:+(v[0]+v[1])),!g&&U&&(!(v=U.match(/Edge\\/(\\d+)/))||v[1]>=74)&&(v=U.match(/Chrome\\/(\\d+)/))&&(g=+v[1]);var Q=g,Z=!!Object.getOwnPropertySymbols&&!b((function(){var t=Symbol();return !String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Q&&Q<41})),tt=Z&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,et=y.Object,nt=tt?function(t){return \"symbol\"==typeof t}:function(t){var e=W(\"Symbol\");return _(e)&&G(e.prototype,et(t))},rt=y.String,ot=function(t){try{return rt(t)}catch(t){return \"Object\"}},it=y.TypeError,ut=function(t){if(_(t))return t;throw it(ot(t)+\" is not a function\")},at=function(t,e){var n=t[e];return null==n?void 0:ut(n)},ct=y.TypeError,lt=Object.defineProperty,st=function(t,e){try{lt(y,t,{value:e,configurable:!0,writable:!0});}catch(n){y[t]=e;}return e},ft=\"__core-js_shared__\",dt=y[ft]||st(ft,{}),pt=h((function(t){(t.exports=function(t,e){return dt[t]||(dt[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),ht=y.Object,vt=function(t){return ht(R(t))},gt=D({}.hasOwnProperty),mt=Object.hasOwn||function(t,e){return gt(vt(t),e)},yt=0,bt=Math.random(),xt=D(1..toString),wt=function(t){return \"Symbol(\"+(void 0===t?\"\":t)+\")_\"+xt(++yt+bt,36)},Et=pt(\"wks\"),St=y.Symbol,kt=St&&St.for,Tt=tt?St:St&&St.withoutSetter||wt,Mt=function(t){if(!mt(Et,t)||!Z&&\"string\"!=typeof Et[t]){var e=\"Symbol.\"+t;Z&&mt(St,t)?Et[t]=St[t]:Et[t]=tt&&kt?kt(e):Tt(e);}return Et[t]},It=y.TypeError,Nt=Mt(\"toPrimitive\"),Ht=function(t,e){if(!q(t)||nt(t))return t;var n,r=at(t,Nt);if(r){if(void 0===e&&(e=\"default\"),n=E(r,t,e),!q(n)||nt(n))return n;throw It(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var n,r;if(\"string\"===e&&_(n=t.toString)&&!q(r=E(n,t)))return r;if(_(n=t.valueOf)&&!q(r=E(n,t)))return r;if(\"string\"!==e&&_(n=t.toString)&&!q(r=E(n,t)))return r;throw ct(\"Can't convert object to primitive value\")}(t,e)},Ot=function(t){var e=Ht(t,\"string\");return nt(e)?e:e+\"\"},jt=y.document,Dt=q(jt)&&q(jt.createElement),Lt=function(t){return Dt?jt.createElement(t):{}},zt=!x&&!b((function(){return 7!=Object.defineProperty(Lt(\"div\"),\"a\",{get:function(){return 7}}).a})),At=Object.getOwnPropertyDescriptor,Pt={f:x?At:function(t,e){if(t=F(t),e=Ot(e),zt)try{return At(t,e)}catch(t){}if(mt(t,e))return I(!E(M.f,t,e),t[e])}},Ct=y.String,Vt=y.TypeError,Bt=function(t){if(q(t))return t;throw Vt(Ct(t)+\" is not an object\")},Rt=y.TypeError,Ft=Object.defineProperty,_t={f:x?Ft:function(t,e,n){if(Bt(t),e=Ot(e),Bt(n),zt)try{return Ft(t,e,n)}catch(t){}if(\"get\"in n||\"set\"in n)throw Rt(\"Accessors not supported\");return \"value\"in n&&(t[e]=n.value),t}},qt=x?function(t,e,n){return _t.f(t,e,I(1,n))}:function(t,e,n){return t[e]=n,t},$t=D(Function.toString);_(dt.inspectSource)||(dt.inspectSource=function(t){return $t(t)});var Wt,Gt,Ut,Xt=dt.inspectSource,Yt=y.WeakMap,Jt=_(Yt)&&/native code/.test(Xt(Yt)),Kt=pt(\"keys\"),Qt=function(t){return Kt[t]||(Kt[t]=wt(t))},Zt={},te=\"Object already initialized\",ee=y.TypeError,ne=y.WeakMap;if(Jt||dt.state){var re=dt.state||(dt.state=new ne),oe=D(re.get),ie=D(re.has),ue=D(re.set);Wt=function(t,e){if(ie(re,t))throw new ee(te);return e.facade=t,ue(re,t,e),e},Gt=function(t){return oe(re,t)||{}},Ut=function(t){return ie(re,t)};}else {var ae=Qt(\"state\");Zt[ae]=!0,Wt=function(t,e){if(mt(t,ae))throw new ee(te);return e.facade=t,qt(t,ae,e),e},Gt=function(t){return mt(t,ae)?t[ae]:{}},Ut=function(t){return mt(t,ae)};}var ce={set:Wt,get:Gt,has:Ut,enforce:function(t){return Ut(t)?Gt(t):Wt(t,{})},getterFor:function(t){return function(e){var n;if(!q(e)||(n=Gt(e)).type!==t)throw ee(\"Incompatible receiver, \"+t+\" required\");return n}}},le=Function.prototype,se=x&&Object.getOwnPropertyDescriptor,fe=mt(le,\"name\"),de={EXISTS:fe,PROPER:fe&&\"something\"===function(){}.name,CONFIGURABLE:fe&&(!x||x&&se(le,\"name\").configurable)},pe=h((function(t){var e=de.CONFIGURABLE,n=ce.get,r=ce.enforce,o=String(String).split(\"String\");(t.exports=function(t,n,i,u){var a,c=!!u&&!!u.unsafe,l=!!u&&!!u.enumerable,s=!!u&&!!u.noTargetGet,f=u&&void 0!==u.name?u.name:n;_(i)&&(\"Symbol(\"===String(f).slice(0,7)&&(f=\"[\"+String(f).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!mt(i,\"name\")||e&&i.name!==f)&&qt(i,\"name\",f),(a=r(i)).source||(a.source=o.join(\"string\"==typeof f?f:\"\"))),t!==y?(c?!s&&t[n]&&(l=!0):delete t[n],l?t[n]=i:qt(t,n,i)):l?t[n]=i:st(n,i);})(Function.prototype,\"toString\",(function(){return _(this)&&n(this).source||Xt(this)}));})),he=Math.ceil,ve=Math.floor,ge=function(t){var e=+t;return e!=e||0===e?0:(e>0?ve:he)(e)},me=Math.max,ye=Math.min,be=function(t,e){var n=ge(t);return n<0?me(n+e,0):ye(n,e)},xe=Math.min,we=function(t){return t>0?xe(ge(t),9007199254740991):0},Ee=function(t){return we(t.length)},Se=function(t){return function(e,n,r){var o,i=F(e),u=Ee(i),a=be(r,u);if(t&&n!=n){for(;u>a;)if((o=i[a++])!=o)return !0}else for(;u>a;a++)if((t||a in i)&&i[a]===n)return t||a||0;return !t&&-1}},ke={includes:Se(!0),indexOf:Se(!1)},Te=ke.indexOf,Me=D([].push),Ie=function(t,e){var n,r=F(t),o=0,i=[];for(n in r)!mt(Zt,n)&&mt(r,n)&&Me(i,n);for(;e.length>o;)mt(r,n=e[o++])&&(~Te(i,n)||Me(i,n));return i},Ne=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],He=Ne.concat(\"length\",\"prototype\"),Oe={f:Object.getOwnPropertyNames||function(t){return Ie(t,He)}},je={f:Object.getOwnPropertySymbols},De=D([].concat),Le=W(\"Reflect\",\"ownKeys\")||function(t){var e=Oe.f(Bt(t)),n=je.f;return n?De(e,n(t)):e},ze=function(t,e){for(var n=Le(e),r=_t.f,o=Pt.f,i=0;i<n.length;i++){var u=n[i];mt(t,u)||r(t,u,o(e,u));}},Ae=/#|\\.prototype\\./,Pe=function(t,e){var n=Ve[Ce(t)];return n==Re||n!=Be&&(_(e)?b(e):!!e)},Ce=Pe.normalize=function(t){return String(t).replace(Ae,\".\").toLowerCase()},Ve=Pe.data={},Be=Pe.NATIVE=\"N\",Re=Pe.POLYFILL=\"P\",Fe=Pe,_e=Pt.f,qe=function(t,e){var n,r,o,i,u,a=t.target,c=t.global,l=t.stat;if(n=c?y:l?y[a]||st(a,{}):(y[a]||{}).prototype)for(r in e){if(i=e[r],o=t.noTargetGet?(u=_e(n,r))&&u.value:n[r],!Fe(c?r:a+(l?\".\":\"#\")+r,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;ze(i,o);}(t.sham||o&&o.sham)&&qt(i,\"sham\",!0),pe(n,r,i,t);}},$e=D(D.bind),We=Array.isArray||function(t){return \"Array\"==A(t)},Ge={};Ge[Mt(\"toStringTag\")]=\"z\";var Ue=\"[object z]\"===String(Ge),Xe=Mt(\"toStringTag\"),Ye=y.Object,Je=\"Arguments\"==A(function(){return arguments}()),Ke=Ue?A:function(t){var e,n,r;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Ye(t),Xe))?n:Je?A(e):\"Object\"==(r=A(e))&&_(e.callee)?\"Arguments\":r},Qe=function(){},Ze=[],tn=W(\"Reflect\",\"construct\"),en=/^\\s*(?:class|function)\\b/,nn=D(en.exec),rn=!en.exec(Qe),on=function(t){if(!_(t))return !1;try{return tn(Qe,Ze,t),!0}catch(t){return !1}},un=!tn||b((function(){var t;return on(on.call)||!on(Object)||!on((function(){t=!0;}))||t}))?function(t){if(!_(t))return !1;switch(Ke(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return rn||!!nn(en,Xt(t))}:on,an=Mt(\"species\"),cn=y.Array,ln=function(t,e){return new(function(t){var e;return We(t)&&(e=t.constructor,(un(e)&&(e===cn||We(e.prototype))||q(e)&&null===(e=e[an]))&&(e=void 0)),void 0===e?cn:e}(t))(0===e?0:e)},sn=D([].push),fn=function(t){var e=1==t,n=2==t,r=3==t,o=4==t,i=6==t,u=7==t,a=5==t||i;return function(c,l,s,f){for(var d,p,h=vt(c),v=V(h),g=function(t,e){return ut(t),void 0===e?t:$e?$e(t,e):function(){return t.apply(e,arguments)}}(l,s),m=Ee(v),y=0,b=f||ln,x=e?b(c,m):n||u?b(c,0):void 0;m>y;y++)if((a||y in v)&&(p=g(d=v[y],y,h),t))if(e)x[y]=p;else if(p)switch(t){case 3:return !0;case 5:return d;case 6:return y;case 2:sn(x,d);}else switch(t){case 4:return !1;case 7:sn(x,d);}return i?-1:r||o?o:x}},dn={forEach:fn(0),map:fn(1),filter:fn(2),some:fn(3),every:fn(4),find:fn(5),findIndex:fn(6),filterReject:fn(7)},pn=Mt(\"species\"),hn=function(t){return Q>=51||!b((function(){var e=[];return (e.constructor={})[pn]=function(){return {foo:1}},1!==e[t](Boolean).foo}))},vn=dn.filter;qe({target:\"Array\",proto:!0,forced:!hn(\"filter\")},{filter:function(t){return vn(this,t,arguments.length>1?arguments[1]:void 0)}});var gn=Ue?{}.toString:function(){return \"[object \"+Ke(this)+\"]\"};Ue||pe(Object.prototype,\"toString\",gn,{unsafe:!0});var mn,yn=y.String,bn=function(t){if(\"Symbol\"===Ke(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return yn(t)},xn=function(){var t=Bt(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e},wn=y.RegExp,En=b((function(){var t=wn(\"a\",\"y\");return t.lastIndex=2,null!=t.exec(\"abcd\")})),Sn=En||b((function(){return !wn(\"a\",\"y\").sticky})),kn={BROKEN_CARET:En||b((function(){var t=wn(\"^r\",\"gy\");return t.lastIndex=2,null!=t.exec(\"str\")})),MISSED_STICKY:Sn,UNSUPPORTED_Y:En},Tn=Object.keys||function(t){return Ie(t,Ne)},Mn=x?Object.defineProperties:function(t,e){Bt(t);for(var n,r=F(e),o=Tn(e),i=o.length,u=0;i>u;)_t.f(t,n=o[u++],r[n]);return t},In=W(\"document\",\"documentElement\"),Nn=Qt(\"IE_PROTO\"),Hn=function(){},On=function(t){return \"<script>\"+t+\"</\"+\"script>\"},jn=function(t){t.write(On(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},Dn=function(){try{mn=new ActiveXObject(\"htmlfile\");}catch(t){}var t,e;Dn=\"undefined\"!=typeof document?document.domain&&mn?jn(mn):((e=Lt(\"iframe\")).style.display=\"none\",In.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(On(\"document.F=Object\")),t.close(),t.F):jn(mn);for(var n=Ne.length;n--;)delete Dn.prototype[Ne[n]];return Dn()};Zt[Nn]=!0;var Ln,zn,An=Object.create||function(t,e){var n;return null!==t?(Hn.prototype=Bt(t),n=new Hn,Hn.prototype=null,n[Nn]=t):n=Dn(),void 0===e?n:Mn(n,e)},Pn=y.RegExp,Cn=b((function(){var t=Pn(\".\",\"s\");return !(t.dotAll&&t.exec(\"\\n\")&&\"s\"===t.flags)})),Vn=y.RegExp,Bn=b((function(){var t=Vn(\"(?<a>b)\",\"g\");return \"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$<a>c\")})),Rn=ce.get,Fn=pt(\"native-string-replace\",String.prototype.replace),_n=RegExp.prototype.exec,qn=_n,$n=D(\"\".charAt),Wn=D(\"\".indexOf),Gn=D(\"\".replace),Un=D(\"\".slice),Xn=(zn=/b*/g,E(_n,Ln=/a/,\"a\"),E(_n,zn,\"a\"),0!==Ln.lastIndex||0!==zn.lastIndex),Yn=kn.BROKEN_CARET,Jn=void 0!==/()??/.exec(\"\")[1];(Xn||Jn||Yn||Cn||Bn)&&(qn=function(t){var e,n,r,o,i,u,a,c=this,l=Rn(c),s=bn(t),f=l.raw;if(f)return f.lastIndex=c.lastIndex,e=E(qn,f,s),c.lastIndex=f.lastIndex,e;var d=l.groups,p=Yn&&c.sticky,h=E(xn,c),v=c.source,g=0,m=s;if(p&&(h=Gn(h,\"y\",\"\"),-1===Wn(h,\"g\")&&(h+=\"g\"),m=Un(s,c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&\"\\n\"!==$n(s,c.lastIndex-1))&&(v=\"(?: \"+v+\")\",m=\" \"+m,g++),n=new RegExp(\"^(?:\"+v+\")\",h)),Jn&&(n=new RegExp(\"^\"+v+\"$(?!\\\\s)\",h)),Xn&&(r=c.lastIndex),o=E(_n,p?n:c,m),p?o?(o.input=Un(o.input,g),o[0]=Un(o[0],g),o.index=c.lastIndex,c.lastIndex+=o[0].length):c.lastIndex=0:Xn&&o&&(c.lastIndex=c.global?o.index+o[0].length:r),Jn&&o&&o.length>1&&E(Fn,o[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0);})),o&&d)for(o.groups=u=An(null),i=0;i<d.length;i++)u[(a=d[i])[0]]=o[a[1]];return o});var Kn=qn;qe({target:\"RegExp\",proto:!0,forced:/./.exec!==Kn},{exec:Kn});var Qn=Function.prototype,Zn=Qn.apply,tr=Qn.bind,er=Qn.call,nr=\"object\"==typeof Reflect&&Reflect.apply||(tr?er.bind(Zn):function(){return er.apply(Zn,arguments)}),rr=Mt(\"species\"),or=RegExp.prototype,ir=function(t,e,n,r){var o=Mt(t),i=!b((function(){var e={};return e[o]=function(){return 7},7!=\"\"[t](e)})),u=i&&!b((function(){var e=!1,n=/a/;return \"split\"===t&&((n={}).constructor={},n.constructor[rr]=function(){return n},n.flags=\"\",n[o]=/./[o]),n.exec=function(){return e=!0,null},n[o](\"\"),!e}));if(!i||!u||n){var a=D(/./[o]),c=e(o,\"\"[t],(function(t,e,n,r,o){var u=D(t),c=e.exec;return c===Kn||c===or.exec?i&&!o?{done:!0,value:a(e,n,r)}:{done:!0,value:u(n,e,r)}:{done:!1}}));pe(String.prototype,t,c[0]),pe(or,o,c[1]);}r&&qt(or[o],\"sham\",!0);},ur=D(\"\".charAt),ar=D(\"\".charCodeAt),cr=D(\"\".slice),lr=function(t){return function(e,n){var r,o,i=bn(R(e)),u=ge(n),a=i.length;return u<0||u>=a?t?\"\":void 0:(r=ar(i,u))<55296||r>56319||u+1===a||(o=ar(i,u+1))<56320||o>57343?t?ur(i,u):r:t?cr(i,u,u+2):o-56320+(r-55296<<10)+65536}},sr={codeAt:lr(!1),charAt:lr(!0)}.charAt,fr=function(t,e,n){return e+(n?sr(t,e).length:1)},dr=Math.floor,pr=D(\"\".charAt),hr=D(\"\".replace),vr=D(\"\".slice),gr=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,mr=/\\$([$&'`]|\\d{1,2})/g,yr=function(t,e,n,r,o,i){var u=n+t.length,a=r.length,c=mr;return void 0!==o&&(o=vt(o),c=gr),hr(i,c,(function(i,c){var l;switch(pr(c,0)){case\"$\":return \"$\";case\"&\":return t;case\"`\":return vr(e,0,n);case\"'\":return vr(e,u);case\"<\":l=o[vr(c,1,-1)];break;default:var s=+c;if(0===s)return i;if(s>a){var f=dr(s/10);return 0===f?i:f<=a?void 0===r[f-1]?pr(c,1):r[f-1]+pr(c,1):i}l=r[s-1];}return void 0===l?\"\":l}))},br=y.TypeError,xr=function(t,e){var n=t.exec;if(_(n)){var r=E(n,t,e);return null!==r&&Bt(r),r}if(\"RegExp\"===A(t))return E(Kn,t,e);throw br(\"RegExp#exec called on incompatible receiver\")},wr=Mt(\"replace\"),Er=Math.max,Sr=Math.min,kr=D([].concat),Tr=D([].push),Mr=D(\"\".indexOf),Ir=D(\"\".slice),Nr=\"$0\"===\"a\".replace(/./,\"$0\"),Hr=!!/./[wr]&&\"\"===/./[wr](\"a\",\"$0\");ir(\"replace\",(function(t,e,n){var r=Hr?\"$\":\"$0\";return [function(t,n){var r=R(this),o=null==t?void 0:at(t,wr);return o?E(o,t,r,n):E(e,bn(r),t,n)},function(t,o){var i=Bt(this),u=bn(t);if(\"string\"==typeof o&&-1===Mr(o,r)&&-1===Mr(o,\"$<\")){var a=n(e,i,u,o);if(a.done)return a.value}var c=_(o);c||(o=bn(o));var l=i.global;if(l){var s=i.unicode;i.lastIndex=0;}for(var f=[];;){var d=xr(i,u);if(null===d)break;if(Tr(f,d),!l)break;\"\"===bn(d[0])&&(i.lastIndex=fr(u,we(i.lastIndex),s));}for(var p,h=\"\",v=0,g=0;g<f.length;g++){for(var m=bn((d=f[g])[0]),y=Er(Sr(ge(d.index),u.length),0),b=[],x=1;x<d.length;x++)Tr(b,void 0===(p=d[x])?p:String(p));var w=d.groups;if(c){var E=kr([m],b,y,u);void 0!==w&&Tr(E,w);var S=bn(nr(o,void 0,E));}else S=yr(m,u,y,b,w,o);y>=v&&(h+=Ir(u,v,y)+S,v=y+m.length);}return h+Ir(u,v)}]}),!!b((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")}))||!Nr||Hr);var Or=Mt(\"unscopables\"),jr=Array.prototype;null==jr[Or]&&_t.f(jr,Or,{configurable:!0,value:An(null)});var Dr=function(t){jr[Or][t]=!0;},Lr=dn.find,zr=\"find\",Ar=!0;zr in[]&&Array(1).find((function(){Ar=!1;})),qe({target:\"Array\",proto:!0,forced:Ar},{find:function(t){return Lr(this,t,arguments.length>1?arguments[1]:void 0)}}),Dr(zr);var Pr=Mt(\"match\"),Cr=function(t){var e;return q(t)&&(void 0!==(e=t[Pr])?!!e:\"RegExp\"==A(t))},Vr=y.TypeError,Br=Mt(\"species\"),Rr=function(t,e){var n,r=Bt(t).constructor;return void 0===r||null==(n=Bt(r)[Br])?e:function(t){if(un(t))return t;throw Vr(ot(t)+\" is not a constructor\")}(n)},Fr=function(t,e,n){var r=Ot(e);r in t?_t.f(t,r,I(0,n)):t[r]=n;},_r=y.Array,qr=Math.max,$r=function(t,e,n){for(var r=Ee(t),o=be(e,r),i=be(void 0===n?r:n,r),u=_r(qr(i-o,0)),a=0;o<i;o++,a++)Fr(u,a,t[o]);return u.length=a,u},Wr=kn.UNSUPPORTED_Y,Gr=4294967295,Ur=Math.min,Xr=[].push,Yr=D(/./.exec),Jr=D(Xr),Kr=D(\"\".slice),Qr=!b((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n=\"ab\".split(t);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]}));ir(\"split\",(function(t,e,n){var r;return r=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,n){var r=bn(R(this)),o=void 0===n?Gr:n>>>0;if(0===o)return [];if(void 0===t)return [r];if(!Cr(t))return E(e,r,t,o);for(var i,u,a,c=[],l=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),s=0,f=new RegExp(t.source,l+\"g\");(i=E(Kn,f,r))&&!((u=f.lastIndex)>s&&(Jr(c,Kr(r,s,i.index)),i.length>1&&i.index<r.length&&nr(Xr,c,$r(i,1)),a=i[0].length,s=u,c.length>=o));)f.lastIndex===i.index&&f.lastIndex++;return s===r.length?!a&&Yr(f,\"\")||Jr(c,\"\"):Jr(c,Kr(r,s)),c.length>o?$r(c,0,o):c}:\"0\".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:E(e,this,t,n)}:e,[function(e,n){var o=R(this),i=null==e?void 0:at(e,t);return i?E(i,e,o,n):E(r,bn(o),e,n)},function(t,o){var i=Bt(this),u=bn(t),a=n(r,i,u,o,r!==e);if(a.done)return a.value;var c=Rr(i,RegExp),l=i.unicode,s=(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(Wr?\"g\":\"y\"),f=new c(Wr?\"^(?:\"+i.source+\")\":i,s),d=void 0===o?Gr:o>>>0;if(0===d)return [];if(0===u.length)return null===xr(f,u)?[u]:[];for(var p=0,h=0,v=[];h<u.length;){f.lastIndex=Wr?0:h;var g,m=xr(f,Wr?Kr(u,h):u);if(null===m||(g=Ur(we(f.lastIndex+(Wr?h:0)),u.length))===p)h=fr(u,h,l);else {if(Jr(v,Kr(u,p,h)),v.length===d)return v;for(var y=1;y<=m.length-1;y++)if(Jr(v,m[y]),v.length===d)return v;h=p=g;}}return Jr(v,Kr(u,p)),v}]}),!Qr,Wr);var Zr,to=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\",eo=D(\"\".replace),no=\"[\"+to+\"]\",ro=RegExp(\"^\"+no+no+\"*\"),oo=RegExp(no+no+\"*$\"),io=function(t){return function(e){var n=bn(R(e));return 1&t&&(n=eo(n,ro,\"\")),2&t&&(n=eo(n,oo,\"\")),n}},uo={start:io(1),end:io(2),trim:io(3)},ao=de.PROPER,co=uo.trim;function lo(t){return 0===c.default(\"<div>\"+t+\"</div>\").children().filter((function(t){return \"BR\"!==t.tagName})).length}function so(t){return 0===t.length?\"\":t[0].outerHTML}function fo(t){return t.length?t[0].tagName.toLowerCase():\"\"}function po(t,e){for(var n=\"\",r=(t.attr(\"style\")||\"\").split(\";\"),o=r.length,i=0;i<o;i++){var u=r[i];if(u){var a=u.split(\":\");a[0].trim()===e&&(n=a[1].trim());}}return n}qe({target:\"String\",proto:!0,forced:(Zr=\"trim\",b((function(){return !!to[Zr]()||\"​᠎\"!==\"​᠎\"[Zr]()||ao&&to[Zr].name!==Zr})))},{trim:function(){return co(this)}}),qe({global:!0},{globalThis:y}),o.css&&(c.default.fn.css=o.css),o.append&&(c.default.fn.append=o.append),o.prepend&&(c.default.fn.prepend=o.prepend),o.addClass&&(c.default.fn.addClass=o.addClass),o.removeClass&&(c.default.fn.removeClass=o.removeClass),o.hasClass&&(c.default.fn.hasClass=o.hasClass),o.on&&(c.default.fn.on=o.on),o.off&&(c.default.fn.off=o.off),o.focus&&(c.default.fn.focus=o.focus),o.attr&&(c.default.fn.attr=o.attr),o.removeAttr&&(c.default.fn.removeAttr=o.removeAttr),o.hide&&(c.default.fn.hide=o.hide),o.show&&(c.default.fn.show=o.show),o.parents&&(c.default.fn.parents=o.parents),o.dataset&&(c.default.fn.dataset=o.dataset),o.val&&(c.default.fn.val=o.val),o.text&&(c.default.fn.text=o.text),o.html&&(c.default.fn.html=o.html),o.children&&(c.default.fn.children=o.children),o.remove&&(c.default.fn.remove=o.remove),o.find&&(c.default.fn.find=o.find),o.width&&(c.default.fn.width=o.width),o.height&&(c.default.fn.height=o.height),o.filter&&(c.default.fn.filter=o.filter),o.empty&&(c.default.fn.empty=o.empty);var ho=function(t,e){return ho=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e;}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);},ho(t,e)};\n  /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */function vo(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Class extends value \"+String(e)+\" is not a constructor or null\");function n(){this.constructor=t;}ho(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n);}var go=function(){return go=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},go.apply(this,arguments)};function mo(t,e,n,r){return new(n||(n=Promise))((function(o,i){function u(t){try{c(r.next(t));}catch(t){i(t);}}function a(t){try{c(r.throw(t));}catch(t){i(t);}}function c(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e);}))).then(u,a);}c((r=r.apply(t,e||[])).next());}))}function yo(t,e){var n,r,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError(\"Generator is already executing.\");for(;u;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,r=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!(o=u.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){u.label=i[1];break}if(6===i[0]&&u.label<o[1]){u.label=o[1],o=i;break}if(o&&u.label<o[2]){u.label=o[2],u.ops.push(i);break}o[2]&&u.ops.pop(),u.trys.pop();continue}i=e.call(t,u);}catch(t){i=[6,t],r=0;}finally{n=o=0;}if(5&i[0])throw i[1];return {value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}function bo(t){var e=\"function\"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&\"number\"==typeof t.length)return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}function xo(t,e){var n=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),u=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)u.push(r.value);}catch(t){o={error:t};}finally{try{r&&!r.done&&(n=i.return)&&n.call(i);}finally{if(o)throw o.error}}return u}function wo(t){var e=xo(r.Editor.nodes(t,{match:function(e){return t.children[0]===e},mode:\"highest\"}),1),n=e[0];if(null==n)return !1;var o=n[0];if(!r.Element.isElement(o))return !1;if(\"paragraph\"===o.type)return !1;if(\"\"!==r.Node.string(o))return !1;var i=o.children,u=void 0===i?[]:i;return !!r.Text.isText(u[0])&&(r.Transforms.setNodes(t,{type:\"paragraph\"}),!0)}var Eo={renderElems:[s],elemsToHtml:[f],parseElemsHtml:[{selector:\"p:not([data-w-e-type])\",parseElemHtml:function(t,e,n){var o=c.default(t);return 0===(e=e.filter((function(t){return !!r.Text.isText(t)||!!n.isInline(t)}))).length&&(e=[{text:o.text().replace(/\\s+/gm,\" \")}]),{type:\"paragraph\",children:e}}}],editorPlugin:function(t){var e=t.deleteBackward,n=t.deleteForward;t.insertText,t.insertBreak;var r=t;return r.deleteBackward=function(t){wo(r)||e(t);},r.deleteForward=function(t){wo(r)||n(t);},r}},So=/\"/g,ko=D(\"\".replace),To=function(t,e,n,r){var o=bn(R(t)),i=\"<\"+e;return \"\"!==n&&(i+=\" \"+n+'=\"'+ko(bn(r),So,\"&quot;\")+'\"'),i+\">\"+o+\"</\"+e+\">\"},Mo=function(t){return b((function(){var e=\"\"[t]('\"');return e!==e.toLowerCase()||e.split('\"').length>3}))};function Io(t,e){var n=e,r=t,o=r.bold,i=r.italic,u=r.underline;return o&&(n=\"<strong>\"+n+\"</strong>\"),r.code&&(n=\"<code>\"+n+\"</code>\"),i&&(n=\"<em>\"+n+\"</em>\"),u&&(n=\"<u>\"+n+\"</u>\"),r.through&&(n=\"<s>\"+n+\"</s>\"),r.sub&&(n=\"<sub>\"+n+\"</sub>\"),r.sup&&(n=\"<sup>\"+n+\"</sup>\"),n}function No(t,e){return 0!==t.length&&(!!t[0].matches(e)||t.find(e).length>0)}qe({target:\"String\",proto:!0,forced:Mo(\"bold\")},{bold:function(){return To(this,\"b\",\"\",\"\")}}),qe({target:\"String\",proto:!0,forced:Mo(\"italics\")},{italics:function(){return To(this,\"i\",\"\",\"\")}}),qe({target:\"String\",proto:!0,forced:Mo(\"sub\")},{sub:function(){return To(this,\"sub\",\"\",\"\")}}),qe({target:\"String\",proto:!0,forced:Mo(\"sup\")},{sup:function(){return To(this,\"sup\",\"\",\"\")}});var Ho={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Oo=Lt(\"span\").classList,jo=Oo&&Oo.constructor&&Oo.constructor.prototype,Do=jo===Object.prototype?void 0:jo,Lo=function(t,e){var n=[][t];return !!n&&b((function(){n.call(null,e||function(){throw 1},1);}))},zo=dn.forEach,Ao=Lo(\"forEach\")?[].forEach:function(t){return zo(this,t,arguments.length>1?arguments[1]:void 0)},Po=function(t){if(t&&t.forEach!==Ao)try{qt(t,\"forEach\",Ao);}catch(e){t.forEach=Ao;}};for(var Co in Ho)Ho[Co]&&Po(y[Co]&&y[Co].prototype);function Vo(t,n){return null==t.selection||!!xo(r.Editor.nodes(t,{match:function(n){return \"pre\"===e.DomEditor.getNodeType(n)||!!r.Editor.isVoid(t,n)},universal:!0}),1)[0]}function Bo(t,e){Object.keys(e).forEach((function(e){\"text\"!==e&&r.Editor.removeMark(t,e);}));}Po(Do),qe({target:\"Object\",stat:!0,forced:b((function(){Tn(1);}))},{keys:function(t){return Tn(vt(t))}});var Ro=function(){function t(){this.marksNeedToRemove=[],this.tag=\"button\";}return t.prototype.getValue=function(t){var e=this.mark,n=r.Editor.marks(t);return n?n[e]:!!xo(r.Editor.nodes(t,{match:function(t){return !0===t[e]}}),1)[0]},t.prototype.isActive=function(t){return !!this.getValue(t)},t.prototype.isDisabled=function(t){return Vo(t,this.mark)},t.prototype.exec=function(t,e){var n=this.mark,r=this.marksNeedToRemove;e?t.removeMark(n):(t.addMark(n,!0),r&&r.forEach((function(e){return t.removeMark(e)})));},t}(),Fo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M707.872 484.64A254.88 254.88 0 0 0 768 320c0-141.152-114.848-256-256-256H192v896h384c141.152 0 256-114.848 256-256a256.096 256.096 0 0 0-124.128-219.36zM384 192h101.504c55.968 0 101.504 57.408 101.504 128s-45.536 128-101.504 128H384V192z m159.008 640H384v-256h159.008c58.464 0 106.016 57.408 106.016 128s-47.552 128-106.016 128z\"></path></svg>',_o='<svg viewBox=\"0 0 1024 1024\"><path d=\"M704 64l128 0 0 416c0 159.072-143.264 288-320 288s-320-128.928-320-288l0-416 128 0 0 416c0 40.16 18.24 78.688 51.36 108.512 36.896 33.216 86.848 51.488 140.64 51.488s103.744-18.304 140.64-51.488c33.12-29.792 51.36-68.352 51.36-108.512l0-416zM192 832l640 0 0 128-640 0z\"></path></svg>',qo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M896 64v64h-128L448 896h128v64H128v-64h128L576 128h-128V64z\"></path></svg>',$o='<svg viewBox=\"0 0 1024 1024\"><path d=\"M1024 512v64h-234.496c27.52 38.496 42.496 82.688 42.496 128 0 70.88-36.672 139.04-100.576 186.976C672.064 935.488 594.144 960 512 960s-160.064-24.512-219.424-69.024C228.64 843.04 192 774.88 192 704h128c0 69.376 87.936 128 192 128s192-58.624 192-128-87.936-128-192-128H0v-64h299.52a385.984 385.984 0 0 1-6.944-5.024C228.64 459.04 192 390.88 192 320s36.672-139.04 100.576-186.976C351.936 88.512 429.856 64 512 64s160.064 24.512 219.424 69.024C795.328 180.96 832 249.12 832 320h-128c0-69.376-87.936-128-192-128s-192 58.624-192 128 87.936 128 192 128c78.976 0 154.048 22.688 212.48 64H1024z\"></path></svg>',Wo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M576 736l96 96 320-320L672 192l-96 96 224 224zM448 288l-96-96L32 512l320 320 96-96-224-224z\"></path></svg>',Go='<svg viewBox=\"0 0 1024 1024\"><path d=\"M864 0a160 160 0 0 1 128 256l-64 64-224-224 64-64c26.752-20.096 59.968-32 96-32zM64 736l-64 288 288-64 592-592-224-224L64 736z m651.584-372.416l-448 448-55.168-55.168 448-448 55.168 55.168z\"></path></svg>',Uo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M924.402464 1023.068211H0.679665V99.345412h461.861399v98.909208H99.596867v725.896389h725.896389V561.206811h98.909208z\" p-id=\"10909\"></path><path d=\"M930.805104 22.977336l69.965436 69.965436-453.492405 453.492404-69.965435-69.901489z\" p-id=\"10910\"></path><path d=\"M1022.464381 304.030081h-98.917201V99.345412H709.230573V0.428211h313.233808z\"></path></svg>',Xo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M64 864h896v96H64zM360.58 576h302.85l81.53 224h102.16L579.24 64H444.77L176.89 800h102.16l81.53-224zM512 159.96L628.49 480H395.52L512 159.96z\"></path></svg>',Yo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M510.030769 315.076923l84.676923 196.923077h-177.230769l76.8-196.923077h15.753846zM945.230769 157.538462v708.923076c0 43.323077-35.446154 78.769231-78.769231 78.769231H157.538462c-43.323077 0-78.769231-35.446154-78.769231-78.769231V157.538462c0-43.323077 35.446154-78.769231 78.769231-78.769231h708.923076c43.323077 0 78.769231 35.446154 78.769231 78.769231z m-108.307692 643.938461L600.615385 216.615385c-5.907692-11.815385-15.753846-19.692308-29.538462-19.692308h-139.815385c-11.815385 0-23.630769 7.876923-27.56923 19.692308l-216.615385 584.861538c-3.938462 11.815385 3.938462 25.6 17.723077 25.6h80.738462c11.815385 0 23.630769-9.846154 27.56923-21.661538l63.015385-175.261539h263.876923l68.923077 175.261539c3.938462 11.815385 15.753846 21.661538 27.569231 21.661538h80.738461c13.784615 0 23.630769-13.784615 19.692308-25.6z\"></path></svg>',Jo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M64 512h384v128h-128V1024h-128V640h-128z m896-256H708.2496v768h-136.4992V256H320V128h640z\"></path></svg>',Ko='<svg viewBox=\"0 0 1024 1024\"><path d=\"M956.788364 152.110545h-24.110546l23.924364 9.029819 0.186182 121.018181h-65.070546l-86.574545-130.048H566.551273v650.14691l130.048 64.977454v65.163636h-390.050909v-65.163636l129.954909-64.977454V152.110545H198.283636L111.429818 282.065455H46.545455V69.259636C46.545455 33.792 82.664727 22.062545 98.955636 22.062545h812.683637c23.738182 0 45.056 15.173818 45.056 41.053091V169.425455v-17.221819z\"></path></svg>',Qo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m256-512v384l-256-192z\"></path></svg>',Zo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m0-128V320l256 192z\"></path></svg>',ti='<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>',ei='<svg viewBox=\"0 0 1024 1024\"><path d=\"M972.8 793.6v102.4H256v-102.4h716.8z m0-230.4v102.4H51.2v-102.4h921.6z m0-230.4v102.4H256v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>',ni='<svg viewBox=\"0 0 1024 1024\"><path d=\"M870.4 793.6v102.4H153.6v-102.4h716.8z m102.4-230.4v102.4H51.2v-102.4h921.6z m-102.4-230.4v102.4H153.6v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>',ri='<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m0 192h1024v128H0z m0 192h1024v128H0z m0 192h1024v128H0z m0 192h1024v128H0z\"></path></svg>',oi='<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 206.016v50.016h128v64h-192V174.016l128-60V64h-128V0h192v146.016zM676 256h-136L352 444 164 256H28l256 256-256 256h136L352 580 540 768h136l-256-256z\"></path></svg>',ii='<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 910.016v50.016h128v64h-192v-146.016l128-60V768h-128v-64h192v146.016zM676 256h-136L352 444 164 256H28l256 256-256 256h136L352 580 540 768h136l-256-256z\"></path></svg>',ui=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"bold\",n.title=e.t(\"textStyle.bold\"),n.iconSvg=Fo,n.hotkey=\"mod+b\",n}return vo(n,t),n}(Ro),ai=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"code\",n.title=e.t(\"textStyle.code\"),n.iconSvg=Wo,n.hotkey=\"mod+e\",n}return vo(n,t),n}(Ro),ci=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"italic\",n.title=e.t(\"textStyle.italic\"),n.iconSvg=qo,n.hotkey=\"mod+i\",n}return vo(n,t),n}(Ro),li=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"through\",n.title=e.t(\"textStyle.through\"),n.iconSvg=$o,n.hotkey=\"mod+shift+x\",n}return vo(n,t),n}(Ro),si=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"underline\",n.title=e.t(\"textStyle.underline\"),n.iconSvg=_o,n.hotkey=\"mod+u\",n}return vo(n,t),n}(Ro),fi=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"sub\",n.marksNeedToRemove=[\"sup\"],n.title=e.t(\"textStyle.sub\"),n.iconSvg=ii,n.hotkey=\"\",n}return vo(n,t),n}(Ro),di=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.mark=\"sup\",n.marksNeedToRemove=[\"sub\"],n.title=e.t(\"textStyle.sup\"),n.iconSvg=oi,n.hotkey=\"\",n}return vo(n,t),n}(Ro),pi=function(){function t(){this.title=e.t(\"textStyle.clear\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M969.382408 288.738615l-319.401123-270.852152a67.074236 67.074236 0 0 0-96.459139 5.74922l-505.931379 574.922021a68.35184 68.35184 0 0 0-17.886463 47.910169 74.101061 74.101061 0 0 0 24.274486 47.910168l156.50655 132.232065h373.060512L975.131628 383.281347a67.074236 67.074236 0 0 0-5.74922-96.459139z m-440.134747 433.746725H264.144729l-90.071117-78.572676c-5.74922-5.74922-12.137243-12.137243-12.137243-17.886463a36.411728 36.411728 0 0 1 5.749221-24.274485l210.804741-240.828447 265.102932 228.691204z m-439.495945 180.781036h843.218964a60.047411 60.047411 0 1 1 0 120.733624H89.751716a60.047411 60.047411 0 1 1 0-120.733624z m0 0\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return Vo(t)},t.prototype.exec=function(t,e){var n,o,i=r.Editor.nodes(t,{match:function(t){return r.Text.isText(t)},universal:!0});try{for(var u=bo(i),a=u.next();!a.done;a=u.next()){Bo(t,a.value[0]);}}catch(t){n={error:t};}finally{try{a&&!a.done&&(o=u.return)&&o.call(u);}finally{if(n)throw n.error}}},t}(),hi={renderStyle:function(t,e){var r=t,o=r.bold,i=r.italic,u=r.underline,a=r.code,c=r.through,l=r.sub,s=r.sup,f=e;return o&&(f=n.jsx(\"strong\",null,f)),a&&(f=n.jsx(\"code\",null,f)),i&&(f=n.jsx(\"em\",null,f)),u&&(f=n.jsx(\"u\",null,f)),c&&(f=n.jsx(\"s\",null,f)),l&&(f=n.jsx(\"sub\",null,f)),s&&(f=n.jsx(\"sup\",null,f)),f},menus:[{key:\"bold\",factory:function(){return new ui}},{key:\"underline\",factory:function(){return new si}},{key:\"italic\",factory:function(){return new ci}},{key:\"through\",factory:function(){return new li}},{key:\"code\",factory:function(){return new ai}},{key:\"sub\",factory:function(){return new fi}},{key:\"sup\",factory:function(){return new di}},{key:\"clearStyle\",factory:function(){return new pi}}],styleToHtml:function(t,e){if(!r.Text.isText(t))return e;if(lo(e))return Io(t,e);var n=c.default(e);if(\"br\"===fo(n))return Io(t,\"<br>\");var o=n.html();return o=Io(t,o),n.html(o),so(n)},parseStyleHtml:function(t,e,n){var o=c.default(t);if(!r.Text.isText(e))return e;var i=e;return No(o,\"b,strong\")&&(i.bold=!0),No(o,\"i,em\")&&(i.italic=!0),No(o,\"u\")&&(i.underline=!0),No(o,\"s,strike\")&&(i.through=!0),No(o,\"sub\")&&(i.sub=!0),No(o,\"sup\")&&(i.sup=!0),No(o,\"code\")&&(i.code=!0),i}};function vi(t){return function(e,r,o){var i=\"h\"+t;return n.jsx(i,null,r)}}var gi={type:\"header1\",renderElem:vi(1)},mi={type:\"header2\",renderElem:vi(2)},yi={type:\"header3\",renderElem:vi(3)},bi={type:\"header4\",renderElem:vi(4)},xi={type:\"header5\",renderElem:vi(5)},wi=de.PROPER,Ei=\"toString\",Si=RegExp.prototype,ki=Si.toString,Ti=D(xn),Mi=b((function(){return \"/a/b\"!=ki.call({source:\"a\",flags:\"b\"})})),Ii=wi&&ki.name!=Ei;(Mi||Ii)&&pe(RegExp.prototype,Ei,(function(){var t=Bt(this),e=bn(t.source),n=t.flags;return \"/\"+e+\"/\"+bn(void 0===n&&G(Si,t)&&!(\"flags\"in Si)?Ti(t):n)}),{unsafe:!0});var Ni,Hi=y.TypeError,Oi=function(t){if(Cr(t))throw Hi(\"The method doesn't accept regular expressions\");return t},ji=Mt(\"match\"),Di=function(t){var e=/./;try{\"/./\"[t](e);}catch(n){try{return e[ji]=!1,\"/./\"[t](e)}catch(t){}}return !1},Li=Pt.f,zi=D(\"\".startsWith),Ai=D(\"\".slice),Pi=Math.min,Ci=Di(\"startsWith\");function Vi(t){var n=xo(r.Editor.nodes(t,{match:function(t){return e.DomEditor.getNodeType(t).startsWith(\"header\")},universal:!0}),1),o=n[0];if(null==o)return \"paragraph\";var i=xo(o,1)[0];return e.DomEditor.getNodeType(i)}function Bi(t){return null==t.selection||!xo(r.Editor.nodes(t,{match:function(t){var n=e.DomEditor.getNodeType(t);return \"paragraph\"===n||!!n.startsWith(\"header\")},universal:!0,mode:\"highest\"}),1)[0]}function Ri(t,e){e&&r.Transforms.setNodes(t,{type:e});}qe({target:\"String\",proto:!0,forced:!!(Ci||(Ni=Li(String.prototype,\"startsWith\"),!Ni||Ni.writable))&&!Ci},{startsWith:function(t){var e=bn(R(this));Oi(t);var n=we(Pi(arguments.length>1?arguments[1]:void 0,e.length)),r=bn(t);return zi?zi(e,r,n):Ai(e,n,n+r.length)===r}});var Fi=function(){function t(){this.title=e.t(\"header.title\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M960 960c-51.2 0-102.4-3.2-153.6-3.2-51.2 0-99.2 3.2-150.4 3.2-19.2 0-28.8-22.4-28.8-38.4 0-51.2 57.6-28.8 86.4-48 19.2-12.8 19.2-60.8 19.2-80v-224-19.2c-9.6-3.2-19.2-3.2-28.8-3.2H320c-9.6 0-19.2 0-28.8 3.2V780.8c0 22.4 0 80 22.4 92.8 28.8 19.2 96-6.4 96 44.8 0 16-9.6 41.6-28.8 41.6-54.4 0-105.6-3.2-160-3.2-48 0-96 3.2-147.2 3.2-19.2 0-28.8-22.4-28.8-38.4 0-51.2 51.2-28.8 80-48 19.2-12.8 19.2-60.8 19.2-83.2V294.4c0-28.8 3.2-115.2-22.4-131.2-25.6-16-86.4 9.6-86.4-41.6 0-16 6.4-41.6 28.8-41.6 51.2 0 105.6 3.2 156.8 3.2 48 0 96-3.2 144-3.2 19.2 0 28.8 22.4 28.8 41.6 0 48-57.6 25.6-83.2 41.6-19.2 12.8-19.2 73.6-19.2 92.8v201.6c6.4 3.2 16 3.2 22.4 3.2h400c6.4 0 12.8 0 22.4-3.2V256c0-22.4 0-80-19.2-92.8-28.8-16-86.4 6.4-86.4-41.6 0-16 9.6-41.6 28.8-41.6 51.2 0 99.2 3.2 150.4 3.2 48 0 99.2-3.2 147.2-3.2 19.2 0 28.8 22.4 28.8 41.6 0 51.2-57.6 25.6-86.4 41.6-19.2 12.8-19.2 70.4-19.2 92.8v537.6c0 19.2 0 67.2 19.2 80 28.8 19.2 89.6-6.4 89.6 44.8 0 19.2-6.4 41.6-28.8 41.6z\"></path></svg>',this.tag=\"select\",this.width=60;}return t.prototype.getOptions=function(t){var n=[{value:\"header1\",text:\"H1\",styleForRenderMenuList:{\"font-size\":\"32px\",\"font-weight\":\"bold\"}},{value:\"header2\",text:\"H2\",styleForRenderMenuList:{\"font-size\":\"24px\",\"font-weight\":\"bold\"}},{value:\"header3\",text:\"H3\",styleForRenderMenuList:{\"font-size\":\"18px\",\"font-weight\":\"bold\"}},{value:\"header4\",text:\"H4\",styleForRenderMenuList:{\"font-size\":\"16px\",\"font-weight\":\"bold\"}},{value:\"header5\",text:\"H5\",styleForRenderMenuList:{\"font-size\":\"13px\",\"font-weight\":\"bold\"}},{value:\"paragraph\",text:e.t(\"header.text\")}],r=this.getValue(t).toString();return n.forEach((function(t){t.value===r?t.selected=!0:delete t.selected;})),n},t.prototype.isActive=function(t){return !1},t.prototype.getValue=function(t){return Vi(t)},t.prototype.isDisabled=function(t){return Bi(t)},t.prototype.exec=function(t,e){Ri(t,e.toString());},t}(),_i=function(){function t(){this.tag=\"button\";}return t.prototype.getValue=function(t){return Vi(t)},t.prototype.isActive=function(t){return this.getValue(t)===this.type},t.prototype.isDisabled=function(t){return Bi(t)},t.prototype.exec=function(t,e){var n=this.type;Ri(t,e===n?\"paragraph\":n);},t}(),qi=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"H1\",e.type=\"header1\",e}return vo(e,t),e}(_i),$i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"H2\",e.type=\"header2\",e}return vo(e,t),e}(_i),Wi=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"H3\",e.type=\"header3\",e}return vo(e,t),e}(_i),Gi=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"H4\",e.type=\"header4\",e}return vo(e,t),e}(_i),Ui=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"H5\",e.type=\"header5\",e}return vo(e,t),e}(_i),Xi={key:\"headerSelect\",factory:function(){return new Fi}},Yi={key:\"header1\",factory:function(){return new qi}},Ji={key:\"header2\",factory:function(){return new $i}},Ki={key:\"header3\",factory:function(){return new Wi}},Qi={key:\"header4\",factory:function(){return new Gi}},Zi={key:\"header5\",factory:function(){return new Ui}};function tu(t){return function(e,n){return \"<h\"+t+\">\"+n+\"</h\"+t+\">\"}}function eu(t){return function(e,n,o){var i=c.default(e);return 0===(n=n.filter((function(t){return !!r.Text.isText(t)||!!o.isInline(t)}))).length&&(n=[{text:i.text().replace(/\\s+/gm,\" \")}]),{type:\"header\"+t,children:n}}}var nu={renderElems:[gi,mi,yi,bi,xi],elemsToHtml:[{type:\"header1\",elemToHtml:tu(1)},{type:\"header2\",elemToHtml:tu(2)},{type:\"header3\",elemToHtml:tu(3)},{type:\"header4\",elemToHtml:tu(4)},{type:\"header5\",elemToHtml:tu(5)}],parseElemsHtml:[{selector:\"h1:not([data-w-e-type])\",parseElemHtml:eu(1)},{selector:\"h2:not([data-w-e-type])\",parseElemHtml:eu(2)},{selector:\"h3:not([data-w-e-type])\",parseElemHtml:eu(3)},{selector:\"h4:not([data-w-e-type])\",parseElemHtml:eu(4)},{selector:\"h5:not([data-w-e-type])\",parseElemHtml:eu(5)}],menus:[Xi,Yi,Ji,Ki,Qi,Zi],editorPlugin:function(t){var n=t.insertBreak;t.insertNode;var o=t;return o.insertBreak=function(){var i=xo(r.Editor.nodes(o,{match:function(t){return e.DomEditor.getNodeType(t).startsWith(\"header\")},universal:!0}),1)[0];if(i)if(e.DomEditor.isSelectionAtLineEnd(t,i[1])){r.Transforms.insertNodes(o,{type:\"paragraph\",children:[{text:\"\"}]},{mode:\"highest\"});}else n();else n();},o}},ru=Object.assign,ou=Object.defineProperty,iu=D([].concat),uu=!ru||b((function(){if(x&&1!==ru({b:1},ru(ou({},\"a\",{enumerable:!0,get:function(){ou(this,\"b\",{value:3,enumerable:!1});}}),{b:2})).b)return !0;var t={},e={},n=Symbol(),r=\"abcdefghijklmnopqrst\";return t[n]=7,r.split(\"\").forEach((function(t){e[t]=t;})),7!=ru({},t)[n]||Tn(ru({},e)).join(\"\")!=r}))?function(t,e){for(var n=vt(t),r=arguments.length,o=1,i=je.f,u=M.f;r>o;)for(var a,c=V(arguments[o++]),l=i?iu(Tn(c),i(c)):Tn(c),s=l.length,f=0;s>f;)a=l[f++],x&&!E(u,c,a)||(n[a]=c[a]);return n}:ru;function au(t,e){null==t.data&&(t.data={});var n=t.data;null==n.style&&(n.style={}),Object.assign(n.style,e);}qe({target:\"Object\",stat:!0,forced:Object.assign!==uu},{assign:uu});var cu={selector:\"font\",preParseHtml:function(t){var e=c.default(t);if(\"font\"!==fo(e))return t;var n=e.attr(\"color\")||\"\";return n&&(e.removeAttr(\"color\"),e.css(\"color\",n)),e[0]}};var lu=function(){function t(){this.tag=\"button\",this.showDropPanel=!0,this.$content=null;}return t.prototype.exec=function(t,e){},t.prototype.getValue=function(t){var e=this.mark,n=r.Editor.marks(t);return n&&n[e]?n[e]:\"\"},t.prototype.isActive=function(t){return !!this.getValue(t)},t.prototype.isDisabled=function(t){return null==t.selection||!!xo(r.Editor.nodes(t,{match:function(n){return \"pre\"===e.DomEditor.getNodeType(n)||!!r.Editor.isVoid(t,n)},universal:!0}),1)[0]},t.prototype.getPanelContentElem=function(t){var n=this.mark;if(null==this.$content){var o=c.default('<ul class=\"w-e-panel-content-color\"></ul>');o.on(\"click\",\"li\",(function(e){var o=e.target;if(null!=o&&(e.preventDefault(),null!=t.selection)){var i=c.default(o).attr(\"data-value\");\"0\"===i?r.Editor.removeMark(t,n):r.Editor.addMark(t,n,i);}})),this.$content=o;}var i=this.$content;if(null==i)return document.createElement(\"ul\");i.empty();var u=this.getValue(t),a=t.getMenuConfig(n).colors;(void 0===a?[]:a).forEach((function(t){var e=c.default('<div class=\"color-block\" data-value=\"'+t+'\"></div>');e.css(\"background-color\",t);var n=c.default('<li data-value=\"'+t+'\"></li>');u===t&&n.addClass(\"active\"),n.append(e),i.append(n);}));var l=\"\";\"color\"===n&&(l=e.t(\"color.default\")),\"bgColor\"===n&&(l=e.t(\"color.clear\"));var s=c.default('\\n      <li data-value=\"0\" class=\"clear\">\\n        <svg viewBox=\"0 0 1024 1024\"><path d=\"M236.8 128L896 787.2V128H236.8z m614.4 704L192 172.8V832h659.2zM192 64h704c38.4 0 64 25.6 64 64v704c0 38.4-25.6 64-64 64H192c-38.4 0-64-25.6-64-64V128c0-38.4 25.6-64 64-64z\"></path></svg>\\n        '+l+\"\\n      </li>\\n    \");return i.prepend(s),i[0]},t}(),su=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"color.color\"),n.iconSvg=Xo,n.mark=\"color\",n}return vo(n,t),n}(lu),fu=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"color.bgColor\"),n.iconSvg=Yo,n.mark=\"bgColor\",n}return vo(n,t),n}(lu),du=[\"rgb(0, 0, 0)\",\"rgb(38, 38, 38)\",\"rgb(89, 89, 89)\",\"rgb(140, 140, 140)\",\"rgb(191, 191, 191)\",\"rgb(217, 217, 217)\",\"rgb(233, 233, 233)\",\"rgb(245, 245, 245)\",\"rgb(250, 250, 250)\",\"rgb(255, 255, 255)\",\"rgb(225, 60, 57)\",\"rgb(231, 95, 51)\",\"rgb(235, 144, 58)\",\"rgb(245, 219, 77)\",\"rgb(114, 192, 64)\",\"rgb(89, 191, 192)\",\"rgb(66, 144, 247)\",\"rgb(54, 88, 226)\",\"rgb(106, 57, 201)\",\"rgb(216, 68, 147)\",\"rgb(251, 233, 230)\",\"rgb(252, 237, 225)\",\"rgb(252, 239, 212)\",\"rgb(252, 251, 207)\",\"rgb(231, 246, 213)\",\"rgb(218, 244, 240)\",\"rgb(217, 237, 250)\",\"rgb(224, 232, 250)\",\"rgb(237, 225, 248)\",\"rgb(246, 226, 234)\",\"rgb(255, 163, 158)\",\"rgb(255, 187, 150)\",\"rgb(255, 213, 145)\",\"rgb(255, 251, 143)\",\"rgb(183, 235, 143)\",\"rgb(135, 232, 222)\",\"rgb(145, 213, 255)\",\"rgb(173, 198, 255)\",\"rgb(211, 173, 247)\",\"rgb(255, 173, 210)\",\"rgb(255, 77, 79)\",\"rgb(255, 122, 69)\",\"rgb(255, 169, 64)\",\"rgb(255, 236, 61)\",\"rgb(115, 209, 61)\",\"rgb(54, 207, 201)\",\"rgb(64, 169, 255)\",\"rgb(89, 126, 247)\",\"rgb(146, 84, 222)\",\"rgb(247, 89, 171)\",\"rgb(207, 19, 34)\",\"rgb(212, 56, 13)\",\"rgb(212, 107, 8)\",\"rgb(212, 177, 6)\",\"rgb(56, 158, 13)\",\"rgb(8, 151, 156)\",\"rgb(9, 109, 217)\",\"rgb(29, 57, 196)\",\"rgb(83, 29, 171)\",\"rgb(196, 29, 127)\",\"rgb(130, 0, 20)\",\"rgb(135, 20, 0)\",\"rgb(135, 56, 0)\",\"rgb(97, 71, 0)\",\"rgb(19, 82, 0)\",\"rgb(0, 71, 79)\",\"rgb(0, 58, 140)\",\"rgb(6, 17, 120)\",\"rgb(34, 7, 94)\",\"rgb(120, 6, 80)\"];var pu={renderStyle:function(t,e){var n=t,r=n.color,o=n.bgColor,i=e;return r&&au(i,{color:r}),o&&au(i,{backgroundColor:o}),i},styleToHtml:function(t,e){if(!r.Text.isText(t))return e;var n,o=t,i=o.color,u=o.bgColor;return i||u?((lo(e)||\"span\"!==fo(n=c.default(e)))&&(n=c.default(\"<span>\"+e+\"</span>\")),i&&n.css(\"color\",i),u&&n.css(\"background-color\",u),so(n)):e},preParseHtml:[cu],parseStyleHtml:function(t,e,n){var o=c.default(t);if(!r.Text.isText(e))return e;var i=e,u=po(o,\"color\");u&&(i.color=u);var a=po(o,\"background-color\");return a||(a=po(o,\"background\")),a&&(i.bgColor=a),i},menus:[{key:\"color\",factory:function(){return new su},config:{colors:du}},{key:\"bgColor\",factory:function(){return new fu},config:{colors:du}}]},hu=function(t){if(\"string\"!=typeof t)return !1;var e=t.match(vu);if(!e)return !1;var n=e[1];if(!n)return !1;if(gu.test(n)||mu.test(n))return !0;return !1},vu=/^(?:\\w+:)?\\/\\/(\\S+)$/,gu=/^localhost[\\:?\\d]*(?:[^\\:?\\d]\\S*)?$/,mu=/^[^\\s\\.]+\\.\\S{2,}$/;var yu=ke.includes;function bu(t){return void 0===t&&(t=\"r\"),t+\"-\"+i.nanoid()}function xu(t){return t.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function wu(t,e,n,r){return mo(this,void 0,void 0,(function(){var o,i;return yo(this,(function(u){switch(u.label){case 0:return (o=e.getMenuConfig(t).checkLink)?[4,o(n,r)]:[3,2];case 1:if(\"string\"==typeof(i=u.sent()))return e.alert(i,\"error\"),[2,!1];if(null==i)return [2,!1];u.label=2;case 2:return [2,!0]}}))}))}function Eu(t,e,n){return mo(this,void 0,void 0,(function(){var r;return yo(this,(function(o){switch(o.label){case 0:return (r=e.getMenuConfig(t).parseLinkUrl)?[4,r(n)]:[3,2];case 1:return [2,o.sent()];case 2:return [2,n]}}))}))}function Su(t){return null==t.selection||!!e.DomEditor.getSelectedElems(t).some((function(e){var n=e.type;return !!t.isVoid(e)||(!![\"pre\",\"code\",\"link\"].includes(n)||void 0)}))}function ku(t,e){return {type:\"link\",url:xu(t),children:e?[{text:e}]:[]}}function Tu(t,e,n){return mo(this,void 0,void 0,(function(){var o,i,u;return yo(this,(function(a){switch(a.label){case 0:return n?(e||(e=n),t.restoreSelection(),Su(t)?[2]:[4,wu(\"insertLink\",t,e,n)]):[2];case 1:return a.sent()?[4,Eu(\"insertLink\",t,n)]:[2];case 2:return o=a.sent(),null==(i=t.selection)?[2]:(r.Range.isCollapsed(i)?(t.insertText(\" \"),u=ku(o,e),r.Transforms.insertNodes(t,u),t.insertFragment([{text:\" \"}])):r.Editor.string(t,i)!==e?(t.deleteFragment(),u=ku(o,e),r.Transforms.insertNodes(t,u)):(u=ku(o),r.Transforms.wrapNodes(t,u,{split:!0}),r.Transforms.collapse(t,{edge:\"end\"})),[2])}}))}))}qe({target:\"Array\",proto:!0},{includes:function(t){return yu(this,t,arguments.length>1?arguments[1]:void 0)}}),Dr(\"includes\");var Mu={type:\"link\",renderElem:function(t,e,r){var o=t,i=o.url,u=o.target,a=void 0===u?\"_blank\":u;return n.jsx(\"a\",{href:i,target:a},e)}};var Iu={type:\"link\",elemToHtml:function(t,e){var n=t,r=n.url,o=n.target;return '<a href=\"'+r+'\" target=\"'+(void 0===o?\"_blank\":o)+'\">'+e+\"</a>\"}};var Nu={selector:\"a:not([data-w-e-type])\",parseElemHtml:function(t,e,n){var o=c.default(t);return 0===(e=e.filter((function(t){return !!r.Text.isText(t)||!!n.isInline(t)}))).length&&(e=[{text:o.text().replace(/\\s+/gm,\" \")}]),{type:\"link\",url:o.attr(\"href\")||\"\",target:o.attr(\"target\")||\"\",children:e}}};function Hu(){return bu(\"w-e-insert-link\")}var Ou=function(){function t(){this.title=e.t(\"link.insert\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M440.224 635.776a51.84 51.84 0 0 1-36.768-15.232c-95.136-95.136-95.136-249.92 0-345.056l192-192C641.536 37.408 702.816 12.032 768 12.032s126.432 25.376 172.544 71.456c95.136 95.136 95.136 249.92 0 345.056l-87.776 87.776a51.968 51.968 0 1 1-73.536-73.536l87.776-87.776a140.16 140.16 0 0 0 0-197.984c-26.432-26.432-61.6-40.992-99.008-40.992s-72.544 14.56-99.008 40.992l-192 192a140.16 140.16 0 0 0 0 197.984 51.968 51.968 0 0 1-36.768 88.768z\"></path><path d=\"M256 1012a242.4 242.4 0 0 1-172.544-71.456c-95.136-95.136-95.136-249.92 0-345.056l87.776-87.776a51.968 51.968 0 1 1 73.536 73.536l-87.776 87.776a140.16 140.16 0 0 0 0 197.984c26.432 26.432 61.6 40.992 99.008 40.992s72.544-14.56 99.008-40.992l192-192a140.16 140.16 0 0 0 0-197.984 51.968 51.968 0 1 1 73.536-73.536c95.136 95.136 95.136 249.92 0 345.056l-192 192A242.4 242.4 0 0 1 256 1012z\"></path></svg>',this.tag=\"button\",this.showModal=!0,this.modalWidth=300,this.$content=null,this.textInputId=Hu(),this.urlInputId=Hu(),this.buttonId=Hu();}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.exec=function(t,e){},t.prototype.isDisabled=function(t){return Su(t)},t.prototype.getModalPositionNode=function(t){return null},t.prototype.getModalContentElem=function(t){var n=t.selection,o=this,i=o.textInputId,u=o.urlInputId,a=o.buttonId,l=xo(e.genModalInputElems(e.t(\"link.text\"),i),2),s=l[0],f=l[1],d=c.default(f),p=xo(e.genModalInputElems(e.t(\"link.url\"),u),2),h=p[0],v=p[1],g=c.default(v),m=xo(e.genModalButtonElems(a,e.t(\"common.ok\")),1)[0];if(null==this.$content){var y=c.default(\"<div></div>\");y.on(\"click\",\"#\"+a,(function(e){e.preventDefault();var n=y.find(\"#\"+i).val(),r=y.find(\"#\"+u).val();Tu(t,n,r),t.hidePanelOrModal();})),this.$content=y;}var b=this.$content;if(b.empty(),b.append(s),b.append(h),b.append(m),null==n||r.Range.isCollapsed(n))d.val(\"\");else {var x=r.Editor.string(t,n);d.val(x);}return g.val(\"\"),setTimeout((function(){d.focus();})),b[0]},t}();function ju(){return bu(\"w-e-update-link\")}var Du=function(){function t(){this.title=e.t(\"link.edit\"),this.iconSvg=Go,this.tag=\"button\",this.showModal=!0,this.modalWidth=300,this.$content=null,this.urlInputId=ju(),this.buttonId=ju();}return t.prototype.getSelectedLinkElem=function(t){var n=e.DomEditor.getSelectedNodeByType(t,\"link\");return null==n?null:n},t.prototype.getValue=function(t){var e=this.getSelectedLinkElem(t);return e&&e.url||\"\"},t.prototype.isActive=function(t){return !1},t.prototype.exec=function(t,e){},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkElem(t)},t.prototype.getModalPositionNode=function(t){return e.DomEditor.getSelectedNodeByType(t,\"link\")},t.prototype.getModalContentElem=function(t){var n=this.urlInputId,o=this.buttonId,i=xo(e.genModalInputElems(e.t(\"link.url\"),n),2),u=i[0],a=i[1],l=c.default(a),s=xo(e.genModalButtonElems(o,e.t(\"common.ok\")),1)[0];if(null==this.$content){var f=c.default(\"<div></div>\");f.on(\"click\",\"button\",(function(o){o.preventDefault(),t.restoreSelection();var i=e.DomEditor.getSelectedNodeByType(t,\"link\"),u=i?r.Node.string(i):\"\",a=f.find(\"#\"+n).val();!function(t,n,o){mo(this,void 0,void 0,(function(){var i,u;return yo(this,(function(a){switch(a.label){case 0:return o?[4,wu(\"editLink\",t,n,o)]:[2];case 1:return a.sent()?[4,Eu(\"editLink\",t,o)]:[2];case 2:return i=a.sent(),u={url:xu(i)},r.Transforms.setNodes(t,u,{match:function(t){return e.DomEditor.checkNodeType(t,\"link\")}}),[2]}}))}));}(t,u,a),t.hidePanelOrModal();})),this.$content=f;}var d=this.$content;d.empty(),d.append(u),d.append(s);var p=this.getValue(t);return l.val(p),setTimeout((function(){l.focus();})),d[0]},t}(),Lu=function(){function t(){this.title=e.t(\"link.unLink\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M608.16328 811.815036c9.371954 9.371954 9.371954 24.56788 0 33.941834l-89.347563 89.347564c-118.525421 118.523421-311.38448 118.531421-429.919901 0-118.527421-118.529421-118.527421-311.39048 0-429.917901l89.349564-89.349563c9.371954-9.371954 24.56788-9.371954 33.941834 0l79.195613 79.195613c9.371954 9.371954 9.371954 24.56788 0 33.941834l-89.349563 89.347564c-56.143726 56.145726-56.143726 147.49928 0 203.645005 56.143726 56.143726 147.49928 56.145726 203.647005 0l89.347564-89.347563c9.371954-9.371954 24.56788-9.371954 33.941834 0l79.193613 79.195613z m-113.135447-520.429459c9.371954 9.371954 24.56788 9.371954 33.941834 0l89.347564-89.347564c56.143726-56.149726 147.49928-56.145726 203.647006 0 56.143726 56.145726 56.143726 147.49928 0 203.645006l-89.349564 89.347564c-9.371954 9.371954-9.371954 24.56788 0 33.941834l79.195613 79.195613c9.371954 9.371954 24.56788 9.371954 33.941834 0l89.349564-89.349563c118.529421-118.529421 118.529421-311.38848 0-429.917901-118.531421-118.527421-311.38848-118.527421-429.919901 0l-89.347563 89.347564c-9.371954 9.371954-9.371954 24.56788 0 33.941834l79.193613 79.195613z m469.653707 718.556492l45.253779-45.253779c18.745908-18.745908 18.745908-49.13776 0-67.881669L127.195629 14.062931c-18.745908-18.745908-49.13776-18.745908-67.881669 0L14.058181 59.31871c-18.745908 18.745908-18.745908 49.13776 0 67.881669l882.74169 882.74169c18.745908 18.743908 49.13776 18.743908 67.881669 0z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection||null==e.DomEditor.getSelectedNodeByType(t,\"link\")},t.prototype.exec=function(t,n){this.isDisabled(t)||r.Transforms.unwrapNodes(t,{match:function(t){return e.DomEditor.checkNodeType(t,\"link\")}});},t}(),zu=function(){function t(){this.title=e.t(\"link.view\"),this.iconSvg=Uo,this.tag=\"button\";}return t.prototype.getSelectedLinkElem=function(t){var n=e.DomEditor.getSelectedNodeByType(t,\"link\");return null==n?null:n},t.prototype.getValue=function(t){var e=this.getSelectedLinkElem(t);return e&&e.url||\"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedLinkElem(t)},t.prototype.exec=function(t,e){if(!this.isDisabled(t)){if(!e||\"string\"!=typeof e)throw new Error(\"View link failed, link url is '\"+e+\"'\");window.open(e,\"_blank\");}},t}();var Au={checkLink:function(t,e){return !0},parseLinkUrl:function(t){return t}},Pu={renderElems:[Mu],elemsToHtml:[Iu],parseElemsHtml:[Nu],menus:[{key:\"insertLink\",factory:function(){return new Ou},config:Au},{key:\"editLink\",factory:function(){return new Du},config:Au},{key:\"unLink\",factory:function(){return new Lu}},{key:\"viewLink\",factory:function(){return new zu}}],editorPlugin:function(t){var n=t.isInline,o=t.insertData,i=t.normalizeNode;t.insertNode,t.insertText;var u=t;return u.isInline=function(t){return \"link\"===t.type||n(t)},u.insertData=function(t){var e=t.getData(\"text/plain\");if(hu(e)){if(!Su(u)){var n=u.selection;if(null!=n){var i=r.Editor.string(u,n);Tu(u,i,e);}}}else o(t);},u.normalizeNode=function(t){var n=xo(t,2),o=n[0],a=n[1];return \"link\"!==e.DomEditor.getNodeType(o)?i([o,a]):\"\"===r.Node.string(o)?r.Transforms.removeNodes(u,{at:a}):i([o,a])},u}};var Cu=D(1..valueOf),Vu=y.RangeError,Bu=y.RangeError,Ru=y.String,Fu=Math.floor,_u=D((function(t){var e=bn(R(this)),n=\"\",r=ge(t);if(r<0||r==1/0)throw Vu(\"Wrong number of repetitions\");for(;r>0;(r>>>=1)&&(e+=e))1&r&&(n+=e);return n})),qu=D(\"\".slice),$u=D(1..toFixed),Wu=function(t,e,n){return 0===e?n:e%2==1?Wu(t,e-1,n*t):Wu(t*t,e/2,n)},Gu=function(t,e,n){for(var r=-1,o=n;++r<6;)o+=e*t[r],t[r]=o%1e7,o=Fu(o/1e7);},Uu=function(t,e){for(var n=6,r=0;--n>=0;)r+=t[n],t[n]=Fu(r/e),r=r%e*1e7;},Xu=function(t){for(var e=6,n=\"\";--e>=0;)if(\"\"!==n||0===e||0!==t[e]){var r=Ru(t[e]);n=\"\"===n?r:n+_u(\"0\",7-r.length)+r;}return n};function Yu(t,n){return \"w-e-image-container-\"+e.DomEditor.findKey(t,n).id}function Ju(t,o,i,u){var a=c.default(\"body\"),s=Yu(t,o),f=u.width,d=u.height,p=0,h=0,v=0,g=!1,m=null;function y(n){m=function(){var t=c.default(\"#\"+s);if(0===t.length)throw new Error(\"Cannot find image container elem\");return t}(),p=n;var r=m.find(\"img\");if(0===r.length)throw new Error(\"Cannot find image elem\");h=r.width(),v=r.height(),a.on(\"mousemove\",b),a.on(\"mouseup\",x);var o=e.DomEditor.getHoverbar(t);o&&o.hideAndClean();}var b=l.default((function(t){t.preventDefault();var e=t.clientX,n=h+(g?p-e:e-p),r=v*(n/h);null!=m&&(n<=15||r<=15||(m.css(\"width\",n+\"px\"),m.css(\"height\",r+\"px\")));}),100);function x(n){if(a.off(\"mousemove\",b),null!=m){var i=m.width().toFixed(2),u=m.height().toFixed(2),c={style:go(go({},o.style),{width:i+\"px\",height:u+\"px\"})};r.Transforms.setNodes(t,c,{at:e.DomEditor.findPath(t,o)}),a.off(\"mouseup\",x);}}var w={};return f&&(w.width=f),d&&(w.height=d),n.jsx(\"div\",{id:s,style:w,className:\"w-e-image-container w-e-selected-image-container\",on:{mousedown:function(t){var e=c.default(t.target);e.hasClass(\"w-e-image-dragger\")&&(t.preventDefault(),(e.hasClass(\"left-top\")||e.hasClass(\"left-bottom\"))&&(g=!0),y(t.clientX));}}},i,n.jsx(\"div\",{className:\"w-e-image-dragger left-top\"}),n.jsx(\"div\",{className:\"w-e-image-dragger right-top\"}),n.jsx(\"div\",{className:\"w-e-image-dragger left-bottom\"}),n.jsx(\"div\",{className:\"w-e-image-dragger right-bottom\"}))}qe({target:\"Number\",proto:!0,forced:b((function(){return \"0.000\"!==$u(8e-5,3)||\"1\"!==$u(.9,0)||\"1.25\"!==$u(1.255,2)||\"1000000000000000128\"!==$u(0xde0b6b3a7640080,0)}))||!b((function(){$u({});}))},{toFixed:function(t){var e,n,r,o,i=Cu(this),u=ge(t),a=[0,0,0,0,0,0],c=\"\",l=\"0\";if(u<0||u>20)throw Bu(\"Incorrect fraction digits\");if(i!=i)return \"NaN\";if(i<=-1e21||i>=1e21)return Ru(i);if(i<0&&(c=\"-\",i=-i),i>1e-21)if(n=(e=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e}(i*Wu(2,69,1))-69)<0?i*Wu(2,-e,1):i/Wu(2,e,1),n*=4503599627370496,(e=52-e)>0){for(Gu(a,0,n),r=u;r>=7;)Gu(a,1e7,0),r-=7;for(Gu(a,Wu(10,r,1),0),r=e-1;r>=23;)Uu(a,1<<23),r-=23;Uu(a,1<<r),Gu(a,1,1),Uu(a,2),l=Xu(a);}else Gu(a,0,n),Gu(a,1<<-e,0),l=Xu(a)+_u(\"0\",u);return l=u>0?c+((o=l.length)<=u?\"0.\"+_u(\"0\",u-o)+l:qu(l,0,o-u)+\".\"+qu(l,o-u)):c+l}});var Ku={type:\"image\",renderElem:function(t,r,o){var i=t,u=i.src,a=i.alt,c=void 0===a?\"\":a,l=i.href,s=void 0===l?\"\":l,f=i.style,d=void 0===f?{}:f,p=d.width,h=void 0===p?\"\":p,v=d.height,g=void 0===v?\"\":v,m=e.DomEditor.isNodeSelected(o,t),y={};h&&(y.width=\"100%\"),g&&(y.height=\"100%\");var b=n.jsx(\"img\",{style:y,src:u,alt:c,\"data-href\":s}),x=o.isDisabled();return m&&!x?Ju(o,t,b,{width:h,height:g}):function(t,e,r,o){var i=o.width,u=o.height,a={};i&&(a.width=i),u&&(a.height=u);var c=Yu(t,e);return n.jsx(\"div\",{id:c,style:a,className:\"w-e-image-container\"},r)}(o,t,b,{width:h,height:g})}};var Qu={type:\"image\",elemToHtml:function(t,e){var n=t,r=n.src,o=n.alt,i=void 0===o?\"\":o,u=n.href,a=void 0===u?\"\":u,c=n.style,l=void 0===c?{}:c,s=l.width,f=void 0===s?\"\":s,d=l.height,p=void 0===d?\"\":d,h=\"\";return f&&(h+=\"width: \"+f+\";\"),p&&(h+=\"height: \"+p+\";\"),'<img src=\"'+r+'\" alt=\"'+i+'\" data-href=\"'+a+'\" style=\"'+h+'\"/>'}};var Zu={selector:\"img:not([data-w-e-type])\",parseElemHtml:function(t,e,n){var r=c.default(t),o=r.attr(\"data-href\")||\"\";return o=decodeURIComponent(o),{type:\"image\",src:r.attr(\"src\")||\"\",alt:r.attr(\"alt\")||\"\",href:o,style:{width:po(r,\"width\"),height:po(r,\"height\")},children:[{text:\"\"}]}}};function ta(t,e,n,r,o){return void 0===r&&(r=\"\"),void 0===o&&(o=\"\"),mo(this,void 0,void 0,(function(){var i,u;return yo(this,(function(a){switch(a.label){case 0:return (i=e.getMenuConfig(t).checkImage)?[4,i(n,r,o)]:[3,2];case 1:if(\"string\"==typeof(u=a.sent()))return e.alert(u,\"error\"),[2,!1];if(null==u)return [2,!1];a.label=2;case 2:return [2,!0]}}))}))}function ea(t,e,n){return mo(this,void 0,void 0,(function(){var r;return yo(this,(function(o){switch(o.label){case 0:return (r=e.getMenuConfig(t).parseImageSrc)?[4,r(n)]:[3,2];case 1:return [2,o.sent()];case 2:return [2,n]}}))}))}function na(t,n,o,i){return void 0===o&&(o=\"\"),void 0===i&&(i=\"\"),mo(this,void 0,void 0,(function(){var u,a,c;return yo(this,(function(l){switch(l.label){case 0:return [4,ta(\"insertImage\",t,n,o,i)];case 1:return l.sent()?[4,ea(\"insertImage\",t,n)]:[2];case 2:return u=l.sent(),a={type:\"image\",src:xu(u),href:i,alt:o,style:{},children:[{text:\"\"}]},null===t.selection&&t.restoreSelection(),e.DomEditor.getSelectedNodeByType(t,\"image\")&&t.move(1),oa(t)?[2]:(r.Transforms.insertNodes(t,a),(c=t.getMenuConfig(\"insertImage\").onInsertedImage)&&c(a),[2])}}))}))}function ra(t,n,o,i,u){return void 0===o&&(o=\"\"),void 0===i&&(i=\"\"),void 0===u&&(u={}),mo(this,void 0,void 0,(function(){var a,c,l,s,f,d;return yo(this,(function(p){switch(p.label){case 0:return [4,ta(\"editImage\",t,n,o,i)];case 1:return p.sent()?[4,ea(\"editImage\",t,n)]:[2];case 2:return a=p.sent(),null==(c=e.DomEditor.getSelectedNodeByType(t,\"image\"))?[2]:(l=c.style,s={src:a,alt:o,href:i,style:go(go({},void 0===l?{}:l),u)},r.Transforms.setNodes(t,s,{match:function(t){return e.DomEditor.checkNodeType(t,\"image\")}}),f=e.DomEditor.getSelectedNodeByType(t,\"image\"),(d=t.getMenuConfig(\"editImage\").onUpdatedImage)&&d(f),[2])}}))}))}function oa(t){var n=t.selection;return null==n||(!r.Range.isCollapsed(n)||!!xo(r.Editor.nodes(t,{match:function(n){var o=e.DomEditor.getNodeType(n);return \"code\"===o||(\"pre\"===o||(\"link\"===o||(\"list-item\"===o||(!!o.startsWith(\"header\")||(\"blockquote\"===o||!!r.Editor.isVoid(t,n))))))},universal:!0}),1)[0])}function ia(){return bu(\"w-e-insert-image\")}var ua=function(){function t(){this.title=e.t(\"image.netImage\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>',this.tag=\"button\",this.showModal=!0,this.modalWidth=300,this.$content=null,this.srcInputId=ia(),this.altInputId=ia(),this.hrefInputId=ia(),this.buttonId=ia();}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.exec=function(t,e){},t.prototype.isDisabled=function(t){return oa(t)},t.prototype.getModalPositionNode=function(t){return null},t.prototype.getModalContentElem=function(t){var n=this,r=this,o=r.srcInputId,i=r.altInputId,u=r.hrefInputId,a=r.buttonId,l=xo(e.genModalInputElems(e.t(\"image.src\"),o),2),s=l[0],f=l[1],d=c.default(f),p=xo(e.genModalInputElems(e.t(\"image.desc\"),i),2),h=p[0],v=p[1],g=c.default(v),m=xo(e.genModalInputElems(e.t(\"image.link\"),u),2),y=m[0],b=m[1],x=c.default(b),w=xo(e.genModalButtonElems(a,e.t(\"common.ok\")),1)[0];if(null==this.$content){var E=c.default(\"<div></div>\");E.on(\"click\",\"#\"+a,(function(e){e.preventDefault();var r=E.find(\"#\"+o).val().trim(),a=E.find(\"#\"+i).val().trim(),c=E.find(\"#\"+u).val().trim();n.insertImage(t,r,a,c),t.hidePanelOrModal();})),this.$content=E;}var S=this.$content;return S.empty(),S.append(s),S.append(h),S.append(y),S.append(w),d.val(\"\"),g.val(\"\"),x.val(\"\"),setTimeout((function(){d.focus();})),S[0]},t.prototype.insertImage=function(t,e,n,r){void 0===n&&(n=\"\"),void 0===r&&(r=\"\"),e&&(t.restoreSelection(),this.isDisabled(t)||na(t,e,n,r));},t}(),aa=function(){function t(){this.title=e.t(\"image.delete\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M826.8032 356.5312c-19.328 0-36.3776 15.6928-36.3776 35.0464v524.2624c0 19.328-16 34.56-35.328 34.56H264.9344c-19.328 0-35.5072-15.3088-35.5072-34.56V390.0416c0-19.328-14.1568-35.0464-33.5104-35.0464s-33.5104 15.6928-33.5104 35.0464V915.712c0 57.9328 44.6208 108.288 102.528 108.288H755.2c57.9328 0 108.0832-50.4576 108.0832-108.288V391.4752c-0.1024-19.2512-17.1264-34.944-36.48-34.944z\" p-id=\"9577\"></path><path d=\"M437.1712 775.7568V390.6048c0-19.328-14.1568-35.0464-33.5104-35.0464s-33.5104 15.616-33.5104 35.0464v385.152c0 19.328 14.1568 35.0464 33.5104 35.0464s33.5104-15.7184 33.5104-35.0464zM649.7024 775.7568V390.6048c0-19.328-17.0496-35.0464-36.3776-35.0464s-36.3776 15.616-36.3776 35.0464v385.152c0 19.328 17.0496 35.0464 36.3776 35.0464s36.3776-15.7184 36.3776-35.0464zM965.0432 217.0368h-174.6176V145.5104c0-57.9328-47.2064-101.76-104.6528-101.76h-350.976c-57.8304 0-105.3952 43.8528-105.3952 101.76v71.5264H54.784c-19.4304 0-35.0464 14.1568-35.0464 33.5104 0 19.328 15.616 33.5104 35.0464 33.5104h910.3616c19.328 0 35.0464-14.1568 35.0464-33.5104 0-19.3536-15.6928-33.5104-35.1488-33.5104z m-247.3728 0H297.3952V145.5104c0-19.328 18.2016-34.7648 37.4272-34.7648h350.976c19.1488 0 31.872 15.1296 31.872 34.7648v71.5264z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection||null==e.DomEditor.getSelectedNodeByType(t,\"image\")},t.prototype.exec=function(t,n){this.isDisabled(t)||r.Transforms.removeNodes(t,{match:function(t){return e.DomEditor.checkNodeType(t,\"image\")}});},t}();function ca(){return bu(\"w-e-edit-image\")}var la=function(){function t(){this.title=e.t(\"image.edit\"),this.iconSvg=Go,this.tag=\"button\",this.showModal=!0,this.modalWidth=300,this.$content=null,this.srcInputId=ca(),this.altInputId=ca(),this.hrefInputId=ca(),this.buttonId=ca();}return t.prototype.getValue=function(t){return \"\"},t.prototype.getImageNode=function(t){return e.DomEditor.getSelectedNodeByType(t,\"image\")},t.prototype.isActive=function(t){return !1},t.prototype.exec=function(t,e){},t.prototype.isDisabled=function(t){var n=t.selection;return null==n||(!r.Range.isCollapsed(n)||null==e.DomEditor.getSelectedNodeByType(t,\"image\"))},t.prototype.getModalPositionNode=function(t){return this.getImageNode(t)},t.prototype.getModalContentElem=function(t){var n=this,r=this,o=r.srcInputId,i=r.altInputId,u=r.hrefInputId,a=r.buttonId,l=this.getImageNode(t);if(null==l)throw new Error(\"Not found selected image node\");var s=xo(e.genModalInputElems(e.t(\"image.src\"),o),2),f=s[0],d=s[1],p=c.default(d),h=xo(e.genModalInputElems(e.t(\"image.desc\"),i),2),v=h[0],g=h[1],m=c.default(g),y=xo(e.genModalInputElems(e.t(\"image.link\"),u),2),b=y[0],x=y[1],w=c.default(x),E=xo(e.genModalButtonElems(a,e.t(\"common.ok\")),1)[0];if(null==this.$content){var S=c.default(\"<div></div>\");S.on(\"click\",\"#\"+a,(function(e){e.preventDefault();var r=S.find(\"#\"+o).val(),a=S.find(\"#\"+i).val(),c=S.find(\"#\"+u).val();n.updateImage(t,r,a,c),t.hidePanelOrModal();})),this.$content=S;}var k=this.$content;k.empty(),k.append(f),k.append(v),k.append(b),k.append(E);var T=l,M=T.src,I=T.alt,N=void 0===I?\"\":I,H=T.href,O=void 0===H?\"\":H;return p.val(M),m.val(N),w.val(O),setTimeout((function(){p.focus();})),k[0]},t.prototype.updateImage=function(t,e,n,r,o){void 0===n&&(n=\"\"),void 0===r&&(r=\"\"),void 0===o&&(o={}),e&&(t.restoreSelection(),this.isDisabled(t)||ra(t,e,n,r,o));},t}(),sa=function(){function t(){this.title=e.t(\"image.viewLink\"),this.iconSvg=Uo,this.tag=\"button\";}return t.prototype.getValue=function(t){var n=e.DomEditor.getSelectedNodeByType(t,\"image\");return n&&n.href||\"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection||!this.getValue(t)},t.prototype.exec=function(t,e){if(!this.isDisabled(t)){if(!e||\"string\"!=typeof e)throw new Error(\"View image link failed, image.href is '\"+e+\"'\");window.open(e,\"_blank\");}},t}(),fa=function(){function t(){this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.getSelectedNode=function(t){return e.DomEditor.getSelectedNodeByType(t,\"image\")},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedNode(t)},t.prototype.exec=function(t,n){if(!this.isDisabled(t)){var o=this.getSelectedNode(t);if(null!=o){var i=e.DomEditor.getHoverbar(t);i&&i.hideAndClean();var u=o.style,a={style:go(go({},void 0===u?{}:u),{width:this.value,height:\"\"})};r.Transforms.setNodes(t,a,{match:function(t){return e.DomEditor.checkNodeType(t,\"image\")}});}}},t}(),da=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"30%\",e.value=\"30%\",e}return vo(e,t),e}(fa),pa=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"50%\",e.value=\"50%\",e}return vo(e,t),e}(fa),ha=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.title=\"100%\",e.value=\"100%\",e}return vo(e,t),e}(fa);var va={onInsertedImage:function(t){},onUpdatedImage:function(t){},checkImage:function(t,e,n){return !0},parseImageSrc:function(t){return t}},ga={renderElems:[Ku],elemsToHtml:[Qu],parseElemsHtml:[Zu],menus:[{key:\"insertImage\",factory:function(){return new ua},config:va},{key:\"deleteImage\",factory:function(){return new aa}},{key:\"editImage\",factory:function(){return new la},config:va},{key:\"viewImageLink\",factory:function(){return new sa}},{key:\"imageWidth30\",factory:function(){return new da}},{key:\"imageWidth50\",factory:function(){return new pa}},{key:\"imageWidth100\",factory:function(){return new ha}}],editorPlugin:function(t){var e=t.isInline,n=t.isVoid;t.insertNode;var r=t;return r.isInline=function(t){return \"image\"===t.type||e(t)},r.isVoid=function(t){return \"image\"===t.type||n(t)},r}};var ma={type:\"todo\",renderElem:function(t,o,i){var u=!1;i.isDisabled()&&(u=!0);var a=t.checked,c=n.jsx(\"div\",{style:{margin:\"5px 0\"}},n.jsx(\"span\",{contentEditable:!1,style:{marginRight:\"0.5em\"}},n.jsx(\"input\",{type:\"checkbox\",checked:a,disabled:u,on:{change:function(n){var o=e.DomEditor.findPath(i,t),u={checked:n.target.checked};r.Transforms.setNodes(i,u,{at:o});}}})),n.jsx(\"span\",null,o));return c}};var ya=function(){function t(){this.title=e.t(\"todo.todo\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M278.755556 403.911111l-79.644445 79.644445L455.111111 739.555556l568.888889-568.888889-79.644444-79.644445L455.111111 580.266667l-176.355555-176.355556zM910.222222 910.222222H113.777778V113.777778h568.888889V0H113.777778C51.2 0 0 51.2 0 113.777778v796.444444c0 62.577778 51.2 113.777778 113.777778 113.777778h796.444444c62.577778 0 113.777778-51.2 113.777778-113.777778V455.111111h-113.777778v455.111111z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !!e.DomEditor.getSelectedNodeByType(t,\"todo\")},t.prototype.isDisabled=function(t){return null==t.selection||!!e.DomEditor.getSelectedElems(t).some((function(e){if(r.Editor.isVoid(t,e)&&r.Editor.isBlock(t,e))return !0;var n=e.type;return !![\"pre\",\"table\",\"list-item\"].includes(n)||void 0}))},t.prototype.exec=function(t,e){var n=this.isActive(t);r.Transforms.setNodes(t,{type:n?\"paragraph\":\"todo\"});},t}();var ba={renderElems:[ma],elemsToHtml:[{type:\"todo\",elemToHtml:function(t,e){return '<div data-w-e-type=\"todo\"><input type=\"checkbox\" disabled '+(t.checked?\"checked\":\"\")+\">\"+e+\"</div>\"}}],preParseHtml:[{selector:\"ul.w-e-todo\",preParseHtml:function(t){var e=c.default(t).find(\"li\"),n=c.default('<div data-w-e-type=\"todo\"></div>'),r=e.find(\"input[type]\");return n.append(r),e.children()[0].remove(),n[0].innerHTML=n[0].innerHTML+e[0].innerHTML,n[0]}}],parseElemsHtml:[{selector:'div[data-w-e-type=\"todo\"]',parseElemHtml:function(t,e,n){var o=c.default(t);0===(e=e.filter((function(t){return !!r.Text.isText(t)||!!n.isInline(t)}))).length&&(e=[{text:o.text().replace(/\\s+/gm,\" \")}]);var i=!1;return null!=o.find('input[type=\"checkbox\"]').attr(\"checked\")&&(i=!0),{type:\"todo\",checked:i,children:e}}}],menus:[{key:\"todo\",factory:function(){return new ya}}],editorPlugin:function(t){var n=t.deleteBackward,o=t;return o.deleteBackward=function(o){var i=t.selection;if(i&&r.Range.isCollapsed(i)){var u=e.DomEditor.getSelectedNodeByType(t,\"todo\");if(u&&0===r.Node.string(u).length)return void r.Transforms.setNodes(t,{type:\"paragraph\"},{mode:\"highest\"})}n(o);},o}};var xa={type:\"blockquote\",renderElem:function(t,e,r){return n.jsx(\"blockquote\",null,e)}};var wa={type:\"blockquote\",elemToHtml:function(t,e){return \"<blockquote>\"+e+\"</blockquote>\"}};var Ea={selector:\"blockquote:not([data-w-e-type])\",parseElemHtml:function(t,e,n){var o=c.default(t);return 0===(e=e.filter((function(t){return !!r.Text.isText(t)||!!n.isInline(t)}))).length&&(e=[{text:o.text().replace(/\\s+/gm,\" \")}]),{type:\"blockquote\",children:e}}},Sa=function(){function t(){this.title=e.t(\"blockQuote.title\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M894.6 907.1H605.4c-32.6 0-59-26.4-59-59V608.2l-4-14.9c0-315.9 125.5-485.1 376.5-507.5v59.8C752.7 180.4 711.3 315.8 711.3 442.4v41.2l31.5 12.3h151.8c32.6 0 59 26.4 59 59v293.2c0 32.5-26.4 59-59 59z m-472 0H133.4c-32.6 0-59-26.4-59-59V608.2l-4-14.9c0-315.9 125.5-485.1 376.5-507.5v59.8C280.7 180.4 239.3 315.8 239.3 442.4v41.2l31.5 12.3h151.8c32.6 0 59 26.4 59 59v293.2c0 32.5-26.4 59-59 59z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !!e.DomEditor.getSelectedNodeByType(t,\"blockquote\")},t.prototype.isDisabled=function(t){return null==t.selection||!xo(r.Editor.nodes(t,{match:function(t){var n=e.DomEditor.getNodeType(t);return \"paragraph\"===n||\"blockquote\"===n},universal:!0,mode:\"highest\"}),1)[0]},t.prototype.exec=function(t,e){if(!this.isDisabled(t)){var n=this.isActive(t)?\"paragraph\":\"blockquote\";r.Transforms.setNodes(t,{type:n},{mode:\"highest\"});}},t}(),ka={key:\"blockquote\",factory:function(){return new Sa}},Ta=D([].slice),Ma=hn(\"slice\"),Ia=Mt(\"species\"),Na=y.Array,Ha=Math.max;qe({target:\"Array\",proto:!0,forced:!Ma},{slice:function(t,e){var n,r,o,i=F(this),u=Ee(i),a=be(t,u),c=be(void 0===e?u:e,u);if(We(i)&&(n=i.constructor,(un(n)&&(n===Na||We(n.prototype))||q(n)&&null===(n=n[Ia]))&&(n=void 0),n===Na||void 0===n))return Ta(i,a,c);for(r=new(void 0===n?Na:n)(Ha(c-a,0)),o=0;a<c;a++,o++)a in i&&Fr(r,o,i[a]);return r.length=o,r}});var Oa={renderElems:[xa],elemsToHtml:[wa],parseElemsHtml:[Ea],menus:[ka],editorPlugin:function(t){var n=t.insertBreak,o=t.insertText,i=t;return i.insertBreak=function(){var u=i.selection;if(null==u)return n();var a=xo(r.Editor.nodes(t,{match:function(t){return e.DomEditor.checkNodeType(t,\"blockquote\")},universal:!0}),1)[0];if(!a)return n();var c=a[0],l=e.DomEditor.findPath(t,c),s=r.Editor.end(t,l);if(r.Point.equals(s,u.focus)){var f=r.Node.string(c);if(f&&\"\\n\"===f.slice(-1)){t.deleteBackward(\"character\");return void r.Transforms.insertNodes(i,{type:\"paragraph\",children:[{text:\"\"}]},{mode:\"highest\"})}}o(\"\\n\");},i}},ja=function(){function t(){this.title=e.t(\"emotion.title\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M512 1024C230.4 1024 0 793.6 0 512S230.4 0 512 0s512 230.4 512 512-230.4 512-512 512z m0-102.4c226.742857 0 409.6-182.857143 409.6-409.6S738.742857 102.4 512 102.4 102.4 285.257143 102.4 512s182.857143 409.6 409.6 409.6z m-204.8-358.4h409.6c0 113.371429-91.428571 204.8-204.8 204.8s-204.8-91.428571-204.8-204.8z m0-102.4c-43.885714 0-76.8-32.914286-76.8-76.8s32.914286-76.8 76.8-76.8 76.8 32.914286 76.8 76.8-32.914286 76.8-76.8 76.8z m409.6 0c-43.885714 0-76.8-32.914286-76.8-76.8s32.914286-76.8 76.8-76.8c43.885714 0 76.8 32.914286 76.8 76.8s-32.914286 76.8-76.8 76.8z\"></path></svg>',this.tag=\"button\",this.showDropPanel=!0,this.$content=null;}return t.prototype.exec=function(t,e){},t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection||!!xo(r.Editor.nodes(t,{match:function(n){return \"pre\"===e.DomEditor.getNodeType(n)||!!r.Editor.isVoid(t,n)},universal:!0}),1)[0]},t.prototype.getPanelContentElem=function(t){if(null==this.$content){var e=c.default('<ul class=\"w-e-panel-content-emotion\"></ul>');e.on(\"click\",\"li\",(function(e){var n=e.target;if(null!=n){e.preventDefault();var r=c.default(n).text();t.insertText(r);}})),this.$content=e;}var n=this.$content;if(null==n)return document.createElement(\"ul\");n.empty();var r=t.getMenuConfig(\"emotion\").emotions;return (void 0===r?[]:r).forEach((function(t){var e=c.default(\"<li>\"+t+\"</li>\");n.append(e);})),n[0]},t}();var Da={menus:[{key:\"emotion\",factory:function(){return new ja},config:{emotions:\"😀 😃 😄 😁 😆 😅 😂 🤣 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😛 😝 😜 🤓 😎 😏 😒 😞 😔 😟 😕 🙁 😣 😖 😫 😩 😢 😭 😤 😠 😡 😳 😱 😨 🤗 🤔 😶 😑 😬 🙄 😯 😴 😷 🤑 😈 🤡 💩 👻 💀 👀 👣 👐 🙌 👏 🤝 👍 👎 👊 ✊ 🤛 🤜 🤞 ✌️ 🤘 👌 👈 👉 👆 👇 ☝️ ✋ 🤚 🖐 🖖 👋 🤙 💪 🖕 ✍️ 🙏\".split(\" \")}}]};var La={1:\"12px\",2:\"14px\",3:\"16px\",4:\"19px\",5:\"24px\",6:\"32px\",7:\"48px\"};var za={selector:\"font\",preParseHtml:function(t){var e=c.default(t);if(\"font\"!==fo(e))return t;var n=e.attr(\"size\")||\"\";n&&(e.removeAttr(\"size\"),e.css(\"font-size\",La[n]));var r=e.attr(\"face\")||\"\";return r&&(e.removeAttr(\"face\"),e.css(\"font-family\",r)),e[0]}},Aa=D(\"\".indexOf);qe({target:\"String\",proto:!0,forced:!Di(\"includes\")},{includes:function(t){return !!~Aa(bn(R(this)),bn(Oi(t)),arguments.length>1?arguments[1]:void 0)}});var Pa,Ca,Va=function(t){return t&&t.Math==Math&&t},Ba=Va(\"object\"==typeof globalThis&&globalThis)||Va(\"object\"==typeof window&&window)||Va(\"object\"==typeof self&&self)||Va(\"object\"==typeof d&&d)||function(){return this}()||Function(\"return this\")(),Ra=Function.prototype,Fa=Ra.apply,_a=Ra.bind,qa=Ra.call,$a=\"object\"==typeof Reflect&&Reflect.apply||(_a?qa.bind(Fa):function(){return qa.apply(Fa,arguments)}),Wa=Function.prototype,Ga=Wa.bind,Ua=Wa.call,Xa=Ga&&Ga.bind(Ua),Ya=Ga?function(t){return t&&Xa(Ua,t)}:function(t){return t&&function(){return Ua.apply(t,arguments)}},Ja=function(t){return \"function\"==typeof t},Ka=function(t){try{return !!t()}catch(t){return !0}},Qa=!Ka((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),Za=Function.prototype.call,tc=Za.bind?Za.bind(Za):function(){return Za.apply(Za,arguments)},ec={}.propertyIsEnumerable,nc=Object.getOwnPropertyDescriptor,rc=nc&&!ec.call({1:2},1)?function(t){var e=nc(this,t);return !!e&&e.enumerable}:ec,oc={f:rc},ic=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},uc=Ya({}.toString),ac=Ya(\"\".slice),cc=function(t){return ac(uc(t),8,-1)},lc=Ba.Object,sc=Ya(\"\".split),fc=Ka((function(){return !lc(\"z\").propertyIsEnumerable(0)}))?function(t){return \"String\"==cc(t)?sc(t,\"\"):lc(t)}:lc,dc=Ba.TypeError,pc=function(t){if(null==t)throw dc(\"Can't call method on \"+t);return t},hc=function(t){return fc(pc(t))},vc=function(t){return \"object\"==typeof t?null!==t:Ja(t)},gc={},mc=function(t){return Ja(t)?t:void 0},yc=function(t,e){return arguments.length<2?mc(gc[t])||mc(Ba[t]):gc[t]&&gc[t][e]||Ba[t]&&Ba[t][e]},bc=Ya({}.isPrototypeOf),xc=yc(\"navigator\",\"userAgent\")||\"\",wc=Ba.process,Ec=Ba.Deno,Sc=wc&&wc.versions||Ec&&Ec.version,kc=Sc&&Sc.v8;kc&&(Ca=(Pa=kc.split(\".\"))[0]>0&&Pa[0]<4?1:+(Pa[0]+Pa[1])),!Ca&&xc&&(!(Pa=xc.match(/Edge\\/(\\d+)/))||Pa[1]>=74)&&(Pa=xc.match(/Chrome\\/(\\d+)/))&&(Ca=+Pa[1]);var Tc=Ca,Mc=!!Object.getOwnPropertySymbols&&!Ka((function(){var t=Symbol();return !String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Tc&&Tc<41})),Ic=Mc&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,Nc=Ba.Object,Hc=Ic?function(t){return \"symbol\"==typeof t}:function(t){var e=yc(\"Symbol\");return Ja(e)&&bc(e.prototype,Nc(t))},Oc=Ba.String,jc=Ba.TypeError,Dc=function(t){if(Ja(t))return t;throw jc(function(t){try{return Oc(t)}catch(t){return \"Object\"}}(t)+\" is not a function\")},Lc=Ba.TypeError,zc=Object.defineProperty,Ac=\"__core-js_shared__\",Pc=Ba[Ac]||function(t,e){try{zc(Ba,t,{value:e,configurable:!0,writable:!0});}catch(n){Ba[t]=e;}return e}(Ac,{}),Cc=h((function(t){(t.exports=function(t,e){return Pc[t]||(Pc[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"pure\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),Vc=Ba.Object,Bc=function(t){return Vc(pc(t))},Rc=Ya({}.hasOwnProperty),Fc=Object.hasOwn||function(t,e){return Rc(Bc(t),e)},_c=0,qc=Math.random(),$c=Ya(1..toString),Wc=function(t){return \"Symbol(\"+(void 0===t?\"\":t)+\")_\"+$c(++_c+qc,36)},Gc=Cc(\"wks\"),Uc=Ba.Symbol,Xc=Uc&&Uc.for,Yc=Ic?Uc:Uc&&Uc.withoutSetter||Wc,Jc=function(t){if(!Fc(Gc,t)||!Mc&&\"string\"!=typeof Gc[t]){var e=\"Symbol.\"+t;Mc&&Fc(Uc,t)?Gc[t]=Uc[t]:Gc[t]=Ic&&Xc?Xc(e):Yc(e);}return Gc[t]},Kc=Ba.TypeError,Qc=Jc(\"toPrimitive\"),Zc=function(t,e){if(!vc(t)||Hc(t))return t;var n,r,o=null==(n=t[Qc])?void 0:Dc(n);if(o){if(void 0===e&&(e=\"default\"),r=tc(o,t,e),!vc(r)||Hc(r))return r;throw Kc(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var n,r;if(\"string\"===e&&Ja(n=t.toString)&&!vc(r=tc(n,t)))return r;if(Ja(n=t.valueOf)&&!vc(r=tc(n,t)))return r;if(\"string\"!==e&&Ja(n=t.toString)&&!vc(r=tc(n,t)))return r;throw Lc(\"Can't convert object to primitive value\")}(t,e)},tl=function(t){var e=Zc(t,\"string\");return Hc(e)?e:e+\"\"},el=Ba.document,nl=vc(el)&&vc(el.createElement),rl=function(t){return nl?el.createElement(t):{}},ol=!Qa&&!Ka((function(){return 7!=Object.defineProperty(rl(\"div\"),\"a\",{get:function(){return 7}}).a})),il=Object.getOwnPropertyDescriptor,ul={f:Qa?il:function(t,e){if(t=hc(t),e=tl(e),ol)try{return il(t,e)}catch(t){}if(Fc(t,e))return ic(!tc(oc.f,t,e),t[e])}},al=/#|\\.prototype\\./,cl=function(t,e){var n=sl[ll(t)];return n==dl||n!=fl&&(Ja(e)?Ka(e):!!e)},ll=cl.normalize=function(t){return String(t).replace(al,\".\").toLowerCase()},sl=cl.data={},fl=cl.NATIVE=\"N\",dl=cl.POLYFILL=\"P\",pl=cl,hl=Ya(Ya.bind),vl=function(t,e){return Dc(t),void 0===e?t:hl?hl(t,e):function(){return t.apply(e,arguments)}},gl=Ba.String,ml=Ba.TypeError,yl=function(t){if(vc(t))return t;throw ml(gl(t)+\" is not an object\")},bl=Ba.TypeError,xl=Object.defineProperty,wl={f:Qa?xl:function(t,e,n){if(yl(t),e=tl(e),yl(n),ol)try{return xl(t,e,n)}catch(t){}if(\"get\"in n||\"set\"in n)throw bl(\"Accessors not supported\");return \"value\"in n&&(t[e]=n.value),t}},El=Qa?function(t,e,n){return wl.f(t,e,ic(1,n))}:function(t,e,n){return t[e]=n,t},Sl=ul.f,kl=function(t){var e=function(n,r,o){if(this instanceof e){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,r)}return new t(n,r,o)}return $a(t,this,arguments)};return e.prototype=t.prototype,e},Tl=function(t,e){var n,r,o,i,u,a,c,l,s=t.target,f=t.global,d=t.stat,p=t.proto,h=f?Ba:d?Ba[s]:(Ba[s]||{}).prototype,v=f?gc:gc[s]||El(gc,s,{})[s],g=v.prototype;for(o in e)n=!pl(f?o:s+(d?\".\":\"#\")+o,t.forced)&&h&&Fc(h,o),u=v[o],n&&(a=t.noTargetGet?(l=Sl(h,o))&&l.value:h[o]),i=n&&a?a:e[o],n&&typeof u==typeof i||(c=t.bind&&n?vl(i,Ba):t.wrap&&n?kl(i):p&&Ja(i)?Ya(i):i,(t.sham||i&&i.sham||u&&u.sham)&&El(c,\"sham\",!0),El(v,o,c),p&&(Fc(gc,r=s+\"Prototype\")||El(gc,r,{}),El(gc[r],o,i),t.real&&g&&!g[o]&&El(g,o,i)));},Ml=Array.isArray||function(t){return \"Array\"==cc(t)},Il=Math.ceil,Nl=Math.floor,Hl=function(t){var e=+t;return e!=e||0===e?0:(e>0?Nl:Il)(e)},Ol=Math.min,jl=function(t){return (e=t.length)>0?Ol(Hl(e),9007199254740991):0;var e;},Dl=function(t,e,n){var r=tl(e);r in t?wl.f(t,r,ic(0,n)):t[r]=n;},Ll={};Ll[Jc(\"toStringTag\")]=\"z\";var zl=\"[object z]\"===String(Ll),Al=Jc(\"toStringTag\"),Pl=Ba.Object,Cl=\"Arguments\"==cc(function(){return arguments}()),Vl=zl?cc:function(t){var e,n,r;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Pl(t),Al))?n:Cl?cc(e):\"Object\"==(r=cc(e))&&Ja(e.callee)?\"Arguments\":r},Bl=Ya(Function.toString);Ja(Pc.inspectSource)||(Pc.inspectSource=function(t){return Bl(t)});var Rl=Pc.inspectSource,Fl=function(){},_l=[],ql=yc(\"Reflect\",\"construct\"),$l=/^\\s*(?:class|function)\\b/,Wl=Ya($l.exec),Gl=!$l.exec(Fl),Ul=function(t){if(!Ja(t))return !1;try{return ql(Fl,_l,t),!0}catch(t){return !1}},Xl=!ql||Ka((function(){var t;return Ul(Ul.call)||!Ul(Object)||!Ul((function(){t=!0;}))||t}))?function(t){if(!Ja(t))return !1;switch(Vl(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Gl||!!Wl($l,Rl(t))}:Ul,Yl=Jc(\"species\"),Jl=Ba.Array,Kl=function(t,e){return new(function(t){var e;return Ml(t)&&(e=t.constructor,(Xl(e)&&(e===Jl||Ml(e.prototype))||vc(e)&&null===(e=e[Yl]))&&(e=void 0)),void 0===e?Jl:e}(t))(0===e?0:e)},Ql=Jc(\"species\"),Zl=Jc(\"isConcatSpreadable\"),ts=9007199254740991,es=\"Maximum allowed index exceeded\",ns=Ba.TypeError,rs=Tc>=51||!Ka((function(){var t=[];return t[Zl]=!1,t.concat()[0]!==t})),os=function(t){return Tc>=51||!Ka((function(){var e=[];return (e.constructor={})[Ql]=function(){return {foo:1}},1!==e[t](Boolean).foo}))}(\"concat\"),is=function(t){if(!vc(t))return !1;var e=t[Zl];return void 0!==e?!!e:Ml(t)};Tl({target:\"Array\",proto:!0,forced:!rs||!os},{concat:function(t){var e,n,r,o,i,u=Bc(this),a=Kl(u,0),c=0;for(e=-1,r=arguments.length;e<r;e++)if(is(i=-1===e?u:arguments[e])){if(c+(o=jl(i))>ts)throw ns(es);for(n=0;n<o;n++,c++)n in i&&Dl(a,c,i[n]);}else {if(c>=ts)throw ns(es);Dl(a,c++,i);}return a.length=c,a}});var us,as=Ba.String,cs=function(t){if(\"Symbol\"===Vl(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return as(t)},ls=Math.max,ss=Math.min,fs=function(t,e){var n=Hl(t);return n<0?ls(n+e,0):ss(n,e)},ds=function(t){return function(e,n,r){var o,i=hc(e),u=jl(i),a=fs(r,u);if(t&&n!=n){for(;u>a;)if((o=i[a++])!=o)return !0}else for(;u>a;a++)if((t||a in i)&&i[a]===n)return t||a||0;return !t&&-1}},ps={includes:ds(!0),indexOf:ds(!1)},hs={},vs=ps.indexOf,gs=Ya([].push),ms=function(t,e){var n,r=hc(t),o=0,i=[];for(n in r)!Fc(hs,n)&&Fc(r,n)&&gs(i,n);for(;e.length>o;)Fc(r,n=e[o++])&&(~vs(i,n)||gs(i,n));return i},ys=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],bs=Object.keys||function(t){return ms(t,ys)},xs=Qa?Object.defineProperties:function(t,e){yl(t);for(var n,r=hc(e),o=bs(e),i=o.length,u=0;i>u;)wl.f(t,n=o[u++],r[n]);return t},ws=yc(\"document\",\"documentElement\"),Es=Cc(\"keys\"),Ss=function(t){return Es[t]||(Es[t]=Wc(t))},ks=Ss(\"IE_PROTO\"),Ts=function(){},Ms=function(t){return \"<script>\"+t+\"</\"+\"script>\"},Is=function(t){t.write(Ms(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},Ns=function(){try{us=new ActiveXObject(\"htmlfile\");}catch(t){}var t,e;Ns=\"undefined\"!=typeof document?document.domain&&us?Is(us):((e=rl(\"iframe\")).style.display=\"none\",ws.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(Ms(\"document.F=Object\")),t.close(),t.F):Is(us);for(var n=ys.length;n--;)delete Ns.prototype[ys[n]];return Ns()};hs[ks]=!0;var Hs,Os,js,Ds=Object.create||function(t,e){var n;return null!==t?(Ts.prototype=yl(t),n=new Ts,Ts.prototype=null,n[ks]=t):n=Ns(),void 0===e?n:xs(n,e)},Ls=ys.concat(\"length\",\"prototype\"),zs={f:Object.getOwnPropertyNames||function(t){return ms(t,Ls)}},As=Ba.Array,Ps=Math.max,Cs=zs.f,Vs=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Bs=function(t){try{return Cs(t)}catch(t){return function(t,e,n){for(var r=jl(t),o=fs(e,r),i=fs(void 0===n?r:n,r),u=As(Ps(i-o,0)),a=0;o<i;o++,a++)Dl(u,a,t[o]);return u.length=a,u}(Vs)}},Rs={f:function(t){return Vs&&\"Window\"==cc(t)?Bs(t):Cs(hc(t))}},Fs={f:Object.getOwnPropertySymbols},_s=Ya([].slice),qs=function(t,e,n,r){r&&r.enumerable?t[e]=n:El(t,e,n);},$s={f:Jc},Ws=wl.f,Gs=function(t){var e=gc.Symbol||(gc.Symbol={});Fc(e,t)||Ws(e,t,{value:$s.f(t)});},Us=zl?{}.toString:function(){return \"[object \"+Vl(this)+\"]\"},Xs=wl.f,Ys=Jc(\"toStringTag\"),Js=function(t,e,n,r){if(t){var o=n?t:t.prototype;Fc(o,Ys)||Xs(o,Ys,{configurable:!0,value:e}),r&&!zl&&El(o,\"toString\",Us);}},Ks=Ba.WeakMap,Qs=Ja(Ks)&&/native code/.test(Rl(Ks)),Zs=\"Object already initialized\",tf=Ba.TypeError,ef=Ba.WeakMap;if(Qs||Pc.state){var nf=Pc.state||(Pc.state=new ef),rf=Ya(nf.get),of=Ya(nf.has),uf=Ya(nf.set);Hs=function(t,e){if(of(nf,t))throw new tf(Zs);return e.facade=t,uf(nf,t,e),e},Os=function(t){return rf(nf,t)||{}},js=function(t){return of(nf,t)};}else {var af=Ss(\"state\");hs[af]=!0,Hs=function(t,e){if(Fc(t,af))throw new tf(Zs);return e.facade=t,El(t,af,e),e},Os=function(t){return Fc(t,af)?t[af]:{}},js=function(t){return Fc(t,af)};}var cf={set:Hs,get:Os,has:js,enforce:function(t){return js(t)?Os(t):Hs(t,{})},getterFor:function(t){return function(e){var n;if(!vc(e)||(n=Os(e)).type!==t)throw tf(\"Incompatible receiver, \"+t+\" required\");return n}}},lf=Ya([].push),sf=function(t){var e=1==t,n=2==t,r=3==t,o=4==t,i=6==t,u=7==t,a=5==t||i;return function(c,l,s,f){for(var d,p,h=Bc(c),v=fc(h),g=vl(l,s),m=jl(v),y=0,b=f||Kl,x=e?b(c,m):n||u?b(c,0):void 0;m>y;y++)if((a||y in v)&&(p=g(d=v[y],y,h),t))if(e)x[y]=p;else if(p)switch(t){case 3:return !0;case 5:return d;case 6:return y;case 2:lf(x,d);}else switch(t){case 4:return !1;case 7:lf(x,d);}return i?-1:r||o?o:x}},ff={forEach:sf(0),map:sf(1),filter:sf(2),some:sf(3),every:sf(4),find:sf(5),findIndex:sf(6),filterReject:sf(7)}.forEach,df=Ss(\"hidden\"),pf=\"Symbol\",hf=Jc(\"toPrimitive\"),vf=cf.set,gf=cf.getterFor(pf),mf=Object.prototype,yf=Ba.Symbol,bf=yf&&yf.prototype,xf=Ba.TypeError,wf=Ba.QObject,Ef=yc(\"JSON\",\"stringify\"),Sf=ul.f,kf=wl.f,Tf=Rs.f,Mf=oc.f,If=Ya([].push),Nf=Cc(\"symbols\"),Hf=Cc(\"op-symbols\"),Of=Cc(\"string-to-symbol-registry\"),jf=Cc(\"symbol-to-string-registry\"),Df=Cc(\"wks\"),Lf=!wf||!wf.prototype||!wf.prototype.findChild,zf=Qa&&Ka((function(){return 7!=Ds(kf({},\"a\",{get:function(){return kf(this,\"a\",{value:7}).a}})).a}))?function(t,e,n){var r=Sf(mf,e);r&&delete mf[e],kf(t,e,n),r&&t!==mf&&kf(mf,e,r);}:kf,Af=function(t,e){var n=Nf[t]=Ds(bf);return vf(n,{type:pf,tag:t,description:e}),Qa||(n.description=e),n},Pf=function(t,e,n){t===mf&&Pf(Hf,e,n),yl(t);var r=tl(e);return yl(n),Fc(Nf,r)?(n.enumerable?(Fc(t,df)&&t[df][r]&&(t[df][r]=!1),n=Ds(n,{enumerable:ic(0,!1)})):(Fc(t,df)||kf(t,df,ic(1,{})),t[df][r]=!0),zf(t,r,n)):kf(t,r,n)},Cf=function(t,e){yl(t);var n=hc(e),r=bs(n).concat(Ff(n));return ff(r,(function(e){Qa&&!tc(Vf,n,e)||Pf(t,e,n[e]);})),t},Vf=function(t){var e=tl(t),n=tc(Mf,this,e);return !(this===mf&&Fc(Nf,e)&&!Fc(Hf,e))&&(!(n||!Fc(this,e)||!Fc(Nf,e)||Fc(this,df)&&this[df][e])||n)},Bf=function(t,e){var n=hc(t),r=tl(e);if(n!==mf||!Fc(Nf,r)||Fc(Hf,r)){var o=Sf(n,r);return !o||!Fc(Nf,r)||Fc(n,df)&&n[df][r]||(o.enumerable=!0),o}},Rf=function(t){var e=Tf(hc(t)),n=[];return ff(e,(function(t){Fc(Nf,t)||Fc(hs,t)||If(n,t);})),n},Ff=function(t){var e=t===mf,n=Tf(e?Hf:hc(t)),r=[];return ff(n,(function(t){!Fc(Nf,t)||e&&!Fc(mf,t)||If(r,Nf[t]);})),r};if(Mc||(yf=function(){if(bc(bf,this))throw xf(\"Symbol is not a constructor\");var t=arguments.length&&void 0!==arguments[0]?cs(arguments[0]):void 0,e=Wc(t),n=function(t){this===mf&&tc(n,Hf,t),Fc(this,df)&&Fc(this[df],e)&&(this[df][e]=!1),zf(this,e,ic(1,t));};return Qa&&Lf&&zf(mf,e,{configurable:!0,set:n}),Af(e,t)},bf=yf.prototype,qs(bf,\"toString\",(function(){return gf(this).tag})),qs(yf,\"withoutSetter\",(function(t){return Af(Wc(t),t)})),oc.f=Vf,wl.f=Pf,ul.f=Bf,zs.f=Rs.f=Rf,Fs.f=Ff,$s.f=function(t){return Af(Jc(t),t)},Qa&&kf(bf,\"description\",{configurable:!0,get:function(){return gf(this).description}})),Tl({global:!0,wrap:!0,forced:!Mc,sham:!Mc},{Symbol:yf}),ff(bs(Df),(function(t){Gs(t);})),Tl({target:pf,stat:!0,forced:!Mc},{for:function(t){var e=cs(t);if(Fc(Of,e))return Of[e];var n=yf(e);return Of[e]=n,jf[n]=e,n},keyFor:function(t){if(!Hc(t))throw xf(t+\" is not a symbol\");if(Fc(jf,t))return jf[t]},useSetter:function(){Lf=!0;},useSimple:function(){Lf=!1;}}),Tl({target:\"Object\",stat:!0,forced:!Mc,sham:!Qa},{create:function(t,e){return void 0===e?Ds(t):Cf(Ds(t),e)},defineProperty:Pf,defineProperties:Cf,getOwnPropertyDescriptor:Bf}),Tl({target:\"Object\",stat:!0,forced:!Mc},{getOwnPropertyNames:Rf,getOwnPropertySymbols:Ff}),Tl({target:\"Object\",stat:!0,forced:Ka((function(){Fs.f(1);}))},{getOwnPropertySymbols:function(t){return Fs.f(Bc(t))}}),Ef){var _f=!Mc||Ka((function(){var t=yf();return \"[null]\"!=Ef([t])||\"{}\"!=Ef({a:t})||\"{}\"!=Ef(Object(t))}));Tl({target:\"JSON\",stat:!0,forced:_f},{stringify:function(t,e,n){var r=_s(arguments),o=e;if((vc(e)||void 0!==t)&&!Hc(t))return Ml(e)||(e=function(t,e){if(Ja(o)&&(e=tc(o,this,t,e)),!Hc(e))return e}),r[1]=e,$a(Ef,null,r)}});}if(!bf[hf]){var qf=bf.valueOf;qs(bf,hf,(function(t){return tc(qf,this)}));}Js(yf,pf),hs[df]=!0,Gs(\"asyncIterator\"),Gs(\"hasInstance\"),Gs(\"isConcatSpreadable\"),Gs(\"iterator\"),Gs(\"match\"),Gs(\"matchAll\"),Gs(\"replace\"),Gs(\"search\"),Gs(\"species\"),Gs(\"split\"),Gs(\"toPrimitive\"),Gs(\"toStringTag\"),Gs(\"unscopables\"),Js(Ba.JSON,\"JSON\",!0);var $f,Wf,Gf,Uf=gc.Symbol,Xf={},Yf=Function.prototype,Jf=Qa&&Object.getOwnPropertyDescriptor,Kf=Fc(Yf,\"name\"),Qf={EXISTS:Kf,PROPER:Kf&&\"something\"===function(){}.name,CONFIGURABLE:Kf&&(!Qa||Qa&&Jf(Yf,\"name\").configurable)},Zf=!Ka((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})),td=Ss(\"IE_PROTO\"),ed=Ba.Object,nd=ed.prototype,rd=Zf?ed.getPrototypeOf:function(t){var e=Bc(t);if(Fc(e,td))return e[td];var n=e.constructor;return Ja(n)&&e instanceof n?n.prototype:e instanceof ed?nd:null},od=Jc(\"iterator\"),id=!1;[].keys&&(\"next\"in(Gf=[].keys())?(Wf=rd(rd(Gf)))!==Object.prototype&&($f=Wf):id=!0);var ud=null==$f||Ka((function(){var t={};return $f[od].call(t)!==t}));$f=ud?{}:Ds($f),Ja($f[od])||qs($f,od,(function(){return this}));var ad={IteratorPrototype:$f,BUGGY_SAFARI_ITERATORS:id},cd=ad.IteratorPrototype,ld=function(){return this};Ba.String,Ba.TypeError;Object.setPrototypeOf||\"__proto__\"in{}&&function(){var t,e=!1,n={};try{(t=Ya(Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set))(n,[]),e=n instanceof Array;}catch(t){}}();var sd=Qf.PROPER,fd=ad.BUGGY_SAFARI_ITERATORS,dd=Jc(\"iterator\"),pd=\"keys\",hd=\"values\",vd=\"entries\",gd=function(){return this},md=function(t,e,n,r,o,i,u){!function(t,e,n,r){var o=e+\" Iterator\";t.prototype=Ds(cd,{next:ic(+!r,n)}),Js(t,o,!1,!0),Xf[o]=ld;}(n,e,r);var a,c,l,s=function(t){if(t===o&&v)return v;if(!fd&&t in p)return p[t];switch(t){case pd:case hd:case vd:return function(){return new n(this,t)}}return function(){return new n(this)}},f=e+\" Iterator\",d=!1,p=t.prototype,h=p[dd]||p[\"@@iterator\"]||o&&p[o],v=!fd&&h||s(o),g=\"Array\"==e&&p.entries||h;if(g&&(a=rd(g.call(new t)))!==Object.prototype&&a.next&&(Js(a,f,!0,!0),Xf[f]=gd),sd&&o==hd&&h&&h.name!==hd&&(d=!0,v=function(){return tc(h,this)}),o)if(c={values:s(hd),keys:i?v:s(pd),entries:s(vd)},u)for(l in c)(fd||d||!(l in p))&&qs(p,l,c[l]);else Tl({target:e,proto:!0,forced:fd||d},c);return u&&p[dd]!==v&&qs(p,dd,v,{name:o}),Xf[e]=v,c},yd=\"Array Iterator\",bd=cf.set,xd=cf.getterFor(yd);md(Array,\"Array\",(function(t,e){bd(this,{type:yd,target:hc(t),index:0,kind:e});}),(function(){var t=xd(this),e=t.target,n=t.kind,r=t.index++;return !e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),\"values\"),Xf.Arguments=Xf.Array;var wd=Jc(\"toStringTag\");for(var Ed in {CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var Sd=Ba[Ed],kd=Sd&&Sd.prototype;kd&&Vl(kd)!==wd&&El(kd,wd,Ed),Xf[Ed]=Xf.Array;}var Td=Uf;Gs(\"asyncDispose\"),Gs(\"dispose\"),Gs(\"matcher\"),Gs(\"metadata\"),Gs(\"observable\"),Gs(\"patternMatch\"),Gs(\"replaceAll\");var Md=Td,Id=Ya(\"\".charAt),Nd=Ya(\"\".charCodeAt),Hd=Ya(\"\".slice),Od=function(t){return function(e,n){var r,o,i=cs(pc(e)),u=Hl(n),a=i.length;return u<0||u>=a?t?\"\":void 0:(r=Nd(i,u))<55296||r>56319||u+1===a||(o=Nd(i,u+1))<56320||o>57343?t?Id(i,u):r:t?Hd(i,u,u+2):o-56320+(r-55296<<10)+65536}},jd={codeAt:Od(!1),charAt:Od(!0)}.charAt,Dd=\"String Iterator\",Ld=cf.set,zd=cf.getterFor(Dd);md(String,\"String\",(function(t){Ld(this,{type:Dd,string:cs(t),index:0});}),(function(){var t,e=zd(this),n=e.string,r=e.index;return r>=n.length?{value:void 0,done:!0}:(t=jd(n,r),e.index+=t.length,{value:t,done:!1})}));var Ad=$s.f(\"iterator\"),Pd=h((function(t){function e(n){return \"function\"==typeof Md&&\"symbol\"==typeof Ad?(t.exports=e=function(t){return typeof t},t.exports.default=t.exports,t.exports.__esModule=!0):(t.exports=e=function(t){return t&&\"function\"==typeof Md&&t.constructor===Md&&t!==Md.prototype?\"symbol\":typeof t},t.exports.default=t.exports,t.exports.__esModule=!0),e(n)}t.exports=e,t.exports.default=t.exports,t.exports.__esModule=!0;})),Cd=p(Pd),Vd=de.EXISTS,Bd=_t.f,Rd=Function.prototype,Fd=D(Rd.toString),_d=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,qd=D(_d.exec);x&&!Vd&&Bd(Rd,\"name\",{configurable:!0,get:function(){try{return qd(_d,Fd(this))[1]}catch(t){return \"\"}}});var $d=function(){function t(){this.tag=\"select\",this.width=80;}return t.prototype.isActive=function(t){return !1},t.prototype.getValue=function(t){var e=this.mark,n=r.Editor.marks(t);return n&&n[e]?n[e]:\"\"},t.prototype.isDisabled=function(t){return null==t.selection||(this.mark,!!xo(r.Editor.nodes(t,{match:function(n){return \"pre\"===e.DomEditor.getNodeType(n)||!!r.Editor.isVoid(t,n)},universal:!0}),1)[0])},t.prototype.exec=function(t,e){var n=this.mark;e?t.addMark(n,e):t.removeMark(n);},t}(),Wd=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"fontSize.title\"),n.iconSvg=Jo,n.mark=\"fontSize\",n}return vo(n,t),n.prototype.getOptions=function(t){var n=[],r=t.getMenuConfig(this.mark).fontSizeList,o=void 0===r?[]:r;n.push({text:e.t(\"fontSize.default\"),value:\"\"}),o.forEach((function(t){if(\"string\"==typeof t)n.push({text:t,value:t});else if(\"object\"===Cd(t)){var e=t.name,r=t.value;n.push({text:e,value:r});}}));var i=this.getValue(t);return n.forEach((function(t){t.value===i?t.selected=!0:delete t.selected;})),n},n}($d),Gd=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"fontFamily.title\"),n.iconSvg=Ko,n.mark=\"fontFamily\",n.selectPanelWidth=150,n}return vo(n,t),n.prototype.getOptions=function(t){var n=[],r=t.getMenuConfig(this.mark).fontFamilyList,o=void 0===r?[]:r;n.push({text:e.t(\"fontFamily.default\"),value:\"\"}),o.forEach((function(t){if(\"string\"==typeof t)n.push({text:t,value:t,styleForRenderMenuList:{\"font-family\":t}});else if(\"object\"===Cd(t)){var e=t.name,r=t.value;n.push({text:e,value:r,styleForRenderMenuList:{\"font-family\":r}});}}));var i=this.getValue(t);return n.forEach((function(t){t.value===i?t.selected=!0:delete t.selected;})),n},n}($d);var Ud={renderStyle:function(t,e){var n=t,r=n.fontSize,o=n.fontFamily,i=e;return r&&au(i,{fontSize:r}),o&&au(i,{fontFamily:o}),i},styleToHtml:function(t,e){if(!r.Text.isText(t))return e;var n,o=t,i=o.fontSize,u=o.fontFamily;return i||u?((lo(e)||\"span\"!==fo(n=c.default(e)))&&(n=c.default(\"<span>\"+e+\"</span>\")),i&&n.css(\"font-size\",i),u&&n.css(\"font-family\",u),so(n)):e},preParseHtml:[za],parseStyleHtml:function(t,e,n){var o=c.default(t);if(!r.Text.isText(e))return e;var i=e,u=n.getMenuConfig(\"fontSize\").fontSizeList,a=void 0===u?[]:u,l=po(o,\"font-size\"),s=a.find((function(t){return t.value&&t.value===l}))||a.includes(l);l&&s&&(i.fontSize=l);var f=n.getMenuConfig(\"fontFamily\").fontFamilyList,d=void 0===f?[]:f,p=po(o,\"font-family\").replace(/\"/g,\"\"),h=d.find((function(t){return t.value&&t.value===p}))||d.includes(p);return p&&h&&(i.fontFamily=p),i},menus:[{key:\"fontSize\",factory:function(){return new Wd},config:{fontSizeList:[\"12px\",{name:\"13px\",value:\"13px\"},\"14px\",\"15px\",\"16px\",\"19px\",{name:\"22px\",value:\"22px\"},\"24px\",\"29px\",\"32px\",\"40px\",\"48px\"]}},{key:\"fontFamily\",factory:function(){return new Gd},config:{fontFamilyList:[\"黑体\",{name:\"仿宋\",value:\"仿宋\"},\"楷体\",\"标楷体\",\"华文仿宋\",\"华文楷体\",{name:\"宋体\",value:\"宋体\"},\"微软雅黑\",\"Arial\",\"Tahoma\",\"Verdana\",\"Times New Roman\",\"Courier New\"]}}]};var Xd={selector:\"p,h1,h2,h3,h4,h5\",preParseHtml:function(t){var e=c.default(t),n=po(e,\"padding-left\");return /\\dem/.test(n)&&e.css(\"text-indent\",\"2em\"),/\\dpx/.test(n)&&parseInt(n,10)%32==0&&e.css(\"text-indent\",\"2em\"),e[0]}};var Yd=function(){function t(){this.tag=\"button\";}return t.prototype.getValue=function(t){var e=xo(r.Editor.nodes(t,{match:function(t){return !!t.indent},universal:!0}),1),n=e[0];return null==n?\"\":xo(n,1)[0].indent||\"\"},t.prototype.isActive=function(t){return !1},t.prototype.getMatchNode=function(t){var n=xo(r.Editor.nodes(t,{match:function(t){var n=e.DomEditor.getNodeType(t);return \"paragraph\"===n||!!n.startsWith(\"header\")},universal:!0,mode:\"highest\"}),1)[0];return null==n?null:n[0]},t}(),Jd=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"indent.decrease\"),n.iconSvg=Qo,n}return vo(n,t),n.prototype.isDisabled=function(t){var e=this.getMatchNode(t);return null==e||!e.indent},n.prototype.exec=function(t,e){r.Transforms.setNodes(t,{indent:null},{match:function(t){return r.Element.isElement(t)}});},n}(Yd),Kd=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"indent.increase\"),n.iconSvg=Zo,n}return vo(n,t),n.prototype.isDisabled=function(t){var e=this.getMatchNode(t);return null==e||!!e.indent},n.prototype.exec=function(t,e){r.Transforms.setNodes(t,{indent:\"2em\"},{match:function(t){return r.Element.isElement(t)},mode:\"highest\"});},n}(Yd),Qd={renderStyle:function(t,e){if(!r.Element.isElement(t))return e;var n=t.indent,o=e;return n&&au(o,{textIndent:n}),o},styleToHtml:function(t,e){if(!r.Element.isElement(t))return e;var n=t.indent;if(!n)return e;var o=c.default(e);return o.css(\"text-indent\",n),so(o)},preParseHtml:[Xd],parseStyleHtml:function(t,e,n){var o=c.default(t);if(!r.Element.isElement(e))return e;var i=e,u=po(o,\"text-indent\"),a=parseInt(u,10);return u&&a>0&&(i.indent=u),i},menus:[{key:\"indent\",factory:function(){return new Kd}},{key:\"delIndent\",factory:function(){return new Jd}}]};var Zd=function(){function t(){this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.getMatchNode=function(t){var n=xo(r.Editor.nodes(t,{match:function(t){var n=e.DomEditor.getNodeType(t);return \"paragraph\"===n||(\"blockquote\"===n||!!n.startsWith(\"header\"))},universal:!0,mode:\"highest\"}),1)[0];return null==n?null:n[0]},t.prototype.isDisabled=function(t){return null==t.selection||!!e.DomEditor.getSelectedElems(t).some((function(e){if(r.Editor.isVoid(t,e)&&r.Editor.isBlock(t,e))return !0;var n=e.type;return !![\"pre\",\"code\"].includes(n)||void 0}))},t}(),tp=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"justify.left\"),n.iconSvg=ti,n}return vo(n,t),n.prototype.exec=function(t,e){r.Transforms.setNodes(t,{textAlign:\"left\"},{match:function(e){return r.Element.isElement(e)&&!t.isInline(e)}});},n}(Zd),ep=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"justify.right\"),n.iconSvg=ei,n}return vo(n,t),n.prototype.exec=function(t,e){r.Transforms.setNodes(t,{textAlign:\"right\"},{match:function(e){return r.Element.isElement(e)&&!t.isInline(e)}});},n}(Zd),np=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"justify.center\"),n.iconSvg=ni,n}return vo(n,t),n.prototype.exec=function(t,e){r.Transforms.setNodes(t,{textAlign:\"center\"},{match:function(e){return r.Element.isElement(e)&&!t.isInline(e)}});},n}(Zd),rp=function(t){function n(){var n=null!==t&&t.apply(this,arguments)||this;return n.title=e.t(\"justify.justify\"),n.iconSvg=ri,n}return vo(n,t),n.prototype.exec=function(t,e){r.Transforms.setNodes(t,{textAlign:\"justify\"},{match:function(e){return r.Element.isElement(e)&&!t.isInline(e)}});},n}(Zd),op={renderStyle:function(t,e){if(!r.Element.isElement(t))return e;var n=t.textAlign,o=e;return n&&au(o,{textAlign:n}),o},styleToHtml:function(t,e){if(!r.Element.isElement(t))return e;var n=t.textAlign;if(!n)return e;var o=c.default(e);return o.css(\"text-align\",n),so(o)},parseStyleHtml:function(t,e,n){var o=c.default(t);if(!r.Element.isElement(e))return e;var i=e,u=po(o,\"text-align\");return u&&(i.textAlign=u),i},menus:[{key:\"justifyLeft\",factory:function(){return new tp}},{key:\"justifyRight\",factory:function(){return new ep}},{key:\"justifyCenter\",factory:function(){return new np}},{key:\"justifyJustify\",factory:function(){return new rp}}]};var ip=function(){function t(){this.title=e.t(\"lineHeight.title\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M964 788a8 8 0 0 1 8 8v98a8 8 0 0 1-8 8H438a8 8 0 0 1-8-8v-98a8 8 0 0 1 8-8h526zM198.93 144.306c6.668-5.798 16.774-5.094 22.573 1.574l122.26 140.582a16 16 0 0 1 3.927 10.5c0 8.836-7.164 16-16 16h-61.8a8 8 0 0 0-8 8v390.077h69.819a16 16 0 0 1 10.502 3.928c6.666 5.8 7.37 15.906 1.57 22.573L221.476 878.123a16 16 0 0 1-1.57 1.57c-6.668 5.8-16.774 5.097-22.574-1.57L75.051 737.538a16 16 0 0 1-3.928-10.5c0-8.837 7.163-16 16-16h69.822V312.96H87.127a16 16 0 0 1-10.502-3.928c-6.666-5.8-7.37-15.906-1.57-22.573l122.303-140.582a16 16 0 0 1 1.572-1.572zM964 465a8 8 0 0 1 8 8v98a8 8 0 0 1-8 8H438a8 8 0 0 1-8-8v-98a8 8 0 0 1 8-8h526z m0-323a8 8 0 0 1 8 8v98a8 8 0 0 1-8 8H438a8 8 0 0 1-8-8v-98a8 8 0 0 1 8-8h526z\"></path></svg>',this.tag=\"select\",this.width=80;}return t.prototype.getOptions=function(t){var n=[],r=t.getMenuConfig(\"lineHeight\").lineHeightList,o=void 0===r?[]:r;n.push({text:e.t(\"lineHeight.default\"),value:\"\"}),o.forEach((function(t){n.push({text:t,value:t});}));var i=this.getValue(t);return n.forEach((function(t){t.value===i?t.selected=!0:delete t.selected;})),n},t.prototype.getMatchNode=function(t){var n=xo(r.Editor.nodes(t,{match:function(t){var n=e.DomEditor.getNodeType(t);return !!n.startsWith(\"header\")||!![\"paragraph\",\"blockquote\",\"list-item\"].includes(n)},universal:!0,mode:\"highest\"}),1)[0];return null==n?null:n[0]},t.prototype.isActive=function(t){return !1},t.prototype.getValue=function(t){var e=this.getMatchNode(t);return null==e?\"\":r.Element.isElement(e)&&e.lineHeight||\"\"},t.prototype.isDisabled=function(t){return null==t.selection||null==this.getMatchNode(t)},t.prototype.exec=function(t,e){r.Transforms.setNodes(t,{lineHeight:e.toString()},{mode:\"highest\"});},t}();var up={renderStyle:function(t,e){if(!r.Element.isElement(t))return e;var n=t.lineHeight,o=e;return n&&au(o,{lineHeight:n}),o},styleToHtml:function(t,e){if(!r.Element.isElement(t))return e;var n=t.lineHeight;if(!n)return e;var o=c.default(e);return o.css(\"line-height\",n),so(o)},parseStyleHtml:function(t,e,n){var o=c.default(t);if(!r.Element.isElement(e))return e;var i=e,u=n.getMenuConfig(\"lineHeight\").lineHeightList,a=void 0===u?[]:u,l=po(o,\"line-height\");return l&&a.includes(l)&&(i.lineHeight=l),i},menus:[{key:\"lineHeight\",factory:function(){return new ip},config:{lineHeightList:[\"1\",\"1.15\",\"1.5\",\"2\",\"2.5\",\"3\"]}}]},ap=function(){function t(){this.title=e.t(\"undo.redo\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M0.00032 576a510.72 510.72 0 0 0 173.344 384l84.672-96A383.136 383.136 0 0 1 128.00032 576C128.00032 363.936 299.93632 192 512.00032 192c106.048 0 202.048 42.976 271.52 112.48L640.00032 448h384V64l-149.984 149.984A510.272 510.272 0 0 0 512.00032 64C229.21632 64 0.00032 293.216 0.00032 576z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection},t.prototype.exec=function(t,e){\"function\"==typeof t.redo&&t.redo();},t}(),cp=function(){function t(){this.title=e.t(\"undo.undo\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M512 64A510.272 510.272 0 0 0 149.984 213.984L0.032 64v384h384L240.512 304.48A382.784 382.784 0 0 1 512.032 192c212.064 0 384 171.936 384 384 0 114.688-50.304 217.632-130.016 288l84.672 96a510.72 510.72 0 0 0 173.344-384c0-282.784-229.216-512-512-512z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection},t.prototype.exec=function(t,e){\"function\"==typeof t.undo&&t.undo();},t}(),lp={menus:[{key:\"redo\",factory:function(){return new ap}},{key:\"undo\",factory:function(){return new cp}}]};var sp={type:\"divider\",renderElem:function(t,r,o){var i=e.DomEditor.isNodeSelected(o,t);return n.h(\"div\",{props:{contentEditable:!1,className:\"w-e-textarea-divider\"},dataset:{selected:i?\"true\":\"\"},style:{},on:{mousedown:function(t){return t.preventDefault()}}},[n.h(\"hr\")])}};var fp={type:\"divider\",elemToHtml:function(t,e){return \"<hr/>\"}};var dp={selector:\"hr:not([data-w-e-type])\",parseElemHtml:function(t,e,n){return {type:\"divider\",children:[{text:\"\"}]}}},pp=function(){function t(){this.title=e.t(\"divider.title\"),this.iconSvg='<svg viewBox=\"0 0 1092 1024\"><path d=\"M0 51.2m51.2 0l989.866667 0q51.2 0 51.2 51.2l0 0q0 51.2-51.2 51.2l-989.866667 0q-51.2 0-51.2-51.2l0 0q0-51.2 51.2-51.2Z\"></path><path d=\"M0 460.8m51.2 0l170.666667 0q51.2 0 51.2 51.2l0 0q0 51.2-51.2 51.2l-170.666667 0q-51.2 0-51.2-51.2l0 0q0-51.2 51.2-51.2Z\"></path><path d=\"M819.2 460.8m51.2 0l170.666667 0q51.2 0 51.2 51.2l0 0q0 51.2-51.2 51.2l-170.666667 0q-51.2 0-51.2-51.2l0 0q0-51.2 51.2-51.2Z\"></path><path d=\"M409.6 460.8m51.2 0l170.666667 0q51.2 0 51.2 51.2l0 0q0 51.2-51.2 51.2l-170.666667 0q-51.2 0-51.2-51.2l0 0q0-51.2 51.2-51.2Z\"></path><path d=\"M0 870.4m51.2 0l989.866667 0q51.2 0 51.2 51.2l0 0q0 51.2-51.2 51.2l-989.866667 0q-51.2 0-51.2-51.2l0 0q0-51.2 51.2-51.2Z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){return null==t.selection||!!e.DomEditor.getSelectedElems(t).some((function(n){if(t.isVoid(n))return !0;var r=e.DomEditor.getNodeType(n);return \"table\"===r||(\"pre\"===r||void 0)}))},t.prototype.exec=function(t,e){r.Transforms.insertNodes(t,{type:\"divider\",children:[{text:\"\"}]},{mode:\"highest\"});},t}(),hp={renderElems:[sp],elemsToHtml:[fp],parseElemsHtml:[dp],menus:[{key:\"divider\",factory:function(){return new pp}}],editorPlugin:function(t){var n=t.isVoid,o=t.normalizeNode,i=t;return i.isVoid=function(t){return \"divider\"===t.type||n(t)},i.normalizeNode=function(t){var n=xo(t,2),u=n[0],a=n[1];if(\"divider\"!==e.DomEditor.getNodeType(u))return o([u,a]);e.DomEditor.isLastNode(i,u)&&r.Transforms.insertNodes(i,e.DomEditor.genEmptyParagraph(),{at:[a[0]+1]});},i}},vp=dn.map;qe({target:\"Array\",proto:!0,forced:!hn(\"map\")},{map:function(t){return vp(this,t,arguments.length>1?arguments[1]:void 0)}});var gp=D([].join),mp=V!=Object,yp=Lo(\"join\",\",\");qe({target:\"Array\",proto:!0,forced:mp||!yp},{join:function(t){return gp(F(this),void 0===t?\",\":t)}});var bp=function(){function t(){this.title=e.t(\"codeBlock.title\"),this.iconSvg='<svg viewBox=\"0 0 1280 1024\"><path d=\"M832 736l96 96 320-320L928 192l-96 96 224 224zM448 288l-96-96L32 512l320 320 96-96-224-224zM701.312 150.528l69.472 18.944-192 704.032-69.472-18.944 192-704.032z\"></path></svg>',this.tag=\"button\";}return t.prototype.getSelectCodeElem=function(t){var n=e.DomEditor.getSelectedNodeByType(t,\"code\");if(null==n)return null;var r=e.DomEditor.getParentNode(t,n);return null==r||\"pre\"!==e.DomEditor.getNodeType(r)?null:n},t.prototype.getValue=function(t){var e=this.getSelectCodeElem(t);return null==e?\"\":e.language||\"\"},t.prototype.isActive=function(t){return !!this.getSelectCodeElem(t)},t.prototype.isDisabled=function(t){if(null==t.selection)return !0;var n=e.DomEditor.getSelectedElems(t);return !!n.some((function(e){return t.isVoid(e)}))||!n.some((function(t){var n=e.DomEditor.getNodeType(t);if(\"pre\"===n||\"paragraph\"===n)return !0}))},t.prototype.exec=function(t,e){this.isActive(t)?this.changeToPlainText(t):this.changeToCodeBlock(t,e.toString());},t.prototype.changeToPlainText=function(t){var e=this.getSelectCodeElem(t);if(null!=e){var n=r.Node.string(e);r.Transforms.removeNodes(t,{mode:\"highest\"});var o=n.split(\"\\n\").map((function(t){return {type:\"paragraph\",children:[{text:t}]}}));r.Transforms.insertNodes(t,o,{mode:\"highest\"});}},t.prototype.changeToCodeBlock=function(t,e){var n,o,i=[],u=r.Editor.nodes(t,{match:function(e){return t.children.includes(e)},universal:!0});try{for(var a=bo(u),c=a.next();!c.done;c=a.next()){var l=xo(c.value,1)[0];l&&i.push(r.Node.string(l));}}catch(t){n={error:t};}finally{try{c&&!c.done&&(o=a.return)&&o.call(a);}finally{if(n)throw n.error}}r.Transforms.removeNodes(t,{mode:\"highest\"});var s={type:\"pre\",children:[{type:\"code\",language:e,children:[{text:i.join(\"\\n\")}]}]};r.Transforms.insertNodes(t,s,{mode:\"highest\"});},t}(),xp={key:\"codeBlock\",factory:function(){return new bp}};qe({target:\"String\",proto:!0,forced:Mo(\"anchor\")},{anchor:function(t){return To(this,\"a\",\"name\",t)}}),ir(\"match\",(function(t,e,n){return [function(e){var n=R(this),r=null==e?void 0:at(e,t);return r?E(r,e,n):new RegExp(e)[t](bn(n))},function(t){var r=Bt(this),o=bn(t),i=n(e,r,o);if(i.done)return i.value;if(!r.global)return xr(r,o);var u=r.unicode;r.lastIndex=0;for(var a,c=[],l=0;null!==(a=xr(r,o));){var s=bn(a[0]);c[l]=s,\"\"===s&&(r.lastIndex=fr(o,we(r.lastIndex),u)),l++;}return 0===l?null:c}]}));var wp={menus:[xp],editorPlugin:function(t){var n=t.insertBreak,o=t.normalizeNode,i=t.insertData;t.insertNode;var u=t;return u.insertBreak=function(){var t=e.DomEditor.getSelectedNodeByType(u,\"code\");if(null!=t){var o=function(t,e){var n=e.selection;if(null==n)return \"\";var o=r.Node.string(t),i=n.anchor.offset,u=o.slice(0,i).split(\"\\n\"),a=u.length;return 0===a?\"\":u[a-1]}(t,u);if(o){var i=o.match(/^\\s+/);if(null!=i&&null!=i[0]){var a=i[0];return void u.insertText(\"\\n\"+a)}}u.insertText(\"\\n\");}else n();},u.normalizeNode=function(t){var n=xo(t,2),i=n[0],a=n[1],c=e.DomEditor.getNodeType(i);(\"code\"===c&&a.length<=1&&r.Transforms.setNodes(u,{type:\"paragraph\"},{at:a}),\"pre\"===c)&&(e.DomEditor.isLastNode(u,i)&&r.Transforms.insertNodes(u,e.DomEditor.genEmptyParagraph(),{at:[a[0]+1]}),\"code\"!==e.DomEditor.getNodeType(i.children[0])&&(r.Transforms.unwrapNodes(u),r.Transforms.setNodes(u,{type:\"paragraph\"},{mode:\"highest\"})));return o([i,a])},u.insertData=function(t){if(null!=e.DomEditor.getSelectedNodeByType(u,\"code\")){var n=t.getData(\"text/plain\");r.Editor.insertText(u,n);}else i(t);},u},renderElems:[{type:\"pre\",renderElem:function(t,e,r){return n.jsx(\"pre\",null,e)}},{type:\"code\",renderElem:function(t,e,r){return n.jsx(\"code\",null,e)}}],elemsToHtml:[{type:\"code\",elemToHtml:function(t,e){return \"<code>\"+e+\"</code>\"}},{type:\"pre\",elemToHtml:function(t,e){return \"<pre>\"+e+\"</pre>\"}}],preParseHtml:[{selector:\"pre>code\",preParseHtml:function(t){var e=c.default(t);if(\"code\"!==fo(e))return t;var n=e.find(\"xmp\");if(0===n.length)return t;var r=n.text();return n.remove(),e.text(r),e[0]}}],parseElemsHtml:[{selector:\"pre:not([data-w-e-type])>code\",parseElemHtml:function(t,e,n){return {type:\"code\",language:\"\",children:[{text:c.default(t)[0].textContent||\"\"}]}}},{selector:\"pre:not([data-w-e-type])\",parseElemHtml:function(t,n,r){var o=c.default(t);return 0===(n=n.filter((function(t){return \"code\"===e.DomEditor.getNodeType(t)}))).length&&(n=[{type:\"code\",language:\"\",children:[{text:o[0].textContent||\"\"}]}]),{type:\"pre\",children:n.filter((function(t){return \"code\"===e.DomEditor.getNodeType(t)}))}}}]},Ep=function(){function t(){this.title=e.t(\"fullScreen.title\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M133.705143 335.433143V133.851429h201.581714a29.622857 29.622857 0 0 0 29.622857-29.549715V68.754286a29.622857 29.622857 0 0 0-29.622857-29.622857H61.732571A22.893714 22.893714 0 0 0 38.765714 62.025143V335.725714c0 16.310857 13.238857 29.622857 29.622857 29.622857h35.547429a29.842286 29.842286 0 0 0 29.696-29.842285zM690.980571 133.851429h201.581715v201.654857c0 16.310857 13.238857 29.549714 29.622857 29.549714h35.547428a29.622857 29.622857 0 0 0 29.549715-29.549714V61.952a22.893714 22.893714 0 0 0-22.820572-22.893714h-273.554285a29.622857 29.622857 0 0 0-29.549715 29.622857v35.547428c0 16.310857 13.238857 29.696 29.622857 29.696zM335.286857 892.781714H133.705143V691.2a29.622857 29.622857 0 0 0-29.622857-29.622857H68.534857a29.622857 29.622857 0 0 0-29.549714 29.622857v273.554286c0 12.653714 10.24 22.893714 22.820571 22.893714h273.554286a29.622857 29.622857 0 0 0 29.696-29.622857v-35.547429a29.769143 29.769143 0 0 0-29.769143-29.696z m557.348572-201.581714v201.581714H690.907429a29.622857 29.622857 0 0 0-29.622858 29.622857v35.547429c0 16.310857 13.238857 29.622857 29.622858 29.622857h273.554285c12.580571 0 22.893714-10.313143 22.893715-22.893714V691.2a29.622857 29.622857 0 0 0-29.622858-29.622857h-35.547428a29.622857 29.622857 0 0 0-29.696 29.622857z\"></path></svg>',this.tag=\"button\",this.alwaysEnable=!0;}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return t.isFullScreen},t.prototype.isDisabled=function(t){return !1},t.prototype.exec=function(t,e){t.isFullScreen?t.unFullScreen():t.fullScreen();},t}(),Sp={menus:[{key:\"fullScreen\",factory:function(){return new Ep}}]},kp=function(){function t(){this.title=e.t(\"common.enter\"),this.iconSvg='<svg viewBox=\"0 0 1255 1024\"><path d=\"M1095.111111 731.477333h-625.777778V1024L0 658.318222 469.333333 292.408889v292.636444h625.777778V0h156.444445v731.477333z\"></path></svg>',this.tag=\"button\";}return t.prototype.getValue=function(t){return \"\"},t.prototype.isActive=function(t){return !1},t.prototype.isDisabled=function(t){var e=t.selection;return null==e||!!r.Range.isExpanded(e)},t.prototype.exec=function(t,e){var n=t.selection;if(null!=n){var o=[n.anchor.path[0]];r.Transforms.insertNodes(t,{type:\"paragraph\",children:[{text:\"\"}]},{at:o}),t.select(r.Editor.start(t,o));}},t}(),Tp=[hi,pu,Ud,Qd,op,up,ga,hp,Da,Pu,wp,Oa,nu,Eo,ba,lp,Sp,{menus:[{key:\"enter\",factory:function(){return new kp}}]}];t.default=Tp,t.insertImageNode=na,t.isInsertImageMenuDisabled=oa,t.updateImageNode=ra,Object.defineProperty(t,\"__esModule\",{value:!0});}));\n\n  });\n\n  var basicModules = /*@__PURE__*/getDefaultExportFromCjs(dist$5);\n\n  var dist$4 = createCommonjsModule$1(function (module, exports) {\n  !function(t,e){module.exports=e(dist$6,require$$2$1,require$$2,require$$1);}(commonjsGlobal,(function(t,e,r,n){function o(t){return t&&\"object\"==typeof t&&\"default\"in t?t:{default:t}}var i=o(n);t.i18nAddResources(\"en\",{listModule:{unOrderedList:\"Unordered list\",orderedList:\"Ordered list\"}}),t.i18nAddResources(\"zh-CN\",{listModule:{unOrderedList:\"无序列表\",orderedList:\"有序列表\"}});var u=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function a(t){var e={exports:{}};return t(e,e.exports),e.exports}var c,f,l=function(t){return t&&t.Math==Math&&t},s=l(\"object\"==typeof globalThis&&globalThis)||l(\"object\"==typeof window&&window)||l(\"object\"==typeof self&&self)||l(\"object\"==typeof u&&u)||function(){return this}()||Function(\"return this\")(),d=Function.prototype,v=d.bind,p=d.call,y=v&&v.bind(p),h=v?function(t){return t&&y(p,t)}:function(t){return t&&function(){return p.apply(t,arguments)}},g=function(t){try{return !!t()}catch(t){return !0}},b=h({}.toString),m=h(\"\".slice),w=function(t){return m(b(t),8,-1)},x=s.Object,S=h(\"\".split),O=g((function(){return !x(\"z\").propertyIsEnumerable(0)}))?function(t){return \"String\"==w(t)?S(t,\"\"):x(t)}:x,E=s.TypeError,T=function(t){if(null==t)throw E(\"Can't call method on \"+t);return t},j=function(t){return O(T(t))},A=Object.defineProperty,I=function(t,e){try{A(s,t,{value:e,configurable:!0,writable:!0});}catch(r){s[t]=e;}return e},P=\"__core-js_shared__\",R=s[P]||I(P,{}),L=a((function(t){(t.exports=function(t,e){return R[t]||(R[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),k=s.Object,M=function(t){return k(T(t))},N=h({}.hasOwnProperty),_=Object.hasOwn||function(t,e){return N(M(t),e)},z=0,D=Math.random(),C=h(1..toString),F=function(t){return \"Symbol(\"+(void 0===t?\"\":t)+\")_\"+C(++z+D,36)},H=function(t){return \"function\"==typeof t},B=function(t){return H(t)?t:void 0},G=function(t,e){return arguments.length<2?B(s[t]):s[t]&&s[t][e]},$=G(\"navigator\",\"userAgent\")||\"\",V=s.process,W=s.Deno,U=V&&V.versions||W&&W.version,q=U&&U.v8;q&&(f=(c=q.split(\".\"))[0]>0&&c[0]<4?1:+(c[0]+c[1])),!f&&$&&(!(c=$.match(/Edge\\/(\\d+)/))||c[1]>=74)&&(c=$.match(/Chrome\\/(\\d+)/))&&(f=+c[1]);var K,Y=f,X=!!Object.getOwnPropertySymbols&&!g((function(){var t=Symbol();return !String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Y&&Y<41})),J=X&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,Q=L(\"wks\"),Z=s.Symbol,tt=Z&&Z.for,et=J?Z:Z&&Z.withoutSetter||F,rt=function(t){if(!_(Q,t)||!X&&\"string\"!=typeof Q[t]){var e=\"Symbol.\"+t;X&&_(Z,t)?Q[t]=Z[t]:Q[t]=J&&tt?tt(e):et(e);}return Q[t]},nt=function(t){return \"object\"==typeof t?null!==t:H(t)},ot=s.String,it=s.TypeError,ut=function(t){if(nt(t))return t;throw it(ot(t)+\" is not an object\")},at=!g((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),ct=s.document,ft=nt(ct)&&nt(ct.createElement),lt=function(t){return ft?ct.createElement(t):{}},st=!at&&!g((function(){return 7!=Object.defineProperty(lt(\"div\"),\"a\",{get:function(){return 7}}).a})),dt=Function.prototype.call,vt=dt.bind?dt.bind(dt):function(){return dt.apply(dt,arguments)},pt=h({}.isPrototypeOf),yt=s.Object,ht=J?function(t){return \"symbol\"==typeof t}:function(t){var e=G(\"Symbol\");return H(e)&&pt(e.prototype,yt(t))},gt=s.String,bt=function(t){try{return gt(t)}catch(t){return \"Object\"}},mt=s.TypeError,wt=function(t){if(H(t))return t;throw mt(bt(t)+\" is not a function\")},xt=function(t,e){var r=t[e];return null==r?void 0:wt(r)},St=s.TypeError,Ot=s.TypeError,Et=rt(\"toPrimitive\"),Tt=function(t,e){if(!nt(t)||ht(t))return t;var r,n=xt(t,Et);if(n){if(void 0===e&&(e=\"default\"),r=vt(n,t,e),!nt(r)||ht(r))return r;throw Ot(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var r,n;if(\"string\"===e&&H(r=t.toString)&&!nt(n=vt(r,t)))return n;if(H(r=t.valueOf)&&!nt(n=vt(r,t)))return n;if(\"string\"!==e&&H(r=t.toString)&&!nt(n=vt(r,t)))return n;throw St(\"Can't convert object to primitive value\")}(t,e)},jt=function(t){var e=Tt(t,\"string\");return ht(e)?e:e+\"\"},At=s.TypeError,It=Object.defineProperty,Pt={f:at?It:function(t,e,r){if(ut(t),e=jt(e),ut(r),st)try{return It(t,e,r)}catch(t){}if(\"get\"in r||\"set\"in r)throw At(\"Accessors not supported\");return \"value\"in r&&(t[e]=r.value),t}},Rt=Math.ceil,Lt=Math.floor,kt=function(t){var e=+t;return e!=e||0===e?0:(e>0?Lt:Rt)(e)},Mt=Math.max,Nt=Math.min,_t=function(t,e){var r=kt(t);return r<0?Mt(r+e,0):Nt(r,e)},zt=Math.min,Dt=function(t){return t>0?zt(kt(t),9007199254740991):0},Ct=function(t){return Dt(t.length)},Ft=function(t){return function(e,r,n){var o,i=j(e),u=Ct(i),a=_t(n,u);if(t&&r!=r){for(;u>a;)if((o=i[a++])!=o)return !0}else for(;u>a;a++)if((t||a in i)&&i[a]===r)return t||a||0;return !t&&-1}},Ht={includes:Ft(!0),indexOf:Ft(!1)},Bt={},Gt=Ht.indexOf,$t=h([].push),Vt=function(t,e){var r,n=j(t),o=0,i=[];for(r in n)!_(Bt,r)&&_(n,r)&&$t(i,r);for(;e.length>o;)_(n,r=e[o++])&&(~Gt(i,r)||$t(i,r));return i},Wt=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],Ut=Object.keys||function(t){return Vt(t,Wt)},qt=at?Object.defineProperties:function(t,e){ut(t);for(var r,n=j(e),o=Ut(e),i=o.length,u=0;i>u;)Pt.f(t,r=o[u++],n[r]);return t},Kt=G(\"document\",\"documentElement\"),Yt=L(\"keys\"),Xt=function(t){return Yt[t]||(Yt[t]=F(t))},Jt=Xt(\"IE_PROTO\"),Qt=function(){},Zt=function(t){return \"<script>\"+t+\"</\"+\"script>\"},te=function(t){t.write(Zt(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},ee=function(){try{K=new ActiveXObject(\"htmlfile\");}catch(t){}var t,e;ee=\"undefined\"!=typeof document?document.domain&&K?te(K):((e=lt(\"iframe\")).style.display=\"none\",Kt.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(Zt(\"document.F=Object\")),t.close(),t.F):te(K);for(var r=Wt.length;r--;)delete ee.prototype[Wt[r]];return ee()};Bt[Jt]=!0;var re=Object.create||function(t,e){var r;return null!==t?(Qt.prototype=ut(t),r=new Qt,Qt.prototype=null,r[Jt]=t):r=ee(),void 0===e?r:qt(r,e)},ne=rt(\"unscopables\"),oe=Array.prototype;null==oe[ne]&&Pt.f(oe,ne,{configurable:!0,value:re(null)});var ie=function(t){oe[ne][t]=!0;},ue={},ae=h(Function.toString);H(R.inspectSource)||(R.inspectSource=function(t){return ae(t)});var ce,fe,le,se=R.inspectSource,de=s.WeakMap,ve=H(de)&&/native code/.test(se(de)),pe=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},ye=at?function(t,e,r){return Pt.f(t,e,pe(1,r))}:function(t,e,r){return t[e]=r,t},he=\"Object already initialized\",ge=s.TypeError,be=s.WeakMap;if(ve||R.state){var me=R.state||(R.state=new be),we=h(me.get),xe=h(me.has),Se=h(me.set);ce=function(t,e){if(xe(me,t))throw new ge(he);return e.facade=t,Se(me,t,e),e},fe=function(t){return we(me,t)||{}},le=function(t){return xe(me,t)};}else {var Oe=Xt(\"state\");Bt[Oe]=!0,ce=function(t,e){if(_(t,Oe))throw new ge(he);return e.facade=t,ye(t,Oe,e),e},fe=function(t){return _(t,Oe)?t[Oe]:{}},le=function(t){return _(t,Oe)};}var Ee,Te,je,Ae={set:ce,get:fe,has:le,enforce:function(t){return le(t)?fe(t):ce(t,{})},getterFor:function(t){return function(e){var r;if(!nt(e)||(r=fe(e)).type!==t)throw ge(\"Incompatible receiver, \"+t+\" required\");return r}}},Ie={}.propertyIsEnumerable,Pe=Object.getOwnPropertyDescriptor,Re={f:Pe&&!Ie.call({1:2},1)?function(t){var e=Pe(this,t);return !!e&&e.enumerable}:Ie},Le=Object.getOwnPropertyDescriptor,ke={f:at?Le:function(t,e){if(t=j(t),e=jt(e),st)try{return Le(t,e)}catch(t){}if(_(t,e))return pe(!vt(Re.f,t,e),t[e])}},Me=Function.prototype,Ne=at&&Object.getOwnPropertyDescriptor,_e=_(Me,\"name\"),ze={EXISTS:_e,PROPER:_e&&\"something\"===function(){}.name,CONFIGURABLE:_e&&(!at||at&&Ne(Me,\"name\").configurable)},De=a((function(t){var e=ze.CONFIGURABLE,r=Ae.get,n=Ae.enforce,o=String(String).split(\"String\");(t.exports=function(t,r,i,u){var a,c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,l=!!u&&!!u.noTargetGet,d=u&&void 0!==u.name?u.name:r;H(i)&&(\"Symbol(\"===String(d).slice(0,7)&&(d=\"[\"+String(d).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!_(i,\"name\")||e&&i.name!==d)&&ye(i,\"name\",d),(a=n(i)).source||(a.source=o.join(\"string\"==typeof d?d:\"\"))),t!==s?(c?!l&&t[r]&&(f=!0):delete t[r],f?t[r]=i:ye(t,r,i)):f?t[r]=i:I(r,i);})(Function.prototype,\"toString\",(function(){return H(this)&&r(this).source||se(this)}));})),Ce=Wt.concat(\"length\",\"prototype\"),Fe={f:Object.getOwnPropertyNames||function(t){return Vt(t,Ce)}},He={f:Object.getOwnPropertySymbols},Be=h([].concat),Ge=G(\"Reflect\",\"ownKeys\")||function(t){var e=Fe.f(ut(t)),r=He.f;return r?Be(e,r(t)):e},$e=function(t,e){for(var r=Ge(e),n=Pt.f,o=ke.f,i=0;i<r.length;i++){var u=r[i];_(t,u)||n(t,u,o(e,u));}},Ve=/#|\\.prototype\\./,We=function(t,e){var r=qe[Ue(t)];return r==Ye||r!=Ke&&(H(e)?g(e):!!e)},Ue=We.normalize=function(t){return String(t).replace(Ve,\".\").toLowerCase()},qe=We.data={},Ke=We.NATIVE=\"N\",Ye=We.POLYFILL=\"P\",Xe=We,Je=ke.f,Qe=function(t,e){var r,n,o,i,u,a=t.target,c=t.global,f=t.stat;if(r=c?s:f?s[a]||I(a,{}):(s[a]||{}).prototype)for(n in e){if(i=e[n],o=t.noTargetGet?(u=Je(r,n))&&u.value:r[n],!Xe(c?n:a+(f?\".\":\"#\")+n,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;$e(i,o);}(t.sham||o&&o.sham)&&ye(i,\"sham\",!0),De(r,n,i,t);}},Ze=!g((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})),tr=Xt(\"IE_PROTO\"),er=s.Object,rr=er.prototype,nr=Ze?er.getPrototypeOf:function(t){var e=M(t);if(_(e,tr))return e[tr];var r=e.constructor;return H(r)&&e instanceof r?r.prototype:e instanceof er?rr:null},or=rt(\"iterator\"),ir=!1;[].keys&&(\"next\"in(je=[].keys())?(Te=nr(nr(je)))!==Object.prototype&&(Ee=Te):ir=!0);var ur=null==Ee||g((function(){var t={};return Ee[or].call(t)!==t}));ur&&(Ee={}),H(Ee[or])||De(Ee,or,(function(){return this}));var ar={IteratorPrototype:Ee,BUGGY_SAFARI_ITERATORS:ir},cr=Pt.f,fr=rt(\"toStringTag\"),lr=function(t,e,r){t&&!_(t=r?t:t.prototype,fr)&&cr(t,fr,{configurable:!0,value:e});},sr=ar.IteratorPrototype,dr=function(){return this},vr=s.String,pr=s.TypeError,yr=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,r={};try{(t=h(Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set))(r,[]),e=r instanceof Array;}catch(t){}return function(r,n){return ut(r),function(t){if(\"object\"==typeof t||H(t))return t;throw pr(\"Can't set \"+vr(t)+\" as a prototype\")}(n),e?t(r,n):r.__proto__=n,r}}():void 0),hr=ze.PROPER,gr=ze.CONFIGURABLE,br=ar.IteratorPrototype,mr=ar.BUGGY_SAFARI_ITERATORS,wr=rt(\"iterator\"),xr=\"keys\",Sr=\"values\",Or=\"entries\",Er=function(){return this},Tr=function(t,e,r,n,o,i,u){!function(t,e,r,n){var o=e+\" Iterator\";t.prototype=re(sr,{next:pe(+!n,r)}),lr(t,o,!1),ue[o]=dr;}(r,e,n);var a,c,f,l=function(t){if(t===o&&y)return y;if(!mr&&t in v)return v[t];switch(t){case xr:case Sr:case Or:return function(){return new r(this,t)}}return function(){return new r(this)}},s=e+\" Iterator\",d=!1,v=t.prototype,p=v[wr]||v[\"@@iterator\"]||o&&v[o],y=!mr&&p||l(o),h=\"Array\"==e&&v.entries||p;if(h&&(a=nr(h.call(new t)))!==Object.prototype&&a.next&&(nr(a)!==br&&(yr?yr(a,br):H(a[wr])||De(a,wr,Er)),lr(a,s,!0)),hr&&o==Sr&&p&&p.name!==Sr&&(gr?ye(v,\"name\",Sr):(d=!0,y=function(){return vt(p,this)})),o)if(c={values:l(Sr),keys:i?y:l(xr),entries:l(Or)},u)for(f in c)(mr||d||!(f in v))&&De(v,f,c[f]);else Qe({target:e,proto:!0,forced:mr||d},c);return v[wr]!==y&&De(v,wr,y,{name:o}),ue[e]=y,c},jr=\"Array Iterator\",Ar=Ae.set,Ir=Ae.getterFor(jr),Pr=Tr(Array,\"Array\",(function(t,e){Ar(this,{type:jr,target:j(t),index:0,kind:e});}),(function(){var t=Ir(this),e=t.target,r=t.kind,n=t.index++;return !e||n>=e.length?(t.target=void 0,{value:void 0,done:!0}):\"keys\"==r?{value:n,done:!1}:\"values\"==r?{value:e[n],done:!1}:{value:[n,e[n]],done:!1}}),\"values\");ue.Arguments=ue.Array,ie(\"keys\"),ie(\"values\"),ie(\"entries\");var Rr={};Rr[rt(\"toStringTag\")]=\"z\";var Lr=\"[object z]\"===String(Rr),kr=rt(\"toStringTag\"),Mr=s.Object,Nr=\"Arguments\"==w(function(){return arguments}()),_r=Lr?w:function(t){var e,r,n;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=Mr(t),kr))?r:Nr?w(e):\"Object\"==(n=w(e))&&H(e.callee)?\"Arguments\":n},zr=Lr?{}.toString:function(){return \"[object \"+_r(this)+\"]\"};Lr||De(Object.prototype,\"toString\",zr,{unsafe:!0});var Dr=s.String,Cr=function(t){if(\"Symbol\"===_r(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return Dr(t)},Fr=h(\"\".charAt),Hr=h(\"\".charCodeAt),Br=h(\"\".slice),Gr=function(t){return function(e,r){var n,o,i=Cr(T(e)),u=kt(r),a=i.length;return u<0||u>=a?t?\"\":void 0:(n=Hr(i,u))<55296||n>56319||u+1===a||(o=Hr(i,u+1))<56320||o>57343?t?Fr(i,u):n:t?Br(i,u,u+2):o-56320+(n-55296<<10)+65536}},$r={codeAt:Gr(!1),charAt:Gr(!0)},Vr=$r.charAt,Wr=\"String Iterator\",Ur=Ae.set,qr=Ae.getterFor(Wr);Tr(String,\"String\",(function(t){Ur(this,{type:Wr,string:Cr(t),index:0});}),(function(){var t,e=qr(this),r=e.string,n=e.index;return n>=r.length?{value:void 0,done:!0}:(t=Vr(r,n),e.index+=t.length,{value:t,done:!1})}));var Kr=function(t,e,r){for(var n in e)De(t,n,e[n],r);return t},Yr=s.Array,Xr=Math.max,Jr=Fe.f,Qr=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Zr=function(t){try{return Jr(t)}catch(t){return function(t,e,r){for(var n,o,i,u,a=Ct(t),c=_t(e,a),f=_t(void 0===r?a:r,a),l=Yr(Xr(f-c,0)),s=0;c<f;c++,s++)n=l,o=s,i=t[c],u=void 0,(u=jt(o))in n?Pt.f(n,u,pe(0,i)):n[u]=i;return l.length=s,l}(Qr)}},tn={f:function(t){return Qr&&\"Window\"==w(t)?Zr(t):Jr(j(t))}},en=g((function(){if(\"function\"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,\"a\",{value:8});}})),rn=Object.isExtensible,nn=g((function(){rn(1);}))||en?function(t){return !!nt(t)&&((!en||\"ArrayBuffer\"!=w(t))&&(!rn||rn(t)))}:rn,on=!g((function(){return Object.isExtensible(Object.preventExtensions({}))})),un=a((function(t){var e=Pt.f,r=!1,n=F(\"meta\"),o=0,i=function(t){e(t,n,{value:{objectID:\"O\"+o++,weakData:{}}});},u=t.exports={enable:function(){u.enable=function(){},r=!0;var t=Fe.f,e=h([].splice),o={};o[n]=1,t(o).length&&(Fe.f=function(r){for(var o=t(r),i=0,u=o.length;i<u;i++)if(o[i]===n){e(o,i,1);break}return o},Qe({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:tn.f}));},fastKey:function(t,e){if(!nt(t))return \"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!_(t,n)){if(!nn(t))return \"F\";if(!e)return \"E\";i(t);}return t[n].objectID},getWeakData:function(t,e){if(!_(t,n)){if(!nn(t))return !0;if(!e)return !1;i(t);}return t[n].weakData},onFreeze:function(t){return on&&r&&nn(t)&&!_(t,n)&&i(t),t}};Bt[n]=!0;})),an=h(h.bind),cn=function(t,e){return wt(t),void 0===e?t:an?an(t,e):function(){return t.apply(e,arguments)}},fn=rt(\"iterator\"),ln=Array.prototype,sn=rt(\"iterator\"),dn=function(t){if(null!=t)return xt(t,sn)||xt(t,\"@@iterator\")||ue[_r(t)]},vn=s.TypeError,pn=function(t,e,r){var n,o;ut(t);try{if(!(n=xt(t,\"return\"))){if(\"throw\"===e)throw r;return r}n=vt(n,t);}catch(t){o=!0,n=t;}if(\"throw\"===e)throw r;if(o)throw n;return ut(n),r},yn=s.TypeError,hn=function(t,e){this.stopped=t,this.result=e;},gn=hn.prototype,bn=function(t,e,r){var n,o,i,u,a,c,f,l,s=r&&r.that,d=!(!r||!r.AS_ENTRIES),v=!(!r||!r.IS_ITERATOR),p=!(!r||!r.INTERRUPTED),y=cn(e,s),h=function(t){return n&&pn(n,\"normal\",t),new hn(!0,t)},g=function(t){return d?(ut(t),p?y(t[0],t[1],h):y(t[0],t[1])):p?y(t,h):y(t)};if(v)n=t;else {if(!(o=dn(t)))throw yn(bt(t)+\" is not iterable\");if(void 0!==(l=o)&&(ue.Array===l||ln[fn]===l)){for(i=0,u=Ct(t);u>i;i++)if((a=g(t[i]))&&pt(gn,a))return a;return new hn(!1)}n=function(t,e){var r=arguments.length<2?dn(t):e;if(wt(r))return ut(vt(r,t));throw vn(bt(t)+\" is not iterable\")}(t,o);}for(c=n.next;!(f=vt(c,n)).done;){try{a=g(f.value);}catch(t){pn(n,\"throw\",t);}if(\"object\"==typeof a&&a&&pt(gn,a))return a}return new hn(!1)},mn=s.TypeError,wn=function(t,e){if(pt(e,t))return t;throw mn(\"Incorrect invocation\")},xn=rt(\"iterator\"),Sn=!1;try{var On=0,En={next:function(){return {done:!!On++}},return:function(){Sn=!0;}};En[xn]=function(){return this},Array.from(En,(function(){throw 2}));}catch(t){}var Tn=Array.isArray||function(t){return \"Array\"==w(t)},jn=function(){},An=[],In=G(\"Reflect\",\"construct\"),Pn=/^\\s*(?:class|function)\\b/,Rn=h(Pn.exec),Ln=!Pn.exec(jn),kn=function(t){if(!H(t))return !1;try{return In(jn,An,t),!0}catch(t){return !1}},Mn=!In||g((function(){var t;return kn(kn.call)||!kn(Object)||!kn((function(){t=!0;}))||t}))?function(t){if(!H(t))return !1;switch(_r(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Ln||!!Rn(Pn,se(t))}:kn,Nn=rt(\"species\"),_n=s.Array,zn=function(t,e){return new(function(t){var e;return Tn(t)&&(e=t.constructor,(Mn(e)&&(e===_n||Tn(e.prototype))||nt(e)&&null===(e=e[Nn]))&&(e=void 0)),void 0===e?_n:e}(t))(0===e?0:e)},Dn=h([].push),Cn=function(t){var e=1==t,r=2==t,n=3==t,o=4==t,i=6==t,u=7==t,a=5==t||i;return function(c,f,l,s){for(var d,v,p=M(c),y=O(p),h=cn(f,l),g=Ct(y),b=0,m=s||zn,w=e?m(c,g):r||u?m(c,0):void 0;g>b;b++)if((a||b in y)&&(v=h(d=y[b],b,p),t))if(e)w[b]=v;else if(v)switch(t){case 3:return !0;case 5:return d;case 6:return b;case 2:Dn(w,d);}else switch(t){case 4:return !1;case 7:Dn(w,d);}return i?-1:n||o?o:w}},Fn={forEach:Cn(0),map:Cn(1),filter:Cn(2),some:Cn(3),every:Cn(4),find:Cn(5),findIndex:Cn(6),filterReject:Cn(7)},Hn=un.getWeakData,Bn=Ae.set,Gn=Ae.getterFor,$n=Fn.find,Vn=Fn.findIndex,Wn=h([].splice),Un=0,qn=function(t){return t.frozen||(t.frozen=new Kn)},Kn=function(){this.entries=[];},Yn=function(t,e){return $n(t.entries,(function(t){return t[0]===e}))};Kn.prototype={get:function(t){var e=Yn(this,t);if(e)return e[1]},has:function(t){return !!Yn(this,t)},set:function(t,e){var r=Yn(this,t);r?r[1]=e:this.entries.push([t,e]);},delete:function(t){var e=Vn(this.entries,(function(e){return e[0]===t}));return ~e&&Wn(this.entries,e,1),!!~e}};var Xn,Jn={getConstructor:function(t,e,r,n){var o=t((function(t,o){wn(t,i),Bn(t,{type:e,id:Un++,frozen:void 0}),null!=o&&bn(o,t[n],{that:t,AS_ENTRIES:r});})),i=o.prototype,u=Gn(e),a=function(t,e,r){var n=u(t),o=Hn(ut(e),!0);return !0===o?qn(n).set(e,r):o[n.id]=r,t};return Kr(i,{delete:function(t){var e=u(this);if(!nt(t))return !1;var r=Hn(t);return !0===r?qn(e).delete(t):r&&_(r,e.id)&&delete r[e.id]},has:function(t){var e=u(this);if(!nt(t))return !1;var r=Hn(t);return !0===r?qn(e).has(t):r&&_(r,e.id)}}),Kr(i,r?{get:function(t){var e=u(this);if(nt(t)){var r=Hn(t);return !0===r?qn(e).get(t):r?r[e.id]:void 0}},set:function(t,e){return a(this,t,e)}}:{add:function(t){return a(this,t,!0)}}),o}},Qn=Ae.enforce,Zn=!s.ActiveXObject&&\"ActiveXObject\"in s,to=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},eo=function(t,e,r){var n=-1!==t.indexOf(\"Map\"),o=-1!==t.indexOf(\"Weak\"),i=n?\"set\":\"add\",u=s[t],a=u&&u.prototype,c=u,f={},l=function(t){var e=h(a[t]);De(a,t,\"add\"==t?function(t){return e(this,0===t?0:t),this}:\"delete\"==t?function(t){return !(o&&!nt(t))&&e(this,0===t?0:t)}:\"get\"==t?function(t){return o&&!nt(t)?void 0:e(this,0===t?0:t)}:\"has\"==t?function(t){return !(o&&!nt(t))&&e(this,0===t?0:t)}:function(t,r){return e(this,0===t?0:t,r),this});};if(Xe(t,!H(u)||!(o||a.forEach&&!g((function(){(new u).entries().next();})))))c=r.getConstructor(e,t,n,i),un.enable();else if(Xe(t,!0)){var d=new c,v=d[i](o?{}:-0,1)!=d,p=g((function(){d.has(1);})),y=function(t,e){if(!e&&!Sn)return !1;var r=!1;try{var n={};n[xn]=function(){return {next:function(){return {done:r=!0}}}},t(n);}catch(t){}return r}((function(t){new u(t);})),b=!o&&g((function(){for(var t=new u,e=5;e--;)t[i](e,e);return !t.has(-0)}));y||((c=e((function(t,e){wn(t,a);var r=function(t,e,r){var n,o;return yr&&H(n=e.constructor)&&n!==r&&nt(o=n.prototype)&&o!==r.prototype&&yr(t,o),t}(new u,t,c);return null!=e&&bn(e,r[i],{that:r,AS_ENTRIES:n}),r}))).prototype=a,a.constructor=c),(p||b)&&(l(\"delete\"),l(\"has\"),n&&l(\"get\")),(b||v)&&l(i),o&&a.clear&&delete a.clear;}return f[t]=c,Qe({global:!0,forced:c!=u},f),lr(c,t),o||r.setStrong(c,t,n),c}(\"WeakMap\",to,Jn);if(ve&&Zn){Xn=Jn.getConstructor(to,\"WeakMap\",!0),un.enable();var ro=eo.prototype,no=h(ro.delete),oo=h(ro.has),io=h(ro.get),uo=h(ro.set);Kr(ro,{delete:function(t){if(nt(t)&&!nn(t)){var e=Qn(this);return e.frozen||(e.frozen=new Xn),no(this,t)||e.frozen.delete(t)}return no(this,t)},has:function(t){if(nt(t)&&!nn(t)){var e=Qn(this);return e.frozen||(e.frozen=new Xn),oo(this,t)||e.frozen.has(t)}return oo(this,t)},get:function(t){if(nt(t)&&!nn(t)){var e=Qn(this);return e.frozen||(e.frozen=new Xn),oo(this,t)?io(this,t):e.frozen.get(t)}return io(this,t)},set:function(t,e){if(nt(t)&&!nn(t)){var r=Qn(this);r.frozen||(r.frozen=new Xn),oo(this,t)?uo(this,t,e):r.frozen.set(t,e);}else uo(this,t,e);return this}});}var ao={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},co=lt(\"span\").classList,fo=co&&co.constructor&&co.constructor.prototype,lo=fo===Object.prototype?void 0:fo,so=rt(\"iterator\"),vo=rt(\"toStringTag\"),po=Pr.values,yo=function(t,e){if(t){if(t[so]!==po)try{ye(t,so,po);}catch(e){t[so]=po;}if(t[vo]||ye(t,vo,e),ao[e])for(var r in Pr)if(t[r]!==Pr[r])try{ye(t,r,Pr[r]);}catch(e){t[r]=Pr[r];}}};for(var ho in ao)yo(s[ho]&&s[ho].prototype,ho);yo(lo,\"DOMTokenList\");var go=new WeakMap;var bo={type:\"list-item\",renderElem:function(n,o,i){go.set(n,i);var u=n,a=u.level,c=void 0===a?0:a,f=u.ordered,l={margin:\"5px 0 5px \"+20*c+\"px\"},s=\"\";if(void 0!==f&&f){var d=function(r,n){var o=n,i=o.type,u=o.level,a=void 0===u?0:u,c=o.ordered,f=void 0!==c&&c;if(!f)return -1;var l=1,s=n,d=t.DomEditor.findPath(r,s);if(0===d[0])return 1;for(;d[0]>0;){var v=e.Path.previous(d),p=e.Editor.node(r,v);if(null==p)break;var y=p[0],h=y.level,g=void 0===h?0:h,b=y.type,m=y.ordered;if(b!==i)break;if(g<a)break;if(g===a){if(m!==f)break;l++;}s=y,d=v;}return l}(i,n);s=d+\".\";}else s=function(t){void 0===t&&(t=0);var e=\"\";switch(t){case 0:e=\"•\";break;case 1:e=\"◦\";break;default:e=\"▪\";}return e}(c);var v=function(t){var r,n=t.children||[],o=n.length;if(0===o)return \"\";for(var i=0;i<o&&!r;i++){var u=n[i];e.Text.isText(u)&&(r=u);}return null==r?\"\":r.color||\"\"}(n);return r.jsx(\"div\",{style:l},r.jsx(\"span\",{contentEditable:!1,style:{marginRight:\"0.5em\",color:v},\"data-w-e-reserve\":!0},s),r.jsx(\"span\",null,o))}},mo=function(t,e){return mo=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e;}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);},mo(t,e)};\n  /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */function wo(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Class extends value \"+String(e)+\" is not a constructor or null\");function r(){this.constructor=t;}mo(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r);}function xo(t){var e=\"function\"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&\"number\"==typeof t.length)return {next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}function So(t,e){var r=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),u=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)u.push(n.value);}catch(t){o={error:t};}finally{try{n&&!n.done&&(r=i.return)&&r.call(i);}finally{if(o)throw o.error}}return u}function Oo(r){return e.Editor.nodes(r,{at:r.selection||void 0,match:function(e){return 1===t.DomEditor.findPath(r,e).length}})}var Eo=Ht.includes;Qe({target:\"Array\",proto:!0},{includes:function(t){return Eo(this,t,arguments.length>1?arguments[1]:void 0)}}),ie(\"includes\");var To,jo,Ao=function(){var t=ut(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e},Io=s.RegExp,Po=g((function(){var t=Io(\"a\",\"y\");return t.lastIndex=2,null!=t.exec(\"abcd\")})),Ro=Po||g((function(){return !Io(\"a\",\"y\").sticky})),Lo={BROKEN_CARET:Po||g((function(){var t=Io(\"^r\",\"gy\");return t.lastIndex=2,null!=t.exec(\"str\")})),MISSED_STICKY:Ro,UNSUPPORTED_Y:Po},ko=s.RegExp,Mo=g((function(){var t=ko(\".\",\"s\");return !(t.dotAll&&t.exec(\"\\n\")&&\"s\"===t.flags)})),No=s.RegExp,_o=g((function(){var t=No(\"(?<a>b)\",\"g\");return \"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$<a>c\")})),zo=Ae.get,Do=L(\"native-string-replace\",String.prototype.replace),Co=RegExp.prototype.exec,Fo=Co,Ho=h(\"\".charAt),Bo=h(\"\".indexOf),Go=h(\"\".replace),$o=h(\"\".slice),Vo=(jo=/b*/g,vt(Co,To=/a/,\"a\"),vt(Co,jo,\"a\"),0!==To.lastIndex||0!==jo.lastIndex),Wo=Lo.BROKEN_CARET,Uo=void 0!==/()??/.exec(\"\")[1];(Vo||Uo||Wo||Mo||_o)&&(Fo=function(t){var e,r,n,o,i,u,a,c=this,f=zo(c),l=Cr(t),s=f.raw;if(s)return s.lastIndex=c.lastIndex,e=vt(Fo,s,l),c.lastIndex=s.lastIndex,e;var d=f.groups,v=Wo&&c.sticky,p=vt(Ao,c),y=c.source,h=0,g=l;if(v&&(p=Go(p,\"y\",\"\"),-1===Bo(p,\"g\")&&(p+=\"g\"),g=$o(l,c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&\"\\n\"!==Ho(l,c.lastIndex-1))&&(y=\"(?: \"+y+\")\",g=\" \"+g,h++),r=new RegExp(\"^(?:\"+y+\")\",p)),Uo&&(r=new RegExp(\"^\"+y+\"$(?!\\\\s)\",p)),Vo&&(n=c.lastIndex),o=vt(Co,v?r:c,g),v?o?(o.input=$o(o.input,h),o[0]=$o(o[0],h),o.index=c.lastIndex,c.lastIndex+=o[0].length):c.lastIndex=0:Vo&&o&&(c.lastIndex=c.global?o.index+o[0].length:n),Uo&&o&&o.length>1&&vt(Do,o[0],r,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0);})),o&&d)for(o.groups=u=re(null),i=0;i<d.length;i++)u[(a=d[i])[0]]=o[a[1]];return o});var qo=Fo;Qe({target:\"RegExp\",proto:!0,forced:/./.exec!==qo},{exec:qo});var Ko=function(){function r(){this.type=\"list-item\",this.tag=\"button\";}return r.prototype.getListNode=function(e){var r=this.type;return t.DomEditor.getSelectedNodeByType(e,r)},r.prototype.getValue=function(t){return \"\"},r.prototype.isActive=function(t){var e=this.getListNode(t);if(null==e)return !1;var r=e.ordered;return (void 0!==r&&r)===this.ordered},r.prototype.isDisabled=function(r){return null==r.selection||!!t.DomEditor.getSelectedElems(r).some((function(t){if(e.Editor.isVoid(r,t)&&e.Editor.isBlock(r,t))return !0;var n=t.type;return !![\"pre\",\"code\",\"table\"].includes(n)||void 0}))},r.prototype.exec=function(t,r){this.isActive(t)?e.Transforms.setNodes(t,{type:\"paragraph\",ordered:void 0,level:void 0}):e.Transforms.setNodes(t,{type:\"list-item\",ordered:this.ordered,indent:void 0});},r}(),Yo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 64h640v128H384V64z m0 384h640v128H384v-128z m0 384h640v128H384v-128zM0 128a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m0 384a128 128 0 1 1 256 0 128 128 0 0 1-256 0z\"></path></svg>',Xo='<svg viewBox=\"0 0 1024 1024\"><path d=\"M384 832h640v128H384z m0-384h640v128H384z m0-384h640v128H384zM192 0v256H128V64H64V0zM128 526.016v50.016h128v64H64v-146.016l128-60V384H64v-64h192v146.016zM256 704v320H64v-64h128v-64H64v-64h128v-64H64v-64z\"></path></svg>',Jo=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r.ordered=!1,r.title=t.t(\"listModule.unOrderedList\"),r.iconSvg=Yo,r}return wo(r,e),r}(Ko),Qo=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r.ordered=!0,r.title=t.t(\"listModule.orderedList\"),r.iconSvg=Xo,r}return wo(r,e),r}(Ko),Zo={key:\"bulletedList\",factory:function(){return new Jo}},ti={key:\"numberedList\",factory:function(){return new Qo}};var ei=[];var ri,ni={type:\"list-item\",elemToHtml:function(r,n){var o=\"\",i=\"\",u=r.ordered,a=void 0!==u&&u?\"ol\":\"ul\",c=function(r){var n=go.get(r);if(null==n)return 0;var o=r,i=o.type,u=o.ordered,a=void 0!==u&&u,c=o.level,f=void 0===c?0:c,l=t.DomEditor.findPath(n,r);if(0===l[0])return f+1;var s=e.Path.previous(l),d=e.Editor.node(n,s);if(!d)return 0;var v=So(d,1)[0];if(t.DomEditor.getNodeType(v)!==i)return f+1;var p=v,y=p.ordered,h=void 0!==y&&y,g=p.level,b=void 0===g?0:g;return b<f?f-b:b>f?0:b===f?h===a?0:1:0}(r);if(c>0)for(var f=0;f<c;f++)o+=\"<\"+a+\">\",ei.push(a);var l=function(r){var n=go.get(r);if(null==n)return 0;var o=r,i=o.type,u=o.ordered,a=void 0!==u&&u,c=o.level,f=void 0===c?0:c,l=t.DomEditor.findPath(n,r);if(l[0]===n.children.length-1)return f+1;var s=e.Path.next(l),d=e.Editor.node(n,s);if(!d)return 0;var v=So(d,1)[0];if(t.DomEditor.getNodeType(v)!==i)return f+1;var p=v,y=p.ordered,h=void 0!==y&&y,g=p.level,b=void 0===g?0:g;return b<f?f-b:b>f?0:b===f?h===a?0:1:0}(r);if(l>0)for(f=0;f<l;f++){i+=\"</\"+ei.pop()+\">\";}return {html:\"<li>\"+n+\"</li>\",prefix:o,suffix:i}}},oi=rt(\"species\"),ii=Fn.filter,ui=(ri=\"filter\",Y>=51||!g((function(){var t=[];return (t.constructor={})[oi]=function(){return {foo:1}},1!==t[ri](Boolean).foo})));Qe({target:\"Array\",proto:!0,forced:!ui},{filter:function(t){return ii(this,t,arguments.length>1?arguments[1]:void 0)}});var ai=Function.prototype,ci=ai.apply,fi=ai.bind,li=ai.call,si=\"object\"==typeof Reflect&&Reflect.apply||(fi?li.bind(ci):function(){return li.apply(ci,arguments)}),di=rt(\"species\"),vi=RegExp.prototype,pi=$r.charAt,yi=function(t,e,r){return e+(r?pi(t,e).length:1)},hi=Math.floor,gi=h(\"\".charAt),bi=h(\"\".replace),mi=h(\"\".slice),wi=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,xi=/\\$([$&'`]|\\d{1,2})/g,Si=function(t,e,r,n,o,i){var u=r+t.length,a=n.length,c=xi;return void 0!==o&&(o=M(o),c=wi),bi(i,c,(function(i,c){var f;switch(gi(c,0)){case\"$\":return \"$\";case\"&\":return t;case\"`\":return mi(e,0,r);case\"'\":return mi(e,u);case\"<\":f=o[mi(c,1,-1)];break;default:var l=+c;if(0===l)return i;if(l>a){var s=hi(l/10);return 0===s?i:s<=a?void 0===n[s-1]?gi(c,1):n[s-1]+gi(c,1):i}f=n[l-1];}return void 0===f?\"\":f}))},Oi=s.TypeError,Ei=function(t,e){var r=t.exec;if(H(r)){var n=vt(r,t,e);return null!==n&&ut(n),n}if(\"RegExp\"===w(t))return vt(qo,t,e);throw Oi(\"RegExp#exec called on incompatible receiver\")},Ti=rt(\"replace\"),ji=Math.max,Ai=Math.min,Ii=h([].concat),Pi=h([].push),Ri=h(\"\".indexOf),Li=h(\"\".slice),ki=\"$0\"===\"a\".replace(/./,\"$0\"),Mi=!!/./[Ti]&&\"\"===/./[Ti](\"a\",\"$0\");!function(t,e,r,n){var o=rt(t),i=!g((function(){var e={};return e[o]=function(){return 7},7!=\"\"[t](e)})),u=i&&!g((function(){var e=!1,r=/a/;return \"split\"===t&&((r={}).constructor={},r.constructor[di]=function(){return r},r.flags=\"\",r[o]=/./[o]),r.exec=function(){return e=!0,null},r[o](\"\"),!e}));if(!i||!u||r){var a=h(/./[o]),c=e(o,\"\"[t],(function(t,e,r,n,o){var u=h(t),c=e.exec;return c===qo||c===vi.exec?i&&!o?{done:!0,value:a(e,r,n)}:{done:!0,value:u(r,e,n)}:{done:!1}}));De(String.prototype,t,c[0]),De(vi,o,c[1]);}n&&ye(vi[o],\"sham\",!0);}(\"replace\",(function(t,e,r){var n=Mi?\"$\":\"$0\";return [function(t,r){var n=T(this),o=null==t?void 0:xt(t,Ti);return o?vt(o,t,n,r):vt(e,Cr(n),t,r)},function(t,o){var i=ut(this),u=Cr(t);if(\"string\"==typeof o&&-1===Ri(o,n)&&-1===Ri(o,\"$<\")){var a=r(e,i,u,o);if(a.done)return a.value}var c=H(o);c||(o=Cr(o));var f=i.global;if(f){var l=i.unicode;i.lastIndex=0;}for(var s=[];;){var d=Ei(i,u);if(null===d)break;if(Pi(s,d),!f)break;\"\"===Cr(d[0])&&(i.lastIndex=yi(u,Dt(i.lastIndex),l));}for(var v,p=\"\",y=0,h=0;h<s.length;h++){for(var g=Cr((d=s[h])[0]),b=ji(Ai(kt(d.index),u.length),0),m=[],w=1;w<d.length;w++)Pi(m,void 0===(v=d[w])?v:String(v));var x=d.groups;if(c){var S=Ii([g],m,b,u);void 0!==x&&Pi(S,x);var O=Cr(si(o,void 0,S));}else O=Si(g,u,b,m,x,o);b>=y&&(p+=Li(u,y,b)+O,y=b+g.length);}return p+Li(u,y)}]}),!!g((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")}))||!ki||Mi);var Ni=s.TypeError,_i=function(t,e,r,n,o,i,u,a){for(var c,f,l=o,s=0,d=!!u&&cn(u,a);s<n;){if(s in r){if(c=d?d(r[s],s,e):r[s],i>0&&Tn(c))f=Ct(c),l=_i(t,e,c,f,l,i-1)-1;else {if(l>=9007199254740991)throw Ni(\"Exceed the acceptable array length\");t[l]=c;}l++;}s++;}return l},zi=_i;function Di(t){return t.length?t[0].tagName.toLowerCase():\"\"}return Qe({target:\"Array\",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=M(this),r=Ct(e),n=zn(e,0);return n.length=zi(n,e,e,r,0,void 0===t?1:kt(t)),n}}),ie(\"flat\"),Qe({global:!0},{globalThis:s}),n.append&&(i.default.fn.append=n.append),n.attr&&(i.default.fn.attr=n.attr),n.parent&&(i.default.fn.parent=n.parent),{renderElems:[bo],editorPlugin:function(r){var n=r.deleteBackward,o=r.handleTab,i=r.normalizeNode,u=r;return u.deleteBackward=function(r){var o=u.selection;if(null!=o)if(e.Range.isExpanded(o))n(r);else {var i=t.DomEditor.getSelectedNodeByType(u,\"list-item\");if(null!=i)if(0!==o.focus.offset)n(r);else {var a=i.level,c=void 0===a?0:a;c>0?e.Transforms.setNodes(u,{level:c-1}):e.Transforms.setNodes(u,{type:\"paragraph\",ordered:void 0,level:void 0});}else n(r);}else n(r);},u.handleTab=function(){var r,n,i,a,c=u.selection;if(null!=c){if(e.Range.isCollapsed(c)){var f=t.DomEditor.getSelectedNodeByType(u,\"list-item\");if(null==f)return void o();if(0===c.focus.offset){var l=f.level,s=void 0===l?0:l;return void e.Transforms.setNodes(u,{level:s+1})}}if(e.Range.isExpanded(c)){var d=0,v=!1;try{for(var p=xo(Oo(u)),y=p.next();!y.done;y=p.next()){var h=So(y.value,1)[0];\"list-item\"===t.DomEditor.getNodeType(h)?d++:v=!0;}}catch(t){r={error:t};}finally{try{y&&!y.done&&(n=p.return)&&n.call(p);}finally{if(r)throw r.error}}if(v||d<=1)return void o();try{for(var g=xo(Oo(u)),b=g.next();!b.done;b=g.next()){var m=So(b.value,2),w=(h=m[0],m[1]),x=h.level;s=void 0===x?0:x;e.Transforms.setNodes(u,{level:s+1},{at:w});}}catch(t){i={error:t};}finally{try{b&&!b.done&&(a=g.return)&&a.call(g);}finally{if(i)throw i.error}}}else o();}else o();},u.normalizeNode=function(r){var n=So(r,2),o=n[0],a=n[1],c=t.DomEditor.getNodeType(o);return \"bulleted-list\"!==c&&\"numbered-list\"!==c||e.Transforms.unwrapNodes(u,{at:a}),i([o,a])},u},menus:[Zo,ti],elemsToHtml:[ni],parseElemsHtml:[{selector:\"ul:not([data-w-e-type]),ol:not([data-w-e-type])\",parseElemHtml:function(t,e,r){return e.flat(1/0)}},{selector:\"li:not([data-w-e-type])\",parseElemHtml:function(t,r,n){var o=i.default(t);0===(r=r.filter((function(t){return !!e.Text.isText(t)||!!n.isInline(t)}))).length&&(r=[{text:o.text().replace(/\\s+/gm,\" \")}]);var u=function(t){return \"ol\"===Di(t.parent())}(o),a=function(t){for(var e=0,r=t.parent(),n=Di(r);\"ul\"===n||\"ol\"===n;)n=Di(r=r.parent()),e++;return e-1}(o);return {type:\"list-item\",ordered:u,level:a,children:r}}}]}}));\n\n  });\n\n  /**\n   * Lodash (Custom Build) <https://lodash.com/>\n   * Build: `lodash modularize exports=\"npm\" -o ./`\n   * Copyright JS Foundation and other contributors <https://js.foundation/>\n   * Released under MIT license <https://lodash.com/license>\n   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n   */\n\n  var lodash_isequal = createCommonjsModule$1(function (module, exports) {\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used as references for various `Number` constants. */\n  var MAX_SAFE_INTEGER = 9007199254740991;\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /** Used for built-in method references. */\n  var arrayProto = Array.prototype,\n      funcProto = Function.prototype,\n      objectProto = Object.prototype;\n\n  /** Used to detect overreaching core-js shims. */\n  var coreJsData = root['__core-js_shared__'];\n\n  /** Used to resolve the decompiled source of functions. */\n  var funcToString = funcProto.toString;\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty = objectProto.hasOwnProperty;\n\n  /** Used to detect methods masquerading as native. */\n  var maskSrcKey = (function() {\n    var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n    return uid ? ('Symbol(src)_1.' + uid) : '';\n  }());\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var nativeObjectToString = objectProto.toString;\n\n  /** Used to detect if a method is native. */\n  var reIsNative = RegExp('^' +\n    funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n    .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n  );\n\n  /** Built-in value references. */\n  var Buffer = moduleExports ? root.Buffer : undefined,\n      Symbol = root.Symbol,\n      Uint8Array = root.Uint8Array,\n      propertyIsEnumerable = objectProto.propertyIsEnumerable,\n      splice = arrayProto.splice,\n      symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeGetSymbols = Object.getOwnPropertySymbols,\n      nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n      nativeKeys = overArg(Object.keys, Object);\n\n  /* Built-in method references that are verified to be native. */\n  var DataView = getNative(root, 'DataView'),\n      Map = getNative(root, 'Map'),\n      Promise = getNative(root, 'Promise'),\n      Set = getNative(root, 'Set'),\n      WeakMap = getNative(root, 'WeakMap'),\n      nativeCreate = getNative(Object, 'create');\n\n  /** Used to detect maps, sets, and weakmaps. */\n  var dataViewCtorString = toSource(DataView),\n      mapCtorString = toSource(Map),\n      promiseCtorString = toSource(Promise),\n      setCtorString = toSource(Set),\n      weakMapCtorString = toSource(WeakMap);\n\n  /** Used to convert symbols to primitives and strings. */\n  var symbolProto = Symbol ? Symbol.prototype : undefined,\n      symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n  /**\n   * Creates a hash object.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function Hash(entries) {\n    var index = -1,\n        length = entries == null ? 0 : entries.length;\n\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n\n  /**\n   * Removes all key-value entries from the hash.\n   *\n   * @private\n   * @name clear\n   * @memberOf Hash\n   */\n  function hashClear() {\n    this.__data__ = nativeCreate ? nativeCreate(null) : {};\n    this.size = 0;\n  }\n\n  /**\n   * Removes `key` and its value from the hash.\n   *\n   * @private\n   * @name delete\n   * @memberOf Hash\n   * @param {Object} hash The hash to modify.\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function hashDelete(key) {\n    var result = this.has(key) && delete this.__data__[key];\n    this.size -= result ? 1 : 0;\n    return result;\n  }\n\n  /**\n   * Gets the hash value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf Hash\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function hashGet(key) {\n    var data = this.__data__;\n    if (nativeCreate) {\n      var result = data[key];\n      return result === HASH_UNDEFINED ? undefined : result;\n    }\n    return hasOwnProperty.call(data, key) ? data[key] : undefined;\n  }\n\n  /**\n   * Checks if a hash value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf Hash\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function hashHas(key) {\n    var data = this.__data__;\n    return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n  }\n\n  /**\n   * Sets the hash `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf Hash\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the hash instance.\n   */\n  function hashSet(key, value) {\n    var data = this.__data__;\n    this.size += this.has(key) ? 0 : 1;\n    data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n    return this;\n  }\n\n  // Add methods to `Hash`.\n  Hash.prototype.clear = hashClear;\n  Hash.prototype['delete'] = hashDelete;\n  Hash.prototype.get = hashGet;\n  Hash.prototype.has = hashHas;\n  Hash.prototype.set = hashSet;\n\n  /**\n   * Creates an list cache object.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function ListCache(entries) {\n    var index = -1,\n        length = entries == null ? 0 : entries.length;\n\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n\n  /**\n   * Removes all key-value entries from the list cache.\n   *\n   * @private\n   * @name clear\n   * @memberOf ListCache\n   */\n  function listCacheClear() {\n    this.__data__ = [];\n    this.size = 0;\n  }\n\n  /**\n   * Removes `key` and its value from the list cache.\n   *\n   * @private\n   * @name delete\n   * @memberOf ListCache\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function listCacheDelete(key) {\n    var data = this.__data__,\n        index = assocIndexOf(data, key);\n\n    if (index < 0) {\n      return false;\n    }\n    var lastIndex = data.length - 1;\n    if (index == lastIndex) {\n      data.pop();\n    } else {\n      splice.call(data, index, 1);\n    }\n    --this.size;\n    return true;\n  }\n\n  /**\n   * Gets the list cache value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf ListCache\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function listCacheGet(key) {\n    var data = this.__data__,\n        index = assocIndexOf(data, key);\n\n    return index < 0 ? undefined : data[index][1];\n  }\n\n  /**\n   * Checks if a list cache value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf ListCache\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function listCacheHas(key) {\n    return assocIndexOf(this.__data__, key) > -1;\n  }\n\n  /**\n   * Sets the list cache `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf ListCache\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the list cache instance.\n   */\n  function listCacheSet(key, value) {\n    var data = this.__data__,\n        index = assocIndexOf(data, key);\n\n    if (index < 0) {\n      ++this.size;\n      data.push([key, value]);\n    } else {\n      data[index][1] = value;\n    }\n    return this;\n  }\n\n  // Add methods to `ListCache`.\n  ListCache.prototype.clear = listCacheClear;\n  ListCache.prototype['delete'] = listCacheDelete;\n  ListCache.prototype.get = listCacheGet;\n  ListCache.prototype.has = listCacheHas;\n  ListCache.prototype.set = listCacheSet;\n\n  /**\n   * Creates a map cache object to store key-value pairs.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function MapCache(entries) {\n    var index = -1,\n        length = entries == null ? 0 : entries.length;\n\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n\n  /**\n   * Removes all key-value entries from the map.\n   *\n   * @private\n   * @name clear\n   * @memberOf MapCache\n   */\n  function mapCacheClear() {\n    this.size = 0;\n    this.__data__ = {\n      'hash': new Hash,\n      'map': new (Map || ListCache),\n      'string': new Hash\n    };\n  }\n\n  /**\n   * Removes `key` and its value from the map.\n   *\n   * @private\n   * @name delete\n   * @memberOf MapCache\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function mapCacheDelete(key) {\n    var result = getMapData(this, key)['delete'](key);\n    this.size -= result ? 1 : 0;\n    return result;\n  }\n\n  /**\n   * Gets the map value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf MapCache\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function mapCacheGet(key) {\n    return getMapData(this, key).get(key);\n  }\n\n  /**\n   * Checks if a map value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf MapCache\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function mapCacheHas(key) {\n    return getMapData(this, key).has(key);\n  }\n\n  /**\n   * Sets the map `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf MapCache\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the map cache instance.\n   */\n  function mapCacheSet(key, value) {\n    var data = getMapData(this, key),\n        size = data.size;\n\n    data.set(key, value);\n    this.size += data.size == size ? 0 : 1;\n    return this;\n  }\n\n  // Add methods to `MapCache`.\n  MapCache.prototype.clear = mapCacheClear;\n  MapCache.prototype['delete'] = mapCacheDelete;\n  MapCache.prototype.get = mapCacheGet;\n  MapCache.prototype.has = mapCacheHas;\n  MapCache.prototype.set = mapCacheSet;\n\n  /**\n   *\n   * Creates an array cache object to store unique values.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [values] The values to cache.\n   */\n  function SetCache(values) {\n    var index = -1,\n        length = values == null ? 0 : values.length;\n\n    this.__data__ = new MapCache;\n    while (++index < length) {\n      this.add(values[index]);\n    }\n  }\n\n  /**\n   * Adds `value` to the array cache.\n   *\n   * @private\n   * @name add\n   * @memberOf SetCache\n   * @alias push\n   * @param {*} value The value to cache.\n   * @returns {Object} Returns the cache instance.\n   */\n  function setCacheAdd(value) {\n    this.__data__.set(value, HASH_UNDEFINED);\n    return this;\n  }\n\n  /**\n   * Checks if `value` is in the array cache.\n   *\n   * @private\n   * @name has\n   * @memberOf SetCache\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `true` if `value` is found, else `false`.\n   */\n  function setCacheHas(value) {\n    return this.__data__.has(value);\n  }\n\n  // Add methods to `SetCache`.\n  SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n  SetCache.prototype.has = setCacheHas;\n\n  /**\n   * Creates a stack cache object to store key-value pairs.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function Stack(entries) {\n    var data = this.__data__ = new ListCache(entries);\n    this.size = data.size;\n  }\n\n  /**\n   * Removes all key-value entries from the stack.\n   *\n   * @private\n   * @name clear\n   * @memberOf Stack\n   */\n  function stackClear() {\n    this.__data__ = new ListCache;\n    this.size = 0;\n  }\n\n  /**\n   * Removes `key` and its value from the stack.\n   *\n   * @private\n   * @name delete\n   * @memberOf Stack\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function stackDelete(key) {\n    var data = this.__data__,\n        result = data['delete'](key);\n\n    this.size = data.size;\n    return result;\n  }\n\n  /**\n   * Gets the stack value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf Stack\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function stackGet(key) {\n    return this.__data__.get(key);\n  }\n\n  /**\n   * Checks if a stack value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf Stack\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function stackHas(key) {\n    return this.__data__.has(key);\n  }\n\n  /**\n   * Sets the stack `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf Stack\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the stack cache instance.\n   */\n  function stackSet(key, value) {\n    var data = this.__data__;\n    if (data instanceof ListCache) {\n      var pairs = data.__data__;\n      if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n        pairs.push([key, value]);\n        this.size = ++data.size;\n        return this;\n      }\n      data = this.__data__ = new MapCache(pairs);\n    }\n    data.set(key, value);\n    this.size = data.size;\n    return this;\n  }\n\n  // Add methods to `Stack`.\n  Stack.prototype.clear = stackClear;\n  Stack.prototype['delete'] = stackDelete;\n  Stack.prototype.get = stackGet;\n  Stack.prototype.has = stackHas;\n  Stack.prototype.set = stackSet;\n\n  /**\n   * Creates an array of the enumerable property names of the array-like `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @param {boolean} inherited Specify returning inherited property names.\n   * @returns {Array} Returns the array of property names.\n   */\n  function arrayLikeKeys(value, inherited) {\n    var isArr = isArray(value),\n        isArg = !isArr && isArguments(value),\n        isBuff = !isArr && !isArg && isBuffer(value),\n        isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n        skipIndexes = isArr || isArg || isBuff || isType,\n        result = skipIndexes ? baseTimes(value.length, String) : [],\n        length = result.length;\n\n    for (var key in value) {\n      if ((inherited || hasOwnProperty.call(value, key)) &&\n          !(skipIndexes && (\n             // Safari 9 has enumerable `arguments.length` in strict mode.\n             key == 'length' ||\n             // Node.js 0.10 has enumerable non-index properties on buffers.\n             (isBuff && (key == 'offset' || key == 'parent')) ||\n             // PhantomJS 2 has enumerable non-index properties on typed arrays.\n             (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n             // Skip index properties.\n             isIndex(key, length)\n          ))) {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Gets the index at which the `key` is found in `array` of key-value pairs.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} key The key to search for.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function assocIndexOf(array, key) {\n    var length = array.length;\n    while (length--) {\n      if (eq(array[length][0], key)) {\n        return length;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n   * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n   * symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Function} keysFunc The function to get the keys of `object`.\n   * @param {Function} symbolsFunc The function to get the symbols of `object`.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n    var result = keysFunc(object);\n    return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n  }\n\n  /**\n   * The base implementation of `getTag` without fallbacks for buggy environments.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  function baseGetTag(value) {\n    if (value == null) {\n      return value === undefined ? undefinedTag : nullTag;\n    }\n    return (symToStringTag && symToStringTag in Object(value))\n      ? getRawTag(value)\n      : objectToString(value);\n  }\n\n  /**\n   * The base implementation of `_.isArguments`.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   */\n  function baseIsArguments(value) {\n    return isObjectLike(value) && baseGetTag(value) == argsTag;\n  }\n\n  /**\n   * The base implementation of `_.isEqual` which supports partial comparisons\n   * and tracks traversed objects.\n   *\n   * @private\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @param {boolean} bitmask The bitmask flags.\n   *  1 - Unordered comparison\n   *  2 - Partial comparison\n   * @param {Function} [customizer] The function to customize comparisons.\n   * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   */\n  function baseIsEqual(value, other, bitmask, customizer, stack) {\n    if (value === other) {\n      return true;\n    }\n    if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n      return value !== value && other !== other;\n    }\n    return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n  }\n\n  /**\n   * A specialized version of `baseIsEqual` for arrays and objects which performs\n   * deep comparisons and tracks traversed objects enabling objects with circular\n   * references to be compared.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n    var objIsArr = isArray(object),\n        othIsArr = isArray(other),\n        objTag = objIsArr ? arrayTag : getTag(object),\n        othTag = othIsArr ? arrayTag : getTag(other);\n\n    objTag = objTag == argsTag ? objectTag : objTag;\n    othTag = othTag == argsTag ? objectTag : othTag;\n\n    var objIsObj = objTag == objectTag,\n        othIsObj = othTag == objectTag,\n        isSameTag = objTag == othTag;\n\n    if (isSameTag && isBuffer(object)) {\n      if (!isBuffer(other)) {\n        return false;\n      }\n      objIsArr = true;\n      objIsObj = false;\n    }\n    if (isSameTag && !objIsObj) {\n      stack || (stack = new Stack);\n      return (objIsArr || isTypedArray(object))\n        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n    }\n    if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n      if (objIsWrapped || othIsWrapped) {\n        var objUnwrapped = objIsWrapped ? object.value() : object,\n            othUnwrapped = othIsWrapped ? other.value() : other;\n\n        stack || (stack = new Stack);\n        return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n      }\n    }\n    if (!isSameTag) {\n      return false;\n    }\n    stack || (stack = new Stack);\n    return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n  }\n\n  /**\n   * The base implementation of `_.isNative` without bad shim checks.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a native function,\n   *  else `false`.\n   */\n  function baseIsNative(value) {\n    if (!isObject(value) || isMasked(value)) {\n      return false;\n    }\n    var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n    return pattern.test(toSource(value));\n  }\n\n  /**\n   * The base implementation of `_.isTypedArray` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n   */\n  function baseIsTypedArray(value) {\n    return isObjectLike(value) &&\n      isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n  }\n\n  /**\n   * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function baseKeys(object) {\n    if (!isPrototype(object)) {\n      return nativeKeys(object);\n    }\n    var result = [];\n    for (var key in Object(object)) {\n      if (hasOwnProperty.call(object, key) && key != 'constructor') {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for arrays with support for\n   * partial deep comparisons.\n   *\n   * @private\n   * @param {Array} array The array to compare.\n   * @param {Array} other The other array to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `array` and `other` objects.\n   * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n   */\n  function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n        arrLength = array.length,\n        othLength = other.length;\n\n    if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n      return false;\n    }\n    // Assume cyclic values are equal.\n    var stacked = stack.get(array);\n    if (stacked && stack.get(other)) {\n      return stacked == other;\n    }\n    var index = -1,\n        result = true,\n        seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n    stack.set(array, other);\n    stack.set(other, array);\n\n    // Ignore non-index properties.\n    while (++index < arrLength) {\n      var arrValue = array[index],\n          othValue = other[index];\n\n      if (customizer) {\n        var compared = isPartial\n          ? customizer(othValue, arrValue, index, other, array, stack)\n          : customizer(arrValue, othValue, index, array, other, stack);\n      }\n      if (compared !== undefined) {\n        if (compared) {\n          continue;\n        }\n        result = false;\n        break;\n      }\n      // Recursively compare arrays (susceptible to call stack limits).\n      if (seen) {\n        if (!arraySome(other, function(othValue, othIndex) {\n              if (!cacheHas(seen, othIndex) &&\n                  (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                return seen.push(othIndex);\n              }\n            })) {\n          result = false;\n          break;\n        }\n      } else if (!(\n            arrValue === othValue ||\n              equalFunc(arrValue, othValue, bitmask, customizer, stack)\n          )) {\n        result = false;\n        break;\n      }\n    }\n    stack['delete'](array);\n    stack['delete'](other);\n    return result;\n  }\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for comparing objects of\n   * the same `toStringTag`.\n   *\n   * **Note:** This function only supports comparing values with tags of\n   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {string} tag The `toStringTag` of the objects to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n    switch (tag) {\n      case dataViewTag:\n        if ((object.byteLength != other.byteLength) ||\n            (object.byteOffset != other.byteOffset)) {\n          return false;\n        }\n        object = object.buffer;\n        other = other.buffer;\n\n      case arrayBufferTag:\n        if ((object.byteLength != other.byteLength) ||\n            !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n          return false;\n        }\n        return true;\n\n      case boolTag:\n      case dateTag:\n      case numberTag:\n        // Coerce booleans to `1` or `0` and dates to milliseconds.\n        // Invalid dates are coerced to `NaN`.\n        return eq(+object, +other);\n\n      case errorTag:\n        return object.name == other.name && object.message == other.message;\n\n      case regexpTag:\n      case stringTag:\n        // Coerce regexes to strings and treat strings, primitives and objects,\n        // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n        // for more details.\n        return object == (other + '');\n\n      case mapTag:\n        var convert = mapToArray;\n\n      case setTag:\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n        convert || (convert = setToArray);\n\n        if (object.size != other.size && !isPartial) {\n          return false;\n        }\n        // Assume cyclic values are equal.\n        var stacked = stack.get(object);\n        if (stacked) {\n          return stacked == other;\n        }\n        bitmask |= COMPARE_UNORDERED_FLAG;\n\n        // Recursively compare objects (susceptible to call stack limits).\n        stack.set(object, other);\n        var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n        stack['delete'](object);\n        return result;\n\n      case symbolTag:\n        if (symbolValueOf) {\n          return symbolValueOf.call(object) == symbolValueOf.call(other);\n        }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for objects with support for\n   * partial deep comparisons.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n        objProps = getAllKeys(object),\n        objLength = objProps.length,\n        othProps = getAllKeys(other),\n        othLength = othProps.length;\n\n    if (objLength != othLength && !isPartial) {\n      return false;\n    }\n    var index = objLength;\n    while (index--) {\n      var key = objProps[index];\n      if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n        return false;\n      }\n    }\n    // Assume cyclic values are equal.\n    var stacked = stack.get(object);\n    if (stacked && stack.get(other)) {\n      return stacked == other;\n    }\n    var result = true;\n    stack.set(object, other);\n    stack.set(other, object);\n\n    var skipCtor = isPartial;\n    while (++index < objLength) {\n      key = objProps[index];\n      var objValue = object[key],\n          othValue = other[key];\n\n      if (customizer) {\n        var compared = isPartial\n          ? customizer(othValue, objValue, key, other, object, stack)\n          : customizer(objValue, othValue, key, object, other, stack);\n      }\n      // Recursively compare objects (susceptible to call stack limits).\n      if (!(compared === undefined\n            ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n            : compared\n          )) {\n        result = false;\n        break;\n      }\n      skipCtor || (skipCtor = key == 'constructor');\n    }\n    if (result && !skipCtor) {\n      var objCtor = object.constructor,\n          othCtor = other.constructor;\n\n      // Non `Object` object instances with different constructors are not equal.\n      if (objCtor != othCtor &&\n          ('constructor' in object && 'constructor' in other) &&\n          !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n            typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n        result = false;\n      }\n    }\n    stack['delete'](object);\n    stack['delete'](other);\n    return result;\n  }\n\n  /**\n   * Creates an array of own enumerable property names and symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function getAllKeys(object) {\n    return baseGetAllKeys(object, keys, getSymbols);\n  }\n\n  /**\n   * Gets the data for `map`.\n   *\n   * @private\n   * @param {Object} map The map to query.\n   * @param {string} key The reference key.\n   * @returns {*} Returns the map data.\n   */\n  function getMapData(map, key) {\n    var data = map.__data__;\n    return isKeyable(key)\n      ? data[typeof key == 'string' ? 'string' : 'hash']\n      : data.map;\n  }\n\n  /**\n   * Gets the native function at `key` of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {string} key The key of the method to get.\n   * @returns {*} Returns the function if it's native, else `undefined`.\n   */\n  function getNative(object, key) {\n    var value = getValue(object, key);\n    return baseIsNative(value) ? value : undefined;\n  }\n\n  /**\n   * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the raw `toStringTag`.\n   */\n  function getRawTag(value) {\n    var isOwn = hasOwnProperty.call(value, symToStringTag),\n        tag = value[symToStringTag];\n\n    try {\n      value[symToStringTag] = undefined;\n      var unmasked = true;\n    } catch (e) {}\n\n    var result = nativeObjectToString.call(value);\n    if (unmasked) {\n      if (isOwn) {\n        value[symToStringTag] = tag;\n      } else {\n        delete value[symToStringTag];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates an array of the own enumerable symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of symbols.\n   */\n  var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n    if (object == null) {\n      return [];\n    }\n    object = Object(object);\n    return arrayFilter(nativeGetSymbols(object), function(symbol) {\n      return propertyIsEnumerable.call(object, symbol);\n    });\n  };\n\n  /**\n   * Gets the `toStringTag` of `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  var getTag = baseGetTag;\n\n  // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n  if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n      (Map && getTag(new Map) != mapTag) ||\n      (Promise && getTag(Promise.resolve()) != promiseTag) ||\n      (Set && getTag(new Set) != setTag) ||\n      (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n    getTag = function(value) {\n      var result = baseGetTag(value),\n          Ctor = result == objectTag ? value.constructor : undefined,\n          ctorString = Ctor ? toSource(Ctor) : '';\n\n      if (ctorString) {\n        switch (ctorString) {\n          case dataViewCtorString: return dataViewTag;\n          case mapCtorString: return mapTag;\n          case promiseCtorString: return promiseTag;\n          case setCtorString: return setTag;\n          case weakMapCtorString: return weakMapTag;\n        }\n      }\n      return result;\n    };\n  }\n\n  /**\n   * Checks if `value` is a valid array-like index.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n   */\n  function isIndex(value, length) {\n    length = length == null ? MAX_SAFE_INTEGER : length;\n    return !!length &&\n      (typeof value == 'number' || reIsUint.test(value)) &&\n      (value > -1 && value % 1 == 0 && value < length);\n  }\n\n  /**\n   * Checks if `value` is suitable for use as unique object key.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n   */\n  function isKeyable(value) {\n    var type = typeof value;\n    return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n      ? (value !== '__proto__')\n      : (value === null);\n  }\n\n  /**\n   * Checks if `func` has its source masked.\n   *\n   * @private\n   * @param {Function} func The function to check.\n   * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n   */\n  function isMasked(func) {\n    return !!maskSrcKey && (maskSrcKey in func);\n  }\n\n  /**\n   * Checks if `value` is likely a prototype object.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n   */\n  function isPrototype(value) {\n    var Ctor = value && value.constructor,\n        proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n    return value === proto;\n  }\n\n  /**\n   * Converts `value` to a string using `Object.prototype.toString`.\n   *\n   * @private\n   * @param {*} value The value to convert.\n   * @returns {string} Returns the converted string.\n   */\n  function objectToString(value) {\n    return nativeObjectToString.call(value);\n  }\n\n  /**\n   * Converts `func` to its source code.\n   *\n   * @private\n   * @param {Function} func The function to convert.\n   * @returns {string} Returns the source code.\n   */\n  function toSource(func) {\n    if (func != null) {\n      try {\n        return funcToString.call(func);\n      } catch (e) {}\n      try {\n        return (func + '');\n      } catch (e) {}\n    }\n    return '';\n  }\n\n  /**\n   * Performs a\n   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * comparison between two values to determine if they are equivalent.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   * var other = { 'a': 1 };\n   *\n   * _.eq(object, object);\n   * // => true\n   *\n   * _.eq(object, other);\n   * // => false\n   *\n   * _.eq('a', 'a');\n   * // => true\n   *\n   * _.eq('a', Object('a'));\n   * // => false\n   *\n   * _.eq(NaN, NaN);\n   * // => true\n   */\n  function eq(value, other) {\n    return value === other || (value !== value && other !== other);\n  }\n\n  /**\n   * Checks if `value` is likely an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArguments(function() { return arguments; }());\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n    return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n      !propertyIsEnumerable.call(value, 'callee');\n  };\n\n  /**\n   * Checks if `value` is classified as an `Array` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n   * @example\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   *\n   * _.isArray(document.body.children);\n   * // => false\n   *\n   * _.isArray('abc');\n   * // => false\n   *\n   * _.isArray(_.noop);\n   * // => false\n   */\n  var isArray = Array.isArray;\n\n  /**\n   * Checks if `value` is array-like. A value is considered array-like if it's\n   * not a function and has a `value.length` that's an integer greater than or\n   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n   * @example\n   *\n   * _.isArrayLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLike(document.body.children);\n   * // => true\n   *\n   * _.isArrayLike('abc');\n   * // => true\n   *\n   * _.isArrayLike(_.noop);\n   * // => false\n   */\n  function isArrayLike(value) {\n    return value != null && isLength(value.length) && !isFunction(value);\n  }\n\n  /**\n   * Checks if `value` is a buffer.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.3.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n   * @example\n   *\n   * _.isBuffer(new Buffer(2));\n   * // => true\n   *\n   * _.isBuffer(new Uint8Array(2));\n   * // => false\n   */\n  var isBuffer = nativeIsBuffer || stubFalse;\n\n  /**\n   * Performs a deep comparison between two values to determine if they are\n   * equivalent.\n   *\n   * **Note:** This method supports comparing arrays, array buffers, booleans,\n   * date objects, error objects, maps, numbers, `Object` objects, regexes,\n   * sets, strings, symbols, and typed arrays. `Object` objects are compared\n   * by their own, not inherited, enumerable properties. Functions and DOM\n   * nodes are compared by strict equality, i.e. `===`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   * var other = { 'a': 1 };\n   *\n   * _.isEqual(object, other);\n   * // => true\n   *\n   * object === other;\n   * // => false\n   */\n  function isEqual(value, other) {\n    return baseIsEqual(value, other);\n  }\n\n  /**\n   * Checks if `value` is classified as a `Function` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   *\n   * _.isFunction(/abc/);\n   * // => false\n   */\n  function isFunction(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n    // The use of `Object#toString` avoids issues with the `typeof` operator\n    // in Safari 9 which returns 'object' for typed arrays and other constructors.\n    var tag = baseGetTag(value);\n    return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n  }\n\n  /**\n   * Checks if `value` is a valid array-like length.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n   * @example\n   *\n   * _.isLength(3);\n   * // => true\n   *\n   * _.isLength(Number.MIN_VALUE);\n   * // => false\n   *\n   * _.isLength(Infinity);\n   * // => false\n   *\n   * _.isLength('3');\n   * // => false\n   */\n  function isLength(value) {\n    return typeof value == 'number' &&\n      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject(value) {\n    var type = typeof value;\n    return value != null && (type == 'object' || type == 'function');\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike(value) {\n    return value != null && typeof value == 'object';\n  }\n\n  /**\n   * Checks if `value` is classified as a typed array.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n   * @example\n   *\n   * _.isTypedArray(new Uint8Array);\n   * // => true\n   *\n   * _.isTypedArray([]);\n   * // => false\n   */\n  var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n  /**\n   * Creates an array of the own enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects. See the\n   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * for more details.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keys(new Foo);\n   * // => ['a', 'b'] (iteration order is not guaranteed)\n   *\n   * _.keys('hi');\n   * // => ['0', '1']\n   */\n  function keys(object) {\n    return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n  }\n\n  /**\n   * This method returns a new empty array.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.13.0\n   * @category Util\n   * @returns {Array} Returns the new empty array.\n   * @example\n   *\n   * var arrays = _.times(2, _.stubArray);\n   *\n   * console.log(arrays);\n   * // => [[], []]\n   *\n   * console.log(arrays[0] === arrays[1]);\n   * // => false\n   */\n  function stubArray() {\n    return [];\n  }\n\n  /**\n   * This method returns `false`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.13.0\n   * @category Util\n   * @returns {boolean} Returns `false`.\n   * @example\n   *\n   * _.times(2, _.stubFalse);\n   * // => [false, false]\n   */\n  function stubFalse() {\n    return false;\n  }\n\n  module.exports = isEqual;\n  });\n\n  var dist$3 = createCommonjsModule$1(function (module, exports) {\n  !function(t,e){module.exports=e(dist$6,require$$2$1,require$$2,lodash_throttle,require$$1,require$$4,lodash_isequal);}(commonjsGlobal,(function(t,e,n,r,o,i,a){function l(t){return t&&\"object\"==typeof t&&\"default\"in t?t:{default:t}}var u=l(r),c=l(o),s=l(a);t.i18nAddResources(\"en\",{tableModule:{deleteCol:\"Delete column\",deleteRow:\"Delete row\",deleteTable:\"Delete table\",widthAuto:\"Width auto\",insertCol:\"Insert column\",insertRow:\"Insert row\",insertTable:\"Insert table\",header:\"Header\"}}),t.i18nAddResources(\"zh-CN\",{tableModule:{deleteCol:\"删除列\",deleteRow:\"删除行\",deleteTable:\"删除表格\",widthAuto:\"宽度自适应\",insertCol:\"插入列\",insertRow:\"插入行\",insertTable:\"插入表格\",header:\"表头\"}});var f=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function d(t){var e={exports:{}};return t(e,e.exports),e.exports}var p,v,h=function(t){return t&&t.Math==Math&&t},g=h(\"object\"==typeof globalThis&&globalThis)||h(\"object\"==typeof window&&window)||h(\"object\"==typeof self&&self)||h(\"object\"==typeof f&&f)||function(){return this}()||Function(\"return this\")(),y=function(t){try{return !!t()}catch(t){return !0}},m=!y((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),b=Function.prototype.call,E=b.bind?b.bind(b):function(){return b.apply(b,arguments)},w={}.propertyIsEnumerable,x=Object.getOwnPropertyDescriptor,S={f:x&&!w.call({1:2},1)?function(t){var e=x(this,t);return !!e&&e.enumerable}:w},T=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},D=Function.prototype,N=D.bind,P=D.call,M=N&&N.bind(P),R=N?function(t){return t&&M(P,t)}:function(t){return t&&function(){return P.apply(t,arguments)}},O=R({}.toString),H=R(\"\".slice),V=function(t){return H(O(t),8,-1)},z=g.Object,j=R(\"\".split),L=y((function(){return !z(\"z\").propertyIsEnumerable(0)}))?function(t){return \"String\"==V(t)?j(t,\"\"):z(t)}:z,A=g.TypeError,C=function(t){if(null==t)throw A(\"Can't call method on \"+t);return t},I=function(t){return L(C(t))},k=function(t){return \"function\"==typeof t},B=function(t){return \"object\"==typeof t?null!==t:k(t)},$=function(t){return k(t)?t:void 0},F=function(t,e){return arguments.length<2?$(g[t]):g[t]&&g[t][e]},q=R({}.isPrototypeOf),G=F(\"navigator\",\"userAgent\")||\"\",_=g.process,W=g.Deno,U=_&&_.versions||W&&W.version,X=U&&U.v8;X&&(v=(p=X.split(\".\"))[0]>0&&p[0]<4?1:+(p[0]+p[1])),!v&&G&&(!(p=G.match(/Edge\\/(\\d+)/))||p[1]>=74)&&(p=G.match(/Chrome\\/(\\d+)/))&&(v=+p[1]);var Y=v,K=!!Object.getOwnPropertySymbols&&!y((function(){var t=Symbol();return !String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Y&&Y<41})),J=K&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,Q=g.Object,Z=J?function(t){return \"symbol\"==typeof t}:function(t){var e=F(\"Symbol\");return k(e)&&q(e.prototype,Q(t))},tt=g.String,et=function(t){try{return tt(t)}catch(t){return \"Object\"}},nt=g.TypeError,rt=function(t){if(k(t))return t;throw nt(et(t)+\" is not a function\")},ot=function(t,e){var n=t[e];return null==n?void 0:rt(n)},it=g.TypeError,at=Object.defineProperty,lt=function(t,e){try{at(g,t,{value:e,configurable:!0,writable:!0});}catch(n){g[t]=e;}return e},ut=\"__core-js_shared__\",ct=g[ut]||lt(ut,{}),st=d((function(t){(t.exports=function(t,e){return ct[t]||(ct[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),ft=g.Object,dt=function(t){return ft(C(t))},pt=R({}.hasOwnProperty),vt=Object.hasOwn||function(t,e){return pt(dt(t),e)},ht=0,gt=Math.random(),yt=R(1..toString),mt=function(t){return \"Symbol(\"+(void 0===t?\"\":t)+\")_\"+yt(++ht+gt,36)},bt=st(\"wks\"),Et=g.Symbol,wt=Et&&Et.for,xt=J?Et:Et&&Et.withoutSetter||mt,St=function(t){if(!vt(bt,t)||!K&&\"string\"!=typeof bt[t]){var e=\"Symbol.\"+t;K&&vt(Et,t)?bt[t]=Et[t]:bt[t]=J&&wt?wt(e):xt(e);}return bt[t]},Tt=g.TypeError,Dt=St(\"toPrimitive\"),Nt=function(t,e){if(!B(t)||Z(t))return t;var n,r=ot(t,Dt);if(r){if(void 0===e&&(e=\"default\"),n=E(r,t,e),!B(n)||Z(n))return n;throw Tt(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var n,r;if(\"string\"===e&&k(n=t.toString)&&!B(r=E(n,t)))return r;if(k(n=t.valueOf)&&!B(r=E(n,t)))return r;if(\"string\"!==e&&k(n=t.toString)&&!B(r=E(n,t)))return r;throw it(\"Can't convert object to primitive value\")}(t,e)},Pt=function(t){var e=Nt(t,\"string\");return Z(e)?e:e+\"\"},Mt=g.document,Rt=B(Mt)&&B(Mt.createElement),Ot=function(t){return Rt?Mt.createElement(t):{}},Ht=!m&&!y((function(){return 7!=Object.defineProperty(Ot(\"div\"),\"a\",{get:function(){return 7}}).a})),Vt=Object.getOwnPropertyDescriptor,zt={f:m?Vt:function(t,e){if(t=I(t),e=Pt(e),Ht)try{return Vt(t,e)}catch(t){}if(vt(t,e))return T(!E(S.f,t,e),t[e])}},jt=g.String,Lt=g.TypeError,At=function(t){if(B(t))return t;throw Lt(jt(t)+\" is not an object\")},Ct=g.TypeError,It=Object.defineProperty,kt={f:m?It:function(t,e,n){if(At(t),e=Pt(e),At(n),Ht)try{return It(t,e,n)}catch(t){}if(\"get\"in n||\"set\"in n)throw Ct(\"Accessors not supported\");return \"value\"in n&&(t[e]=n.value),t}},Bt=m?function(t,e,n){return kt.f(t,e,T(1,n))}:function(t,e,n){return t[e]=n,t},$t=R(Function.toString);k(ct.inspectSource)||(ct.inspectSource=function(t){return $t(t)});var Ft,qt,Gt,_t=ct.inspectSource,Wt=g.WeakMap,Ut=k(Wt)&&/native code/.test(_t(Wt)),Xt=st(\"keys\"),Yt=function(t){return Xt[t]||(Xt[t]=mt(t))},Kt={},Jt=\"Object already initialized\",Qt=g.TypeError,Zt=g.WeakMap;if(Ut||ct.state){var te=ct.state||(ct.state=new Zt),ee=R(te.get),ne=R(te.has),re=R(te.set);Ft=function(t,e){if(ne(te,t))throw new Qt(Jt);return e.facade=t,re(te,t,e),e},qt=function(t){return ee(te,t)||{}},Gt=function(t){return ne(te,t)};}else {var oe=Yt(\"state\");Kt[oe]=!0,Ft=function(t,e){if(vt(t,oe))throw new Qt(Jt);return e.facade=t,Bt(t,oe,e),e},qt=function(t){return vt(t,oe)?t[oe]:{}},Gt=function(t){return vt(t,oe)};}var ie={set:Ft,get:qt,has:Gt,enforce:function(t){return Gt(t)?qt(t):Ft(t,{})},getterFor:function(t){return function(e){var n;if(!B(e)||(n=qt(e)).type!==t)throw Qt(\"Incompatible receiver, \"+t+\" required\");return n}}},ae=Function.prototype,le=m&&Object.getOwnPropertyDescriptor,ue=vt(ae,\"name\"),ce={EXISTS:ue,PROPER:ue&&\"something\"===function(){}.name,CONFIGURABLE:ue&&(!m||m&&le(ae,\"name\").configurable)},se=d((function(t){var e=ce.CONFIGURABLE,n=ie.get,r=ie.enforce,o=String(String).split(\"String\");(t.exports=function(t,n,i,a){var l,u=!!a&&!!a.unsafe,c=!!a&&!!a.enumerable,s=!!a&&!!a.noTargetGet,f=a&&void 0!==a.name?a.name:n;k(i)&&(\"Symbol(\"===String(f).slice(0,7)&&(f=\"[\"+String(f).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!vt(i,\"name\")||e&&i.name!==f)&&Bt(i,\"name\",f),(l=r(i)).source||(l.source=o.join(\"string\"==typeof f?f:\"\"))),t!==g?(u?!s&&t[n]&&(c=!0):delete t[n],c?t[n]=i:Bt(t,n,i)):c?t[n]=i:lt(n,i);})(Function.prototype,\"toString\",(function(){return k(this)&&n(this).source||_t(this)}));})),fe=Math.ceil,de=Math.floor,pe=function(t){var e=+t;return e!=e||0===e?0:(e>0?de:fe)(e)},ve=Math.max,he=Math.min,ge=function(t,e){var n=pe(t);return n<0?ve(n+e,0):he(n,e)},ye=Math.min,me=function(t){return t>0?ye(pe(t),9007199254740991):0},be=function(t){return me(t.length)},Ee=function(t){return function(e,n,r){var o,i=I(e),a=be(i),l=ge(r,a);if(t&&n!=n){for(;a>l;)if((o=i[l++])!=o)return !0}else for(;a>l;l++)if((t||l in i)&&i[l]===n)return t||l||0;return !t&&-1}},we={includes:Ee(!0),indexOf:Ee(!1)}.indexOf,xe=R([].push),Se=function(t,e){var n,r=I(t),o=0,i=[];for(n in r)!vt(Kt,n)&&vt(r,n)&&xe(i,n);for(;e.length>o;)vt(r,n=e[o++])&&(~we(i,n)||xe(i,n));return i},Te=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],De=Te.concat(\"length\",\"prototype\"),Ne={f:Object.getOwnPropertyNames||function(t){return Se(t,De)}},Pe={f:Object.getOwnPropertySymbols},Me=R([].concat),Re=F(\"Reflect\",\"ownKeys\")||function(t){var e=Ne.f(At(t)),n=Pe.f;return n?Me(e,n(t)):e},Oe=function(t,e){for(var n=Re(e),r=kt.f,o=zt.f,i=0;i<n.length;i++){var a=n[i];vt(t,a)||r(t,a,o(e,a));}},He=/#|\\.prototype\\./,Ve=function(t,e){var n=je[ze(t)];return n==Ae||n!=Le&&(k(e)?y(e):!!e)},ze=Ve.normalize=function(t){return String(t).replace(He,\".\").toLowerCase()},je=Ve.data={},Le=Ve.NATIVE=\"N\",Ae=Ve.POLYFILL=\"P\",Ce=Ve,Ie=zt.f,ke=function(t,e){var n,r,o,i,a,l=t.target,u=t.global,c=t.stat;if(n=u?g:c?g[l]||lt(l,{}):(g[l]||{}).prototype)for(r in e){if(i=e[r],o=t.noTargetGet?(a=Ie(n,r))&&a.value:n[r],!Ce(u?r:l+(c?\".\":\"#\")+r,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;Oe(i,o);}(t.sham||o&&o.sham)&&Bt(i,\"sham\",!0),se(n,r,i,t);}},Be={};Be[St(\"toStringTag\")]=\"z\";var $e,Fe=\"[object z]\"===String(Be),qe=St(\"toStringTag\"),Ge=g.Object,_e=\"Arguments\"==V(function(){return arguments}()),We=Fe?V:function(t){var e,n,r;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Ge(t),qe))?n:_e?V(e):\"Object\"==(r=V(e))&&k(e.callee)?\"Arguments\":r},Ue=g.String,Xe=function(t){if(\"Symbol\"===We(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return Ue(t)},Ye=/\"/g,Ke=R(\"\".replace);ke({target:\"String\",proto:!0,forced:($e=\"anchor\",y((function(){var t=\"\"[$e]('\"');return t!==t.toLowerCase()||t.split('\"').length>3})))},{anchor:function(t){return e=\"a\",n=\"name\",r=t,o=Xe(C(this)),i=\"<\"+e,\"\"!==n&&(i+=\" \"+n+'=\"'+Ke(Xe(r),Ye,\"&quot;\")+'\"'),i+\">\"+o+\"</\"+e+\">\";var e,n,r,o,i;}});var Je,Qe=function(){var t=At(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e},Ze=g.RegExp,tn=y((function(){var t=Ze(\"a\",\"y\");return t.lastIndex=2,null!=t.exec(\"abcd\")})),en=tn||y((function(){return !Ze(\"a\",\"y\").sticky})),nn={BROKEN_CARET:tn||y((function(){var t=Ze(\"^r\",\"gy\");return t.lastIndex=2,null!=t.exec(\"str\")})),MISSED_STICKY:en,UNSUPPORTED_Y:tn},rn=Object.keys||function(t){return Se(t,Te)},on=m?Object.defineProperties:function(t,e){At(t);for(var n,r=I(e),o=rn(e),i=o.length,a=0;i>a;)kt.f(t,n=o[a++],r[n]);return t},an=F(\"document\",\"documentElement\"),ln=Yt(\"IE_PROTO\"),un=function(){},cn=function(t){return \"<script>\"+t+\"</\"+\"script>\"},sn=function(t){t.write(cn(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},fn=function(){try{Je=new ActiveXObject(\"htmlfile\");}catch(t){}var t,e;fn=\"undefined\"!=typeof document?document.domain&&Je?sn(Je):((e=Ot(\"iframe\")).style.display=\"none\",an.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(cn(\"document.F=Object\")),t.close(),t.F):sn(Je);for(var n=Te.length;n--;)delete fn.prototype[Te[n]];return fn()};Kt[ln]=!0;var dn,pn,vn=Object.create||function(t,e){var n;return null!==t?(un.prototype=At(t),n=new un,un.prototype=null,n[ln]=t):n=fn(),void 0===e?n:on(n,e)},hn=g.RegExp,gn=y((function(){var t=hn(\".\",\"s\");return !(t.dotAll&&t.exec(\"\\n\")&&\"s\"===t.flags)})),yn=g.RegExp,mn=y((function(){var t=yn(\"(?<a>b)\",\"g\");return \"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$<a>c\")})),bn=ie.get,En=st(\"native-string-replace\",String.prototype.replace),wn=RegExp.prototype.exec,xn=wn,Sn=R(\"\".charAt),Tn=R(\"\".indexOf),Dn=R(\"\".replace),Nn=R(\"\".slice),Pn=(pn=/b*/g,E(wn,dn=/a/,\"a\"),E(wn,pn,\"a\"),0!==dn.lastIndex||0!==pn.lastIndex),Mn=nn.BROKEN_CARET,Rn=void 0!==/()??/.exec(\"\")[1];(Pn||Rn||Mn||gn||mn)&&(xn=function(t){var e,n,r,o,i,a,l,u=this,c=bn(u),s=Xe(t),f=c.raw;if(f)return f.lastIndex=u.lastIndex,e=E(xn,f,s),u.lastIndex=f.lastIndex,e;var d=c.groups,p=Mn&&u.sticky,v=E(Qe,u),h=u.source,g=0,y=s;if(p&&(v=Dn(v,\"y\",\"\"),-1===Tn(v,\"g\")&&(v+=\"g\"),y=Nn(s,u.lastIndex),u.lastIndex>0&&(!u.multiline||u.multiline&&\"\\n\"!==Sn(s,u.lastIndex-1))&&(h=\"(?: \"+h+\")\",y=\" \"+y,g++),n=new RegExp(\"^(?:\"+h+\")\",v)),Rn&&(n=new RegExp(\"^\"+h+\"$(?!\\\\s)\",v)),Pn&&(r=u.lastIndex),o=E(wn,p?n:u,y),p?o?(o.input=Nn(o.input,g),o[0]=Nn(o[0],g),o.index=u.lastIndex,u.lastIndex+=o[0].length):u.lastIndex=0:Pn&&o&&(u.lastIndex=u.global?o.index+o[0].length:r),Rn&&o&&o.length>1&&E(En,o[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0);})),o&&d)for(o.groups=a=vn(null),i=0;i<d.length;i++)a[(l=d[i])[0]]=o[l[1]];return o});var On=xn;ke({target:\"RegExp\",proto:!0,forced:/./.exec!==On},{exec:On});var Hn=Array.isArray||function(t){return \"Array\"==V(t)},Vn=function(){},zn=[],jn=F(\"Reflect\",\"construct\"),Ln=/^\\s*(?:class|function)\\b/,An=R(Ln.exec),Cn=!Ln.exec(Vn),In=function(t){if(!k(t))return !1;try{return jn(Vn,zn,t),!0}catch(t){return !1}},kn=!jn||y((function(){var t;return In(In.call)||!In(Object)||!In((function(){t=!0;}))||t}))?function(t){if(!k(t))return !1;switch(We(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Cn||!!An(Ln,_t(t))}:In,Bn=function(t,e,n){var r=Pt(e);r in t?kt.f(t,r,T(0,n)):t[r]=n;},$n=St(\"species\"),Fn=function(t){return Y>=51||!y((function(){var e=[];return (e.constructor={})[$n]=function(){return {foo:1}},1!==e[t](Boolean).foo}))},qn=R([].slice),Gn=Fn(\"slice\"),_n=St(\"species\"),Wn=g.Array,Un=Math.max;function Xn(t,e){var n=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)a.push(r.value);}catch(t){o={error:t};}finally{try{r&&!r.done&&(n=i.return)&&n.call(i);}finally{if(o)throw o.error}}return a}function Yn(n){var r=n.selection;if(null==r)return !1;var o=Xn(e.Editor.nodes(n,{match:function(e){return t.DomEditor.checkNodeType(e,\"table-cell\")}}),1)[0];if(o){var i=Xn(o,2)[1],a=e.Editor.start(n,i);if(e.Point.equals(r.anchor,a))return !0}return !1}function Kn(n,r){var o,i,a=e.Editor.nodes(n,{at:r,match:function(e){return \"table\"===t.DomEditor.getNodeType(e)}}),l=!1;try{for(var u=\n  /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n  function(t){var e=\"function\"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&\"number\"==typeof t.length)return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}(a),c=u.next();!c.done;c=u.next()){c.value;l=!0;}}catch(t){o={error:t};}finally{try{c&&!c.done&&(i=u.return)&&i.call(u);}finally{if(o)throw o.error}}return l}ke({target:\"Array\",proto:!0,forced:!Gn},{slice:function(t,e){var n,r,o,i=I(this),a=be(i),l=ge(t,a),u=ge(void 0===e?a:e,a);if(Hn(i)&&(n=i.constructor,(kn(n)&&(n===Wn||Hn(n.prototype))||B(n)&&null===(n=n[_n]))&&(n=void 0),n===Wn||void 0===n))return qn(i,l,u);for(r=new(void 0===n?Wn:n)(Un(u-l,0)),o=0;l<u;l++,o++)l in i&&Bn(r,o,i[l]);return r.length=o,r}});var Jn=R(R.bind),Qn=St(\"species\"),Zn=g.Array,tr=function(t,e){return new(function(t){var e;return Hn(t)&&(e=t.constructor,(kn(e)&&(e===Zn||Hn(e.prototype))||B(e)&&null===(e=e[Qn]))&&(e=void 0)),void 0===e?Zn:e}(t))(0===e?0:e)},er=R([].push),nr=function(t){var e=1==t,n=2==t,r=3==t,o=4==t,i=6==t,a=7==t,l=5==t||i;return function(u,c,s,f){for(var d,p,v=dt(u),h=L(v),g=function(t,e){return rt(t),void 0===e?t:Jn?Jn(t,e):function(){return t.apply(e,arguments)}}(c,s),y=be(h),m=0,b=f||tr,E=e?b(u,y):n||a?b(u,0):void 0;y>m;m++)if((l||m in h)&&(p=g(d=h[m],m,v),t))if(e)E[m]=p;else if(p)switch(t){case 3:return !0;case 5:return d;case 6:return m;case 2:er(E,d);}else switch(t){case 4:return !1;case 7:er(E,d);}return i?-1:r||o?o:E}},rr={forEach:nr(0),map:nr(1),filter:nr(2),some:nr(3),every:nr(4),find:nr(5),findIndex:nr(6),filterReject:nr(7)},or=rr.map;ke({target:\"Array\",proto:!0,forced:!Fn(\"map\")},{map:function(t){return or(this,t,arguments.length>1?arguments[1]:void 0)}});var ir=Fe?{}.toString:function(){return \"[object \"+We(this)+\"]\"};function ar(t){var e=t.children||[];return 0===e.length?[]:(e[0]||{}).children||[]}function lr(t){return ar(t).every((function(t){return !!t.isHeader}))}Fe||se(Object.prototype,\"toString\",ir,{unsafe:!0});var ur=ce.PROPER,cr=\"toString\",sr=RegExp.prototype,fr=sr.toString,dr=R(Qe),pr=y((function(){return \"/a/b\"!=fr.call({source:\"a\",flags:\"b\"})})),vr=ur&&fr.name!=cr;(pr||vr)&&se(RegExp.prototype,cr,(function(){var t=At(this),e=Xe(t.source),n=t.flags;return \"/\"+e+\"/\"+Xe(void 0===n&&q(sr,t)&&!(\"flags\"in sr)?dr(t):n)}),{unsafe:!0});var hr=St(\"unscopables\"),gr=Array.prototype;null==gr[hr]&&kt.f(gr,hr,{configurable:!0,value:vn(null)});var yr,mr=rr.find,br=\"find\",Er=!0;br in[]&&Array(1).find((function(){Er=!1;})),ke({target:\"Array\",proto:!0,forced:Er},{find:function(t){return mr(this,t,arguments.length>1?arguments[1]:void 0)}}),yr=br,gr[hr][yr]=!0;var wr=Function.prototype,xr=wr.apply,Sr=wr.bind,Tr=wr.call,Dr=\"object\"==typeof Reflect&&Reflect.apply||(Sr?Tr.bind(xr):function(){return Tr.apply(xr,arguments)}),Nr=St(\"species\"),Pr=RegExp.prototype,Mr=function(t,e,n,r){var o=St(t),i=!y((function(){var e={};return e[o]=function(){return 7},7!=\"\"[t](e)})),a=i&&!y((function(){var e=!1,n=/a/;return \"split\"===t&&((n={}).constructor={},n.constructor[Nr]=function(){return n},n.flags=\"\",n[o]=/./[o]),n.exec=function(){return e=!0,null},n[o](\"\"),!e}));if(!i||!a||n){var l=R(/./[o]),u=e(o,\"\"[t],(function(t,e,n,r,o){var a=R(t),u=e.exec;return u===On||u===Pr.exec?i&&!o?{done:!0,value:l(e,n,r)}:{done:!0,value:a(n,e,r)}:{done:!1}}));se(String.prototype,t,u[0]),se(Pr,o,u[1]);}r&&Bt(Pr[o],\"sham\",!0);},Rr=St(\"match\"),Or=g.TypeError,Hr=St(\"species\"),Vr=function(t,e){var n,r=At(t).constructor;return void 0===r||null==(n=At(r)[Hr])?e:function(t){if(kn(t))return t;throw Or(et(t)+\" is not a constructor\")}(n)},zr=R(\"\".charAt),jr=R(\"\".charCodeAt),Lr=R(\"\".slice),Ar=function(t){return function(e,n){var r,o,i=Xe(C(e)),a=pe(n),l=i.length;return a<0||a>=l?t?\"\":void 0:(r=jr(i,a))<55296||r>56319||a+1===l||(o=jr(i,a+1))<56320||o>57343?t?zr(i,a):r:t?Lr(i,a,a+2):o-56320+(r-55296<<10)+65536}},Cr={codeAt:Ar(!1),charAt:Ar(!0)}.charAt,Ir=function(t,e,n){return e+(n?Cr(t,e).length:1)},kr=g.Array,Br=Math.max,$r=function(t,e,n){for(var r=be(t),o=ge(e,r),i=ge(void 0===n?r:n,r),a=kr(Br(i-o,0)),l=0;o<i;o++,l++)Bn(a,l,t[o]);return a.length=l,a},Fr=g.TypeError,qr=function(t,e){var n=t.exec;if(k(n)){var r=E(n,t,e);return null!==r&&At(r),r}if(\"RegExp\"===V(t))return E(On,t,e);throw Fr(\"RegExp#exec called on incompatible receiver\")},Gr=nn.UNSUPPORTED_Y,_r=4294967295,Wr=Math.min,Ur=[].push,Xr=R(/./.exec),Yr=R(Ur),Kr=R(\"\".slice),Jr=!y((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n=\"ab\".split(t);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]}));Mr(\"split\",(function(t,e,n){var r;return r=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,n){var r,o,i=Xe(C(this)),a=void 0===n?_r:n>>>0;if(0===a)return [];if(void 0===t)return [i];if(!B(r=t)||!(void 0!==(o=r[Rr])?o:\"RegExp\"==V(r)))return E(e,i,t,a);for(var l,u,c,s=[],f=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),d=0,p=new RegExp(t.source,f+\"g\");(l=E(On,p,i))&&!((u=p.lastIndex)>d&&(Yr(s,Kr(i,d,l.index)),l.length>1&&l.index<i.length&&Dr(Ur,s,$r(l,1)),c=l[0].length,d=u,s.length>=a));)p.lastIndex===l.index&&p.lastIndex++;return d===i.length?!c&&Xr(p,\"\")||Yr(s,\"\"):Yr(s,Kr(i,d)),s.length>a?$r(s,0,a):s}:\"0\".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:E(e,this,t,n)}:e,[function(e,n){var o=C(this),i=null==e?void 0:ot(e,t);return i?E(i,e,o,n):E(r,Xe(o),e,n)},function(t,o){var i=At(this),a=Xe(t),l=n(r,i,a,o,r!==e);if(l.done)return l.value;var u=Vr(i,RegExp),c=i.unicode,s=(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(Gr?\"g\":\"y\"),f=new u(Gr?\"^(?:\"+i.source+\")\":i,s),d=void 0===o?_r:o>>>0;if(0===d)return [];if(0===a.length)return null===qr(f,a)?[a]:[];for(var p=0,v=0,h=[];v<a.length;){f.lastIndex=Gr?0:v;var g,y=qr(f,Gr?Kr(a,v):a);if(null===y||(g=Wr(me(f.lastIndex+(Gr?v:0)),a.length))===p)v=Ir(a,v,c);else {if(Yr(h,Kr(a,p,v)),h.length===d)return h;for(var m=1;m<=y.length-1;m++)if(Yr(h,y[m]),h.length===d)return h;v=p=g;}}return Yr(h,Kr(a,p)),h}]}),!Jr,Gr);var Qr=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\",Zr=R(\"\".replace),to=\"[\"+Qr+\"]\",eo=RegExp(\"^\"+to+to+\"*\"),no=RegExp(to+to+\"*$\"),ro=function(t){return function(e){var n=Xe(C(e));return 1&t&&(n=Zr(n,eo,\"\")),2&t&&(n=Zr(n,no,\"\")),n}},oo={start:ro(1),end:ro(2),trim:ro(3)},io=ce.PROPER,ao=oo.trim;function lo(t){return t.length?t[0].tagName.toLowerCase():\"\"}ke({target:\"String\",proto:!0,forced:function(t){return y((function(){return !!Qr[t]()||\"​᠎\"!==\"​᠎\"[t]()||io&&Qr[t].name!==t}))}(\"trim\")},{trim:function(){return ao(this)}}),ke({global:!0},{globalThis:g}),o.append&&(c.default.fn.append=o.append),o.on&&(c.default.fn.on=o.on),o.focus&&(c.default.fn.focus=o.focus),o.attr&&(c.default.fn.attr=o.attr),o.val&&(c.default.fn.val=o.val),o.html&&(c.default.fn.html=o.html),o.dataset&&(c.default.fn.dataset=o.dataset),o.addClass&&(c.default.fn.addClass=o.addClass),o.removeClass&&(c.default.fn.removeClass=o.removeClass),o.children&&(c.default.fn.children=o.children),o.each&&(c.default.fn.each=o.each),o.find&&(c.default.fn.find=o.find);var uo=!1,co=0,so=0,fo=null,po=null,vo=c.default(\"body\");function ho(t){uo=!1,po=null,fo=null,vo.off(\"mousemove\",go),vo.off(\"mouseup\",ho);}vo.on(\"mousedown\",(function(t){var e=t.target;if((\"TH\"===e.tagName||\"TD\"===e.tagName)&&\"col-resize\"===e.style.cursor){e.style.cursor=\"auto\",t.preventDefault(),uo=!0;var n=t.clientX;co=n;var r=e.getBoundingClientRect().width;so=r,vo.on(\"mousemove\",go),vo.on(\"mouseup\",ho);}}));var go=u.default((function(t){if(uo&&null!=po&&null!=fo){t.preventDefault();var n=t.clientX,r=so+(n-co);(r=Math.floor(100*r)/100)<30&&(r=30),e.Transforms.setNodes(po,{width:r.toString()},{at:fo});}}),100);var yo={type:\"table\",renderElem:function(r,o,i){var a=function(n,r){if(n.isDisabled())return !1;var o=n.selection;if(null==o)return !0;if(e.Range.isCollapsed(o))return !0;var i=o.anchor,a=o.focus,l=t.DomEditor.findPath(n,r),u=e.Editor.start(n,l),c=e.Editor.end(n,l),s=e.Point.compare(i,c)<=0&&e.Point.compare(i,u)>=0,f=e.Point.compare(a,c)<=0&&e.Point.compare(a,u)>=0;return !!(s&&f&&e.Path.equals(i.path.slice(0,3),a.path.slice(0,3)))}(i,r),l=r.width,u=void 0===l?\"auto\":l,c=t.DomEditor.isNodeSelected(i,r),s=ar(r),f=n.jsx(\"div\",{className:\"table-container\",\"data-selected\":c,on:{mousedown:function(n){if(\"DIV\"===n.target.tagName&&n.preventDefault(),!i.isDisabled()){var o=t.DomEditor.findPath(i,r),a=e.Editor.start(i,o),l=i.selection;if(null!=l)l.anchor.path[0]!==o[0]&&i.select(a);else i.select(a);}}}},n.jsx(\"table\",{width:u,contentEditable:a},n.jsx(\"colgroup\",null,s.map((function(t){var e=t.width,r=void 0===e?\"auto\":e;return n.jsx(\"col\",{width:r})}))),n.jsx(\"tbody\",null,o)));return f}},mo={type:\"table-row\",renderElem:function(t,e,r){return n.jsx(\"tr\",null,e)}},bo={type:\"table-cell\",renderElem:function(e,r,o){var i=function(e,n){var r=t.DomEditor.getParentNode(e,n);if(null==r)return !1;var o=t.DomEditor.getParentNode(e,r);return null!=o&&ar(o).some((function(t){return t===n}))}(o,e),a=e,l=a.colSpan,c=void 0===l?1:l,s=a.rowSpan,f=void 0===s?1:s,d=a.isHeader,p=void 0!==d&&d;if(!i)return n.jsx(\"td\",{colSpan:c,rowSpan:f},r);var v=p?\"th\":\"td\",h=n.jsx(v,{colSpan:c,rowSpan:f,style:{borderRightWidth:\"3px\"},on:{mousemove:u.default((function(n){var r=this.elm;if(null!=r){var i=r.getBoundingClientRect(),a=i.left,l=i.width,u=i.top,c=i.height,s=n.clientX,f=n.clientY;if(!uo)s>a+l-5&&s<a+l&&(f>u&&f<u+c)?(r.style.cursor=\"col-resize\",po=o,fo=t.DomEditor.findPath(o,e)):uo||(r.style.cursor=\"auto\",po=null,fo=null);}}),100)}},r);return h}};var Eo={type:\"table\",elemToHtml:function(t,e){var n=t.width;return '<table style=\"width: '+(void 0===n?\"auto\":n)+';\"><tbody>'+e+\"</tbody></table>\"}},wo={type:\"table-row\",elemToHtml:function(t,e){return \"<tr>\"+e+\"</tr>\"}},xo={type:\"table-cell\",elemToHtml:function(t,e){var n=t,r=n.colSpan,o=void 0===r?1:r,i=n.rowSpan,a=void 0===i?1:i,l=n.isHeader,u=void 0!==l&&l,c=n.width,s=u?\"th\":\"td\";return \"<\"+s+' colSpan=\"'+o+'\" rowSpan=\"'+a+'\" width=\"'+(void 0===c?\"auto\":c)+'\">'+e+\"</\"+s+\">\"}};var So={selector:\"table\",preParseHtml:function(t){var e=c.default(t);if(\"table\"!==lo(e))return t;var n=e.find(\"tbody\");if(0===n.length)return t;var r=e.find(\"tr\");return e.append(r),n.remove(),e[0]}},To=rr.filter;ke({target:\"Array\",proto:!0,forced:!Fn(\"filter\")},{filter:function(t){return To(this,t,arguments.length>1?arguments[1]:void 0)}});var Do=Math.floor,No=R(\"\".charAt),Po=R(\"\".replace),Mo=R(\"\".slice),Ro=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,Oo=/\\$([$&'`]|\\d{1,2})/g,Ho=function(t,e,n,r,o,i){var a=n+t.length,l=r.length,u=Oo;return void 0!==o&&(o=dt(o),u=Ro),Po(i,u,(function(i,u){var c;switch(No(u,0)){case\"$\":return \"$\";case\"&\":return t;case\"`\":return Mo(e,0,n);case\"'\":return Mo(e,a);case\"<\":c=o[Mo(u,1,-1)];break;default:var s=+u;if(0===s)return i;if(s>l){var f=Do(s/10);return 0===f?i:f<=l?void 0===r[f-1]?No(u,1):r[f-1]+No(u,1):i}c=r[s-1];}return void 0===c?\"\":c}))},Vo=St(\"replace\"),zo=Math.max,jo=Math.min,Lo=R([].concat),Ao=R([].push),Co=R(\"\".indexOf),Io=R(\"\".slice),ko=\"$0\"===\"a\".replace(/./,\"$0\"),Bo=!!/./[Vo]&&\"\"===/./[Vo](\"a\",\"$0\");Mr(\"replace\",(function(t,e,n){var r=Bo?\"$\":\"$0\";return [function(t,n){var r=C(this),o=null==t?void 0:ot(t,Vo);return o?E(o,t,r,n):E(e,Xe(r),t,n)},function(t,o){var i=At(this),a=Xe(t);if(\"string\"==typeof o&&-1===Co(o,r)&&-1===Co(o,\"$<\")){var l=n(e,i,a,o);if(l.done)return l.value}var u=k(o);u||(o=Xe(o));var c=i.global;if(c){var s=i.unicode;i.lastIndex=0;}for(var f=[];;){var d=qr(i,a);if(null===d)break;if(Ao(f,d),!c)break;\"\"===Xe(d[0])&&(i.lastIndex=Ir(a,me(i.lastIndex),s));}for(var p,v=\"\",h=0,g=0;g<f.length;g++){for(var y=Xe((d=f[g])[0]),m=zo(jo(pe(d.index),a.length),0),b=[],E=1;E<d.length;E++)Ao(b,void 0===(p=d[E])?p:String(p));var w=d.groups;if(u){var x=Lo([y],b,m,a);void 0!==w&&Ao(x,w);var S=Xe(Dr(o,void 0,x));}else S=Ho(y,a,m,b,w,o);m>=h&&(v+=Io(a,h,m)+S,h=m+y.length);}return v+Io(a,h)}]}),!!y((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")}))||!ko||Bo);var $o={selector:\"td:not([data-w-e-type]),th:not([data-w-e-type])\",parseElemHtml:function(t,n,r){var o=c.default(t);0===(n=n.filter((function(t){return !!e.Text.isText(t)||!!r.isInline(t)}))).length&&(n=[{text:o.text().replace(/\\s+/gm,\" \")}]);var i=parseInt(o.attr(\"colSpan\")||\"1\"),a=parseInt(o.attr(\"rowSpan\")||\"1\"),l=o.attr(\"width\")||\"auto\";return {type:\"table-cell\",isHeader:\"th\"===lo(o),colSpan:i,rowSpan:a,width:l,children:n}}};var Fo={selector:\"tr:not([data-w-e-type])\",parseElemHtml:function(e,n,r){return {type:\"table-row\",children:n.filter((function(e){return \"table-cell\"===t.DomEditor.getNodeType(e)}))}}};var qo={selector:\"table:not([data-w-e-type])\",parseElemHtml:function(e,n,r){var o=c.default(e),i=\"auto\";return \"100%\"===function(t,e){for(var n=\"\",r=(t.attr(\"style\")||\"\").split(\";\"),o=r.length,i=0;i<o;i++){var a=r[i];if(a){var l=a.split(\":\");l[0].trim()===e&&(n=l[1].trim());}}return n}(o,\"width\")&&(i=\"100%\"),\"100%\"===o.attr(\"width\")&&(i=\"100%\"),{type:\"table\",width:i,children:n.filter((function(e){return \"table-row\"===t.DomEditor.getNodeType(e)}))}}};var Go=function(){function n(){this.title=t.t(\"tableModule.insertTable\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64v896h1024V64H0z m384 576v-192h256v192h-256z m256 64v192h-256v-192h256z m0-512v192h-256V192h256zM320 192v192H64V192h256z m-256 256h256v192H64v-192z m640 0h256v192h-256v-192z m0-64V192h256v192h-256zM64 704h256v192H64v-192z m640 192v-192h256v192h-256z\"></path></svg>',this.tag=\"button\",this.showDropPanel=!0,this.$content=null;}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.exec=function(t,e){},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||!!t.DomEditor.getSelectedElems(n).some((function(e){var r=t.DomEditor.getNodeType(e);return \"pre\"===r||(\"table\"===r||(\"list-item\"===r||!!n.isVoid(e)))})))},n.prototype.getPanelContentElem=function(t){var e=this;if(this.$content)return this.$content[0];for(var n=c.default('<div class=\"w-e-panel-content-table\"></div>'),r=c.default(\"<span>0 &times; 0</span>\"),o=c.default(\"<table></table>\"),i=0;i<10;i++){for(var a=c.default(\"<tr></tr>\"),l=0;l<10;l++){var u=c.default(\"<td></td>\");u.attr(\"data-x\",l.toString()),u.attr(\"data-y\",i.toString()),a.append(u),u.on(\"mouseenter\",(function(t){var e=t.target;if(null!=e){var n=c.default(e).dataset(),i=n.x,a=n.y;r[0].innerHTML=i+1+\" &times; \"+(a+1),o.children().each((function(t){c.default(t).children().each((function(t){var e=c.default(t),n=e.dataset(),r=n.x,o=n.y;r<=i&&o<=a?e.addClass(\"active\"):e.removeClass(\"active\");}));}));}})),u.on(\"click\",(function(n){n.preventDefault();var r=n.target;if(null!=r){var o=c.default(r).dataset(),i=o.x,a=o.y;e.insertTable(t,a+1,i+1);}}));}o.append(a);}return n.append(o),n.append(r),this.$content=n,n[0]},n.prototype.insertTable=function(n,r,o){var i=parseInt(r,10),a=parseInt(o,10);if(i&&a&&!(i<=0||a<=0)){t.DomEditor.isSelectedEmptyParagraph(n)&&e.Transforms.removeNodes(n,{mode:\"highest\"});var l=function(t,e){for(var n=[],r=0;r<t;r++){for(var o=[],i=0;i<e;i++){var a={type:\"table-cell\",children:[{text:\"\"}]};0===r&&(a.isHeader=!0),o.push(a);}n.push({type:\"table-row\",children:o});}return {type:\"table\",width:\"auto\",children:n}}(i,a);e.Transforms.insertNodes(n,l,{mode:\"highest\"});}},n}(),_o=function(){function n(){this.title=t.t(\"tableModule.deleteTable\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M826.8032 356.5312c-19.328 0-36.3776 15.6928-36.3776 35.0464v524.2624c0 19.328-16 34.56-35.328 34.56H264.9344c-19.328 0-35.5072-15.3088-35.5072-34.56V390.0416c0-19.328-14.1568-35.0464-33.5104-35.0464s-33.5104 15.6928-33.5104 35.0464V915.712c0 57.9328 44.6208 108.288 102.528 108.288H755.2c57.9328 0 108.0832-50.4576 108.0832-108.288V391.4752c-0.1024-19.2512-17.1264-34.944-36.48-34.944z\" p-id=\"9577\"></path><path d=\"M437.1712 775.7568V390.6048c0-19.328-14.1568-35.0464-33.5104-35.0464s-33.5104 15.616-33.5104 35.0464v385.152c0 19.328 14.1568 35.0464 33.5104 35.0464s33.5104-15.7184 33.5104-35.0464zM649.7024 775.7568V390.6048c0-19.328-17.0496-35.0464-36.3776-35.0464s-36.3776 15.616-36.3776 35.0464v385.152c0 19.328 17.0496 35.0464 36.3776 35.0464s36.3776-15.7184 36.3776-35.0464zM965.0432 217.0368h-174.6176V145.5104c0-57.9328-47.2064-101.76-104.6528-101.76h-350.976c-57.8304 0-105.3952 43.8528-105.3952 101.76v71.5264H54.784c-19.4304 0-35.0464 14.1568-35.0464 33.5104 0 19.328 15.616 33.5104 35.0464 33.5104h910.3616c19.328 0 35.0464-14.1568 35.0464-33.5104 0-19.3536-15.6928-33.5104-35.1488-33.5104z m-247.3728 0H297.3952V145.5104c0-19.328 18.2016-34.7648 37.4272-34.7648h350.976c19.1488 0 31.872 15.1296 31.872 34.7648v71.5264z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.isDisabled=function(e){return null==e.selection||null==t.DomEditor.getSelectedNodeByType(e,\"table\")},n.prototype.exec=function(t,n){this.isDisabled(t)||e.Transforms.removeNodes(t,{mode:\"highest\"});},n}(),Wo=function(){function n(){this.title=t.t(\"tableModule.insertRow\"),this.iconSvg='<svg viewBox=\"0 0 1048 1024\"><path d=\"M707.7888 521.0112h-147.456v-147.456H488.2432v147.456h-147.456v68.8128h147.456v147.456h72.0896v-147.456h147.456zM0 917.504V0h1048.576v917.504H0zM327.68 65.536H65.536v196.608H327.68V65.536z m327.68 0H393.216v196.608h262.144V65.536z m327.68 0h-262.144v196.608h262.144V65.536z m0 258.8672H65.536v462.0288H983.04V324.4032z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||null==t.DomEditor.getSelectedNodeByType(n,\"table\"))},n.prototype.exec=function(n,r){if(!this.isDisabled(n)){var o=Xn(e.Editor.nodes(n,{match:function(e){return t.DomEditor.checkNodeType(e,\"table-cell\")},universal:!0}),1),i=Xn(o[0],2),a=i[0],l=i[1],u=t.DomEditor.getParentNode(n,a),c=(null==u?void 0:u.children.length)||0;if(0!==c){for(var s={type:\"table-row\",children:[]},f=0;f<c;f++){s.children.push({type:\"table-cell\",children:[{text:\"\"}]});}var d=e.Path.parent(l),p=e.Path.next(d);e.Transforms.insertNodes(n,s,{at:p});}}},n}(),Uo=function(){function n(){this.title=t.t(\"tableModule.deleteRow\"),this.iconSvg='<svg viewBox=\"0 0 1048 1024\"><path d=\"M907.6736 586.5472L747.1104 425.984l163.84-163.84-78.6432-78.6432-163.84 163.84L507.904 186.7776 429.2608 262.144l163.84 163.84-167.1168 167.1168 78.6432 78.6432 167.1168-167.1168 160.5632 160.5632 75.3664-78.6432zM0 917.504V0h1048.576v917.504H0z m983.04-327.68h-22.9376l-65.536-65.536H983.04V327.68h-91.7504l65.536-65.536h26.2144V65.536H65.536v196.608h317.8496l65.536 65.536H65.536v196.608h380.1088l-65.536 65.536H65.536v196.608H983.04v-196.608z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||null==t.DomEditor.getSelectedNodeByType(n,\"table-row\"))},n.prototype.exec=function(n,r){if(!this.isDisabled(n)){var o=Xn(e.Editor.nodes(n,{match:function(e){return t.DomEditor.checkNodeType(e,\"table-row\")},universal:!0}),1),i=Xn(o[0],2),a=i[0],l=i[1],u=t.DomEditor.getParentNode(n,a);((null==u?void 0:u.children.length)||0)<=1?e.Transforms.removeNodes(n,{mode:\"highest\"}):e.Transforms.removeNodes(n,{at:l});}},n}(),Xo={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Yo=Ot(\"span\").classList,Ko=Yo&&Yo.constructor&&Yo.constructor.prototype,Jo=Ko===Object.prototype?void 0:Ko,Qo=rr.forEach,Zo=function(t,e){var n=[][t];return !!n&&y((function(){n.call(null,e||function(){throw 1},1);}))}(\"forEach\"),ti=Zo?[].forEach:function(t){return Qo(this,t,arguments.length>1?arguments[1]:void 0)},ei=function(t){if(t&&t.forEach!==ti)try{Bt(t,\"forEach\",ti);}catch(e){t.forEach=ti;}};for(var ni in Xo)Xo[ni]&&ei(g[ni]&&g[ni].prototype);ei(Jo);var ri=function(){function n(){this.title=t.t(\"tableModule.insertCol\"),this.iconSvg='<svg viewBox=\"0 0 1048 1024\"><path d=\"M327.68 193.3312v186.7776H140.9024v91.7504H327.68v186.7776h88.4736V471.8592h190.0544V380.1088H416.1536V193.3312zM0 917.504V0h1048.576v917.504H0zM655.36 65.536H65.536v720.896H655.36V65.536z m327.68 0h-262.144v196.608h262.144V65.536z m0 262.144h-262.144v196.608h262.144V327.68z m0 262.144h-262.144v196.608h262.144v-196.608z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||null==t.DomEditor.getSelectedNodeByType(n,\"table\"))},n.prototype.exec=function(n,r){if(!this.isDisabled(n)){var o=Xn(e.Editor.nodes(n,{match:function(e){return t.DomEditor.checkNodeType(e,\"table-cell\")},universal:!0}),1),i=Xn(o[0],2),a=i[0],l=i[1],u=t.DomEditor.getParentNode(n,a);if(null!=u){var c=t.DomEditor.getParentNode(n,u);if(null!=c)(c.children||[]).forEach((function(r,o){e.Element.isElement(r)&&(r.children||[]).forEach((function(r){var i=t.DomEditor.findPath(n,r);if(i.length===l.length&&s.default(i.slice(-1),l.slice(-1))){var a={type:\"table-cell\",children:[{text:\"\"}]};0===o&&lr(c)&&(a.isHeader=!0),e.Transforms.insertNodes(n,a,{at:i});}}));}));}}},n}(),oi=function(){function n(){this.title=t.t(\"tableModule.deleteCol\"),this.iconSvg='<svg viewBox=\"0 0 1048 1024\"><path d=\"M327.68 510.976L393.216 445.44v-13.1072L327.68 366.7968V510.976z m327.68-78.4384l65.536-65.536V507.904L655.36 442.368v-9.8304z m393.216 484.9664V0H0v917.504h1048.576z m-65.536-131.072h-262.144v-52.4288l-13.1072 13.1072-52.4288-52.4288v91.7504H393.216v-91.7504l-52.4288 52.4288-13.1072-13.1072v52.4288H65.536V65.536H327.68v121.2416l36.0448-36.0448 29.4912 29.4912V62.2592h262.144V180.224l49.152-49.152 16.384 16.384V62.2592h262.144V786.432z m-294.912-108.1344l-160.5632-160.5632-167.1168 167.1168-78.6432-78.6432 167.1168-167.1168L288.3584 278.528l78.6432-78.6432 160.5632 160.5632 163.84-163.84 78.6432 78.6432-163.84 163.84 160.5632 160.5632-78.6432 78.6432z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||null==t.DomEditor.getSelectedNodeByType(n,\"table-cell\"))},n.prototype.exec=function(n,r){if(!this.isDisabled(n)){var o=Xn(e.Editor.nodes(n,{match:function(e){return t.DomEditor.checkNodeType(e,\"table-cell\")},universal:!0}),1),i=Xn(o[0],2),a=i[0],l=i[1],u=t.DomEditor.getParentNode(n,a),c=(null==u?void 0:u.children.length)||0;if(!u||c<=1)e.Transforms.removeNodes(n,{mode:\"highest\"});else {var f=t.DomEditor.getParentNode(n,u);if(null!=f)(f.children||[]).forEach((function(r){e.Element.isElement(r)&&(r.children||[]).forEach((function(r){var o=t.DomEditor.findPath(n,r);o.length===l.length&&s.default(o.slice(-1),l.slice(-1))&&e.Transforms.removeNodes(n,{at:o});}));}));}}},n}(),ii=function(){function n(){this.title=t.t(\"tableModule.header\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M704 128l-64 0L384 128 320 128 0 128l0 256 0 64 0 192 0 64 0 256 320 0 64 0 256 0 64 0 320 0 0-256 0-64L1024 448 1024 384 1024 128 704 128zM640 640 384 640 384 448l256 0L640 640zM64 448l256 0 0 192L64 640 64 448zM320 896 64 896l0-192 256 0L320 896zM640 896 384 896l0-192 256 0L640 896zM960 896l-256 0 0-192 256 0L960 896zM960 640l-256 0L704 448l256 0L960 640z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(e){var n=t.DomEditor.getSelectedNodeByType(e,\"table\");return null!=n&&lr(n)},n.prototype.isActive=function(t){return !!this.getValue(t)},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||null==t.DomEditor.getSelectedNodeByType(n,\"table\"))},n.prototype.exec=function(n,r){if(!this.isDisabled(n)){var o=!r,i=t.DomEditor.getSelectedNodeByType(n,\"table\");if(null!=i)ar(i).forEach((function(r){return e.Transforms.setNodes(n,{isHeader:o},{at:t.DomEditor.findPath(n,r)})}));}},n}(),ai=function(){function n(){this.title=t.t(\"tableModule.widthAuto\"),this.iconSvg='<svg viewBox=\"0 0 1228 1024\"><path d=\"M862.514337 563.200461H404.581995v121.753478a13.311987 13.311987 0 0 1-6.655993 11.468789 10.23999 10.23999 0 0 1-12.083188-1.433599l-204.799795-179.199821a13.721586 13.721586 0 0 1 0-20.479979l204.799795-179.302221a10.23999 10.23999 0 0 1 12.185588-1.535998 13.209587 13.209587 0 0 1 6.553593 11.673588v115.097485h457.932342V319.693504a11.571188 11.571188 0 0 1 18.841582-10.239989l204.799795 179.19982a13.721586 13.721586 0 0 1 0 20.47998l-204.799795 179.199821a10.23999 10.23999 0 0 1-12.185588 1.535998 13.311987 13.311987 0 0 1-6.655994-11.571188V563.200461zM136.499064 14.951409v993.893406a15.257585 15.257585 0 0 1-15.155185 15.052785H15.155185A15.155185 15.155185 0 0 1 0 1008.844815V14.951409a15.257585 15.257585 0 0 1 15.155185-15.052785h106.086294a15.155185 15.155185 0 0 1 15.257585 15.155185zM1228.798771 14.951409v993.893406a15.257585 15.257585 0 0 1-15.155185 15.052785h-106.188693a15.155185 15.155185 0 0 1-15.155185-15.052785V14.951409a15.257585 15.257585 0 0 1 15.155185-15.052785h106.086293A15.155185 15.155185 0 0 1 1228.798771 15.053809z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(e){var n=t.DomEditor.getSelectedNodeByType(e,\"table\");return null!=n&&\"100%\"===n.width},n.prototype.isActive=function(t){return !!this.getValue(t)},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||null==t.DomEditor.getSelectedNodeByType(n,\"table\"))},n.prototype.exec=function(t,n){if(!this.isDisabled(t)){var r={width:n?\"auto\":\"100%\"};e.Transforms.setNodes(t,r,{mode:\"highest\"});}},n}(),li={renderElems:[yo,mo,bo],elemsToHtml:[Eo,wo,xo],preParseHtml:[So],parseElemsHtml:[$o,Fo,qo],menus:[{key:\"insertTable\",factory:function(){return new Go}},{key:\"deleteTable\",factory:function(){return new _o}},{key:\"insertTableRow\",factory:function(){return new Wo}},{key:\"deleteTableRow\",factory:function(){return new Uo}},{key:\"insertTableCol\",factory:function(){return new ri}},{key:\"deleteTableCol\",factory:function(){return new oi}},{key:\"tableHeader\",factory:function(){return new ii}},{key:\"tableFullWidth\",factory:function(){return new ai}}],editorPlugin:function(n){var r=n.insertBreak,o=n.deleteBackward,i=n.deleteForward,a=n.normalizeNode,l=n.insertData,u=n.handleTab,c=n.selectAll,s=n;return s.insertBreak=function(){null==t.DomEditor.getSelectedNodeByType(s,\"table\")?r():s.insertText(\"\\n\");},s.deleteBackward=function(t){if(!Yn(s)){var n=s.selection;if(n){var r=e.Editor.before(s,n);if(r){var i=Kn(s,r),a=Kn(s,n);if(i&&!a)return}}o(t);}},s.handleTab=function(){var r;if(t.DomEditor.getSelectedNodeByType(s,\"table\")){var o=e.Editor.above(n);t.DomEditor.checkNodeType(o[0],\"table-cell\")&&e.Transforms.select(n,o[1]);var i=e.Editor.next(n);if(i)i[0]&&i[0].text&&(i=null!==(r=e.Editor.above(n,{at:i[1]}))&&void 0!==r?r:i),e.Transforms.select(n,i[1]);else {var a=s.children||[],l=a.length;if(t.DomEditor.checkNodeType(a[l-1],\"table\")){var c=t.DomEditor.genEmptyParagraph();e.Transforms.insertNodes(s,c,{at:[l]}),s.handleTab();}}}else u();},s.deleteForward=function(t){Yn(s)||i(t);},s.normalizeNode=function(n){var r=Xn(n,2),o=r[0],i=r[1];if(\"table\"!==t.DomEditor.getNodeType(o))return a([o,i]);if(t.DomEditor.isLastNode(s,o)){var l=t.DomEditor.genEmptyParagraph();e.Transforms.insertNodes(s,l,{at:[i[0]+1]});}},s.insertData=function(n){if(null!=t.DomEditor.getSelectedNodeByType(s,\"table\")){var r=n.getData(\"text/plain\");\"\\n\"===r||/<img[^>]+>/.test(n.getData(\"text/html\"))?l(n):e.Editor.insertText(s,r);}else l(n);},s.selectAll=function(){var n=s.selection;if(null!=n){var r=t.DomEditor.getSelectedNodeByType(s,\"table-cell\");if(null!=r){var o=n.anchor,i=n.focus;if(e.Path.equals(o.path.slice(0,3),i.path.slice(0,3)))if(0!==e.Node.string(r).length){var a=t.DomEditor.findPath(s,r),l={anchor:e.Editor.start(s,a),focus:e.Editor.end(s,a)};s.select(l);}else c();else c();}else c();}else c();},s}};return li}));\n\n  });\n\n  var dist$2 = createCommonjsModule$1(function (module, exports) {\n  !function(t,e){module.exports=e(dist$6,require$$2$1,require$$2,require$$1,require$$4);}(commonjsGlobal,(function(t,e,n,r,o){function i(t){return t&&\"object\"==typeof t&&\"default\"in t?t:{default:t}}var u=i(r);t.i18nAddResources(\"en\",{videoModule:{delete:\"Delete\",uploadVideo:\"Upload video\",insertVideo:\"Insert video\",videoSrc:\"Video source\",videoSrcPlaceHolder:\"Video file url, or third-party <iframe>\",videoPoster:\"Video poster\",videoPosterPlaceHolder:\"Poster image url\",ok:\"Ok\",editSize:\"Edit size\",width:\"Width\",height:\"Height\"}}),t.i18nAddResources(\"zh-CN\",{videoModule:{delete:\"删除视频\",uploadVideo:\"上传视频\",insertVideo:\"插入视频\",videoSrc:\"视频地址\",videoSrcPlaceHolder:\"视频文件 url 或第三方 <iframe>\",videoPoster:\"视频封面\",videoPosterPlaceHolder:\"封面图片 url\",ok:\"确定\",editSize:\"修改尺寸\",width:\"宽度\",height:\"高度\"}});\n  /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n  var a=function(){return a=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},a.apply(this,arguments)};function c(t,e,n,r){return new(n||(n=Promise))((function(o,i){function u(t){try{c(r.next(t));}catch(t){i(t);}}function a(t){try{c(r.throw(t));}catch(t){i(t);}}function c(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e);}))).then(u,a);}c((r=r.apply(t,e||[])).next());}))}function f(t,e){var n,r,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError(\"Generator is already executing.\");for(;u;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,r=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!(o=u.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){u.label=i[1];break}if(6===i[0]&&u.label<o[1]){u.label=o[1],o=i;break}if(o&&u.label<o[2]){u.label=o[2],u.ops.push(i);break}o[2]&&u.ops.pop(),u.trys.pop();continue}i=e.call(t,u);}catch(t){i=[6,t],r=0;}finally{n=o=0;}if(5&i[0])throw i[1];return {value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}function s(t){var e=\"function\"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&\"number\"==typeof t.length)return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}function l(t,e){var n=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),u=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)u.push(r.value);}catch(t){o={error:t};}finally{try{r&&!r.done&&(n=i.return)&&n.call(i);}finally{if(o)throw o.error}}return u}function d(t){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=s(t),e={},r(\"next\"),r(\"throw\"),r(\"return\"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,o){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n});}),e);})(r,o,(e=t[n](e)).done,e.value);}))};}}var p=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function v(t){var e={exports:{}};return t(e,e.exports),e.exports}var h,y,g=function(t){return t&&t.Math==Math&&t},m=g(\"object\"==typeof globalThis&&globalThis)||g(\"object\"==typeof window&&window)||g(\"object\"==typeof self&&self)||g(\"object\"==typeof p&&p)||function(){return this}()||Function(\"return this\")(),b=function(t){try{return !!t()}catch(t){return !0}},w=!b((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),S=Function.prototype.call,x=S.bind?S.bind(S):function(){return S.apply(S,arguments)},E={}.propertyIsEnumerable,O=Object.getOwnPropertyDescriptor,j={f:O&&!E.call({1:2},1)?function(t){var e=O(this,t);return !!e&&e.enumerable}:E},I=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},P=Function.prototype,T=P.bind,M=P.call,A=T&&T.bind(M),R=T?function(t){return t&&A(M,t)}:function(t){return t&&function(){return M.apply(t,arguments)}},k=R({}.toString),C=R(\"\".slice),N=function(t){return C(k(t),8,-1)},L=m.Object,V=R(\"\".split),D=b((function(){return !L(\"z\").propertyIsEnumerable(0)}))?function(t){return \"String\"==N(t)?V(t,\"\"):L(t)}:L,z=m.TypeError,F=function(t){if(null==t)throw z(\"Can't call method on \"+t);return t},_=function(t){return D(F(t))},$=function(t){return \"function\"==typeof t},H=function(t){return \"object\"==typeof t?null!==t:$(t)},B=function(t){return $(t)?t:void 0},G=function(t,e){return arguments.length<2?B(m[t]):m[t]&&m[t][e]},W=R({}.isPrototypeOf),U=G(\"navigator\",\"userAgent\")||\"\",q=m.process,K=m.Deno,X=q&&q.versions||K&&K.version,Y=X&&X.v8;Y&&(y=(h=Y.split(\".\"))[0]>0&&h[0]<4?1:+(h[0]+h[1])),!y&&U&&(!(h=U.match(/Edge\\/(\\d+)/))||h[1]>=74)&&(h=U.match(/Chrome\\/(\\d+)/))&&(y=+h[1]);var J=y,Q=!!Object.getOwnPropertySymbols&&!b((function(){var t=Symbol();return !String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&J&&J<41})),Z=Q&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,tt=m.Object,et=Z?function(t){return \"symbol\"==typeof t}:function(t){var e=G(\"Symbol\");return $(e)&&W(e.prototype,tt(t))},nt=m.String,rt=function(t){try{return nt(t)}catch(t){return \"Object\"}},ot=m.TypeError,it=function(t){if($(t))return t;throw ot(rt(t)+\" is not a function\")},ut=function(t,e){var n=t[e];return null==n?void 0:it(n)},at=m.TypeError,ct=Object.defineProperty,ft=function(t,e){try{ct(m,t,{value:e,configurable:!0,writable:!0});}catch(n){m[t]=e;}return e},st=\"__core-js_shared__\",lt=m[st]||ft(st,{}),dt=v((function(t){(t.exports=function(t,e){return lt[t]||(lt[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),pt=m.Object,vt=function(t){return pt(F(t))},ht=R({}.hasOwnProperty),yt=Object.hasOwn||function(t,e){return ht(vt(t),e)},gt=0,mt=Math.random(),bt=R(1..toString),wt=function(t){return \"Symbol(\"+(void 0===t?\"\":t)+\")_\"+bt(++gt+mt,36)},St=dt(\"wks\"),xt=m.Symbol,Et=xt&&xt.for,Ot=Z?xt:xt&&xt.withoutSetter||wt,jt=function(t){if(!yt(St,t)||!Q&&\"string\"!=typeof St[t]){var e=\"Symbol.\"+t;Q&&yt(xt,t)?St[t]=xt[t]:St[t]=Z&&Et?Et(e):Ot(e);}return St[t]},It=m.TypeError,Pt=jt(\"toPrimitive\"),Tt=function(t,e){if(!H(t)||et(t))return t;var n,r=ut(t,Pt);if(r){if(void 0===e&&(e=\"default\"),n=x(r,t,e),!H(n)||et(n))return n;throw It(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var n,r;if(\"string\"===e&&$(n=t.toString)&&!H(r=x(n,t)))return r;if($(n=t.valueOf)&&!H(r=x(n,t)))return r;if(\"string\"!==e&&$(n=t.toString)&&!H(r=x(n,t)))return r;throw at(\"Can't convert object to primitive value\")}(t,e)},Mt=function(t){var e=Tt(t,\"string\");return et(e)?e:e+\"\"},At=m.document,Rt=H(At)&&H(At.createElement),kt=function(t){return Rt?At.createElement(t):{}},Ct=!w&&!b((function(){return 7!=Object.defineProperty(kt(\"div\"),\"a\",{get:function(){return 7}}).a})),Nt=Object.getOwnPropertyDescriptor,Lt={f:w?Nt:function(t,e){if(t=_(t),e=Mt(e),Ct)try{return Nt(t,e)}catch(t){}if(yt(t,e))return I(!x(j.f,t,e),t[e])}},Vt=m.String,Dt=m.TypeError,zt=function(t){if(H(t))return t;throw Dt(Vt(t)+\" is not an object\")},Ft=m.TypeError,_t=Object.defineProperty,$t={f:w?_t:function(t,e,n){if(zt(t),e=Mt(e),zt(n),Ct)try{return _t(t,e,n)}catch(t){}if(\"get\"in n||\"set\"in n)throw Ft(\"Accessors not supported\");return \"value\"in n&&(t[e]=n.value),t}},Ht=w?function(t,e,n){return $t.f(t,e,I(1,n))}:function(t,e,n){return t[e]=n,t},Bt=R(Function.toString);$(lt.inspectSource)||(lt.inspectSource=function(t){return Bt(t)});var Gt,Wt,Ut,qt=lt.inspectSource,Kt=m.WeakMap,Xt=$(Kt)&&/native code/.test(qt(Kt)),Yt=dt(\"keys\"),Jt=function(t){return Yt[t]||(Yt[t]=wt(t))},Qt={},Zt=\"Object already initialized\",te=m.TypeError,ee=m.WeakMap;if(Xt||lt.state){var ne=lt.state||(lt.state=new ee),re=R(ne.get),oe=R(ne.has),ie=R(ne.set);Gt=function(t,e){if(oe(ne,t))throw new te(Zt);return e.facade=t,ie(ne,t,e),e},Wt=function(t){return re(ne,t)||{}},Ut=function(t){return oe(ne,t)};}else {var ue=Jt(\"state\");Qt[ue]=!0,Gt=function(t,e){if(yt(t,ue))throw new te(Zt);return e.facade=t,Ht(t,ue,e),e},Wt=function(t){return yt(t,ue)?t[ue]:{}},Ut=function(t){return yt(t,ue)};}var ae={set:Gt,get:Wt,has:Ut,enforce:function(t){return Ut(t)?Wt(t):Gt(t,{})},getterFor:function(t){return function(e){var n;if(!H(e)||(n=Wt(e)).type!==t)throw te(\"Incompatible receiver, \"+t+\" required\");return n}}},ce=Function.prototype,fe=w&&Object.getOwnPropertyDescriptor,se=yt(ce,\"name\"),le={EXISTS:se,PROPER:se&&\"something\"===function(){}.name,CONFIGURABLE:se&&(!w||w&&fe(ce,\"name\").configurable)},de=v((function(t){var e=le.CONFIGURABLE,n=ae.get,r=ae.enforce,o=String(String).split(\"String\");(t.exports=function(t,n,i,u){var a,c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,s=!!u&&!!u.noTargetGet,l=u&&void 0!==u.name?u.name:n;$(i)&&(\"Symbol(\"===String(l).slice(0,7)&&(l=\"[\"+String(l).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!yt(i,\"name\")||e&&i.name!==l)&&Ht(i,\"name\",l),(a=r(i)).source||(a.source=o.join(\"string\"==typeof l?l:\"\"))),t!==m?(c?!s&&t[n]&&(f=!0):delete t[n],f?t[n]=i:Ht(t,n,i)):f?t[n]=i:ft(n,i);})(Function.prototype,\"toString\",(function(){return $(this)&&n(this).source||qt(this)}));})),pe=Math.ceil,ve=Math.floor,he=function(t){var e=+t;return e!=e||0===e?0:(e>0?ve:pe)(e)},ye=Math.max,ge=Math.min,me=function(t,e){var n=he(t);return n<0?ye(n+e,0):ge(n,e)},be=Math.min,we=function(t){return t>0?be(he(t),9007199254740991):0},Se=function(t){return we(t.length)},xe=function(t){return function(e,n,r){var o,i=_(e),u=Se(i),a=me(r,u);if(t&&n!=n){for(;u>a;)if((o=i[a++])!=o)return !0}else for(;u>a;a++)if((t||a in i)&&i[a]===n)return t||a||0;return !t&&-1}},Ee={includes:xe(!0),indexOf:xe(!1)},Oe=Ee.indexOf,je=R([].push),Ie=function(t,e){var n,r=_(t),o=0,i=[];for(n in r)!yt(Qt,n)&&yt(r,n)&&je(i,n);for(;e.length>o;)yt(r,n=e[o++])&&(~Oe(i,n)||je(i,n));return i},Pe=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],Te=Pe.concat(\"length\",\"prototype\"),Me={f:Object.getOwnPropertyNames||function(t){return Ie(t,Te)}},Ae={f:Object.getOwnPropertySymbols},Re=R([].concat),ke=G(\"Reflect\",\"ownKeys\")||function(t){var e=Me.f(zt(t)),n=Ae.f;return n?Re(e,n(t)):e},Ce=function(t,e){for(var n=ke(e),r=$t.f,o=Lt.f,i=0;i<n.length;i++){var u=n[i];yt(t,u)||r(t,u,o(e,u));}},Ne=/#|\\.prototype\\./,Le=function(t,e){var n=De[Ve(t)];return n==Fe||n!=ze&&($(e)?b(e):!!e)},Ve=Le.normalize=function(t){return String(t).replace(Ne,\".\").toLowerCase()},De=Le.data={},ze=Le.NATIVE=\"N\",Fe=Le.POLYFILL=\"P\",_e=Le,$e=Lt.f,He=function(t,e){var n,r,o,i,u,a=t.target,c=t.global,f=t.stat;if(n=c?m:f?m[a]||ft(a,{}):(m[a]||{}).prototype)for(r in e){if(i=e[r],o=t.noTargetGet?(u=$e(n,r))&&u.value:n[r],!_e(c?r:a+(f?\".\":\"#\")+r,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;Ce(i,o);}(t.sham||o&&o.sham)&&Ht(i,\"sham\",!0),de(n,r,i,t);}},Be={};Be[jt(\"toStringTag\")]=\"z\";var Ge,We=\"[object z]\"===String(Be),Ue=jt(\"toStringTag\"),qe=m.Object,Ke=\"Arguments\"==N(function(){return arguments}()),Xe=We?N:function(t){var e,n,r;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=qe(t),Ue))?n:Ke?N(e):\"Object\"==(r=N(e))&&$(e.callee)?\"Arguments\":r},Ye=m.String,Je=function(t){if(\"Symbol\"===Xe(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return Ye(t)},Qe=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\",Ze=R(\"\".replace),tn=\"[\"+Qe+\"]\",en=RegExp(\"^\"+tn+tn+\"*\"),nn=RegExp(tn+tn+\"*$\"),rn=function(t){return function(e){var n=Je(F(e));return 1&t&&(n=Ze(n,en,\"\")),2&t&&(n=Ze(n,nn,\"\")),n}},on={start:rn(1),end:rn(2),trim:rn(3)},un=le.PROPER,an=on.trim;function cn(t){return t.length?t[0].tagName.toLowerCase():\"\"}function fn(t,e,n){void 0===e&&(e=\"auto\"),void 0===n&&(n=\"auto\");var r=u.default(t);return r.attr(\"width\",e),r.attr(\"height\",n),r[0].outerHTML}He({target:\"String\",proto:!0,forced:(Ge=\"trim\",b((function(){return !!Qe[Ge]()||\"​᠎\"!==\"​᠎\"[Ge]()||un&&Qe[Ge].name!==Ge})))},{trim:function(){return an(this)}}),He({global:!0},{globalThis:m}),r.append&&(u.default.fn.append=r.append),r.on&&(u.default.fn.on=r.on),r.focus&&(u.default.fn.focus=r.focus),r.attr&&(u.default.fn.attr=r.attr),r.val&&(u.default.fn.val=r.val),r.html&&(u.default.fn.html=r.html),r.parent&&(u.default.fn.parent=r.parent),r.hasClass&&(u.default.fn.hasClass=r.hasClass),r.empty&&(u.default.fn.empty=r.empty);var sn={type:\"video\",renderElem:function(e,r,o){var i,u=e,a=u.src,c=void 0===a?\"\":a,f=u.poster,s=void 0===f?\"\":f,l=u.width,d=void 0===l?\"auto\":l,p=u.height,v=void 0===p?\"auto\":p,h=t.DomEditor.isNodeSelected(o,e);if(0===c.trim().indexOf(\"<iframe \")){var y=fn(c,d,v);i=n.jsx(\"div\",{className:\"w-e-textarea-video-container\",\"data-selected\":h?\"true\":\"\",innerHTML:y});}else {var g=n.jsx(\"video\",{poster:s,controls:!0},n.jsx(\"source\",{src:c,type:\"video/mp4\"}),\"Sorry, your browser doesn't support embedded videos.\\n 抱歉，浏览器不支持 video 视频\");\"auto\"!==d&&(g.data.width=d),\"auto\"!==v&&(g.data.height=v),i=n.jsx(\"div\",{className:\"w-e-textarea-video-container\",\"data-selected\":h?\"true\":\"\"},g);}return n.h(\"div\",{props:{contentEditable:!1},on:{mousedown:function(t){return t.preventDefault()}}},i)}};var ln,dn={type:\"video\",elemToHtml:function(t,e){var n=t,r=n.src,o=void 0===r?\"\":r,i=n.poster,u=void 0===i?\"\":i,a=n.width,c=void 0===a?\"auto\":a,f=n.height,s=void 0===f?\"auto\":f,l='<div data-w-e-type=\"video\" data-w-e-is-void>\\n';return 0===o.trim().indexOf(\"<iframe \")?l+=fn(o,c,s):l+='<video poster=\"'+u+'\" controls=\"true\" width=\"'+c+'\" height=\"'+s+'\"><source src=\"'+o+'\" type=\"video/mp4\"/></video>',l+=\"\\n</div>\"}},pn=Object.keys||function(t){return Ie(t,Pe)},vn=w?Object.defineProperties:function(t,e){zt(t);for(var n,r=_(e),o=pn(e),i=o.length,u=0;i>u;)$t.f(t,n=o[u++],r[n]);return t},hn=G(\"document\",\"documentElement\"),yn=Jt(\"IE_PROTO\"),gn=function(){},mn=function(t){return \"<script>\"+t+\"</\"+\"script>\"},bn=function(t){t.write(mn(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},wn=function(){try{ln=new ActiveXObject(\"htmlfile\");}catch(t){}var t,e;wn=\"undefined\"!=typeof document?document.domain&&ln?bn(ln):((e=kt(\"iframe\")).style.display=\"none\",hn.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(mn(\"document.F=Object\")),t.close(),t.F):bn(ln);for(var n=Pe.length;n--;)delete wn.prototype[Pe[n]];return wn()};Qt[yn]=!0;var Sn=Object.create||function(t,e){var n;return null!==t?(gn.prototype=zt(t),n=new gn,gn.prototype=null,n[yn]=t):n=wn(),void 0===e?n:vn(n,e)},xn=jt(\"unscopables\"),En=Array.prototype;null==En[xn]&&$t.f(En,xn,{configurable:!0,value:Sn(null)});var On=function(t){En[xn][t]=!0;},jn=Ee.includes;He({target:\"Array\",proto:!0},{includes:function(t){return jn(this,t,arguments.length>1?arguments[1]:void 0)}}),On(\"includes\");var In={selector:\"iframe,video,p\",preParseHtml:function(t){var e=u.default(t),n=e;if(\"p\"===cn(e)){var r=e.children();if(1===r.length){var o=r[0],i=o.tagName.toLowerCase();[\"iframe\",\"video\"].includes(i)&&(n=u.default(o));}}var a=cn(n);if(\"iframe\"!==a&&\"video\"!==a)return n[0];if(\"video\"===n.parent().attr(\"data-w-e-type\"))return n[0];var c=u.default('<div data-w-e-type=\"video\" data-w-e-is-void></div>');return c.append(n),c[0]}},Pn=R(R.bind),Tn=function(t,e){return it(t),void 0===e?t:Pn?Pn(t,e):function(){return t.apply(e,arguments)}},Mn=Array.isArray||function(t){return \"Array\"==N(t)},An=function(){},Rn=[],kn=G(\"Reflect\",\"construct\"),Cn=/^\\s*(?:class|function)\\b/,Nn=R(Cn.exec),Ln=!Cn.exec(An),Vn=function(t){if(!$(t))return !1;try{return kn(An,Rn,t),!0}catch(t){return !1}},Dn=!kn||b((function(){var t;return Vn(Vn.call)||!Vn(Object)||!Vn((function(){t=!0;}))||t}))?function(t){if(!$(t))return !1;switch(Xe(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Ln||!!Nn(Cn,qt(t))}:Vn,zn=jt(\"species\"),Fn=m.Array,_n=function(t,e){return new(function(t){var e;return Mn(t)&&(e=t.constructor,(Dn(e)&&(e===Fn||Mn(e.prototype))||H(e)&&null===(e=e[zn]))&&(e=void 0)),void 0===e?Fn:e}(t))(0===e?0:e)},$n=R([].push),Hn=function(t){var e=1==t,n=2==t,r=3==t,o=4==t,i=6==t,u=7==t,a=5==t||i;return function(c,f,s,l){for(var d,p,v=vt(c),h=D(v),y=Tn(f,s),g=Se(h),m=0,b=l||_n,w=e?b(c,g):n||u?b(c,0):void 0;g>m;m++)if((a||m in h)&&(p=y(d=h[m],m,v),t))if(e)w[m]=p;else if(p)switch(t){case 3:return !0;case 5:return d;case 6:return m;case 2:$n(w,d);}else switch(t){case 4:return !1;case 7:$n(w,d);}return i?-1:r||o?o:w}},Bn={forEach:Hn(0),map:Hn(1),filter:Hn(2),some:Hn(3),every:Hn(4),find:Hn(5),findIndex:Hn(6),filterReject:Hn(7)},Gn=Bn.find,Wn=\"find\",Un=!0;Wn in[]&&Array(1).find((function(){Un=!1;})),He({target:\"Array\",proto:!0,forced:Un},{find:function(t){return Gn(this,t,arguments.length>1?arguments[1]:void 0)}}),On(Wn);var qn=We?{}.toString:function(){return \"[object \"+Xe(this)+\"]\"};function Kn(t,e,n,r){return void 0===e&&(e=\"\"),void 0===n&&(n=\"auto\"),void 0===r&&(r=\"auto\"),{type:\"video\",src:t,poster:e,width:n,height:r,children:[{text:\"\"}]}}We||de(Object.prototype,\"toString\",qn,{unsafe:!0});var Xn,Yn,Jn={selector:'div[data-w-e-type=\"video\"]',parseElemHtml:function(t,e,n){var r=u.default(t),o=\"\",i=\"\",a=\"auto\",c=\"auto\",f=r.find(\"iframe\");if(f.length>0)return a=f.attr(\"width\")||\"auto\",c=f.attr(\"height\")||\"auto\",Kn(o=f[0].outerHTML,i,a,c);var s=r.find(\"video\");return (o=s.attr(\"src\")||\"\")||s.length>0&&(o=s.find(\"source\").attr(\"src\")||\"\"),a=s.attr(\"width\")||\"auto\",c=s.attr(\"height\")||\"auto\",Kn(o,i=s.attr(\"poster\")||\"\",a,c)}},Qn=function(){var t=zt(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e},Zn=m.RegExp,tr=b((function(){var t=Zn(\"a\",\"y\");return t.lastIndex=2,null!=t.exec(\"abcd\")})),er=tr||b((function(){return !Zn(\"a\",\"y\").sticky})),nr={BROKEN_CARET:tr||b((function(){var t=Zn(\"^r\",\"gy\");return t.lastIndex=2,null!=t.exec(\"str\")})),MISSED_STICKY:er,UNSUPPORTED_Y:tr},rr=m.RegExp,or=b((function(){var t=rr(\".\",\"s\");return !(t.dotAll&&t.exec(\"\\n\")&&\"s\"===t.flags)})),ir=m.RegExp,ur=b((function(){var t=ir(\"(?<a>b)\",\"g\");return \"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$<a>c\")})),ar=ae.get,cr=dt(\"native-string-replace\",String.prototype.replace),fr=RegExp.prototype.exec,sr=fr,lr=R(\"\".charAt),dr=R(\"\".indexOf),pr=R(\"\".replace),vr=R(\"\".slice),hr=(Yn=/b*/g,x(fr,Xn=/a/,\"a\"),x(fr,Yn,\"a\"),0!==Xn.lastIndex||0!==Yn.lastIndex),yr=nr.BROKEN_CARET,gr=void 0!==/()??/.exec(\"\")[1];(hr||gr||yr||or||ur)&&(sr=function(t){var e,n,r,o,i,u,a,c=this,f=ar(c),s=Je(t),l=f.raw;if(l)return l.lastIndex=c.lastIndex,e=x(sr,l,s),c.lastIndex=l.lastIndex,e;var d=f.groups,p=yr&&c.sticky,v=x(Qn,c),h=c.source,y=0,g=s;if(p&&(v=pr(v,\"y\",\"\"),-1===dr(v,\"g\")&&(v+=\"g\"),g=vr(s,c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&\"\\n\"!==lr(s,c.lastIndex-1))&&(h=\"(?: \"+h+\")\",g=\" \"+g,y++),n=new RegExp(\"^(?:\"+h+\")\",v)),gr&&(n=new RegExp(\"^\"+h+\"$(?!\\\\s)\",v)),hr&&(r=c.lastIndex),o=x(fr,p?n:c,g),p?o?(o.input=vr(o.input,y),o[0]=vr(o[0],y),o.index=c.lastIndex,c.lastIndex+=o[0].length):c.lastIndex=0:hr&&o&&(c.lastIndex=c.global?o.index+o[0].length:r),gr&&o&&o.length>1&&x(cr,o[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0);})),o&&d)for(o.groups=u=Sn(null),i=0;i<d.length;i++)u[(a=d[i])[0]]=o[a[1]];return o});var mr=sr;He({target:\"RegExp\",proto:!0,forced:/./.exec!==mr},{exec:mr});var br=Function.prototype,wr=br.apply,Sr=br.bind,xr=br.call,Er=\"object\"==typeof Reflect&&Reflect.apply||(Sr?xr.bind(wr):function(){return xr.apply(wr,arguments)}),Or=jt(\"species\"),jr=RegExp.prototype,Ir=R(\"\".charAt),Pr=R(\"\".charCodeAt),Tr=R(\"\".slice),Mr=function(t){return function(e,n){var r,o,i=Je(F(e)),u=he(n),a=i.length;return u<0||u>=a?t?\"\":void 0:(r=Pr(i,u))<55296||r>56319||u+1===a||(o=Pr(i,u+1))<56320||o>57343?t?Ir(i,u):r:t?Tr(i,u,u+2):o-56320+(r-55296<<10)+65536}},Ar={codeAt:Mr(!1),charAt:Mr(!0)},Rr=Ar.charAt,kr=function(t,e,n){return e+(n?Rr(t,e).length:1)},Cr=Math.floor,Nr=R(\"\".charAt),Lr=R(\"\".replace),Vr=R(\"\".slice),Dr=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,zr=/\\$([$&'`]|\\d{1,2})/g,Fr=function(t,e,n,r,o,i){var u=n+t.length,a=r.length,c=zr;return void 0!==o&&(o=vt(o),c=Dr),Lr(i,c,(function(i,c){var f;switch(Nr(c,0)){case\"$\":return \"$\";case\"&\":return t;case\"`\":return Vr(e,0,n);case\"'\":return Vr(e,u);case\"<\":f=o[Vr(c,1,-1)];break;default:var s=+c;if(0===s)return i;if(s>a){var l=Cr(s/10);return 0===l?i:l<=a?void 0===r[l-1]?Nr(c,1):r[l-1]+Nr(c,1):i}f=r[s-1];}return void 0===f?\"\":f}))},_r=m.TypeError,$r=function(t,e){var n=t.exec;if($(n)){var r=x(n,t,e);return null!==r&&zt(r),r}if(\"RegExp\"===N(t))return x(mr,t,e);throw _r(\"RegExp#exec called on incompatible receiver\")},Hr=jt(\"replace\"),Br=Math.max,Gr=Math.min,Wr=R([].concat),Ur=R([].push),qr=R(\"\".indexOf),Kr=R(\"\".slice),Xr=\"$0\"===\"a\".replace(/./,\"$0\"),Yr=!!/./[Hr]&&\"\"===/./[Hr](\"a\",\"$0\");function Jr(t){return void 0===t&&(t=\"r\"),t+\"-\"+o.nanoid()}!function(t,e,n,r){var o=jt(t),i=!b((function(){var e={};return e[o]=function(){return 7},7!=\"\"[t](e)})),u=i&&!b((function(){var e=!1,n=/a/;return \"split\"===t&&((n={}).constructor={},n.constructor[Or]=function(){return n},n.flags=\"\",n[o]=/./[o]),n.exec=function(){return e=!0,null},n[o](\"\"),!e}));if(!i||!u||n){var a=R(/./[o]),c=e(o,\"\"[t],(function(t,e,n,r,o){var u=R(t),c=e.exec;return c===mr||c===jr.exec?i&&!o?{done:!0,value:a(e,n,r)}:{done:!0,value:u(n,e,r)}:{done:!1}}));de(String.prototype,t,c[0]),de(jr,o,c[1]);}r&&Ht(jr[o],\"sham\",!0);}(\"replace\",(function(t,e,n){var r=Yr?\"$\":\"$0\";return [function(t,n){var r=F(this),o=null==t?void 0:ut(t,Hr);return o?x(o,t,r,n):x(e,Je(r),t,n)},function(t,o){var i=zt(this),u=Je(t);if(\"string\"==typeof o&&-1===qr(o,r)&&-1===qr(o,\"$<\")){var a=n(e,i,u,o);if(a.done)return a.value}var c=$(o);c||(o=Je(o));var f=i.global;if(f){var s=i.unicode;i.lastIndex=0;}for(var l=[];;){var d=$r(i,u);if(null===d)break;if(Ur(l,d),!f)break;\"\"===Je(d[0])&&(i.lastIndex=kr(u,we(i.lastIndex),s));}for(var p,v=\"\",h=0,y=0;y<l.length;y++){for(var g=Je((d=l[y])[0]),m=Br(Gr(he(d.index),u.length),0),b=[],w=1;w<d.length;w++)Ur(b,void 0===(p=d[w])?p:String(p));var S=d.groups;if(c){var x=Wr([g],b,m,u);void 0!==S&&Ur(x,S);var E=Je(Er(o,void 0,x));}else E=Fr(g,u,m,b,S,o);m>=h&&(v+=Kr(u,h,m)+E,h=m+g.length);}return v+Kr(u,h)}]}),!!b((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")}))||!Xr||Yr);var Qr=m.Promise,Zr=function(t,e,n){for(var r in e)de(t,r,e[r],n);return t},to=m.String,eo=m.TypeError,no=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,n={};try{(t=R(Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set))(n,[]),e=n instanceof Array;}catch(t){}return function(n,r){return zt(n),function(t){if(\"object\"==typeof t||$(t))return t;throw eo(\"Can't set \"+to(t)+\" as a prototype\")}(r),e?t(n,r):n.__proto__=r,n}}():void 0),ro=$t.f,oo=jt(\"toStringTag\"),io=function(t,e,n){t&&!yt(t=n?t:t.prototype,oo)&&ro(t,oo,{configurable:!0,value:e});},uo=jt(\"species\"),ao=m.TypeError,co=function(t,e){if(W(e,t))return t;throw ao(\"Incorrect invocation\")},fo={},so=jt(\"iterator\"),lo=Array.prototype,po=jt(\"iterator\"),vo=function(t){if(null!=t)return ut(t,po)||ut(t,\"@@iterator\")||fo[Xe(t)]},ho=m.TypeError,yo=function(t,e,n){var r,o;zt(t);try{if(!(r=ut(t,\"return\"))){if(\"throw\"===e)throw n;return n}r=x(r,t);}catch(t){o=!0,r=t;}if(\"throw\"===e)throw n;if(o)throw r;return zt(r),n},go=m.TypeError,mo=function(t,e){this.stopped=t,this.result=e;},bo=mo.prototype,wo=function(t,e,n){var r,o,i,u,a,c,f,s,l=n&&n.that,d=!(!n||!n.AS_ENTRIES),p=!(!n||!n.IS_ITERATOR),v=!(!n||!n.INTERRUPTED),h=Tn(e,l),y=function(t){return r&&yo(r,\"normal\",t),new mo(!0,t)},g=function(t){return d?(zt(t),v?h(t[0],t[1],y):h(t[0],t[1])):v?h(t,y):h(t)};if(p)r=t;else {if(!(o=vo(t)))throw go(rt(t)+\" is not iterable\");if(void 0!==(s=o)&&(fo.Array===s||lo[so]===s)){for(i=0,u=Se(t);u>i;i++)if((a=g(t[i]))&&W(bo,a))return a;return new mo(!1)}r=function(t,e){var n=arguments.length<2?vo(t):e;if(it(n))return zt(x(n,t));throw ho(rt(t)+\" is not iterable\")}(t,o);}for(c=r.next;!(f=x(c,r)).done;){try{a=g(f.value);}catch(t){yo(r,\"throw\",t);}if(\"object\"==typeof a&&a&&W(bo,a))return a}return new mo(!1)},So=jt(\"iterator\"),xo=!1;try{var Eo=0,Oo={next:function(){return {done:!!Eo++}},return:function(){xo=!0;}};Oo[So]=function(){return this},Array.from(Oo,(function(){throw 2}));}catch(t){}var jo,Io,Po,To,Mo=function(t,e){if(!e&&!xo)return !1;var n=!1;try{var r={};r[So]=function(){return {next:function(){return {done:n=!0}}}},t(r);}catch(t){}return n},Ao=m.TypeError,Ro=jt(\"species\"),ko=function(t,e){var n,r=zt(t).constructor;return void 0===r||null==(n=zt(r)[Ro])?e:function(t){if(Dn(t))return t;throw Ao(rt(t)+\" is not a constructor\")}(n)},Co=R([].slice),No=/(?:ipad|iphone|ipod).*applewebkit/i.test(U),Lo=\"process\"==N(m.process),Vo=m.setImmediate,Do=m.clearImmediate,zo=m.process,Fo=m.Dispatch,_o=m.Function,$o=m.MessageChannel,Ho=m.String,Bo=0,Go={},Wo=\"onreadystatechange\";try{jo=m.location;}catch(t){}var Uo=function(t){if(yt(Go,t)){var e=Go[t];delete Go[t],e();}},qo=function(t){return function(){Uo(t);}},Ko=function(t){Uo(t.data);},Xo=function(t){m.postMessage(Ho(t),jo.protocol+\"//\"+jo.host);};Vo&&Do||(Vo=function(t){var e=Co(arguments,1);return Go[++Bo]=function(){Er($(t)?t:_o(t),void 0,e);},Io(Bo),Bo},Do=function(t){delete Go[t];},Lo?Io=function(t){zo.nextTick(qo(t));}:Fo&&Fo.now?Io=function(t){Fo.now(qo(t));}:$o&&!No?(To=(Po=new $o).port2,Po.port1.onmessage=Ko,Io=Tn(To.postMessage,To)):m.addEventListener&&$(m.postMessage)&&!m.importScripts&&jo&&\"file:\"!==jo.protocol&&!b(Xo)?(Io=Xo,m.addEventListener(\"message\",Ko,!1)):Io=Wo in kt(\"script\")?function(t){hn.appendChild(kt(\"script\")).onreadystatechange=function(){hn.removeChild(this),Uo(t);};}:function(t){setTimeout(qo(t),0);});var Yo,Jo,Qo,Zo,ti,ei,ni,ri,oi={set:Vo,clear:Do},ii=/ipad|iphone|ipod/i.test(U)&&void 0!==m.Pebble,ui=/web0s(?!.*chrome)/i.test(U),ai=Lt.f,ci=oi.set,fi=m.MutationObserver||m.WebKitMutationObserver,si=m.document,li=m.process,di=m.Promise,pi=ai(m,\"queueMicrotask\"),vi=pi&&pi.value;vi||(Yo=function(){var t,e;for(Lo&&(t=li.domain)&&t.exit();Jo;){e=Jo.fn,Jo=Jo.next;try{e();}catch(t){throw Jo?Zo():Qo=void 0,t}}Qo=void 0,t&&t.enter();},No||Lo||ui||!fi||!si?!ii&&di&&di.resolve?((ni=di.resolve(void 0)).constructor=di,ri=Tn(ni.then,ni),Zo=function(){ri(Yo);}):Lo?Zo=function(){li.nextTick(Yo);}:(ci=Tn(ci,m),Zo=function(){ci(Yo);}):(ti=!0,ei=si.createTextNode(\"\"),new fi(Yo).observe(ei,{characterData:!0}),Zo=function(){ei.data=ti=!ti;}));var hi,yi,gi,mi,bi=vi||function(t){var e={fn:t,next:void 0};Qo&&(Qo.next=e),Jo||(Jo=e,Zo()),Qo=e;},wi=function(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError(\"Bad Promise constructor\");e=t,n=r;})),this.resolve=it(e),this.reject=it(n);},Si={f:function(t){return new wi(t)}},xi=function(t){try{return {error:!1,value:t()}}catch(t){return {error:!0,value:t}}},Ei=\"object\"==typeof window,Oi=oi.set,ji=jt(\"species\"),Ii=\"Promise\",Pi=ae.getterFor(Ii),Ti=ae.set,Mi=ae.getterFor(Ii),Ai=Qr&&Qr.prototype,Ri=Qr,ki=Ai,Ci=m.TypeError,Ni=m.document,Li=m.process,Vi=Si.f,Di=Vi,zi=!!(Ni&&Ni.createEvent&&m.dispatchEvent),Fi=$(m.PromiseRejectionEvent),_i=\"unhandledrejection\",$i=!1,Hi=_e(Ii,(function(){var t=qt(Ri),e=t!==String(Ri);if(!e&&66===J)return !0;if(J>=51&&/native code/.test(t))return !1;var n=new Ri((function(t){t(1);})),r=function(t){t((function(){}),(function(){}));};return (n.constructor={})[ji]=r,!($i=n.then((function(){}))instanceof r)||!e&&Ei&&!Fi})),Bi=Hi||!Mo((function(t){Ri.all(t).catch((function(){}));})),Gi=function(t){var e;return !(!H(t)||!$(e=t.then))&&e},Wi=function(t,e){if(!t.notified){t.notified=!0;var n=t.reactions;bi((function(){for(var r=t.value,o=1==t.state,i=0;n.length>i;){var u,a,c,f=n[i++],s=o?f.ok:f.fail,l=f.resolve,d=f.reject,p=f.domain;try{s?(o||(2===t.rejection&&Xi(t),t.rejection=1),!0===s?u=r:(p&&p.enter(),u=s(r),p&&(p.exit(),c=!0)),u===f.promise?d(Ci(\"Promise-chain cycle\")):(a=Gi(u))?x(a,u,l,d):l(u)):d(r);}catch(t){p&&!c&&p.exit(),d(t);}}t.reactions=[],t.notified=!1,e&&!t.rejection&&qi(t);}));}},Ui=function(t,e,n){var r,o;zi?((r=Ni.createEvent(\"Event\")).promise=e,r.reason=n,r.initEvent(t,!1,!0),m.dispatchEvent(r)):r={promise:e,reason:n},!Fi&&(o=m[\"on\"+t])?o(r):t===_i&&function(t,e){var n=m.console;n&&n.error&&(1==arguments.length?n.error(t):n.error(t,e));}(\"Unhandled promise rejection\",n);},qi=function(t){x(Oi,m,(function(){var e,n=t.facade,r=t.value;if(Ki(t)&&(e=xi((function(){Lo?Li.emit(\"unhandledRejection\",r,n):Ui(_i,n,r);})),t.rejection=Lo||Ki(t)?2:1,e.error))throw e.value}));},Ki=function(t){return 1!==t.rejection&&!t.parent},Xi=function(t){x(Oi,m,(function(){var e=t.facade;Lo?Li.emit(\"rejectionHandled\",e):Ui(\"rejectionhandled\",e,t.value);}));},Yi=function(t,e,n){return function(r){t(e,r,n);}},Ji=function(t,e,n){t.done||(t.done=!0,n&&(t=n),t.value=e,t.state=2,Wi(t,!0));},Qi=function(t,e,n){if(!t.done){t.done=!0,n&&(t=n);try{if(t.facade===e)throw Ci(\"Promise can't be resolved itself\");var r=Gi(e);r?bi((function(){var n={done:!1};try{x(r,e,Yi(Qi,n,t),Yi(Ji,n,t));}catch(e){Ji(n,e,t);}})):(t.value=e,t.state=1,Wi(t,!1));}catch(e){Ji({done:!1},e,t);}}};if(Hi&&(ki=(Ri=function(t){co(this,ki),it(t),x(hi,this);var e=Pi(this);try{t(Yi(Qi,e),Yi(Ji,e));}catch(t){Ji(e,t);}}).prototype,(hi=function(t){Ti(this,{type:Ii,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0});}).prototype=Zr(ki,{then:function(t,e){var n=Mi(this),r=n.reactions,o=Vi(ko(this,Ri));return o.ok=!$(t)||t,o.fail=$(e)&&e,o.domain=Lo?Li.domain:void 0,n.parent=!0,r[r.length]=o,0!=n.state&&Wi(n,!1),o.promise},catch:function(t){return this.then(void 0,t)}}),yi=function(){var t=new hi,e=Pi(t);this.promise=t,this.resolve=Yi(Qi,e),this.reject=Yi(Ji,e);},Si.f=Vi=function(t){return t===Ri||t===gi?new yi(t):Di(t)},$(Qr)&&Ai!==Object.prototype)){mi=Ai.then,$i||(de(Ai,\"then\",(function(t,e){var n=this;return new Ri((function(t,e){x(mi,n,t,e);})).then(t,e)}),{unsafe:!0}),de(Ai,\"catch\",ki.catch,{unsafe:!0}));try{delete Ai.constructor;}catch(t){}no&&no(Ai,ki);}function Zi(t,n,r){return void 0===r&&(r=\"\"),c(this,void 0,void 0,(function(){var o,i,u,a,c,s,l;return f(this,(function(f){switch(f.label){case 0:return n?(t.restoreSelection(),o=t.getMenuConfig(\"insertVideo\"),i=o.onInsertedVideo,u=o.checkVideo,a=o.parseVideoSrc,[4,u(n,r)]):[2];case 1:return \"string\"==typeof(c=f.sent())?(t.alert(c,\"error\"),[2]):null==c?[2]:[4,a(n)];case 2:return 0!==(s=f.sent()).trim().indexOf(\"<iframe \")&&(s=s.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")),l={type:\"video\",src:s,poster:r,children:[{text:\"\"}]},Promise.resolve().then((function(){e.Transforms.insertNodes(t,l);})),i(l),[2]}}))}))}function tu(){return Jr(\"w-e-insert-video\")}He({global:!0,wrap:!0,forced:Hi},{Promise:Ri}),io(Ri,Ii,!1),function(t){var e=G(t),n=$t.f;w&&e&&!e[uo]&&n(e,uo,{configurable:!0,get:function(){return this}});}(Ii),gi=G(Ii),He({target:Ii,stat:!0,forced:Hi},{reject:function(t){var e=Vi(this);return x(e.reject,void 0,t),e.promise}}),He({target:Ii,stat:!0,forced:Hi},{resolve:function(t){return function(t,e){if(zt(t),H(e)&&e.constructor===t)return e;var n=Si.f(t);return (0, n.resolve)(e),n.promise}(this,t)}}),He({target:Ii,stat:!0,forced:Bi},{all:function(t){var e=this,n=Vi(e),r=n.resolve,o=n.reject,i=xi((function(){var n=it(e.resolve),i=[],u=0,a=1;wo(t,(function(t){var c=u++,f=!1;a++,x(n,e,t).then((function(t){f||(f=!0,i[c]=t,--a||r(i));}),o);})),--a||r(i);}));return i.error&&o(i.value),n.promise},race:function(t){var e=this,n=Vi(e),r=n.reject,o=xi((function(){var o=it(e.resolve);wo(t,(function(t){x(o,e,t).then(n.resolve,r);}));}));return o.error&&r(o.value),n.promise}});var eu=function(){function n(){this.title=t.t(\"videoModule.insertVideo\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M981.184 160.096C837.568 139.456 678.848 128 512 128S186.432 139.456 42.816 160.096C15.296 267.808 0 386.848 0 512s15.264 244.16 42.816 351.904C186.464 884.544 345.152 896 512 896s325.568-11.456 469.184-32.096C1008.704 756.192 1024 637.152 1024 512s-15.264-244.16-42.816-351.904zM384 704V320l320 192-320 192z\"></path></svg>',this.tag=\"button\",this.showModal=!0,this.modalWidth=320,this.$content=null,this.srcInputId=tu(),this.posterInputId=tu(),this.buttonId=tu();}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.exec=function(t,e){},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||!!t.DomEditor.getSelectedElems(n).some((function(e){var r=t.DomEditor.getNodeType(e);return \"pre\"===r||(\"list-item\"===r||!!n.isVoid(e))})))},n.prototype.getModalPositionNode=function(t){return null},n.prototype.getModalContentElem=function(e){var n=this,r=this,o=r.srcInputId,i=r.posterInputId,a=r.buttonId,s=l(t.genModalInputElems(t.t(\"videoModule.videoSrc\"),o,t.t(\"videoModule.videoSrcPlaceHolder\")),2),d=s[0],p=s[1],v=l(t.genModalInputElems(t.t(\"videoModule.videoPoster\"),i,t.t(\"videoModule.videoPosterPlaceHolder\")),2),h=v[0],y=v[1],g=u.default(p),m=u.default(y),b=l(t.genModalButtonElems(a,t.t(\"videoModule.ok\")),1)[0];if(null==this.$content){var w=u.default(\"<div></div>\");w.on(\"click\",\"#\"+a,(function(t){return c(n,void 0,void 0,(function(){var n,r;return f(this,(function(u){switch(u.label){case 0:return t.preventDefault(),n=w.find(\"#\"+o).val().trim(),r=w.find(\"#\"+i).val().trim(),[4,Zi(e,n,r)];case 1:return u.sent(),e.hidePanelOrModal(),[2]}}))}))})),this.$content=w;}var S=this.$content;return S.empty(),S.append(d),S.append(h),S.append(b),g.val(\"\"),m.val(\"\"),setTimeout((function(){g.focus();})),S[0]},n}(),nu=R([].join),ru=D!=Object,ou=function(t,e){var n=[][t];return !!n&&b((function(){n.call(null,e||function(){throw 1},1);}))}(\"join\",\",\");He({target:\"Array\",proto:!0,forced:ru||!ou},{join:function(t){return nu(_(this),void 0===t?\",\":t)}});var iu,uu,au,cu=!b((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})),fu=Jt(\"IE_PROTO\"),su=m.Object,lu=su.prototype,du=cu?su.getPrototypeOf:function(t){var e=vt(t);if(yt(e,fu))return e[fu];var n=e.constructor;return $(n)&&e instanceof n?n.prototype:e instanceof su?lu:null},pu=jt(\"iterator\"),vu=!1;[].keys&&(\"next\"in(au=[].keys())?(uu=du(du(au)))!==Object.prototype&&(iu=uu):vu=!0);var hu=null==iu||b((function(){var t={};return iu[pu].call(t)!==t}));hu&&(iu={}),$(iu[pu])||de(iu,pu,(function(){return this}));var yu={IteratorPrototype:iu,BUGGY_SAFARI_ITERATORS:vu},gu=yu.IteratorPrototype,mu=function(){return this},bu=le.PROPER,wu=le.CONFIGURABLE,Su=yu.IteratorPrototype,xu=yu.BUGGY_SAFARI_ITERATORS,Eu=jt(\"iterator\"),Ou=\"keys\",ju=\"values\",Iu=\"entries\",Pu=function(){return this},Tu=function(t,e,n,r,o,i,u){!function(t,e,n,r){var o=e+\" Iterator\";t.prototype=Sn(gu,{next:I(+!r,n)}),io(t,o,!1),fo[o]=mu;}(n,e,r);var a,c,f,s=function(t){if(t===o&&h)return h;if(!xu&&t in p)return p[t];switch(t){case Ou:case ju:case Iu:return function(){return new n(this,t)}}return function(){return new n(this)}},l=e+\" Iterator\",d=!1,p=t.prototype,v=p[Eu]||p[\"@@iterator\"]||o&&p[o],h=!xu&&v||s(o),y=\"Array\"==e&&p.entries||v;if(y&&(a=du(y.call(new t)))!==Object.prototype&&a.next&&(du(a)!==Su&&(no?no(a,Su):$(a[Eu])||de(a,Eu,Pu)),io(a,l,!0)),bu&&o==ju&&v&&v.name!==ju&&(wu?Ht(p,\"name\",ju):(d=!0,h=function(){return x(v,this)})),o)if(c={values:s(ju),keys:i?h:s(Ou),entries:s(Iu)},u)for(f in c)(xu||d||!(f in p))&&de(p,f,c[f]);else He({target:e,proto:!0,forced:xu||d},c);return p[Eu]!==h&&de(p,Eu,h,{name:o}),fo[e]=h,c},Mu=\"Array Iterator\",Au=ae.set,Ru=ae.getterFor(Mu),ku=Tu(Array,\"Array\",(function(t,e){Au(this,{type:Mu,target:_(t),index:0,kind:e});}),(function(){var t=Ru(this),e=t.target,n=t.kind,r=t.index++;return !e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),\"values\");fo.Arguments=fo.Array,On(\"keys\"),On(\"values\"),On(\"entries\");var Cu=Ar.charAt,Nu=\"String Iterator\",Lu=ae.set,Vu=ae.getterFor(Nu);Tu(String,\"String\",(function(t){Lu(this,{type:Nu,string:Je(t),index:0});}),(function(){var t,e=Vu(this),n=e.string,r=e.index;return r>=n.length?{value:void 0,done:!0}:(t=Cu(n,r),e.index+=t.length,{value:t,done:!1})}));var Du=function(t,e,n){var r=Mt(e);r in t?$t.f(t,r,I(0,n)):t[r]=n;},zu=m.Array,Fu=Math.max,_u=Me.f,$u=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Hu=function(t){try{return _u(t)}catch(t){return function(t,e,n){for(var r=Se(t),o=me(e,r),i=me(void 0===n?r:n,r),u=zu(Fu(i-o,0)),a=0;o<i;o++,a++)Du(u,a,t[o]);return u.length=a,u}($u)}},Bu={f:function(t){return $u&&\"Window\"==N(t)?Hu(t):_u(_(t))}},Gu=b((function(){if(\"function\"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,\"a\",{value:8});}})),Wu=Object.isExtensible,Uu=b((function(){Wu(1);}))||Gu?function(t){return !!H(t)&&((!Gu||\"ArrayBuffer\"!=N(t))&&(!Wu||Wu(t)))}:Wu,qu=!b((function(){return Object.isExtensible(Object.preventExtensions({}))})),Ku=v((function(t){var e=$t.f,n=!1,r=wt(\"meta\"),o=0,i=function(t){e(t,r,{value:{objectID:\"O\"+o++,weakData:{}}});},u=t.exports={enable:function(){u.enable=function(){},n=!0;var t=Me.f,e=R([].splice),o={};o[r]=1,t(o).length&&(Me.f=function(n){for(var o=t(n),i=0,u=o.length;i<u;i++)if(o[i]===r){e(o,i,1);break}return o},He({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:Bu.f}));},fastKey:function(t,e){if(!H(t))return \"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!yt(t,r)){if(!Uu(t))return \"F\";if(!e)return \"E\";i(t);}return t[r].objectID},getWeakData:function(t,e){if(!yt(t,r)){if(!Uu(t))return !0;if(!e)return !1;i(t);}return t[r].weakData},onFreeze:function(t){return qu&&n&&Uu(t)&&!yt(t,r)&&i(t),t}};Qt[r]=!0;})),Xu=Ku.getWeakData,Yu=ae.set,Ju=ae.getterFor,Qu=Bn.find,Zu=Bn.findIndex,ta=R([].splice),ea=0,na=function(t){return t.frozen||(t.frozen=new ra)},ra=function(){this.entries=[];},oa=function(t,e){return Qu(t.entries,(function(t){return t[0]===e}))};ra.prototype={get:function(t){var e=oa(this,t);if(e)return e[1]},has:function(t){return !!oa(this,t)},set:function(t,e){var n=oa(this,t);n?n[1]=e:this.entries.push([t,e]);},delete:function(t){var e=Zu(this.entries,(function(e){return e[0]===t}));return ~e&&ta(this.entries,e,1),!!~e}};var ia,ua={getConstructor:function(t,e,n,r){var o=t((function(t,o){co(t,i),Yu(t,{type:e,id:ea++,frozen:void 0}),null!=o&&wo(o,t[r],{that:t,AS_ENTRIES:n});})),i=o.prototype,u=Ju(e),a=function(t,e,n){var r=u(t),o=Xu(zt(e),!0);return !0===o?na(r).set(e,n):o[r.id]=n,t};return Zr(i,{delete:function(t){var e=u(this);if(!H(t))return !1;var n=Xu(t);return !0===n?na(e).delete(t):n&&yt(n,e.id)&&delete n[e.id]},has:function(t){var e=u(this);if(!H(t))return !1;var n=Xu(t);return !0===n?na(e).has(t):n&&yt(n,e.id)}}),Zr(i,n?{get:function(t){var e=u(this);if(H(t)){var n=Xu(t);return !0===n?na(e).get(t):n?n[e.id]:void 0}},set:function(t,e){return a(this,t,e)}}:{add:function(t){return a(this,t,!0)}}),o}},aa=ae.enforce,ca=!m.ActiveXObject&&\"ActiveXObject\"in m,fa=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},sa=function(t,e,n){var r=-1!==t.indexOf(\"Map\"),o=-1!==t.indexOf(\"Weak\"),i=r?\"set\":\"add\",u=m[t],a=u&&u.prototype,c=u,f={},s=function(t){var e=R(a[t]);de(a,t,\"add\"==t?function(t){return e(this,0===t?0:t),this}:\"delete\"==t?function(t){return !(o&&!H(t))&&e(this,0===t?0:t)}:\"get\"==t?function(t){return o&&!H(t)?void 0:e(this,0===t?0:t)}:\"has\"==t?function(t){return !(o&&!H(t))&&e(this,0===t?0:t)}:function(t,n){return e(this,0===t?0:t,n),this});};if(_e(t,!$(u)||!(o||a.forEach&&!b((function(){(new u).entries().next();})))))c=n.getConstructor(e,t,r,i),Ku.enable();else if(_e(t,!0)){var l=new c,d=l[i](o?{}:-0,1)!=l,p=b((function(){l.has(1);})),v=Mo((function(t){new u(t);})),h=!o&&b((function(){for(var t=new u,e=5;e--;)t[i](e,e);return !t.has(-0)}));v||((c=e((function(t,e){co(t,a);var n=function(t,e,n){var r,o;return no&&$(r=e.constructor)&&r!==n&&H(o=r.prototype)&&o!==n.prototype&&no(t,o),t}(new u,t,c);return null!=e&&wo(e,n[i],{that:n,AS_ENTRIES:r}),n}))).prototype=a,a.constructor=c),(p||h)&&(s(\"delete\"),s(\"has\"),r&&s(\"get\")),(h||d)&&s(i),o&&a.clear&&delete a.clear;}return f[t]=c,He({global:!0,forced:c!=u},f),io(c,t),o||n.setStrong(c,t,r),c}(\"WeakMap\",fa,ua);if(Xt&&ca){ia=ua.getConstructor(fa,\"WeakMap\",!0),Ku.enable();var la=sa.prototype,da=R(la.delete),pa=R(la.has),va=R(la.get),ha=R(la.set);Zr(la,{delete:function(t){if(H(t)&&!Uu(t)){var e=aa(this);return e.frozen||(e.frozen=new ia),da(this,t)||e.frozen.delete(t)}return da(this,t)},has:function(t){if(H(t)&&!Uu(t)){var e=aa(this);return e.frozen||(e.frozen=new ia),pa(this,t)||e.frozen.has(t)}return pa(this,t)},get:function(t){if(H(t)&&!Uu(t)){var e=aa(this);return e.frozen||(e.frozen=new ia),pa(this,t)?va(this,t):e.frozen.get(t)}return va(this,t)},set:function(t,e){if(H(t)&&!Uu(t)){var n=aa(this);n.frozen||(n.frozen=new ia),pa(this,t)?ha(this,t,e):n.frozen.set(t,e);}else ha(this,t,e);return this}});}var ya={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},ga=kt(\"span\").classList,ma=ga&&ga.constructor&&ga.constructor.prototype,ba=ma===Object.prototype?void 0:ma,wa=jt(\"iterator\"),Sa=jt(\"toStringTag\"),xa=ku.values,Ea=function(t,e){if(t){if(t[wa]!==xa)try{Ht(t,wa,xa);}catch(e){t[wa]=xa;}if(t[Sa]||Ht(t,Sa,e),ya[e])for(var n in ku)if(t[n]!==ku[n])try{Ht(t,n,ku[n]);}catch(e){t[n]=ku[n];}}};for(var Oa in ya)Ea(m[Oa]&&m[Oa].prototype,Oa);Ea(ba,\"DOMTokenList\");var ja=le.EXISTS,Ia=$t.f,Pa=Function.prototype,Ta=R(Pa.toString),Ma=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,Aa=R(Ma.exec);w&&!ja&&Ia(Pa,\"name\",{configurable:!0,get:function(){try{return Aa(Ma,Ta(this))[1]}catch(t){return \"\"}}});var Ra=jt(\"species\"),ka=function(t){return J>=51||!b((function(){var e=[];return (e.constructor={})[Ra]=function(){return {foo:1}},1!==e[t](Boolean).foo}))}(\"slice\"),Ca=jt(\"species\"),Na=m.Array,La=Math.max;function Va(t){return t.getMenuConfig(\"uploadVideo\")}He({target:\"Array\",proto:!0,forced:!ka},{slice:function(t,e){var n,r,o,i=_(this),u=Se(i),a=me(t,u),c=me(void 0===e?u:e,u);if(Mn(i)&&(n=i.constructor,(Dn(n)&&(n===Na||Mn(n.prototype))||H(n)&&null===(n=n[Ca]))&&(n=void 0),n===Na||void 0===n))return Co(i,a,c);for(r=new(void 0===n?Na:n)(La(c-a,0)),o=0;a<c;a++,o++)a in i&&Du(r,o,i[a]);return r.length=o,r}});var Da=new WeakMap;function za(e,n){return c(this,void 0,void 0,(function(){var r,o,i,u;return f(this,(function(c){switch(c.label){case 0:return r=function(e){var n=Da.get(e);if(null!=n)return n;var r=Va(e),o=r.onSuccess,i=r.onProgress,u=r.onFailed,c=r.customInsert,f=r.onError;return n=t.createUploader(a(a({},r),{onProgress:function(t){e.showProgressBar(t),i&&i(t);},onSuccess:function(t,n){if(c)return c(n,(function(t,n){return Zi(e,t,n)})),void o(t,n);var r=n.errno,i=void 0===r?1:r,a=n.data,f=void 0===a?{}:a;if(0===i){var s=f.url,l=void 0===s?\"\":s,d=f.poster;Zi(e,l,void 0===d?\"\":d),o(t,n);}else u(t,n);},onError:function(t,e,n){f(t,e,n);}})),Da.set(e,n),n}(e),o=n.name,i=n.type,u=n.size,r.addFile({name:o,type:i,size:u,data:n}),[4,r.upload()];case 1:return c.sent(),[2]}}))}))}var Fa=function(){function n(){this.title=t.t(\"videoModule.uploadVideo\"),this.iconSvg='<svg viewBox=\"0 0 1056 1024\"><path d=\"M805.902261 521.819882a251.441452 251.441452 0 0 0-251.011972 246.600033 251.051015 251.051015 0 1 0 502.023944 8.823877 253.237463 253.237463 0 0 0-251.011972-255.42391z m59.463561 240.001647v129.898403h-116.701631v-129.898403h-44.041298l101.279368-103.504859 101.279368 103.504859z\" p-id=\"6802\"></path><path d=\"M788.254507 0.000781H99.094092A98.663439 98.663439 0 0 0 0.001171 99.093701v590.067495a98.663439 98.663439 0 0 0 99.092921 99.092921h411.7549a266.434235 266.434235 0 0 1-2.186448-41.815807 275.843767 275.843767 0 0 1 275.180024-270.729042 270.650955 270.650955 0 0 1 103.504859 19.834201V99.093701A101.51363 101.51363 0 0 0 788.254507 0.000781zM295.054441 640.747004V147.507894l394.146189 246.600033z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.exec=function(t,e){var n=this.getMenuConfig(t),r=n.allowedFileTypes,o=void 0===r?[]:r,i=n.customBrowseAndUpload;if(i)i((function(e,n){return Zi(t,e,n)}));else {var a=\"\";o.length>0&&(a='accept=\"'+o.join(\", \")+'\"');var s=u.default(\"body\"),l=u.default('<input type=\"file\" '+a+\" multiple/>\");l.hide(),s.append(l),l.click(),l.on(\"change\",(function(){var e=l[0].files;!function(t,e){var n,r;c(this,void 0,void 0,(function(){var o,i,u,a,c,s;return f(this,(function(f){switch(f.label){case 0:if(null==e)return [2];o=Array.prototype.slice.call(e),i=Va(t).customUpload,f.label=1;case 1:f.trys.push([1,9,10,15]),u=d(o),f.label=2;case 2:return [4,u.next()];case 3:return (a=f.sent()).done?[3,8]:(c=a.value,i?[4,i(c,(function(e,n){return Zi(t,e,n)}))]:[3,5]);case 4:return f.sent(),[3,7];case 5:return [4,za(t,c)];case 6:f.sent(),f.label=7;case 7:return [3,2];case 8:return [3,15];case 9:return s=f.sent(),n={error:s},[3,15];case 10:return f.trys.push([10,,13,14]),a&&!a.done&&(r=u.return)?[4,r.call(u)]:[3,12];case 11:f.sent(),f.label=12;case 12:return [3,14];case 13:if(n)throw n.error;return [7];case 14:return [7];case 15:return [2]}}))}));}(t,e);}));}},n.prototype.isDisabled=function(n){var r=n.selection;return null==r||(!e.Range.isCollapsed(r)||!!t.DomEditor.getSelectedElems(n).some((function(e){var r=t.DomEditor.getNodeType(e);return \"pre\"===r||(\"list-item\"===r||!!n.isVoid(e))})))},n.prototype.getMenuConfig=function(t){return t.getMenuConfig(\"uploadVideo\")},n}(),_a=le.PROPER,$a=\"toString\",Ha=RegExp.prototype,Ba=Ha.toString,Ga=R(Qn),Wa=b((function(){return \"/a/b\"!=Ba.call({source:\"a\",flags:\"b\"})})),Ua=_a&&Ba.name!=$a;function qa(){return Jr(\"w-e-insert-video\")}(Wa||Ua)&&de(RegExp.prototype,$a,(function(){var t=zt(this),e=Je(t.source),n=t.flags;return \"/\"+e+\"/\"+Je(void 0===n&&W(Ha,t)&&!(\"flags\"in Ha)?Ga(t):n)}),{unsafe:!0});var Ka=function(){function n(){this.title=t.t(\"videoModule.editSize\"),this.tag=\"button\",this.showModal=!0,this.modalWidth=320,this.$content=null,this.widthInputId=qa(),this.heightInputId=qa(),this.buttonId=qa();}return n.prototype.getSelectedVideoNode=function(e){return t.DomEditor.getSelectedNodeByType(e,\"video\")},n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.exec=function(t,e){},n.prototype.isDisabled=function(t){return null==t.selection||null==this.getSelectedVideoNode(t)},n.prototype.getModalPositionNode=function(t){return this.getSelectedVideoNode(t)},n.prototype.getModalContentElem=function(n){var r=this,o=r.widthInputId,i=r.heightInputId,a=r.buttonId,c=l(t.genModalInputElems(t.t(\"videoModule.width\"),o,\"auto\"),2),f=c[0],s=c[1],d=u.default(s),p=l(t.genModalInputElems(t.t(\"videoModule.height\"),i,\"auto\"),2),v=p[0],h=p[1],y=u.default(h),g=l(t.genModalButtonElems(a,t.t(\"videoModule.ok\")),1)[0];if(null==this.$content){var m=u.default(\"<div></div>\");m.on(\"click\",\"#\"+a,(function(r){r.preventDefault();var u=m.find(\"#\"+o).val().trim(),a=m.find(\"#\"+i).val().trim(),c=parseInt(u),f=parseInt(a),s=c?c.toString():\"auto\",l=f?f.toString():\"auto\";n.restoreSelection(),e.Transforms.setNodes(n,{width:s,height:l},{match:function(e){return t.DomEditor.checkNodeType(e,\"video\")}}),n.hidePanelOrModal();})),this.$content=m;}var b=this.$content;b.empty(),b.append(f),b.append(v),b.append(g);var w=this.getSelectedVideoNode(n);if(null==w)return b[0];var S=w.width,x=void 0===S?\"auto\":S,E=w.height,O=void 0===E?\"auto\":E;return d.val(x),y.val(O),setTimeout((function(){d.focus();})),b[0]},n}();var Xa={renderElems:[sn],elemsToHtml:[dn],preParseHtml:[In],parseElemsHtml:[Jn],menus:[{key:\"insertVideo\",factory:function(){return new eu},config:{onInsertedVideo:function(t){},checkVideo:function(t,e){return !0},parseVideoSrc:function(t){return t}}},{key:\"uploadVideo\",factory:function(){return new Fa},config:{server:\"\",fieldName:\"wangeditor-uploaded-video\",maxFileSize:10485760,maxNumberOfFiles:5,allowedFileTypes:[\"video/*\"],meta:{},metaWithUrl:!1,withCredentials:!1,timeout:3e4,onBeforeUpload:function(t){return t},onProgress:function(t){},onSuccess:function(t,e){},onFailed:function(t,e){console.error(\"'\"+t.name+\"' upload failed\",e);},onError:function(t,e,n){console.error(\"'\"+t.name+\" upload error\",e,n);}}},{key:\"editVideoSize\",factory:function(){return new Ka}}],editorPlugin:function(n){var r=n.isVoid,o=n.normalizeNode,i=n;return i.isVoid=function(t){return \"video\"===t.type||r(t)},i.normalizeNode=function(n){var r=l(n,2),u=r[0],a=r[1];\"video\"===t.DomEditor.getNodeType(u)&&(t.DomEditor.isLastNode(i,u)&&e.Transforms.insertNodes(i,t.DomEditor.genEmptyParagraph(),{at:[a[0]+1]}));return o([u,a])},i}};return Xa}));\n\n  });\n\n  var dist$1 = createCommonjsModule$1(function (module, exports) {\n  !function(t,e){module.exports=e(dist$6,dist$5,require$$1);}(commonjsGlobal,(function(t,e,n){function r(t){return t&&\"object\"==typeof t&&\"default\"in t?t:{default:t}}var o=r(n);t.i18nAddResources(\"en\",{uploadImgModule:{uploadImage:\"Upload Image\",uploadError:\"{{fileName}} upload error\"}}),t.i18nAddResources(\"zh-CN\",{uploadImgModule:{uploadImage:\"上传图片\",uploadError:\"{{fileName}} 上传出错\"}});var i=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function u(t){var e={exports:{}};return t(e,e.exports),e.exports}var a,c,f=function(t){return t&&t.Math==Math&&t},s=f(\"object\"==typeof globalThis&&globalThis)||f(\"object\"==typeof window&&window)||f(\"object\"==typeof self&&self)||f(\"object\"==typeof i&&i)||function(){return this}()||Function(\"return this\")(),l=function(t){try{return !!t()}catch(t){return !0}},p=!l((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),d=Function.prototype.call,v=d.bind?d.bind(d):function(){return d.apply(d,arguments)},h={}.propertyIsEnumerable,y=Object.getOwnPropertyDescriptor,g={f:y&&!h.call({1:2},1)?function(t){var e=y(this,t);return !!e&&e.enumerable}:h},m=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},b=Function.prototype,w=b.bind,x=b.call,S=w&&w.bind(x),O=w?function(t){return t&&S(x,t)}:function(t){return t&&function(){return x.apply(t,arguments)}},E=O({}.toString),j=O(\"\".slice),I=function(t){return j(E(t),8,-1)},T=s.Object,A=O(\"\".split),P=l((function(){return !T(\"z\").propertyIsEnumerable(0)}))?function(t){return \"String\"==I(t)?A(t,\"\"):T(t)}:T,R=s.TypeError,M=function(t){if(null==t)throw R(\"Can't call method on \"+t);return t},k=function(t){return P(M(t))},L=function(t){return \"function\"==typeof t},F=function(t){return \"object\"==typeof t?null!==t:L(t)},C=function(t){return L(t)?t:void 0},N=function(t,e){return arguments.length<2?C(s[t]):s[t]&&s[t][e]},z=O({}.isPrototypeOf),_=N(\"navigator\",\"userAgent\")||\"\",D=s.process,U=s.Deno,G=D&&D.versions||U&&U.version,B=G&&G.v8;B&&(c=(a=B.split(\".\"))[0]>0&&a[0]<4?1:+(a[0]+a[1])),!c&&_&&(!(a=_.match(/Edge\\/(\\d+)/))||a[1]>=74)&&(a=_.match(/Chrome\\/(\\d+)/))&&(c=+a[1]);var W=c,V=!!Object.getOwnPropertySymbols&&!l((function(){var t=Symbol();return !String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&W&&W<41})),H=V&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,q=s.Object,K=H?function(t){return \"symbol\"==typeof t}:function(t){var e=N(\"Symbol\");return L(e)&&z(e.prototype,q(t))},Y=s.String,X=function(t){try{return Y(t)}catch(t){return \"Object\"}},$=s.TypeError,J=function(t){if(L(t))return t;throw $(X(t)+\" is not a function\")},Q=function(t,e){var n=t[e];return null==n?void 0:J(n)},Z=s.TypeError,tt=Object.defineProperty,et=function(t,e){try{tt(s,t,{value:e,configurable:!0,writable:!0});}catch(n){s[t]=e;}return e},nt=\"__core-js_shared__\",rt=s[nt]||et(nt,{}),ot=u((function(t){(t.exports=function(t,e){return rt[t]||(rt[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),it=s.Object,ut=function(t){return it(M(t))},at=O({}.hasOwnProperty),ct=Object.hasOwn||function(t,e){return at(ut(t),e)},ft=0,st=Math.random(),lt=O(1..toString),pt=function(t){return \"Symbol(\"+(void 0===t?\"\":t)+\")_\"+lt(++ft+st,36)},dt=ot(\"wks\"),vt=s.Symbol,ht=vt&&vt.for,yt=H?vt:vt&&vt.withoutSetter||pt,gt=function(t){if(!ct(dt,t)||!V&&\"string\"!=typeof dt[t]){var e=\"Symbol.\"+t;V&&ct(vt,t)?dt[t]=vt[t]:dt[t]=H&&ht?ht(e):yt(e);}return dt[t]},mt=s.TypeError,bt=gt(\"toPrimitive\"),wt=function(t,e){if(!F(t)||K(t))return t;var n,r=Q(t,bt);if(r){if(void 0===e&&(e=\"default\"),n=v(r,t,e),!F(n)||K(n))return n;throw mt(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var n,r;if(\"string\"===e&&L(n=t.toString)&&!F(r=v(n,t)))return r;if(L(n=t.valueOf)&&!F(r=v(n,t)))return r;if(\"string\"!==e&&L(n=t.toString)&&!F(r=v(n,t)))return r;throw Z(\"Can't convert object to primitive value\")}(t,e)},xt=function(t){var e=wt(t,\"string\");return K(e)?e:e+\"\"},St=s.document,Ot=F(St)&&F(St.createElement),Et=function(t){return Ot?St.createElement(t):{}},jt=!p&&!l((function(){return 7!=Object.defineProperty(Et(\"div\"),\"a\",{get:function(){return 7}}).a})),It=Object.getOwnPropertyDescriptor,Tt={f:p?It:function(t,e){if(t=k(t),e=xt(e),jt)try{return It(t,e)}catch(t){}if(ct(t,e))return m(!v(g.f,t,e),t[e])}},At=s.String,Pt=s.TypeError,Rt=function(t){if(F(t))return t;throw Pt(At(t)+\" is not an object\")},Mt=s.TypeError,kt=Object.defineProperty,Lt={f:p?kt:function(t,e,n){if(Rt(t),e=xt(e),Rt(n),jt)try{return kt(t,e,n)}catch(t){}if(\"get\"in n||\"set\"in n)throw Mt(\"Accessors not supported\");return \"value\"in n&&(t[e]=n.value),t}},Ft=p?function(t,e,n){return Lt.f(t,e,m(1,n))}:function(t,e,n){return t[e]=n,t},Ct=O(Function.toString);L(rt.inspectSource)||(rt.inspectSource=function(t){return Ct(t)});var Nt,zt,_t,Dt=rt.inspectSource,Ut=s.WeakMap,Gt=L(Ut)&&/native code/.test(Dt(Ut)),Bt=ot(\"keys\"),Wt=function(t){return Bt[t]||(Bt[t]=pt(t))},Vt={},Ht=\"Object already initialized\",qt=s.TypeError,Kt=s.WeakMap;if(Gt||rt.state){var Yt=rt.state||(rt.state=new Kt),Xt=O(Yt.get),$t=O(Yt.has),Jt=O(Yt.set);Nt=function(t,e){if($t(Yt,t))throw new qt(Ht);return e.facade=t,Jt(Yt,t,e),e},zt=function(t){return Xt(Yt,t)||{}},_t=function(t){return $t(Yt,t)};}else {var Qt=Wt(\"state\");Vt[Qt]=!0,Nt=function(t,e){if(ct(t,Qt))throw new qt(Ht);return e.facade=t,Ft(t,Qt,e),e},zt=function(t){return ct(t,Qt)?t[Qt]:{}},_t=function(t){return ct(t,Qt)};}var Zt={set:Nt,get:zt,has:_t,enforce:function(t){return _t(t)?zt(t):Nt(t,{})},getterFor:function(t){return function(e){var n;if(!F(e)||(n=zt(e)).type!==t)throw qt(\"Incompatible receiver, \"+t+\" required\");return n}}},te=Function.prototype,ee=p&&Object.getOwnPropertyDescriptor,ne=ct(te,\"name\"),re={EXISTS:ne,PROPER:ne&&\"something\"===function(){}.name,CONFIGURABLE:ne&&(!p||p&&ee(te,\"name\").configurable)},oe=u((function(t){var e=re.CONFIGURABLE,n=Zt.get,r=Zt.enforce,o=String(String).split(\"String\");(t.exports=function(t,n,i,u){var a,c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,l=!!u&&!!u.noTargetGet,p=u&&void 0!==u.name?u.name:n;L(i)&&(\"Symbol(\"===String(p).slice(0,7)&&(p=\"[\"+String(p).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!ct(i,\"name\")||e&&i.name!==p)&&Ft(i,\"name\",p),(a=r(i)).source||(a.source=o.join(\"string\"==typeof p?p:\"\"))),t!==s?(c?!l&&t[n]&&(f=!0):delete t[n],f?t[n]=i:Ft(t,n,i)):f?t[n]=i:et(n,i);})(Function.prototype,\"toString\",(function(){return L(this)&&n(this).source||Dt(this)}));})),ie=Math.ceil,ue=Math.floor,ae=function(t){var e=+t;return e!=e||0===e?0:(e>0?ue:ie)(e)},ce=Math.max,fe=Math.min,se=function(t,e){var n=ae(t);return n<0?ce(n+e,0):fe(n,e)},le=Math.min,pe=function(t){return t>0?le(ae(t),9007199254740991):0},de=function(t){return pe(t.length)},ve=function(t){return function(e,n,r){var o,i=k(e),u=de(i),a=se(r,u);if(t&&n!=n){for(;u>a;)if((o=i[a++])!=o)return !0}else for(;u>a;a++)if((t||a in i)&&i[a]===n)return t||a||0;return !t&&-1}},he={includes:ve(!0),indexOf:ve(!1)}.indexOf,ye=O([].push),ge=function(t,e){var n,r=k(t),o=0,i=[];for(n in r)!ct(Vt,n)&&ct(r,n)&&ye(i,n);for(;e.length>o;)ct(r,n=e[o++])&&(~he(i,n)||ye(i,n));return i},me=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],be=me.concat(\"length\",\"prototype\"),we={f:Object.getOwnPropertyNames||function(t){return ge(t,be)}},xe={f:Object.getOwnPropertySymbols},Se=O([].concat),Oe=N(\"Reflect\",\"ownKeys\")||function(t){var e=we.f(Rt(t)),n=xe.f;return n?Se(e,n(t)):e},Ee=function(t,e){for(var n=Oe(e),r=Lt.f,o=Tt.f,i=0;i<n.length;i++){var u=n[i];ct(t,u)||r(t,u,o(e,u));}},je=/#|\\.prototype\\./,Ie=function(t,e){var n=Ae[Te(t)];return n==Re||n!=Pe&&(L(e)?l(e):!!e)},Te=Ie.normalize=function(t){return String(t).replace(je,\".\").toLowerCase()},Ae=Ie.data={},Pe=Ie.NATIVE=\"N\",Re=Ie.POLYFILL=\"P\",Me=Ie,ke=Tt.f,Le=function(t,e){var n,r,o,i,u,a=t.target,c=t.global,f=t.stat;if(n=c?s:f?s[a]||et(a,{}):(s[a]||{}).prototype)for(r in e){if(i=e[r],o=t.noTargetGet?(u=ke(n,r))&&u.value:n[r],!Me(c?r:a+(f?\".\":\"#\")+r,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;Ee(i,o);}(t.sham||o&&o.sham)&&Ft(i,\"sham\",!0),oe(n,r,i,t);}},Fe=Array.isArray||function(t){return \"Array\"==I(t)},Ce={};Ce[gt(\"toStringTag\")]=\"z\";var Ne,ze=\"[object z]\"===String(Ce),_e=gt(\"toStringTag\"),De=s.Object,Ue=\"Arguments\"==I(function(){return arguments}()),Ge=ze?I:function(t){var e,n,r;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=De(t),_e))?n:Ue?I(e):\"Object\"==(r=I(e))&&L(e.callee)?\"Arguments\":r},Be=function(){},We=[],Ve=N(\"Reflect\",\"construct\"),He=/^\\s*(?:class|function)\\b/,qe=O(He.exec),Ke=!He.exec(Be),Ye=function(t){if(!L(t))return !1;try{return Ve(Be,We,t),!0}catch(t){return !1}},Xe=!Ve||l((function(){var t;return Ye(Ye.call)||!Ye(Object)||!Ye((function(){t=!0;}))||t}))?function(t){if(!L(t))return !1;switch(Ge(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Ke||!!qe(He,Dt(t))}:Ye,$e=function(t,e,n){var r=xt(e);r in t?Lt.f(t,r,m(0,n)):t[r]=n;},Je=gt(\"species\"),Qe=O([].slice),Ze=(Ne=\"slice\",W>=51||!l((function(){var t=[];return (t.constructor={})[Je]=function(){return {foo:1}},1!==t[Ne](Boolean).foo}))),tn=gt(\"species\"),en=s.Array,nn=Math.max;Le({target:\"Array\",proto:!0,forced:!Ze},{slice:function(t,e){var n,r,o,i=k(this),u=de(i),a=se(t,u),c=se(void 0===e?u:e,u);if(Fe(i)&&(n=i.constructor,(Xe(n)&&(n===en||Fe(n.prototype))||F(n)&&null===(n=n[tn]))&&(n=void 0),n===en||void 0===n))return Qe(i,a,c);for(r=new(void 0===n?en:n)(nn(c-a,0)),o=0;a<c;a++,o++)a in i&&$e(r,o,i[a]);return r.length=o,r}});var rn=ze?{}.toString:function(){return \"[object \"+Ge(this)+\"]\"};ze||oe(Object.prototype,\"toString\",rn,{unsafe:!0});var on,un=s.String,an=function(t){if(\"Symbol\"===Ge(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return un(t)},cn=function(){var t=Rt(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e},fn=s.RegExp,sn=l((function(){var t=fn(\"a\",\"y\");return t.lastIndex=2,null!=t.exec(\"abcd\")})),ln=sn||l((function(){return !fn(\"a\",\"y\").sticky})),pn={BROKEN_CARET:sn||l((function(){var t=fn(\"^r\",\"gy\");return t.lastIndex=2,null!=t.exec(\"str\")})),MISSED_STICKY:ln,UNSUPPORTED_Y:sn},dn=Object.keys||function(t){return ge(t,me)},vn=p?Object.defineProperties:function(t,e){Rt(t);for(var n,r=k(e),o=dn(e),i=o.length,u=0;i>u;)Lt.f(t,n=o[u++],r[n]);return t},hn=N(\"document\",\"documentElement\"),yn=Wt(\"IE_PROTO\"),gn=function(){},mn=function(t){return \"<script>\"+t+\"</\"+\"script>\"},bn=function(t){t.write(mn(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},wn=function(){try{on=new ActiveXObject(\"htmlfile\");}catch(t){}var t,e;wn=\"undefined\"!=typeof document?document.domain&&on?bn(on):((e=Et(\"iframe\")).style.display=\"none\",hn.appendChild(e),e.src=String(\"javascript:\"),(t=e.contentWindow.document).open(),t.write(mn(\"document.F=Object\")),t.close(),t.F):bn(on);for(var n=me.length;n--;)delete wn.prototype[me[n]];return wn()};Vt[yn]=!0;var xn,Sn,On=Object.create||function(t,e){var n;return null!==t?(gn.prototype=Rt(t),n=new gn,gn.prototype=null,n[yn]=t):n=wn(),void 0===e?n:vn(n,e)},En=s.RegExp,jn=l((function(){var t=En(\".\",\"s\");return !(t.dotAll&&t.exec(\"\\n\")&&\"s\"===t.flags)})),In=s.RegExp,Tn=l((function(){var t=In(\"(?<a>b)\",\"g\");return \"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$<a>c\")})),An=Zt.get,Pn=ot(\"native-string-replace\",String.prototype.replace),Rn=RegExp.prototype.exec,Mn=Rn,kn=O(\"\".charAt),Ln=O(\"\".indexOf),Fn=O(\"\".replace),Cn=O(\"\".slice),Nn=(Sn=/b*/g,v(Rn,xn=/a/,\"a\"),v(Rn,Sn,\"a\"),0!==xn.lastIndex||0!==Sn.lastIndex),zn=pn.BROKEN_CARET,_n=void 0!==/()??/.exec(\"\")[1];(Nn||_n||zn||jn||Tn)&&(Mn=function(t){var e,n,r,o,i,u,a,c=this,f=An(c),s=an(t),l=f.raw;if(l)return l.lastIndex=c.lastIndex,e=v(Mn,l,s),c.lastIndex=l.lastIndex,e;var p=f.groups,d=zn&&c.sticky,h=v(cn,c),y=c.source,g=0,m=s;if(d&&(h=Fn(h,\"y\",\"\"),-1===Ln(h,\"g\")&&(h+=\"g\"),m=Cn(s,c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&\"\\n\"!==kn(s,c.lastIndex-1))&&(y=\"(?: \"+y+\")\",m=\" \"+m,g++),n=new RegExp(\"^(?:\"+y+\")\",h)),_n&&(n=new RegExp(\"^\"+y+\"$(?!\\\\s)\",h)),Nn&&(r=c.lastIndex),o=v(Rn,d?n:c,m),d?o?(o.input=Cn(o.input,g),o[0]=Cn(o[0],g),o.index=c.lastIndex,c.lastIndex+=o[0].length):c.lastIndex=0:Nn&&o&&(c.lastIndex=c.global?o.index+o[0].length:r),_n&&o&&o.length>1&&v(Pn,o[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(o[i]=void 0);})),o&&p)for(o.groups=u=On(null),i=0;i<p.length;i++)u[(a=p[i])[0]]=o[a[1]];return o});var Dn=Mn;Le({target:\"RegExp\",proto:!0,forced:/./.exec!==Dn},{exec:Dn});var Un=Function.prototype,Gn=Un.apply,Bn=Un.bind,Wn=Un.call,Vn=\"object\"==typeof Reflect&&Reflect.apply||(Bn?Wn.bind(Gn):function(){return Wn.apply(Gn,arguments)}),Hn=gt(\"species\"),qn=RegExp.prototype,Kn=gt(\"match\"),Yn=s.TypeError,Xn=gt(\"species\"),$n=function(t,e){var n,r=Rt(t).constructor;return void 0===r||null==(n=Rt(r)[Xn])?e:function(t){if(Xe(t))return t;throw Yn(X(t)+\" is not a constructor\")}(n)},Jn=O(\"\".charAt),Qn=O(\"\".charCodeAt),Zn=O(\"\".slice),tr=function(t){return function(e,n){var r,o,i=an(M(e)),u=ae(n),a=i.length;return u<0||u>=a?t?\"\":void 0:(r=Qn(i,u))<55296||r>56319||u+1===a||(o=Qn(i,u+1))<56320||o>57343?t?Jn(i,u):r:t?Zn(i,u,u+2):o-56320+(r-55296<<10)+65536}},er={codeAt:tr(!1),charAt:tr(!0)},nr=er.charAt,rr=function(t,e,n){return e+(n?nr(t,e).length:1)},or=s.Array,ir=Math.max,ur=function(t,e,n){for(var r=de(t),o=se(e,r),i=se(void 0===n?r:n,r),u=or(ir(i-o,0)),a=0;o<i;o++,a++)$e(u,a,t[o]);return u.length=a,u},ar=s.TypeError,cr=function(t,e){var n=t.exec;if(L(n)){var r=v(n,t,e);return null!==r&&Rt(r),r}if(\"RegExp\"===I(t))return v(Dn,t,e);throw ar(\"RegExp#exec called on incompatible receiver\")},fr=pn.UNSUPPORTED_Y,sr=4294967295,lr=Math.min,pr=[].push,dr=O(/./.exec),vr=O(pr),hr=O(\"\".slice),yr=!l((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n=\"ab\".split(t);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]}));!function(t,e,n,r){var o=gt(t),i=!l((function(){var e={};return e[o]=function(){return 7},7!=\"\"[t](e)})),u=i&&!l((function(){var e=!1,n=/a/;return \"split\"===t&&((n={}).constructor={},n.constructor[Hn]=function(){return n},n.flags=\"\",n[o]=/./[o]),n.exec=function(){return e=!0,null},n[o](\"\"),!e}));if(!i||!u||n){var a=O(/./[o]),c=e(o,\"\"[t],(function(t,e,n,r,o){var u=O(t),c=e.exec;return c===Dn||c===qn.exec?i&&!o?{done:!0,value:a(e,n,r)}:{done:!0,value:u(n,e,r)}:{done:!1}}));oe(String.prototype,t,c[0]),oe(qn,o,c[1]);}r&&Ft(qn[o],\"sham\",!0);}(\"split\",(function(t,e,n){var r;return r=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,n){var r,o,i=an(M(this)),u=void 0===n?sr:n>>>0;if(0===u)return [];if(void 0===t)return [i];if(!F(r=t)||!(void 0!==(o=r[Kn])?o:\"RegExp\"==I(r)))return v(e,i,t,u);for(var a,c,f,s=[],l=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),p=0,d=new RegExp(t.source,l+\"g\");(a=v(Dn,d,i))&&!((c=d.lastIndex)>p&&(vr(s,hr(i,p,a.index)),a.length>1&&a.index<i.length&&Vn(pr,s,ur(a,1)),f=a[0].length,p=c,s.length>=u));)d.lastIndex===a.index&&d.lastIndex++;return p===i.length?!f&&dr(d,\"\")||vr(s,\"\"):vr(s,hr(i,p)),s.length>u?ur(s,0,u):s}:\"0\".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:v(e,this,t,n)}:e,[function(e,n){var o=M(this),i=null==e?void 0:Q(e,t);return i?v(i,e,o,n):v(r,an(o),e,n)},function(t,o){var i=Rt(this),u=an(t),a=n(r,i,u,o,r!==e);if(a.done)return a.value;var c=$n(i,RegExp),f=i.unicode,s=(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(fr?\"g\":\"y\"),l=new c(fr?\"^(?:\"+i.source+\")\":i,s),p=void 0===o?sr:o>>>0;if(0===p)return [];if(0===u.length)return null===cr(l,u)?[u]:[];for(var d=0,v=0,h=[];v<u.length;){l.lastIndex=fr?0:v;var y,g=cr(l,fr?hr(u,v):u);if(null===g||(y=lr(pe(l.lastIndex+(fr?v:0)),u.length))===d)v=rr(u,v,f);else {if(vr(h,hr(u,d,v)),h.length===p)return h;for(var m=1;m<=g.length-1;m++)if(vr(h,g[m]),h.length===p)return h;v=d=y;}}return vr(h,hr(u,d)),h}]}),!yr,fr);\n  /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n  var gr=function(){return gr=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},gr.apply(this,arguments)};function mr(t,e,n,r){return new(n||(n=Promise))((function(o,i){function u(t){try{c(r.next(t));}catch(t){i(t);}}function a(t){try{c(r.throw(t));}catch(t){i(t);}}function c(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e);}))).then(u,a);}c((r=r.apply(t,e||[])).next());}))}function br(t,e){var n,r,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError(\"Generator is already executing.\");for(;u;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,r=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!(o=u.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){u.label=i[1];break}if(6===i[0]&&u.label<o[1]){u.label=o[1],o=i;break}if(o&&u.label<o[2]){u.label=o[2],u.ops.push(i);break}o[2]&&u.ops.pop(),u.trys.pop();continue}i=e.call(t,u);}catch(t){i=[6,t],r=0;}finally{n=o=0;}if(5&i[0])throw i[1];return {value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}function wr(t){var e=\"function\"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&\"number\"==typeof t.length)return {next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}function xr(t){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=wr(t),e={},r(\"next\"),r(\"throw\"),r(\"return\"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,o){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n});}),e);})(r,o,(e=t[n](e)).done,e.value);}))};}}var Sr=gt(\"unscopables\"),Or=Array.prototype;null==Or[Sr]&&Lt.f(Or,Sr,{configurable:!0,value:On(null)});var Er,jr,Ir,Tr=function(t){Or[Sr][t]=!0;},Ar={},Pr=!l((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})),Rr=Wt(\"IE_PROTO\"),Mr=s.Object,kr=Mr.prototype,Lr=Pr?Mr.getPrototypeOf:function(t){var e=ut(t);if(ct(e,Rr))return e[Rr];var n=e.constructor;return L(n)&&e instanceof n?n.prototype:e instanceof Mr?kr:null},Fr=gt(\"iterator\"),Cr=!1;[].keys&&(\"next\"in(Ir=[].keys())?(jr=Lr(Lr(Ir)))!==Object.prototype&&(Er=jr):Cr=!0);var Nr=null==Er||l((function(){var t={};return Er[Fr].call(t)!==t}));Nr&&(Er={}),L(Er[Fr])||oe(Er,Fr,(function(){return this}));var zr={IteratorPrototype:Er,BUGGY_SAFARI_ITERATORS:Cr},_r=Lt.f,Dr=gt(\"toStringTag\"),Ur=function(t,e,n){t&&!ct(t=n?t:t.prototype,Dr)&&_r(t,Dr,{configurable:!0,value:e});},Gr=zr.IteratorPrototype,Br=function(){return this},Wr=s.String,Vr=s.TypeError,Hr=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,n={};try{(t=O(Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set))(n,[]),e=n instanceof Array;}catch(t){}return function(n,r){return Rt(n),function(t){if(\"object\"==typeof t||L(t))return t;throw Vr(\"Can't set \"+Wr(t)+\" as a prototype\")}(r),e?t(n,r):n.__proto__=r,n}}():void 0),qr=re.PROPER,Kr=re.CONFIGURABLE,Yr=zr.IteratorPrototype,Xr=zr.BUGGY_SAFARI_ITERATORS,$r=gt(\"iterator\"),Jr=\"keys\",Qr=\"values\",Zr=\"entries\",to=function(){return this},eo=function(t,e,n,r,o,i,u){!function(t,e,n,r){var o=e+\" Iterator\";t.prototype=On(Gr,{next:m(+!r,n)}),Ur(t,o,!1),Ar[o]=Br;}(n,e,r);var a,c,f,s=function(t){if(t===o&&y)return y;if(!Xr&&t in d)return d[t];switch(t){case Jr:case Qr:case Zr:return function(){return new n(this,t)}}return function(){return new n(this)}},l=e+\" Iterator\",p=!1,d=t.prototype,h=d[$r]||d[\"@@iterator\"]||o&&d[o],y=!Xr&&h||s(o),g=\"Array\"==e&&d.entries||h;if(g&&(a=Lr(g.call(new t)))!==Object.prototype&&a.next&&(Lr(a)!==Yr&&(Hr?Hr(a,Yr):L(a[$r])||oe(a,$r,to)),Ur(a,l,!0)),qr&&o==Qr&&h&&h.name!==Qr&&(Kr?Ft(d,\"name\",Qr):(p=!0,y=function(){return v(h,this)})),o)if(c={values:s(Qr),keys:i?y:s(Jr),entries:s(Zr)},u)for(f in c)(Xr||p||!(f in d))&&oe(d,f,c[f]);else Le({target:e,proto:!0,forced:Xr||p},c);return d[$r]!==y&&oe(d,$r,y,{name:o}),Ar[e]=y,c},no=\"Array Iterator\",ro=Zt.set,oo=Zt.getterFor(no),io=eo(Array,\"Array\",(function(t,e){ro(this,{type:no,target:k(t),index:0,kind:e});}),(function(){var t=oo(this),e=t.target,n=t.kind,r=t.index++;return !e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):\"keys\"==n?{value:r,done:!1}:\"values\"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),\"values\");Ar.Arguments=Ar.Array,Tr(\"keys\"),Tr(\"values\"),Tr(\"entries\");var uo=er.charAt,ao=\"String Iterator\",co=Zt.set,fo=Zt.getterFor(ao);eo(String,\"String\",(function(t){co(this,{type:ao,string:an(t),index:0});}),(function(){var t,e=fo(this),n=e.string,r=e.index;return r>=n.length?{value:void 0,done:!0}:(t=uo(n,r),e.index+=t.length,{value:t,done:!1})}));var so=function(t,e,n){for(var r in e)oe(t,r,e[r],n);return t},lo=we.f,po=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],vo={f:function(t){return po&&\"Window\"==I(t)?function(t){try{return lo(t)}catch(t){return ur(po)}}(t):lo(k(t))}},ho=l((function(){if(\"function\"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,\"a\",{value:8});}})),yo=Object.isExtensible,go=l((function(){yo(1);}))||ho?function(t){return !!F(t)&&((!ho||\"ArrayBuffer\"!=I(t))&&(!yo||yo(t)))}:yo,mo=!l((function(){return Object.isExtensible(Object.preventExtensions({}))})),bo=u((function(t){var e=Lt.f,n=!1,r=pt(\"meta\"),o=0,i=function(t){e(t,r,{value:{objectID:\"O\"+o++,weakData:{}}});},u=t.exports={enable:function(){u.enable=function(){},n=!0;var t=we.f,e=O([].splice),o={};o[r]=1,t(o).length&&(we.f=function(n){for(var o=t(n),i=0,u=o.length;i<u;i++)if(o[i]===r){e(o,i,1);break}return o},Le({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:vo.f}));},fastKey:function(t,e){if(!F(t))return \"symbol\"==typeof t?t:(\"string\"==typeof t?\"S\":\"P\")+t;if(!ct(t,r)){if(!go(t))return \"F\";if(!e)return \"E\";i(t);}return t[r].objectID},getWeakData:function(t,e){if(!ct(t,r)){if(!go(t))return !0;if(!e)return !1;i(t);}return t[r].weakData},onFreeze:function(t){return mo&&n&&go(t)&&!ct(t,r)&&i(t),t}};Vt[r]=!0;})),wo=O(O.bind),xo=function(t,e){return J(t),void 0===e?t:wo?wo(t,e):function(){return t.apply(e,arguments)}},So=gt(\"iterator\"),Oo=Array.prototype,Eo=gt(\"iterator\"),jo=function(t){if(null!=t)return Q(t,Eo)||Q(t,\"@@iterator\")||Ar[Ge(t)]},Io=s.TypeError,To=function(t,e,n){var r,o;Rt(t);try{if(!(r=Q(t,\"return\"))){if(\"throw\"===e)throw n;return n}r=v(r,t);}catch(t){o=!0,r=t;}if(\"throw\"===e)throw n;if(o)throw r;return Rt(r),n},Ao=s.TypeError,Po=function(t,e){this.stopped=t,this.result=e;},Ro=Po.prototype,Mo=function(t,e,n){var r,o,i,u,a,c,f,s,l=n&&n.that,p=!(!n||!n.AS_ENTRIES),d=!(!n||!n.IS_ITERATOR),h=!(!n||!n.INTERRUPTED),y=xo(e,l),g=function(t){return r&&To(r,\"normal\",t),new Po(!0,t)},m=function(t){return p?(Rt(t),h?y(t[0],t[1],g):y(t[0],t[1])):h?y(t,g):y(t)};if(d)r=t;else {if(!(o=jo(t)))throw Ao(X(t)+\" is not iterable\");if(void 0!==(s=o)&&(Ar.Array===s||Oo[So]===s)){for(i=0,u=de(t);u>i;i++)if((a=m(t[i]))&&z(Ro,a))return a;return new Po(!1)}r=function(t,e){var n=arguments.length<2?jo(t):e;if(J(n))return Rt(v(n,t));throw Io(X(t)+\" is not iterable\")}(t,o);}for(c=r.next;!(f=v(c,r)).done;){try{a=m(f.value);}catch(t){To(r,\"throw\",t);}if(\"object\"==typeof a&&a&&z(Ro,a))return a}return new Po(!1)},ko=s.TypeError,Lo=function(t,e){if(z(e,t))return t;throw ko(\"Incorrect invocation\")},Fo=gt(\"iterator\"),Co=!1;try{var No=0,zo={next:function(){return {done:!!No++}},return:function(){Co=!0;}};zo[Fo]=function(){return this},Array.from(zo,(function(){throw 2}));}catch(t){}var _o=function(t,e){if(!e&&!Co)return !1;var n=!1;try{var r={};r[Fo]=function(){return {next:function(){return {done:n=!0}}}},t(r);}catch(t){}return n},Do=gt(\"species\"),Uo=s.Array,Go=function(t,e){return new(function(t){var e;return Fe(t)&&(e=t.constructor,(Xe(e)&&(e===Uo||Fe(e.prototype))||F(e)&&null===(e=e[Do]))&&(e=void 0)),void 0===e?Uo:e}(t))(0===e?0:e)},Bo=O([].push),Wo=function(t){var e=1==t,n=2==t,r=3==t,o=4==t,i=6==t,u=7==t,a=5==t||i;return function(c,f,s,l){for(var p,d,v=ut(c),h=P(v),y=xo(f,s),g=de(h),m=0,b=l||Go,w=e?b(c,g):n||u?b(c,0):void 0;g>m;m++)if((a||m in h)&&(d=y(p=h[m],m,v),t))if(e)w[m]=d;else if(d)switch(t){case 3:return !0;case 5:return p;case 6:return m;case 2:Bo(w,p);}else switch(t){case 4:return !1;case 7:Bo(w,p);}return i?-1:r||o?o:w}},Vo={forEach:Wo(0),map:Wo(1),filter:Wo(2),some:Wo(3),every:Wo(4),find:Wo(5),findIndex:Wo(6),filterReject:Wo(7)},Ho=bo.getWeakData,qo=Zt.set,Ko=Zt.getterFor,Yo=Vo.find,Xo=Vo.findIndex,$o=O([].splice),Jo=0,Qo=function(t){return t.frozen||(t.frozen=new Zo)},Zo=function(){this.entries=[];},ti=function(t,e){return Yo(t.entries,(function(t){return t[0]===e}))};Zo.prototype={get:function(t){var e=ti(this,t);if(e)return e[1]},has:function(t){return !!ti(this,t)},set:function(t,e){var n=ti(this,t);n?n[1]=e:this.entries.push([t,e]);},delete:function(t){var e=Xo(this.entries,(function(e){return e[0]===t}));return ~e&&$o(this.entries,e,1),!!~e}};var ei,ni={getConstructor:function(t,e,n,r){var o=t((function(t,o){Lo(t,i),qo(t,{type:e,id:Jo++,frozen:void 0}),null!=o&&Mo(o,t[r],{that:t,AS_ENTRIES:n});})),i=o.prototype,u=Ko(e),a=function(t,e,n){var r=u(t),o=Ho(Rt(e),!0);return !0===o?Qo(r).set(e,n):o[r.id]=n,t};return so(i,{delete:function(t){var e=u(this);if(!F(t))return !1;var n=Ho(t);return !0===n?Qo(e).delete(t):n&&ct(n,e.id)&&delete n[e.id]},has:function(t){var e=u(this);if(!F(t))return !1;var n=Ho(t);return !0===n?Qo(e).has(t):n&&ct(n,e.id)}}),so(i,n?{get:function(t){var e=u(this);if(F(t)){var n=Ho(t);return !0===n?Qo(e).get(t):n?n[e.id]:void 0}},set:function(t,e){return a(this,t,e)}}:{add:function(t){return a(this,t,!0)}}),o}},ri=Zt.enforce,oi=!s.ActiveXObject&&\"ActiveXObject\"in s,ii=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},ui=function(t,e,n){var r=-1!==t.indexOf(\"Map\"),o=-1!==t.indexOf(\"Weak\"),i=r?\"set\":\"add\",u=s[t],a=u&&u.prototype,c=u,f={},p=function(t){var e=O(a[t]);oe(a,t,\"add\"==t?function(t){return e(this,0===t?0:t),this}:\"delete\"==t?function(t){return !(o&&!F(t))&&e(this,0===t?0:t)}:\"get\"==t?function(t){return o&&!F(t)?void 0:e(this,0===t?0:t)}:\"has\"==t?function(t){return !(o&&!F(t))&&e(this,0===t?0:t)}:function(t,n){return e(this,0===t?0:t,n),this});};if(Me(t,!L(u)||!(o||a.forEach&&!l((function(){(new u).entries().next();})))))c=n.getConstructor(e,t,r,i),bo.enable();else if(Me(t,!0)){var d=new c,v=d[i](o?{}:-0,1)!=d,h=l((function(){d.has(1);})),y=_o((function(t){new u(t);})),g=!o&&l((function(){for(var t=new u,e=5;e--;)t[i](e,e);return !t.has(-0)}));y||((c=e((function(t,e){Lo(t,a);var n=function(t,e,n){var r,o;return Hr&&L(r=e.constructor)&&r!==n&&F(o=r.prototype)&&o!==n.prototype&&Hr(t,o),t}(new u,t,c);return null!=e&&Mo(e,n[i],{that:n,AS_ENTRIES:r}),n}))).prototype=a,a.constructor=c),(h||g)&&(p(\"delete\"),p(\"has\"),r&&p(\"get\")),(g||v)&&p(i),o&&a.clear&&delete a.clear;}return f[t]=c,Le({global:!0,forced:c!=u},f),Ur(c,t),o||n.setStrong(c,t,r),c}(\"WeakMap\",ii,ni);if(Gt&&oi){ei=ni.getConstructor(ii,\"WeakMap\",!0),bo.enable();var ai=ui.prototype,ci=O(ai.delete),fi=O(ai.has),si=O(ai.get),li=O(ai.set);so(ai,{delete:function(t){if(F(t)&&!go(t)){var e=ri(this);return e.frozen||(e.frozen=new ei),ci(this,t)||e.frozen.delete(t)}return ci(this,t)},has:function(t){if(F(t)&&!go(t)){var e=ri(this);return e.frozen||(e.frozen=new ei),fi(this,t)||e.frozen.has(t)}return fi(this,t)},get:function(t){if(F(t)&&!go(t)){var e=ri(this);return e.frozen||(e.frozen=new ei),fi(this,t)?si(this,t):e.frozen.get(t)}return si(this,t)},set:function(t,e){if(F(t)&&!go(t)){var n=ri(this);n.frozen||(n.frozen=new ei),fi(this,t)?li(this,t,e):n.frozen.set(t,e);}else li(this,t,e);return this}});}var pi={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},di=Et(\"span\").classList,vi=di&&di.constructor&&di.constructor.prototype,hi=vi===Object.prototype?void 0:vi,yi=gt(\"iterator\"),gi=gt(\"toStringTag\"),mi=io.values,bi=function(t,e){if(t){if(t[yi]!==mi)try{Ft(t,yi,mi);}catch(e){t[yi]=mi;}if(t[gi]||Ft(t,gi,e),pi[e])for(var n in io)if(t[n]!==io[n])try{Ft(t,n,io[n]);}catch(e){t[n]=io[n];}}};for(var wi in pi)bi(s[wi]&&s[wi].prototype,wi);bi(hi,\"DOMTokenList\");var xi=function(t,e){var n=[][t];return !!n&&l((function(){n.call(null,e||function(){throw 1},1);}))},Si=Vo.forEach,Oi=xi(\"forEach\")?[].forEach:function(t){return Si(this,t,arguments.length>1?arguments[1]:void 0)},Ei=function(t){if(t&&t.forEach!==Oi)try{Ft(t,\"forEach\",Oi);}catch(e){t.forEach=Oi;}};for(var ji in pi)pi[ji]&&Ei(s[ji]&&s[ji].prototype);Ei(hi);var Ii,Ti,Ai,Pi,Ri=s.Promise,Mi=gt(\"species\"),ki=/(?:ipad|iphone|ipod).*applewebkit/i.test(_),Li=\"process\"==I(s.process),Fi=s.setImmediate,Ci=s.clearImmediate,Ni=s.process,zi=s.Dispatch,_i=s.Function,Di=s.MessageChannel,Ui=s.String,Gi=0,Bi={},Wi=\"onreadystatechange\";try{Ii=s.location;}catch(t){}var Vi=function(t){if(ct(Bi,t)){var e=Bi[t];delete Bi[t],e();}},Hi=function(t){return function(){Vi(t);}},qi=function(t){Vi(t.data);},Ki=function(t){s.postMessage(Ui(t),Ii.protocol+\"//\"+Ii.host);};Fi&&Ci||(Fi=function(t){var e=Qe(arguments,1);return Bi[++Gi]=function(){Vn(L(t)?t:_i(t),void 0,e);},Ti(Gi),Gi},Ci=function(t){delete Bi[t];},Li?Ti=function(t){Ni.nextTick(Hi(t));}:zi&&zi.now?Ti=function(t){zi.now(Hi(t));}:Di&&!ki?(Pi=(Ai=new Di).port2,Ai.port1.onmessage=qi,Ti=xo(Pi.postMessage,Pi)):s.addEventListener&&L(s.postMessage)&&!s.importScripts&&Ii&&\"file:\"!==Ii.protocol&&!l(Ki)?(Ti=Ki,s.addEventListener(\"message\",qi,!1)):Ti=Wi in Et(\"script\")?function(t){hn.appendChild(Et(\"script\")).onreadystatechange=function(){hn.removeChild(this),Vi(t);};}:function(t){setTimeout(Hi(t),0);});var Yi,Xi,$i,Ji,Qi,Zi,tu,eu,nu={set:Fi,clear:Ci},ru=/ipad|iphone|ipod/i.test(_)&&void 0!==s.Pebble,ou=/web0s(?!.*chrome)/i.test(_),iu=Tt.f,uu=nu.set,au=s.MutationObserver||s.WebKitMutationObserver,cu=s.document,fu=s.process,su=s.Promise,lu=iu(s,\"queueMicrotask\"),pu=lu&&lu.value;pu||(Yi=function(){var t,e;for(Li&&(t=fu.domain)&&t.exit();Xi;){e=Xi.fn,Xi=Xi.next;try{e();}catch(t){throw Xi?Ji():$i=void 0,t}}$i=void 0,t&&t.enter();},ki||Li||ou||!au||!cu?!ru&&su&&su.resolve?((tu=su.resolve(void 0)).constructor=su,eu=xo(tu.then,tu),Ji=function(){eu(Yi);}):Li?Ji=function(){fu.nextTick(Yi);}:(uu=xo(uu,s),Ji=function(){uu(Yi);}):(Qi=!0,Zi=cu.createTextNode(\"\"),new au(Yi).observe(Zi,{characterData:!0}),Ji=function(){Zi.data=Qi=!Qi;}));var du,vu,hu,yu,gu=pu||function(t){var e={fn:t,next:void 0};$i&&($i.next=e),Xi||(Xi=e,Ji()),$i=e;},mu=function(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError(\"Bad Promise constructor\");e=t,n=r;})),this.resolve=J(e),this.reject=J(n);},bu={f:function(t){return new mu(t)}},wu=function(t){try{return {error:!1,value:t()}}catch(t){return {error:!0,value:t}}},xu=\"object\"==typeof window,Su=nu.set,Ou=gt(\"species\"),Eu=\"Promise\",ju=Zt.getterFor(Eu),Iu=Zt.set,Tu=Zt.getterFor(Eu),Au=Ri&&Ri.prototype,Pu=Ri,Ru=Au,Mu=s.TypeError,ku=s.document,Lu=s.process,Fu=bu.f,Cu=Fu,Nu=!!(ku&&ku.createEvent&&s.dispatchEvent),zu=L(s.PromiseRejectionEvent),_u=\"unhandledrejection\",Du=!1,Uu=Me(Eu,(function(){var t=Dt(Pu),e=t!==String(Pu);if(!e&&66===W)return !0;if(W>=51&&/native code/.test(t))return !1;var n=new Pu((function(t){t(1);})),r=function(t){t((function(){}),(function(){}));};return (n.constructor={})[Ou]=r,!(Du=n.then((function(){}))instanceof r)||!e&&xu&&!zu})),Gu=Uu||!_o((function(t){Pu.all(t).catch((function(){}));})),Bu=function(t){var e;return !(!F(t)||!L(e=t.then))&&e},Wu=function(t,e){if(!t.notified){t.notified=!0;var n=t.reactions;gu((function(){for(var r=t.value,o=1==t.state,i=0;n.length>i;){var u,a,c,f=n[i++],s=o?f.ok:f.fail,l=f.resolve,p=f.reject,d=f.domain;try{s?(o||(2===t.rejection&&Ku(t),t.rejection=1),!0===s?u=r:(d&&d.enter(),u=s(r),d&&(d.exit(),c=!0)),u===f.promise?p(Mu(\"Promise-chain cycle\")):(a=Bu(u))?v(a,u,l,p):l(u)):p(r);}catch(t){d&&!c&&d.exit(),p(t);}}t.reactions=[],t.notified=!1,e&&!t.rejection&&Hu(t);}));}},Vu=function(t,e,n){var r,o;Nu?((r=ku.createEvent(\"Event\")).promise=e,r.reason=n,r.initEvent(t,!1,!0),s.dispatchEvent(r)):r={promise:e,reason:n},!zu&&(o=s[\"on\"+t])?o(r):t===_u&&function(t,e){var n=s.console;n&&n.error&&(1==arguments.length?n.error(t):n.error(t,e));}(\"Unhandled promise rejection\",n);},Hu=function(t){v(Su,s,(function(){var e,n=t.facade,r=t.value;if(qu(t)&&(e=wu((function(){Li?Lu.emit(\"unhandledRejection\",r,n):Vu(_u,n,r);})),t.rejection=Li||qu(t)?2:1,e.error))throw e.value}));},qu=function(t){return 1!==t.rejection&&!t.parent},Ku=function(t){v(Su,s,(function(){var e=t.facade;Li?Lu.emit(\"rejectionHandled\",e):Vu(\"rejectionhandled\",e,t.value);}));},Yu=function(t,e,n){return function(r){t(e,r,n);}},Xu=function(t,e,n){t.done||(t.done=!0,n&&(t=n),t.value=e,t.state=2,Wu(t,!0));},$u=function(t,e,n){if(!t.done){t.done=!0,n&&(t=n);try{if(t.facade===e)throw Mu(\"Promise can't be resolved itself\");var r=Bu(e);r?gu((function(){var n={done:!1};try{v(r,e,Yu($u,n,t),Yu(Xu,n,t));}catch(e){Xu(n,e,t);}})):(t.value=e,t.state=1,Wu(t,!1));}catch(e){Xu({done:!1},e,t);}}};if(Uu&&(Ru=(Pu=function(t){Lo(this,Ru),J(t),v(du,this);var e=ju(this);try{t(Yu($u,e),Yu(Xu,e));}catch(t){Xu(e,t);}}).prototype,(du=function(t){Iu(this,{type:Eu,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0});}).prototype=so(Ru,{then:function(t,e){var n=Tu(this),r=n.reactions,o=Fu($n(this,Pu));return o.ok=!L(t)||t,o.fail=L(e)&&e,o.domain=Li?Lu.domain:void 0,n.parent=!0,r[r.length]=o,0!=n.state&&Wu(n,!1),o.promise},catch:function(t){return this.then(void 0,t)}}),vu=function(){var t=new du,e=ju(t);this.promise=t,this.resolve=Yu($u,e),this.reject=Yu(Xu,e);},bu.f=Fu=function(t){return t===Pu||t===hu?new vu(t):Cu(t)},L(Ri)&&Au!==Object.prototype)){yu=Au.then,Du||(oe(Au,\"then\",(function(t,e){var n=this;return new Pu((function(t,e){v(yu,n,t,e);})).then(t,e)}),{unsafe:!0}),oe(Au,\"catch\",Ru.catch,{unsafe:!0}));try{delete Au.constructor;}catch(t){}Hr&&Hr(Au,Ru);}Le({global:!0,wrap:!0,forced:Uu},{Promise:Pu}),Ur(Pu,Eu,!1),function(t){var e=N(t),n=Lt.f;p&&e&&!e[Mi]&&n(e,Mi,{configurable:!0,get:function(){return this}});}(Eu),hu=N(Eu),Le({target:Eu,stat:!0,forced:Uu},{reject:function(t){var e=Fu(this);return v(e.reject,void 0,t),e.promise}}),Le({target:Eu,stat:!0,forced:Uu},{resolve:function(t){return function(t,e){if(Rt(t),F(e)&&e.constructor===t)return e;var n=bu.f(t);return (0, n.resolve)(e),n.promise}(this,t)}}),Le({target:Eu,stat:!0,forced:Gu},{all:function(t){var e=this,n=Fu(e),r=n.resolve,o=n.reject,i=wu((function(){var n=J(e.resolve),i=[],u=0,a=1;Mo(t,(function(t){var c=u++,f=!1;a++,v(n,e,t).then((function(t){f||(f=!0,i[c]=t,--a||r(i));}),o);})),--a||r(i);}));return i.error&&o(i.value),n.promise},race:function(t){var e=this,n=Fu(e),r=n.reject,o=wu((function(){var o=J(e.resolve);Mo(t,(function(t){v(o,e,t).then(n.resolve,r);}));}));return o.error&&r(o.value),n.promise}});var Ju=re.PROPER,Qu=\"toString\",Zu=RegExp.prototype,ta=Zu.toString,ea=O(cn),na=l((function(){return \"/a/b\"!=ta.call({source:\"a\",flags:\"b\"})})),ra=Ju&&ta.name!=Qu;(na||ra)&&oe(RegExp.prototype,Qu,(function(){var t=Rt(this),e=an(t.source),n=t.flags;return \"/\"+e+\"/\"+an(void 0===n&&z(Zu,t)&&!(\"flags\"in Zu)?ea(t):n)}),{unsafe:!0});var oa=re.EXISTS,ia=Lt.f,ua=Function.prototype,aa=O(ua.toString),ca=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,fa=O(ca.exec);p&&!oa&&ia(ua,\"name\",{configurable:!0,get:function(){try{return fa(ca,aa(this))[1]}catch(t){return \"\"}}});var sa=new WeakMap;function la(t){return t.getMenuConfig(\"uploadImage\")}function pa(t,n){return mr(this,void 0,void 0,(function(){return br(this,(function(r){return [2,new Promise((function(r){var o=new FileReader;o.readAsDataURL(n),o.onload=function(){var i=o.result;if(i){var u=i.toString(),a=0===u.indexOf(\"data:image\")?\"\":u;e.insertImageNode(t,u,n.name,a),r(\"ok\");}};}))]}))}))}function da(n,r){return mr(this,void 0,void 0,(function(){var o,i,u,a;return br(this,(function(c){switch(c.label){case 0:return o=function(n){var r=sa.get(n);if(null!=r)return r;var o=la(n),i=o.onSuccess,u=o.onProgress,a=o.onFailed,c=o.customInsert,f=o.onError;return r=t.createUploader(gr(gr({},o),{onProgress:function(t){n.showProgressBar(t),u&&u(t);},onSuccess:function(t,r){if(c)return c(r,(function(t,r,o){return e.insertImageNode(n,t,r,o)})),void i(t,r);var o=r.errno,u=void 0===o?1:o,f=r.data,s=void 0===f?{}:f;if(0===u){if(Array.isArray(s))s.forEach((function(t){var r=t.url,o=void 0===r?\"\":r,i=t.alt,u=void 0===i?\"\":i,a=t.href,c=void 0===a?\"\":a;e.insertImageNode(n,o,u,c);}));else {var l=s.url,p=void 0===l?\"\":l,d=s.alt,v=void 0===d?\"\":d,h=s.href,y=void 0===h?\"\":h;e.insertImageNode(n,p,v,y);}i(t,r);}else a(t,r);},onError:function(t,e,n){f(t,e,n);}})),sa.set(n,r),r}(n),i=r.name,u=r.type,a=r.size,o.addFile({name:i,type:u,size:a,data:r}),[4,o.upload()];case 1:return c.sent(),[2]}}))}))}function va(t,n){var r,o;return mr(this,void 0,void 0,(function(){var i,u,a,c,f,s,l,p,d;return br(this,(function(v){switch(v.label){case 0:if(null==n)return [2];i=Array.prototype.slice.call(n),u=la(t),a=u.customUpload,c=u.base64LimitSize,v.label=1;case 1:v.trys.push([1,11,12,17]),f=xr(i),v.label=2;case 2:return [4,f.next()];case 3:return (s=v.sent()).done?[3,10]:(l=s.value,p=l.size,c&&p<=c?[4,pa(t,l)]:[3,5]);case 4:return v.sent(),[3,9];case 5:return a?[4,a(l,(function(n,r,o){return e.insertImageNode(t,n,r,o)}))]:[3,7];case 6:return v.sent(),[3,9];case 7:return [4,da(t,l)];case 8:v.sent(),v.label=9;case 9:return [3,2];case 10:return [3,17];case 11:return d=v.sent(),r={error:d},[3,17];case 12:return v.trys.push([12,,15,16]),s&&!s.done&&(o=f.return)?[4,o.call(f)]:[3,14];case 13:v.sent(),v.label=14;case 14:return [3,16];case 15:if(r)throw r.error;return [7];case 16:return [7];case 17:return [2]}}))}))}var ha=O([].join),ya=P!=Object,ga=xi(\"join\",\",\");Le({target:\"Array\",proto:!0,forced:ya||!ga},{join:function(t){return ha(k(this),void 0===t?\",\":t)}});n.append&&(o.default.fn.append=n.append),n.on&&(o.default.fn.on=n.on),n.remove&&(o.default.fn.remove=n.remove),n.val&&(o.default.fn.val=n.val),n.click&&(o.default.fn.click=n.click),n.hide&&(o.default.fn.hide=n.hide);var ma=function(){function n(){this.title=t.t(\"uploadImgModule.uploadImage\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M828.708571 585.045333a48.761905 48.761905 0 0 0-48.737523 48.761905v18.529524l-72.143238-72.167619a135.972571 135.972571 0 0 0-191.585524 0l-34.133334 34.133333-120.880762-120.953905a138.898286 138.898286 0 0 0-191.585523 0l-72.167619 72.167619V292.400762a48.786286 48.786286 0 0 1 48.761904-48.761905h341.23581a48.737524 48.737524 0 0 0 34.474667-83.285333 48.737524 48.737524 0 0 0-34.474667-14.287238H146.236952A146.212571 146.212571 0 0 0 0 292.400762v585.289143A146.358857 146.358857 0 0 0 146.236952 1024h584.996572a146.212571 146.212571 0 0 0 146.236952-146.310095V633.807238a48.786286 48.786286 0 0 0-48.761905-48.761905zM146.261333 926.45181a48.737524 48.737524 0 0 1-48.761904-48.761905v-174.128762l141.409523-141.458286a38.497524 38.497524 0 0 1 53.126096 0l154.526476 154.624 209.627428 209.724953H146.236952z m633.734096-48.761905c-0.073143 9.337905-3.145143 18.383238-8.777143 25.843809l-219.843048-220.94019 34.133333-34.133334a37.546667 37.546667 0 0 1 53.613715 0l140.873143 141.897143V877.714286zM1009.615238 160.231619L863.329524 13.897143a48.737524 48.737524 0 0 0-16.091429-10.24c-11.849143-4.87619-25.161143-4.87619-37.059047 0a48.761905 48.761905 0 0 0-16.067048 10.24l-146.236952 146.334476a49.005714 49.005714 0 0 0 69.217523 69.241905l62.902858-63.390476v272.627809a48.761905 48.761905 0 1 0 97.475047 0V166.083048l62.902857 63.390476a48.737524 48.737524 0 0 0 69.217524 0 48.761905 48.761905 0 0 0 0-69.241905z\"></path></svg>',this.tag=\"button\";}return n.prototype.getValue=function(t){return \"\"},n.prototype.isActive=function(t){return !1},n.prototype.isDisabled=function(t){return e.isInsertImageMenuDisabled(t)},n.prototype.getMenuConfig=function(t){return t.getMenuConfig(\"uploadImage\")},n.prototype.exec=function(t,n){var r=this.getMenuConfig(t),i=r.allowedFileTypes,u=void 0===i?[]:i,a=r.customBrowseAndUpload;if(a)a((function(n,r,o){return e.insertImageNode(t,n,r,o)}));else {var c=\"\";u.length>0&&(c='accept=\"'+u.join(\", \")+'\"');var f=o.default(\"body\"),s=o.default('<input type=\"file\" '+c+\" multiple/>\");s.hide(),f.append(s),s.click(),s.on(\"change\",(function(){var e=s[0].files;va(t,e);}));}},n}();var ba={menus:[{key:\"uploadImage\",factory:function(){return new ma},config:{server:\"\",fieldName:\"wangeditor-uploaded-image\",maxFileSize:2097152,maxNumberOfFiles:100,allowedFileTypes:[\"image/*\"],meta:{},metaWithUrl:!1,withCredentials:!1,timeout:1e4,onBeforeUpload:function(t){return t},onProgress:function(t){},onSuccess:function(t,e){},onFailed:function(t,e){console.error(\"'\"+t.name+\"' upload failed\",e);},onError:function(t,e,n){console.error(\"'\"+t.name+\"' upload error\",n);},base64LimitSize:0}}],editorPlugin:function(t){var n=t.insertData,r=t;return r.insertData=function(o){if(e.isInsertImageMenuDisabled(r))n(o);else if(o.getData(\"text/plain\"))n(o);else {var i=o.files;if(i.length<=0)n(o);else Array.prototype.slice.call(i).some((function(t){return \"image\"===function(t,e){var n=\"function\"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),u=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)u.push(r.value);}catch(t){o={error:t};}finally{try{r&&!r.done&&(n=i.return)&&n.call(i);}finally{if(o)throw o.error}}return u}(t.type.split(\"/\"),1)[0]}))?va(t,i):n(o);}},r}};return ba}));\n\n  });\n\n  var dist = createCommonjsModule$1(function (module, exports) {\n  !function(e,t){t(exports,dist$6,require$$1,require$$2$1);}(commonjsGlobal,(function(e,t,n,a){function r(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var i=r(n);t.i18nAddResources(\"en\",{highLightModule:{selectLang:\"Language\"}}),t.i18nAddResources(\"zh-CN\",{highLightModule:{selectLang:\"选择语言\"}});var s=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof commonjsGlobal?commonjsGlobal:\"undefined\"!=typeof self?self:{};function o(e){var t={exports:{}};return e(t,t.exports),t.exports}var l,u,c=function(e){return e&&e.Math==Math&&e},d=c(\"object\"==typeof globalThis&&globalThis)||c(\"object\"==typeof window&&window)||c(\"object\"==typeof self&&self)||c(\"object\"==typeof s&&s)||function(){return this}()||Function(\"return this\")(),p=Object.defineProperty,g=function(e,t){try{p(d,e,{value:t,configurable:!0,writable:!0});}catch(n){d[e]=t;}return t},f=\"__core-js_shared__\",b=d[f]||g(f,{}),h=o((function(e){(e.exports=function(e,t){return b[e]||(b[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.19.3\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"});})),m=Function.prototype,y=m.bind,E=m.call,v=y&&y.bind(E),S=y?function(e){return e&&v(E,e)}:function(e){return e&&function(){return E.apply(e,arguments)}},w=d.TypeError,k=function(e){if(null==e)throw w(\"Can't call method on \"+e);return e},A=d.Object,x=function(e){return A(k(e))},T=S({}.hasOwnProperty),_=Object.hasOwn||function(e,t){return T(x(e),t)},O=0,I=Math.random(),R=S(1..toString),N=function(e){return \"Symbol(\"+(void 0===e?\"\":e)+\")_\"+R(++O+I,36)},L=function(e){return \"function\"==typeof e},P=function(e){return L(e)?e:void 0},C=function(e,t){return arguments.length<2?P(d[e]):d[e]&&d[e][t]},F=C(\"navigator\",\"userAgent\")||\"\",D=d.process,$=d.Deno,M=D&&D.versions||$&&$.version,B=M&&M.v8;B&&(u=(l=B.split(\".\"))[0]>0&&l[0]<4?1:+(l[0]+l[1])),!u&&F&&(!(l=F.match(/Edge\\/(\\d+)/))||l[1]>=74)&&(l=F.match(/Chrome\\/(\\d+)/))&&(u=+l[1]);var U=u,j=function(e){try{return !!e()}catch(e){return !0}},z=!!Object.getOwnPropertySymbols&&!j((function(){var e=Symbol();return !String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&U&&U<41})),G=z&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,H=h(\"wks\"),q=d.Symbol,Y=q&&q.for,W=G?q:q&&q.withoutSetter||N,X=function(e){if(!_(H,e)||!z&&\"string\"!=typeof H[e]){var t=\"Symbol.\"+e;z&&_(q,e)?H[e]=q[e]:H[e]=G&&Y?Y(t):W(t);}return H[e]},Z={};Z[X(\"toStringTag\")]=\"z\";var V=\"[object z]\"===String(Z),K=!j((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),J=function(e){return \"object\"==typeof e?null!==e:L(e)},Q=d.document,ee=J(Q)&&J(Q.createElement),te=function(e){return ee?Q.createElement(e):{}},ne=!K&&!j((function(){return 7!=Object.defineProperty(te(\"div\"),\"a\",{get:function(){return 7}}).a})),ae=d.String,re=d.TypeError,ie=function(e){if(J(e))return e;throw re(ae(e)+\" is not an object\")},se=Function.prototype.call,oe=se.bind?se.bind(se):function(){return se.apply(se,arguments)},le=S({}.isPrototypeOf),ue=d.Object,ce=G?function(e){return \"symbol\"==typeof e}:function(e){var t=C(\"Symbol\");return L(t)&&le(t.prototype,ue(e))},de=d.String,pe=function(e){try{return de(e)}catch(e){return \"Object\"}},ge=d.TypeError,fe=function(e){if(L(e))return e;throw ge(pe(e)+\" is not a function\")},be=function(e,t){var n=e[t];return null==n?void 0:fe(n)},he=d.TypeError,me=d.TypeError,ye=X(\"toPrimitive\"),Ee=function(e,t){if(!J(e)||ce(e))return e;var n,a=be(e,ye);if(a){if(void 0===t&&(t=\"default\"),n=oe(a,e,t),!J(n)||ce(n))return n;throw me(\"Can't convert object to primitive value\")}return void 0===t&&(t=\"number\"),function(e,t){var n,a;if(\"string\"===t&&L(n=e.toString)&&!J(a=oe(n,e)))return a;if(L(n=e.valueOf)&&!J(a=oe(n,e)))return a;if(\"string\"!==t&&L(n=e.toString)&&!J(a=oe(n,e)))return a;throw he(\"Can't convert object to primitive value\")}(e,t)},ve=function(e){var t=Ee(e,\"string\");return ce(t)?t:t+\"\"},Se=d.TypeError,we=Object.defineProperty,ke={f:K?we:function(e,t,n){if(ie(e),t=ve(t),ie(n),ne)try{return we(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw Se(\"Accessors not supported\");return \"value\"in n&&(e[t]=n.value),e}},Ae=function(e,t){return {enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},xe=K?function(e,t,n){return ke.f(e,t,Ae(1,n))}:function(e,t,n){return e[t]=n,e},Te=S(Function.toString);L(b.inspectSource)||(b.inspectSource=function(e){return Te(e)});var _e,Oe,Ie,Re=b.inspectSource,Ne=d.WeakMap,Le=L(Ne)&&/native code/.test(Re(Ne)),Pe=h(\"keys\"),Ce=function(e){return Pe[e]||(Pe[e]=N(e))},Fe={},De=\"Object already initialized\",$e=d.TypeError,Me=d.WeakMap;if(Le||b.state){var Be=b.state||(b.state=new Me),Ue=S(Be.get),je=S(Be.has),ze=S(Be.set);_e=function(e,t){if(je(Be,e))throw new $e(De);return t.facade=e,ze(Be,e,t),t},Oe=function(e){return Ue(Be,e)||{}},Ie=function(e){return je(Be,e)};}else {var Ge=Ce(\"state\");Fe[Ge]=!0,_e=function(e,t){if(_(e,Ge))throw new $e(De);return t.facade=e,xe(e,Ge,t),t},Oe=function(e){return _(e,Ge)?e[Ge]:{}},Ie=function(e){return _(e,Ge)};}var He={set:_e,get:Oe,has:Ie,enforce:function(e){return Ie(e)?Oe(e):_e(e,{})},getterFor:function(e){return function(t){var n;if(!J(t)||(n=Oe(t)).type!==e)throw $e(\"Incompatible receiver, \"+e+\" required\");return n}}},qe=Function.prototype,Ye=K&&Object.getOwnPropertyDescriptor,We=_(qe,\"name\"),Xe={EXISTS:We,PROPER:We&&\"something\"===function(){}.name,CONFIGURABLE:We&&(!K||K&&Ye(qe,\"name\").configurable)},Ze=o((function(e){var t=Xe.CONFIGURABLE,n=He.get,a=He.enforce,r=String(String).split(\"String\");(e.exports=function(e,n,i,s){var o,l=!!s&&!!s.unsafe,u=!!s&&!!s.enumerable,c=!!s&&!!s.noTargetGet,p=s&&void 0!==s.name?s.name:n;L(i)&&(\"Symbol(\"===String(p).slice(0,7)&&(p=\"[\"+String(p).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!_(i,\"name\")||t&&i.name!==p)&&xe(i,\"name\",p),(o=a(i)).source||(o.source=r.join(\"string\"==typeof p?p:\"\"))),e!==d?(l?!c&&e[n]&&(u=!0):delete e[n],u?e[n]=i:xe(e,n,i)):u?e[n]=i:g(n,i);})(Function.prototype,\"toString\",(function(){return L(this)&&n(this).source||Re(this)}));})),Ve=S({}.toString),Ke=S(\"\".slice),Je=function(e){return Ke(Ve(e),8,-1)},Qe=X(\"toStringTag\"),et=d.Object,tt=\"Arguments\"==Je(function(){return arguments}()),nt=V?Je:function(e){var t,n,a;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=et(e),Qe))?n:tt?Je(t):\"Object\"==(a=Je(t))&&L(t.callee)?\"Arguments\":a},at=V?{}.toString:function(){return \"[object \"+nt(this)+\"]\"};V||Ze(Object.prototype,\"toString\",at,{unsafe:!0});var rt,it,st={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},ot=te(\"span\").classList,lt=ot&&ot.constructor&&ot.constructor.prototype,ut=lt===Object.prototype?void 0:lt,ct=S(S.bind),dt=d.Object,pt=S(\"\".split),gt=j((function(){return !dt(\"z\").propertyIsEnumerable(0)}))?function(e){return \"String\"==Je(e)?pt(e,\"\"):dt(e)}:dt,ft=Math.ceil,bt=Math.floor,ht=function(e){var t=+e;return t!=t||0===t?0:(t>0?bt:ft)(t)},mt=Math.min,yt=function(e){return e>0?mt(ht(e),9007199254740991):0},Et=function(e){return yt(e.length)},vt=Array.isArray||function(e){return \"Array\"==Je(e)},St=function(){},wt=[],kt=C(\"Reflect\",\"construct\"),At=/^\\s*(?:class|function)\\b/,xt=S(At.exec),Tt=!At.exec(St),_t=function(e){if(!L(e))return !1;try{return kt(St,wt,e),!0}catch(e){return !1}},Ot=!kt||j((function(){var e;return _t(_t.call)||!_t(Object)||!_t((function(){e=!0;}))||e}))?function(e){if(!L(e))return !1;switch(nt(e)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return !1}return Tt||!!xt(At,Re(e))}:_t,It=X(\"species\"),Rt=d.Array,Nt=function(e,t){return new(function(e){var t;return vt(e)&&(t=e.constructor,(Ot(t)&&(t===Rt||vt(t.prototype))||J(t)&&null===(t=t[It]))&&(t=void 0)),void 0===t?Rt:t}(e))(0===t?0:t)},Lt=S([].push),Pt=function(e){var t=1==e,n=2==e,a=3==e,r=4==e,i=6==e,s=7==e,o=5==e||i;return function(l,u,c,d){for(var p,g,f=x(l),b=gt(f),h=function(e,t){return fe(e),void 0===t?e:ct?ct(e,t):function(){return e.apply(t,arguments)}}(u,c),m=Et(b),y=0,E=d||Nt,v=t?E(l,m):n||s?E(l,0):void 0;m>y;y++)if((o||y in b)&&(g=h(p=b[y],y,f),e))if(t)v[y]=g;else if(g)switch(e){case 3:return !0;case 5:return p;case 6:return y;case 2:Lt(v,p);}else switch(e){case 4:return !1;case 7:Lt(v,p);}return i?-1:a||r?r:v}},Ct={forEach:Pt(0),map:Pt(1),filter:Pt(2),some:Pt(3),every:Pt(4),find:Pt(5),findIndex:Pt(6),filterReject:Pt(7)}.forEach,Ft=!!(it=[][\"forEach\"])&&j((function(){it.call(null,rt||function(){throw 1},1);}))?[].forEach:function(e){return Ct(this,e,arguments.length>1?arguments[1]:void 0)},Dt=function(e){if(e&&e.forEach!==Ft)try{xe(e,\"forEach\",Ft);}catch(t){e.forEach=Ft;}};for(var $t in st)st[$t]&&Dt(d[$t]&&d[$t].prototype);Dt(ut);var Mt={}.propertyIsEnumerable,Bt=Object.getOwnPropertyDescriptor,Ut={f:Bt&&!Mt.call({1:2},1)?function(e){var t=Bt(this,e);return !!t&&t.enumerable}:Mt},jt=function(e){return gt(k(e))},zt=Object.getOwnPropertyDescriptor,Gt={f:K?zt:function(e,t){if(e=jt(e),t=ve(t),ne)try{return zt(e,t)}catch(e){}if(_(e,t))return Ae(!oe(Ut.f,e,t),e[t])}},Ht=Math.max,qt=Math.min,Yt=function(e,t){var n=ht(e);return n<0?Ht(n+t,0):qt(n,t)},Wt=function(e){return function(t,n,a){var r,i=jt(t),s=Et(i),o=Yt(a,s);if(e&&n!=n){for(;s>o;)if((r=i[o++])!=r)return !0}else for(;s>o;o++)if((e||o in i)&&i[o]===n)return e||o||0;return !e&&-1}},Xt={includes:Wt(!0),indexOf:Wt(!1)}.indexOf,Zt=S([].push),Vt=function(e,t){var n,a=jt(e),r=0,i=[];for(n in a)!_(Fe,n)&&_(a,n)&&Zt(i,n);for(;t.length>r;)_(a,n=t[r++])&&(~Xt(i,n)||Zt(i,n));return i},Kt=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],Jt=Kt.concat(\"length\",\"prototype\"),Qt={f:Object.getOwnPropertyNames||function(e){return Vt(e,Jt)}},en={f:Object.getOwnPropertySymbols},tn=S([].concat),nn=C(\"Reflect\",\"ownKeys\")||function(e){var t=Qt.f(ie(e)),n=en.f;return n?tn(t,n(e)):t},an=function(e,t){for(var n=nn(t),a=ke.f,r=Gt.f,i=0;i<n.length;i++){var s=n[i];_(e,s)||a(e,s,r(t,s));}},rn=/#|\\.prototype\\./,sn=function(e,t){var n=ln[on(e)];return n==cn||n!=un&&(L(t)?j(t):!!t)},on=sn.normalize=function(e){return String(e).replace(rn,\".\").toLowerCase()},ln=sn.data={},un=sn.NATIVE=\"N\",cn=sn.POLYFILL=\"P\",dn=sn,pn=Gt.f,gn=function(e,t){var n,a,r,i,s,o=e.target,l=e.global,u=e.stat;if(n=l?d:u?d[o]||g(o,{}):(d[o]||{}).prototype)for(a in t){if(i=t[a],r=e.noTargetGet?(s=pn(n,a))&&s.value:n[a],!dn(l?a:o+(u?\".\":\"#\")+a,e.forced)&&void 0!==r){if(typeof i==typeof r)continue;an(i,r);}(e.sham||r&&r.sham)&&xe(i,\"sham\",!0),Ze(n,a,i,e);}},fn=Object.keys||function(e){return Vt(e,Kt)},bn=Object.assign,hn=Object.defineProperty,mn=S([].concat),yn=!bn||j((function(){if(K&&1!==bn({b:1},bn(hn({},\"a\",{enumerable:!0,get:function(){hn(this,\"b\",{value:3,enumerable:!1});}}),{b:2})).b)return !0;var e={},t={},n=Symbol(),a=\"abcdefghijklmnopqrst\";return e[n]=7,a.split(\"\").forEach((function(e){t[e]=e;})),7!=bn({},e)[n]||fn(bn({},t)).join(\"\")!=a}))?function(e,t){for(var n=x(e),a=arguments.length,r=1,i=en.f,s=Ut.f;a>r;)for(var o,l=gt(arguments[r++]),u=i?mn(fn(l),i(l)):fn(l),c=u.length,d=0;c>d;)o=u[d++],K&&!oe(s,l,o)||(n[o]=l[o]);return n}:bn;gn({target:\"Object\",stat:!0,forced:Object.assign!==yn},{assign:yn});var En=o((function(e){var t=function(e){var t=/\\blang(?:uage)?-([\\w-]+)\\b/i,n=0,a={},r={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof i?new i(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\u00a0/g,\" \")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,\"__id\",{value:++n}),e.__id},clone:function e(t,n){var a,i;switch(n=n||{},r.util.type(t)){case\"Object\":if(i=r.util.objId(t),n[i])return n[i];for(var s in a={},n[i]=a,t)t.hasOwnProperty(s)&&(a[s]=e(t[s],n));return a;case\"Array\":return i=r.util.objId(t),n[i]?n[i]:(a=[],n[i]=a,t.forEach((function(t,r){a[r]=e(t,n);})),a);default:return t}},getLanguage:function(e){for(;e&&!t.test(e.className);)e=e.parentElement;return e?(e.className.match(t)||[,\"none\"])[1].toLowerCase():\"none\"},currentScript:function(){if(\"undefined\"==typeof document)return null;if(\"currentScript\"in document)return document.currentScript;try{throw new Error}catch(a){var e=(/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(a.stack)||[])[1];if(e){var t=document.getElementsByTagName(\"script\");for(var n in t)if(t[n].src==e)return t[n]}return null}},isActive:function(e,t,n){for(var a=\"no-\"+t;e;){var r=e.classList;if(r.contains(t))return !0;if(r.contains(a))return !1;e=e.parentElement;}return !!n}},languages:{plain:a,plaintext:a,text:a,txt:a,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var i=(a=a||r.languages)[e],s={};for(var o in i)if(i.hasOwnProperty(o)){if(o==t)for(var l in n)n.hasOwnProperty(l)&&(s[l]=n[l]);n.hasOwnProperty(o)||(s[o]=i[o]);}var u=a[e];return a[e]=s,r.languages.DFS(r.languages,(function(t,n){n===u&&t!=e&&(this[t]=s);})),s},DFS:function e(t,n,a,i){i=i||{};var s=r.util.objId;for(var o in t)if(t.hasOwnProperty(o)){n.call(t,o,t[o],a||o);var l=t[o],u=r.util.type(l);\"Object\"!==u||i[s(l)]?\"Array\"!==u||i[s(l)]||(i[s(l)]=!0,e(l,n,o,i)):(i[s(l)]=!0,e(l,n,null,i));}}},plugins:{},highlightAll:function(e,t){r.highlightAllUnder(document,e,t);},highlightAllUnder:function(e,t,n){var a={callback:n,container:e,selector:'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'};r.hooks.run(\"before-highlightall\",a),a.elements=Array.prototype.slice.apply(a.container.querySelectorAll(a.selector)),r.hooks.run(\"before-all-elements-highlight\",a);for(var i,s=0;i=a.elements[s++];)r.highlightElement(i,!0===t,a.callback);},highlightElement:function(n,a,i){var s=r.util.getLanguage(n),o=r.languages[s];n.className=n.className.replace(t,\"\").replace(/\\s+/g,\" \")+\" language-\"+s;var l=n.parentElement;l&&\"pre\"===l.nodeName.toLowerCase()&&(l.className=l.className.replace(t,\"\").replace(/\\s+/g,\" \")+\" language-\"+s);var u={element:n,language:s,grammar:o,code:n.textContent};function c(e){u.highlightedCode=e,r.hooks.run(\"before-insert\",u),u.element.innerHTML=u.highlightedCode,r.hooks.run(\"after-highlight\",u),r.hooks.run(\"complete\",u),i&&i.call(u.element);}if(r.hooks.run(\"before-sanity-check\",u),(l=u.element.parentElement)&&\"pre\"===l.nodeName.toLowerCase()&&!l.hasAttribute(\"tabindex\")&&l.setAttribute(\"tabindex\",\"0\"),!u.code)return r.hooks.run(\"complete\",u),void(i&&i.call(u.element));if(r.hooks.run(\"before-highlight\",u),u.grammar)if(a&&e.Worker){var d=new Worker(r.filename);d.onmessage=function(e){c(e.data);},d.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}));}else c(r.highlight(u.code,u.grammar,u.language));else c(r.util.encode(u.code));},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};return r.hooks.run(\"before-tokenize\",a),a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run(\"after-tokenize\",a),i.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest;}var r=new l;return u(r,r.head,e),o(e,r,t,r.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(r)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t);},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,i=0;a=n[i++];)a(t);}},Token:i};function i(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||\"\").length;}function s(e,t,n,a){e.lastIndex=t;var r=e.exec(n);if(r&&a&&r[1]){var i=r[1].length;r.index+=i,r[0]=r[0].slice(i);}return r}function o(e,t,n,a,l,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var g=n[p];g=Array.isArray(g)?g:[g];for(var f=0;f<g.length;++f){if(d&&d.cause==p+\",\"+f)return;var b=g[f],h=b.inside,m=!!b.lookbehind,y=!!b.greedy,E=b.alias;if(y&&!b.pattern.global){var v=b.pattern.toString().match(/[imsuy]*$/)[0];b.pattern=RegExp(b.pattern.source,v+\"g\");}for(var S=b.pattern||b,w=a.next,k=l;w!==t.tail&&!(d&&k>=d.reach);k+=w.value.length,w=w.next){var A=w.value;if(t.length>e.length)return;if(!(A instanceof i)){var x,T=1;if(y){if(!(x=s(S,k,e,m)))break;var _=x.index,O=x.index+x[0].length,I=k;for(I+=w.value.length;_>=I;)I+=(w=w.next).value.length;if(k=I-=w.value.length,w.value instanceof i)continue;for(var R=w;R!==t.tail&&(I<O||\"string\"==typeof R.value);R=R.next)T++,I+=R.value.length;T--,A=e.slice(k,I),x.index-=k;}else if(!(x=s(S,0,A,m)))continue;_=x.index;var N=x[0],L=A.slice(0,_),P=A.slice(_+N.length),C=k+A.length;d&&C>d.reach&&(d.reach=C);var F=w.prev;if(L&&(F=u(t,F,L),k+=L.length),c(t,F,T),w=u(t,F,new i(p,h?r.tokenize(N,h):N,E,N)),P&&u(t,w,P),T>1){var D={cause:p+\",\"+f,reach:C};o(e,t,n,w.prev,k,D),d&&D.reach>d.reach&&(d.reach=D.reach);}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0;}function u(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function c(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;t.next=a,a.prev=t,e.length-=r;}if(e.Prism=r,i.stringify=function e(t,n){if(\"string\"==typeof t)return t;if(Array.isArray(t)){var a=\"\";return t.forEach((function(t){a+=e(t,n);})),a}var i={type:t.type,content:e(t.content,n),tag:\"span\",classes:[\"token\",t.type],attributes:{},language:n},s=t.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(i.classes,s):i.classes.push(s)),r.hooks.run(\"wrap\",i);var o=\"\";for(var l in i.attributes)o+=\" \"+l+'=\"'+(i.attributes[l]||\"\").replace(/\"/g,\"&quot;\")+'\"';return \"<\"+i.tag+' class=\"'+i.classes.join(\" \")+'\"'+o+\">\"+i.content+\"</\"+i.tag+\">\"},!e.document)return e.addEventListener?(r.disableWorkerMessageHandler||e.addEventListener(\"message\",(function(t){var n=JSON.parse(t.data),a=n.language,i=n.code,s=n.immediateClose;e.postMessage(r.highlight(i,r.languages[a],a)),s&&e.close();}),!1),r):r;var d=r.util.currentScript();function p(){r.manual||r.highlightAll();}if(d&&(r.filename=d.src,d.hasAttribute(\"data-manual\")&&(r.manual=!0)),!r.manual){var g=document.readyState;\"loading\"===g||\"interactive\"===g&&d&&d.defer?document.addEventListener(\"DOMContentLoaded\",p):window.requestAnimationFrame?window.requestAnimationFrame(p):window.setTimeout(p,16);}return r}(\"undefined\"!=typeof window?window:\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});\n  /**\n     * Prism: Lightweight, robust, elegant syntax highlighting\n     *\n     * @license MIT <https://opensource.org/licenses/MIT>\n     * @author Lea Verou <https://lea.verou.me>\n     * @namespace\n     * @public\n     */e.exports&&(e.exports=t),void 0!==s&&(s.Prism=t),t.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\\s\\S])*?-->/,greedy:!0},prolog:{pattern:/<\\?[\\s\\S]+?\\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,greedy:!0,inside:{\"internal-subset\":{pattern:/(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/\"[^\"]*\"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\\]]/,\"doctype-tag\":/^DOCTYPE/i,name:/[^\\s<>'\"]+/}},cdata:{pattern:/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,greedy:!0},tag:{pattern:/<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,greedy:!0,inside:{tag:{pattern:/^<\\/?[^\\s>\\/]+/,inside:{punctuation:/^<\\/?/,namespace:/^[^\\s>\\/:]+:/}},\"special-attr\":[],\"attr-value\":{pattern:/=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:\"attr-equals\"},/\"|'/]}},punctuation:/\\/?>/,\"attr-name\":{pattern:/[^\\s>\\/]+/,inside:{namespace:/^[^\\s>\\/:]+:/}}}},entity:[{pattern:/&[\\da-z]{1,8};/i,alias:\"named-entity\"},/&#x?[\\da-f]{1,8};/i]},t.languages.markup.tag.inside[\"attr-value\"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside[\"internal-subset\"].inside=t.languages.markup,t.hooks.add(\"wrap\",(function(e){\"entity\"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,\"&\"));})),Object.defineProperty(t.languages.markup.tag,\"addInlined\",{value:function(e,n){var a={};a[\"language-\"+n]={pattern:/(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^<!\\[CDATA\\[|\\]\\]>$/i;var r={\"included-cdata\":{pattern:/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,inside:a}};r[\"language-\"+n]={pattern:/[\\s\\S]+/,inside:t.languages[n]};var i={};i[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g,(function(){return e})),\"i\"),lookbehind:!0,greedy:!0,inside:r},t.languages.insertBefore(\"markup\",\"cdata\",i);}}),Object.defineProperty(t.languages.markup.tag,\"addAttribute\",{value:function(e,n){t.languages.markup.tag.inside[\"special-attr\"].push({pattern:RegExp(/(^|[\"'\\s])/.source+\"(?:\"+e+\")\"+/\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\"i\"),lookbehind:!0,inside:{\"attr-name\":/^[^\\s=]+/,\"attr-value\":{pattern:/=[\\s\\S]+/,inside:{value:{pattern:/(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,lookbehind:!0,alias:[n,\"language-\"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:\"attr-equals\"},/\"|'/]}}}});}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend(\"markup\",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;e.languages.css={comment:/\\/\\*[\\s\\S]*?\\*\\//,atrule:{pattern:/@[\\w-](?:[^;{\\s]|\\s+(?![\\s{]))*(?:;|(?=\\s*\\{))/,inside:{rule:/^@[\\w-]+/,\"selector-function-argument\":{pattern:/(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,lookbehind:!0,alias:\"selector\"},keyword:{pattern:/(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,lookbehind:!0}}},url:{pattern:RegExp(\"\\\\burl\\\\((?:\"+t.source+\"|\"+/(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source+\")\\\\)\",\"i\"),greedy:!0,inside:{function:/^url/i,punctuation:/^\\(|\\)$/,string:{pattern:RegExp(\"^\"+t.source+\"$\"),alias:\"url\"}}},selector:{pattern:RegExp(\"(^|[{}\\\\s])[^{}\\\\s](?:[^{};\\\"'\\\\s]|\\\\s+(?![\\\\s{])|\"+t.source+\")*(?=\\\\s*\\\\{)\"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,lookbehind:!0},important:/!important\\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined(\"style\",\"css\"),n.tag.addAttribute(\"style\",\"css\"));}(t),t.languages.clike={comment:[{pattern:/(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0},\"class-name\":{pattern:/(\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\\\]/}},keyword:/\\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,boolean:/\\b(?:true|false)\\b/,function:/\\b\\w+(?=\\()/,number:/\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,punctuation:/[{}[\\];(),.:]/},t.languages.javascript=t.languages.extend(\"clike\",{\"class-name\":[t.languages.clike[\"class-name\"],{pattern:/(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\\})\\s*)catch\\b/,lookbehind:!0},{pattern:/(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,lookbehind:!0}],function:/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,number:/\\b(?:(?:0[xX](?:[\\dA-Fa-f](?:_[\\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\\d(?:_\\d)?)+n|NaN|Infinity)\\b|(?:\\b(?:\\d(?:_\\d)?)+\\.?(?:\\d(?:_\\d)?)*|\\B\\.(?:\\d(?:_\\d)?)+)(?:[Ee][+-]?(?:\\d(?:_\\d)?)+)?/,operator:/--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/}),t.languages.javascript[\"class-name\"][0].pattern=/(\\b(?:class|interface|extends|implements|instanceof|new)\\s+)[\\w.\\\\]+/,t.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)\\/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/,lookbehind:!0,greedy:!0,inside:{\"regex-source\":{pattern:/^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,lookbehind:!0,alias:\"language-regex\",inside:t.languages.regex},\"regex-delimiter\":/^\\/|\\/$/,\"regex-flags\":/^[a-z]+$/}},\"function-variable\":{pattern:/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,alias:\"function\"},parameter:[{pattern:/(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/}),t.languages.insertBefore(\"javascript\",\"string\",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:\"comment\"},\"template-string\":{pattern:/`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,greedy:!0,inside:{\"template-punctuation\":{pattern:/^`|`$/,alias:\"string\"},interpolation:{pattern:/((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,lookbehind:!0,inside:{\"interpolation-punctuation\":{pattern:/^\\$\\{|\\}$/,alias:\"punctuation\"},rest:t.languages.javascript}},string:/[\\s\\S]+/}}}),t.languages.markup&&(t.languages.markup.tag.addInlined(\"script\",\"javascript\"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\"javascript\")),t.languages.js=t.languages.javascript,function(){if(void 0!==t&&\"undefined\"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:\"javascript\",py:\"python\",rb:\"ruby\",ps1:\"powershell\",psm1:\"powershell\",sh:\"bash\",bat:\"batch\",h:\"c\",tex:\"latex\"},n=\"data-src-status\",a=\"loading\",r=\"loaded\",i='pre[data-src]:not([data-src-status=\"loaded\"]):not([data-src-status=\"loading\"])',s=/\\blang(?:uage)?-([\\w-]+)\\b/i;t.hooks.add(\"before-highlightall\",(function(e){e.selector+=\", \"+i;})),t.hooks.add(\"before-sanity-check\",(function(s){var o=s.element;if(o.matches(i)){s.code=\"\",o.setAttribute(n,a);var u=o.appendChild(document.createElement(\"CODE\"));u.textContent=\"Loading…\";var c=o.getAttribute(\"data-src\"),d=s.language;if(\"none\"===d){var p=(/\\.(\\w+)$/.exec(c)||[,\"none\"])[1];d=e[p]||p;}l(u,d),l(o,d);var g=t.plugins.autoloader;g&&g.loadLanguages(d);var f=new XMLHttpRequest;f.open(\"GET\",c,!0),f.onreadystatechange=function(){var e,a;4==f.readyState&&(f.status<400&&f.responseText?(o.setAttribute(n,r),u.textContent=f.responseText,t.highlightElement(u)):(o.setAttribute(n,\"failed\"),f.status>=400?u.textContent=(e=f.status,a=f.statusText,\"✖ Error \"+e+\" while fetching file: \"+a):u.textContent=\"✖ Error: File does not exist or is empty\"));},f.send(null);}})),t.plugins.fileHighlight={highlight:function(e){for(var n,a=(e||document).querySelectorAll(i),r=0;n=a[r++];)t.highlightElement(n);}};var o=!1;t.fileHighlight=function(){o||(console.warn(\"Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.\"),o=!0),t.plugins.fileHighlight.highlight.apply(this,arguments);};}function l(e,t){var n=e.className;n=n.replace(s,\" \")+\" language-\"+t,e.className=n.replace(/\\s+/g,\" \").trim();}}();}));!function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\\s|\\/\\/.*(?!.)|\\/\\*(?:[^*]|\\*(?!\\/))\\*\\/)/.source,a=/(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})/.source,r=/(?:\\{<S>*\\.{3}(?:[^{}]|<BRACES>)*\\})/.source;function i(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return a})).replace(/<SPREAD>/g,(function(){return r})),RegExp(e,t)}r=i(r).source,e.languages.jsx=e.languages.extend(\"markup\",t),e.languages.jsx.tag.pattern=i(/<\\/?(?:[\\w.:-]+(?:<S>+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*'|[^\\s{'\"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\\/?[^\\s>\\/]*/i,e.languages.jsx.tag.inside[\"attr-value\"].pattern=/=(?!\\{)(?:\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*'|[^\\s'\">]+)/i,e.languages.jsx.tag.inside.tag.inside[\"class-name\"]=/^[A-Z]\\w*(?:\\.[A-Z]\\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore(\"inside\",\"attr-name\",{spread:{pattern:i(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore(\"inside\",\"special-attr\",{script:{pattern:i(/=<BRACES>/.source),inside:{\"script-punctuation\":{pattern:/^=(?=\\{)/,alias:\"punctuation\"},rest:e.languages.jsx},alias:\"language-javascript\"}},e.languages.jsx.tag);var s=function(e){return e?\"string\"==typeof e?e:\"string\"==typeof e.content?e.content:e.content.map(s).join(\"\"):\"\"},o=function(t){for(var n=[],a=0;a<t.length;a++){var r=t[a],i=!1;if(\"string\"!=typeof r&&(\"tag\"===r.type&&r.content[0]&&\"tag\"===r.content[0].type?\"</\"===r.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===s(r.content[0].content[1])&&n.pop():\"/>\"===r.content[r.content.length-1].content||n.push({tagName:s(r.content[0].content[1]),openedBraces:0}):n.length>0&&\"punctuation\"===r.type&&\"{\"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&\"punctuation\"===r.type&&\"}\"===r.content?n[n.length-1].openedBraces--:i=!0),(i||\"string\"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var l=s(r);a<t.length-1&&(\"string\"==typeof t[a+1]||\"plain-text\"===t[a+1].type)&&(l+=s(t[a+1]),t.splice(a+1,1)),a>0&&(\"string\"==typeof t[a-1]||\"plain-text\"===t[a-1].type)&&(l=s(t[a-1])+l,t.splice(a-1,1),a--),t[a]=new e.Token(\"plain-text\",l,null,l);}r.content&&\"string\"!=typeof r.content&&o(r.content);}};e.hooks.add(\"after-tokenize\",(function(e){\"jsx\"!==e.language&&\"tsx\"!==e.language||o(e.tokens);}));}(Prism),function(e){e.languages.typescript=e.languages.extend(\"javascript\",{\"class-name\":{pattern:/(\\b(?:class|extends|implements|instanceof|interface|new|type)\\s+)(?!keyof\\b)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?:\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\\b/}),e.languages.typescript.keyword.push(/\\b(?:abstract|as|declare|implements|is|keyof|readonly|require)\\b/,/\\b(?:asserts|infer|interface|module|namespace|type)\\b(?=\\s*(?:[{_$a-zA-Z\\xA0-\\uFFFF]|$))/,/\\btype\\b(?=\\s*(?:[\\{*]|$))/),delete e.languages.typescript.parameter;var t=e.languages.extend(\"typescript\",{});delete t[\"class-name\"],e.languages.typescript[\"class-name\"].inside=t,e.languages.insertBefore(\"typescript\",\"function\",{decorator:{pattern:/@[$\\w\\xA0-\\uFFFF]+/,inside:{at:{pattern:/^@/,alias:\"operator\"},function:/^[\\s\\S]+/}},\"generic-function\":{pattern:/#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\\s*\\()/,greedy:!0,inside:{function:/^#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*/,generic:{pattern:/<[\\s\\S]+/,alias:\"class-name\",inside:t}}}}),e.languages.ts=e.languages.typescript;}(Prism),Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\\s\\S])*?-->/,greedy:!0},prolog:{pattern:/<\\?[\\s\\S]+?\\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,greedy:!0,inside:{\"internal-subset\":{pattern:/(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/\"[^\"]*\"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\\]]/,\"doctype-tag\":/^DOCTYPE/i,name:/[^\\s<>'\"]+/}},cdata:{pattern:/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,greedy:!0},tag:{pattern:/<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,greedy:!0,inside:{tag:{pattern:/^<\\/?[^\\s>\\/]+/,inside:{punctuation:/^<\\/?/,namespace:/^[^\\s>\\/:]+:/}},\"special-attr\":[],\"attr-value\":{pattern:/=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:\"attr-equals\"},/\"|'/]}},punctuation:/\\/?>/,\"attr-name\":{pattern:/[^\\s>\\/]+/,inside:{namespace:/^[^\\s>\\/:]+:/}}}},entity:[{pattern:/&[\\da-z]{1,8};/i,alias:\"named-entity\"},/&#x?[\\da-f]{1,8};/i]},Prism.languages.markup.tag.inside[\"attr-value\"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside[\"internal-subset\"].inside=Prism.languages.markup,Prism.hooks.add(\"wrap\",(function(e){\"entity\"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,\"&\"));})),Object.defineProperty(Prism.languages.markup.tag,\"addInlined\",{value:function(e,t){var n={};n[\"language-\"+t]={pattern:/(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^<!\\[CDATA\\[|\\]\\]>$/i;var a={\"included-cdata\":{pattern:/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,inside:n}};a[\"language-\"+t]={pattern:/[\\s\\S]+/,inside:Prism.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g,(function(){return e})),\"i\"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore(\"markup\",\"cdata\",r);}}),Object.defineProperty(Prism.languages.markup.tag,\"addAttribute\",{value:function(e,t){Prism.languages.markup.tag.inside[\"special-attr\"].push({pattern:RegExp(/(^|[\"'\\s])/.source+\"(?:\"+e+\")\"+/\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\"i\"),lookbehind:!0,inside:{\"attr-name\":/^[^\\s=]+/,\"attr-value\":{pattern:/=[\\s\\S]+/,inside:{value:{pattern:/(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,lookbehind:!0,alias:[t,\"language-\"+t],inside:Prism.languages[t]},punctuation:[{pattern:/^=/,alias:\"attr-equals\"},/\"|'/]}}}});}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend(\"markup\",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,Prism.languages.go=Prism.languages.extend(\"clike\",{string:{pattern:/([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,greedy:!0},keyword:/\\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\\b/,boolean:/\\b(?:_|iota|nil|true|false)\\b/,number:/(?:\\b0x[a-f\\d]+|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[-+]?\\d+)?)i?/i,operator:/[*\\/%^!=]=?|\\+[=+]?|-[=-]?|\\|[=|]?|&(?:=|&|\\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\\.\\.\\./,builtin:/\\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\\b/}),delete Prism.languages.go[\"class-name\"],function(e){var t=/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*|#(?!\\[).*/,n=[{pattern:/\\b(?:false|true)\\b/i,alias:\"boolean\"},{pattern:/(::\\s*)\\b[a-z_]\\w*\\b(?!\\s*\\()/i,greedy:!0,lookbehind:!0},{pattern:/(\\b(?:case|const)\\s+)\\b[a-z_]\\w*(?=\\s*[;=])/i,greedy:!0,lookbehind:!0},/\\b(?:null)\\b/i,/\\b[A-Z_][A-Z0-9_]*\\b(?!\\s*\\()/],a=/\\b0b[01]+(?:_[01]+)*\\b|\\b0o[0-7]+(?:_[0-7]+)*\\b|\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b|(?:\\b\\d+(?:_\\d+)*\\.?(?:\\d+(?:_\\d+)*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,r=/<?=>|\\?\\?=?|\\.{3}|\\??->|[!=]=?=?|::|\\*\\*=?|--|\\+\\+|&&|\\|\\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\\[\\](),:;]/;e.languages.php={delimiter:{pattern:/\\?>$|^<\\?(?:php(?=\\s)|=)?/i,alias:\"important\"},comment:t,variable:/\\$+(?:\\w+\\b|(?=\\{))/i,package:{pattern:/(namespace\\s+|use\\s+(?:function\\s+)?)(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,lookbehind:!0,inside:{punctuation:/\\\\/}},\"class-name-definition\":{pattern:/(\\b(?:class|enum|interface|trait)\\s+)\\b[a-z_]\\w*(?!\\\\)\\b/i,lookbehind:!0,alias:\"class-name\"},\"function-definition\":{pattern:/(\\bfunction\\s+)[a-z_]\\w*(?=\\s*\\()/i,lookbehind:!0,alias:\"function\"},keyword:[{pattern:/(\\(\\s*)\\b(?:bool|boolean|int|integer|float|string|object|array)\\b(?=\\s*\\))/i,alias:\"type-casting\",greedy:!0,lookbehind:!0},{pattern:/([(,?]\\s*)\\b(?:bool|int|float|string|object|array(?!\\s*\\()|mixed|self|static|callable|iterable|(?:null|false)(?=\\s*\\|))\\b(?=\\s*\\$)/i,alias:\"type-hint\",greedy:!0,lookbehind:!0},{pattern:/([(,?]\\s*[\\w|]\\|\\s*)(?:null|false)\\b(?=\\s*\\$)/i,alias:\"type-hint\",greedy:!0,lookbehind:!0},{pattern:/(\\)\\s*:\\s*(?:\\?\\s*)?)\\b(?:bool|int|float|string|object|void|array(?!\\s*\\()|mixed|self|static|callable|iterable|(?:null|false)(?=\\s*\\|))\\b/i,alias:\"return-type\",greedy:!0,lookbehind:!0},{pattern:/(\\)\\s*:\\s*(?:\\?\\s*)?[\\w|]\\|\\s*)(?:null|false)\\b/i,alias:\"return-type\",greedy:!0,lookbehind:!0},{pattern:/\\b(?:bool|int|float|string|object|void|array(?!\\s*\\()|mixed|iterable|(?:null|false)(?=\\s*\\|))\\b/i,alias:\"type-declaration\",greedy:!0},{pattern:/(\\|\\s*)(?:null|false)\\b/i,alias:\"type-declaration\",greedy:!0,lookbehind:!0},{pattern:/\\b(?:parent|self|static)(?=\\s*::)/i,alias:\"static-context\",greedy:!0},{pattern:/(\\byield\\s+)from\\b/i,lookbehind:!0},/\\bclass\\b/i,{pattern:/((?:^|[^\\s>:]|(?:^|[^-])>|(?:^|[^:]):)\\s*)\\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\\b/i,lookbehind:!0}],\"argument-name\":{pattern:/([(,]\\s+)\\b[a-z_]\\w*(?=\\s*:(?!:))/i,lookbehind:!0},\"class-name\":[{pattern:/(\\b(?:extends|implements|instanceof|new(?!\\s+self|\\s+static))\\s+|\\bcatch\\s*\\()\\b[a-z_]\\w*(?!\\\\)\\b/i,greedy:!0,lookbehind:!0},{pattern:/(\\|\\s*)\\b[a-z_]\\w*(?!\\\\)\\b/i,greedy:!0,lookbehind:!0},{pattern:/\\b[a-z_]\\w*(?!\\\\)\\b(?=\\s*\\|)/i,greedy:!0},{pattern:/(\\|\\s*)(?:\\\\?\\b[a-z_]\\w*)+\\b/i,alias:\"class-name-fully-qualified\",greedy:!0,lookbehind:!0,inside:{punctuation:/\\\\/}},{pattern:/(?:\\\\?\\b[a-z_]\\w*)+\\b(?=\\s*\\|)/i,alias:\"class-name-fully-qualified\",greedy:!0,inside:{punctuation:/\\\\/}},{pattern:/(\\b(?:extends|implements|instanceof|new(?!\\s+self\\b|\\s+static\\b))\\s+|\\bcatch\\s*\\()(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,alias:\"class-name-fully-qualified\",greedy:!0,lookbehind:!0,inside:{punctuation:/\\\\/}},{pattern:/\\b[a-z_]\\w*(?=\\s*\\$)/i,alias:\"type-declaration\",greedy:!0},{pattern:/(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*\\$)/i,alias:[\"class-name-fully-qualified\",\"type-declaration\"],greedy:!0,inside:{punctuation:/\\\\/}},{pattern:/\\b[a-z_]\\w*(?=\\s*::)/i,alias:\"static-context\",greedy:!0},{pattern:/(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*::)/i,alias:[\"class-name-fully-qualified\",\"static-context\"],greedy:!0,inside:{punctuation:/\\\\/}},{pattern:/([(,?]\\s*)[a-z_]\\w*(?=\\s*\\$)/i,alias:\"type-hint\",greedy:!0,lookbehind:!0},{pattern:/([(,?]\\s*)(?:\\\\?\\b[a-z_]\\w*)+(?=\\s*\\$)/i,alias:[\"class-name-fully-qualified\",\"type-hint\"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\\\/}},{pattern:/(\\)\\s*:\\s*(?:\\?\\s*)?)\\b[a-z_]\\w*(?!\\\\)\\b/i,alias:\"return-type\",greedy:!0,lookbehind:!0},{pattern:/(\\)\\s*:\\s*(?:\\?\\s*)?)(?:\\\\?\\b[a-z_]\\w*)+\\b(?!\\\\)/i,alias:[\"class-name-fully-qualified\",\"return-type\"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\\\/}}],constant:n,function:{pattern:/(^|[^\\\\\\w])\\\\?[a-z_](?:[\\w\\\\]*\\w)?(?=\\s*\\()/i,lookbehind:!0,inside:{punctuation:/\\\\/}},property:{pattern:/(->\\s*)\\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var s={pattern:/\\{\\$(?:\\{(?:\\{[^{}]+\\}|[^{}]+)\\}|[^{}])+\\}|(^|[^\\\\{])\\$+(?:\\w+(?:\\[[^\\r\\n\\[\\]]+\\]|->\\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\\r\\n](?:.*[\\r\\n])*?\\1;/,alias:\"nowdoc-string\",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\\w*;$/i,alias:\"symbol\",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:\"([^\"]+)\"[\\r\\n](?:.*[\\r\\n])*?\\1;|([a-z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?\\2;)/i,alias:\"heredoc-string\",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:\"[^\"]+\"|[a-z_]\\w*)|[a-z_]\\w*;$/i,alias:\"symbol\",inside:{punctuation:/^<<<\"?|[\";]$/}},interpolation:s}},{pattern:/`(?:\\\\[\\s\\S]|[^\\\\`])*`/,alias:\"backtick-quoted-string\",greedy:!0},{pattern:/'(?:\\\\[\\s\\S]|[^\\\\'])*'/,alias:\"single-quoted-string\",greedy:!0},{pattern:/\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"/,alias:\"double-quoted-string\",greedy:!0,inside:{interpolation:s}}];e.languages.insertBefore(\"php\",\"variable\",{string:o,attribute:{pattern:/#\\[(?:[^\"'\\/#]|\\/(?![*/])|\\/\\/.*$|#(?!\\[).*$|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|\"(?:\\\\[\\s\\S]|[^\\\\\"])*\"|'(?:\\\\[\\s\\S]|[^\\\\'])*')+\\](?=\\s*[a-z$#])/im,greedy:!0,inside:{\"attribute-content\":{pattern:/^(#\\[)[\\s\\S]+(?=\\]$)/,lookbehind:!0,inside:{comment:t,string:o,\"attribute-class-name\":[{pattern:/([^:]|^)\\b[a-z_]\\w*(?!\\\\)\\b/i,alias:\"class-name\",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\\\?\\b[a-z_]\\w*)+/i,alias:[\"class-name\",\"class-name-fully-qualified\"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\\[|\\]$/,alias:\"punctuation\"}}}}),e.hooks.add(\"before-tokenize\",(function(t){if(/<\\?/.test(t.code)){e.languages[\"markup-templating\"].buildPlaceholders(t,\"php\",/<\\?(?:[^\"'/#]|\\/(?![*/])|(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|(?:\\/\\/|#(?!\\[))(?:[^?\\n\\r]|\\?(?!>))*(?=$|\\?>|[\\r\\n])|#\\[|\\/\\*(?:[^*]|\\*(?!\\/))*(?:\\*\\/|$))*?(?:\\?>|$)/gi);}})),e.hooks.add(\"after-tokenize\",(function(t){e.languages[\"markup-templating\"].tokenizePlaceholders(t,\"php\");}));}(Prism),Prism.languages.c=Prism.languages.extend(\"clike\",{comment:{pattern:/\\/\\/(?:[^\\r\\n\\\\]|\\\\(?:\\r\\n?|\\n|(?![\\r\\n])))*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,greedy:!0},\"class-name\":{pattern:/(\\b(?:enum|struct)\\s+(?:__attribute__\\s*\\(\\([\\s\\S]*?\\)\\)\\s*)?)\\w+|\\b[a-z]\\w*_t\\b/,lookbehind:!0},keyword:/\\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\\b/,function:/\\b[a-z_]\\w*(?=\\s*\\()/i,number:/(?:\\b0x(?:[\\da-f]+(?:\\.[\\da-f]*)?|\\.[\\da-f]+)(?:p[+-]?\\d+)?|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore(\"c\",\"string\",{macro:{pattern:/(^[\\t ]*)#\\s*[a-z](?:[^\\r\\n\\\\/]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|\\\\(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0,greedy:!0,alias:\"property\",inside:{string:[{pattern:/^(#\\s*include\\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,\"macro-name\":[{pattern:/(^#\\s*define\\s+)\\w+\\b(?!\\()/i,lookbehind:!0},{pattern:/(^#\\s*define\\s+)\\w+\\b(?=\\()/i,lookbehind:!0,alias:\"function\"}],directive:{pattern:/^(#\\s*)[a-z]+/,lookbehind:!0,alias:\"keyword\"},\"directive-hash\":/^#/,punctuation:/##|\\\\(?=[\\r\\n])/,expression:{pattern:/\\S[\\s\\S]*/,inside:Prism.languages.c}}},constant:/\\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\\b/}),delete Prism.languages.c.boolean,Prism.languages.python={comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},\"string-interpolation\":{pattern:/(?:f|rf|fr)(?:(\"\"\"|''')[\\s\\S]*?\\1|(\"|')(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\\{\\{)*)\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}])+\\})+\\})+\\}/,lookbehind:!0,inside:{\"format-spec\":{pattern:/(:)[^:(){}]+(?=\\}$)/,lookbehind:!0},\"conversion-option\":{pattern:/![sra](?=[:}]$)/,alias:\"punctuation\"},rest:null}},string:/[\\s\\S]+/}},\"triple-quoted-string\":{pattern:/(?:[rub]|rb|br)?(\"\"\"|''')[\\s\\S]*?\\1/i,greedy:!0,alias:\"string\"},string:{pattern:/(?:[rub]|rb|br)?(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/i,greedy:!0},function:{pattern:/((?:^|\\s)def[ \\t]+)[a-zA-Z_]\\w*(?=\\s*\\()/g,lookbehind:!0},\"class-name\":{pattern:/(\\bclass\\s+)\\w+/i,lookbehind:!0},decorator:{pattern:/(^[\\t ]*)@\\w+(?:\\.\\w+)*/im,lookbehind:!0,alias:[\"annotation\",\"punctuation\"],inside:{punctuation:/\\./}},keyword:/\\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\\b/,builtin:/\\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\\b/,boolean:/\\b(?:True|False|None)\\b/,number:/\\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\\b|(?:\\b\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\B\\.\\d+(?:_\\d+)*)(?:e[+-]?\\d+(?:_\\d+)*)?j?\\b/i,operator:/[-+%=]=?|!=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\\];(),.:]/},Prism.languages.python[\"string-interpolation\"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(e){var t=/\\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\\b/,n=/(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*/.source,a={pattern:RegExp(n+/[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\\w*(?:\\s*\\.\\s*[a-z]\\w*)*(?:\\s*\\.)?/,inside:{punctuation:/\\./}},punctuation:/\\./}};e.languages.java=e.languages.extend(\"clike\",{\"class-name\":[a,{pattern:RegExp(n+/[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\\s*)[a-z_]\\w*/,lookbehind:!0}],number:/\\b0b[01][01_]*L?\\b|\\b0x(?:\\.[\\da-f_p+-]+|[\\da-f_]+(?:\\.[\\da-f_p+-]+)?)\\b|(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\\+\\+|&&|\\|\\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore(\"java\",\"string\",{\"triple-quoted-string\":{pattern:/\"\"\"[ \\t]*[\\r\\n](?:(?:\"|\"\")?(?:\\\\.|[^\"\\\\]))*\"\"\"/,greedy:!0,alias:\"string\"}}),e.languages.insertBefore(\"java\",\"class-name\",{annotation:{pattern:/(^|[^.])@\\w+(?:\\s*\\.\\s*\\w+)*/,lookbehind:!0,alias:\"punctuation\"},generics:{pattern:/<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&)|<(?:[\\w\\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{\"class-name\":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\\./}}});}(Prism),function(e){var t=/\\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\\b/,n=/\\b(?!<keyword>)\\w+(?:\\s*\\.\\s*\\w+)*\\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend(\"c\",{\"class-name\":[{pattern:RegExp(/(\\b(?:class|concept|enum|struct|typename)\\s+)(?!<keyword>)\\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\\b[A-Z]\\w*(?=\\s*::\\s*\\w+\\s*\\()/,/\\b[A-Z_]\\w*(?=\\s*::\\s*~\\w+\\s*\\()/i,/\\b\\w+(?=\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\\s*::\\s*\\w+\\s*\\()/],keyword:t,number:{pattern:/(?:\\b0b[01']+|\\b0x(?:[\\da-f']+(?:\\.[\\da-f']*)?|\\.[\\da-f']+)(?:p[+-]?[\\d']+)?|(?:\\b[\\d']+(?:\\.[\\d']*)?|\\B\\.[\\d']+)(?:e[+-]?[\\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\\+\\+|&&|\\|\\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\\b/,boolean:/\\b(?:true|false)\\b/}),e.languages.insertBefore(\"cpp\",\"string\",{module:{pattern:RegExp(/(\\b(?:module|import)\\s+)/.source+\"(?:\"+/\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|<[^<>\\r\\n]*>/.source+\"|\"+/<mod-name>(?:\\s*:\\s*<mod-name>)?|:\\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+\")\"),lookbehind:!0,greedy:!0,inside:{string:/^[<\"][\\s\\S]+/,operator:/:/,punctuation:/\\./}},\"raw-string\":{pattern:/R\"([^()\\\\ ]{0,16})\\([\\s\\S]*?\\)\\1\"/,alias:\"string\",greedy:!0}}),e.languages.insertBefore(\"cpp\",\"keyword\",{\"generic-function\":{pattern:/\\b(?!operator\\b)[a-z_]\\w*\\s*<(?:[^<>]|<[^<>]*>)*>(?=\\s*\\()/i,inside:{function:/^\\w+/,generic:{pattern:/<[\\s\\S]+/,alias:\"class-name\",inside:e.languages.cpp}}}}),e.languages.insertBefore(\"cpp\",\"operator\",{\"double-colon\":{pattern:/::/,alias:\"punctuation\"}}),e.languages.insertBefore(\"cpp\",\"class-name\",{\"base-clause\":{pattern:/(\\b(?:class|struct)\\s+\\w+\\s*:\\s*)[^;{}\"'\\s]+(?:\\s+[^;{}\"'\\s]+)*(?=\\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend(\"cpp\",{})}}),e.languages.insertBefore(\"inside\",\"double-colon\",{\"class-name\":/\\b[a-z_]\\w*\\b(?!\\s*::)/i},e.languages.cpp[\"base-clause\"]);}(Prism),function(e){function t(e,t){return e.replace(/<<(\\d+)>>/g,(function(e,n){return \"(?:\"+t[+n]+\")\"}))}function n(e,n,a){return RegExp(t(e,n),a||\"\")}function a(e,t){for(var n=0;n<t;n++)e=e.replace(/<<self>>/g,(function(){return \"(?:\"+e+\")\"}));return e.replace(/<<self>>/g,\"[^\\\\s\\\\S]\")}var r=\"bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void\",i=\"class enum interface record struct\",s=\"add alias and ascending async await by descending from(?=\\\\s*(?:\\\\w|$)) get global group into init(?=\\\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\\\s*{)\",o=\"abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield\";function l(e){return \"\\\\b(?:\"+e.trim().replace(/ /g,\"|\")+\")\\\\b\"}var u=l(i),c=RegExp(l(r+\" \"+i+\" \"+s+\" \"+o)),d=l(i+\" \"+s+\" \"+o),p=l(r+\" \"+i+\" \"+o),g=a(/<(?:[^<>;=+\\-*/%&|^]|<<self>>)*>/.source,2),f=a(/\\((?:[^()]|<<self>>)*\\)/.source,2),b=/@?\\b[A-Za-z_]\\w*\\b/.source,h=t(/<<0>>(?:\\s*<<1>>)?/.source,[b,g]),m=t(/(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*/.source,[d,h]),y=/\\[\\s*(?:,\\s*)*\\]/.source,E=t(/<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?/.source,[m,y]),v=t(/[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,f,y]),S=t(/\\(<<0>>+(?:,<<0>>+)+\\)/.source,[v]),w=t(/(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?/.source,[S,m,y]),k={keyword:c,punctuation:/[<>()?,.:[\\]]/},A=/'(?:[^\\r\\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'/.source,x=/\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/.source,T=/@\"(?:\"\"|\\\\[\\s\\S]|[^\\\\\"])*\"(?!\")/.source;e.languages.csharp=e.languages.extend(\"clike\",{string:[{pattern:n(/(^|[^$\\\\])<<0>>/.source,[T]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\\\])<<0>>/.source,[x]),lookbehind:!0,greedy:!0},{pattern:RegExp(A),greedy:!0,alias:\"character\"}],\"class-name\":[{pattern:n(/(\\busing\\s+static\\s+)<<0>>(?=\\s*;)/.source,[m]),lookbehind:!0,inside:k},{pattern:n(/(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)/.source,[b,w]),lookbehind:!0,inside:k},{pattern:n(/(\\busing\\s+)<<0>>(?=\\s*=)/.source,[b]),lookbehind:!0},{pattern:n(/(\\b<<0>>\\s+)<<1>>/.source,[u,h]),lookbehind:!0,inside:k},{pattern:n(/(\\bcatch\\s*\\(\\s*)<<0>>/.source,[m]),lookbehind:!0,inside:k},{pattern:n(/(\\bwhere\\s+)<<0>>/.source,[b]),lookbehind:!0},{pattern:n(/(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>/.source,[E]),lookbehind:!0,inside:k},{pattern:n(/\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))/.source,[w,p,b]),inside:k}],keyword:c,number:/(?:\\b0(?:x[\\da-f_]*[\\da-f]|b[01_]*[01])|(?:\\B\\.\\d+(?:_+\\d+)*|\\b\\d+(?:_+\\d+)*(?:\\.\\d+(?:_+\\d+)*)?)(?:e[-+]?\\d+(?:_+\\d+)*)?)(?:ul|lu|[dflmu])?\\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\\1|~|\\?\\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\\?\\.?|::|[{}[\\];(),.:]/}),e.languages.insertBefore(\"csharp\",\"number\",{range:{pattern:/\\.\\./,alias:\"operator\"}}),e.languages.insertBefore(\"csharp\",\"punctuation\",{\"named-parameter\":{pattern:n(/([(,]\\s*)<<0>>(?=\\s*:)/.source,[b]),lookbehind:!0,alias:\"punctuation\"}}),e.languages.insertBefore(\"csharp\",\"class-name\",{namespace:{pattern:n(/(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])/.source,[b]),lookbehind:!0,inside:{punctuation:/\\./}},\"type-expression\":{pattern:n(/(\\b(?:default|typeof|sizeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))/.source,[f]),lookbehind:!0,alias:\"class-name\",inside:k},\"return-type\":{pattern:n(/<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))/.source,[w,m]),inside:k,alias:\"class-name\"},\"constructor-invocation\":{pattern:n(/(\\bnew\\s+)<<0>>(?=\\s*[[({])/.source,[w]),lookbehind:!0,inside:k,alias:\"class-name\"},\"generic-method\":{pattern:n(/<<0>>\\s*<<1>>(?=\\s*\\()/.source,[b,g]),inside:{function:n(/^<<0>>/.source,[b]),generic:{pattern:RegExp(g),alias:\"class-name\",inside:k}}},\"type-list\":{pattern:n(/\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))/.source,[u,h,b,w,c.source,f,/\\bnew\\s*\\(\\s*\\)/.source]),lookbehind:!0,inside:{\"record-arguments\":{pattern:n(/(^(?!new\\s*\\()<<0>>\\s*)<<1>>/.source,[h,f]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,\"class-name\":{pattern:RegExp(w),greedy:!0,inside:k},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\\t ]*)#.*/m,lookbehind:!0,alias:\"property\",inside:{directive:{pattern:/(#)\\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\\b/,lookbehind:!0,alias:\"keyword\"}}}});var _=x+\"|\"+A,O=t(/\\/(?![*/])|\\/\\/[^\\r\\n]*[\\r\\n]|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|<<0>>/.source,[_]),I=a(t(/[^\"'/()]|<<0>>|\\(<<self>>*\\)/.source,[O]),2),R=/\\b(?:assembly|event|field|method|module|param|property|return|type)\\b/.source,N=t(/<<0>>(?:\\s*\\(<<1>>*\\))?/.source,[m,I]);e.languages.insertBefore(\"csharp\",\"class-name\",{attribute:{pattern:n(/((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])/.source,[R,N]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\\s*:)/.source,[R]),alias:\"keyword\"},\"attribute-arguments\":{pattern:n(/\\(<<0>>*\\)/.source,[I]),inside:e.languages.csharp},\"class-name\":{pattern:RegExp(m),inside:{punctuation:/\\./}},punctuation:/[:,]/}}});var L=/:[^}\\r\\n]+/.source,P=a(t(/[^\"'/()]|<<0>>|\\(<<self>>*\\)/.source,[O]),2),C=t(/\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}/.source,[P,L]),F=a(t(/[^\"'/()]|\\/(?!\\*)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/|<<0>>|\\(<<self>>*\\)/.source,[_]),2),D=t(/\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}/.source,[F,L]);function $(t,a){return {interpolation:{pattern:n(/((?:^|[^{])(?:\\{\\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{\"format-string\":{pattern:n(/(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)/.source,[a,L]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\\{|\\}$/,expression:{pattern:/[\\s\\S]+/,alias:\"language-csharp\",inside:e.languages.csharp}}},string:/[\\s\\S]+/}}e.languages.insertBefore(\"csharp\",\"string\",{\"interpolation-string\":[{pattern:n(/(^|[^\\\\])(?:\\$@|@\\$)\"(?:\"\"|\\\\[\\s\\S]|\\{\\{|<<0>>|[^\\\\{\"])*\"/.source,[C]),lookbehind:!0,greedy:!0,inside:$(C,P)},{pattern:n(/(^|[^@\\\\])\\$\"(?:\\\\.|\\{\\{|<<0>>|[^\\\\\"{])*\"/.source,[D]),lookbehind:!0,greedy:!0,inside:$(D,F)}]});}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp,Prism.languages[\"visual-basic\"]={comment:{pattern:/(?:['‘’]|REM\\b)(?:[^\\r\\n_]|_(?:\\r\\n?|\\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:[^\\S\\r\\n]_[^\\S\\r\\n]*(?:\\r\\n?|\\n)|.)+/i,alias:\"comment\",greedy:!0},string:{pattern:/\\$?[\"“”](?:[\"“”]{2}|[^\"“”])*[\"“”]C?/i,greedy:!0},date:{pattern:/#[^\\S\\r\\n]*(?:\\d+([/-])\\d+\\1\\d+(?:[^\\S\\r\\n]+(?:\\d+[^\\S\\r\\n]*(?:AM|PM)|\\d+:\\d+(?::\\d+)?(?:[^\\S\\r\\n]*(?:AM|PM))?))?|\\d+[^\\S\\r\\n]*(?:AM|PM)|\\d+:\\d+(?::\\d+)?(?:[^\\S\\r\\n]*(?:AM|PM))?)[^\\S\\r\\n]*#/i,alias:\"builtin\"},number:/(?:(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)(?:E[+-]?\\d+)?|&[HO][\\dA-F]+)(?:U?[ILS]|[FRD])?/i,boolean:/\\b(?:True|False|Nothing)\\b/i,keyword:/\\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Until|Xor)\\b/i,operator:[/[+\\-*/\\\\^<=>&#@$%!]/,{pattern:/([^\\S\\r\\n])_(?=[^\\S\\r\\n]*[\\r\\n])/,lookbehind:!0}],punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages[\"visual-basic\"],Prism.languages.vba=Prism.languages[\"visual-basic\"],Prism.languages.sql={comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:--|\\/\\/|#).*)/,lookbehind:!0},variable:[{pattern:/@([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])+\\1/,greedy:!0},/@[\\w.$]+/],string:{pattern:/(^|[^@\\\\])(\"|')(?:\\\\[\\s\\S]|(?!\\2)[^\\\\]|\\2\\2)*\\2/,greedy:!0,lookbehind:!0},function:/\\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\\s*\\()/i,keyword:/\\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\\b/i,boolean:/\\b(?:TRUE|FALSE|NULL)\\b/i,number:/\\b0x[\\da-f]+\\b|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+\\b/i,operator:/[-+*\\/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:AND|BETWEEN|DIV|IN|ILIKE|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\\b/i,punctuation:/[;[\\]()`,.]/},function(e){e.languages.ruby=e.languages.extend(\"clike\",{comment:[/#.*/,{pattern:/^=begin\\s[\\s\\S]*?^=end/m,greedy:!0}],\"class-name\":{pattern:/(\\b(?:class)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\\\]/}},keyword:/\\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\\b/});var t={pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"tag\"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore(\"ruby\",\"keyword\",{regex:[{pattern:RegExp(/%r/.source+\"(?:\"+[/([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/.source,/\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)/.source,/\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[\\s\\S])*\\}/.source,/\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\]/.source,/<(?:[^<>\\\\]|\\\\[\\s\\S])*>/.source].join(\"|\")+\")\"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t}},{pattern:/(^|[^/])\\/(?!\\/)(?:\\[[^\\r\\n\\]]+\\]|\\\\.|[^[/\\\\\\r\\n])+\\/[egimnosux]{0,6}(?=\\s*(?:$|[\\r\\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t}}],variable:/[@$]+[a-zA-Z_]\\w*(?:[?!]|\\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\\w*(?:[?!]|\\b)/,lookbehind:!0},\"method-definition\":{pattern:/(\\bdef\\s+)[\\w.]+/,lookbehind:!0,inside:{function:/\\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore(\"ruby\",\"number\",{builtin:/\\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\\b/,constant:/\\b[A-Z]\\w*(?:[?!]|\\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+\"(?:\"+[/([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/.source,/\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)/.source,/\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[\\s\\S])*\\}/.source,/\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\]/.source,/<(?:[^<>\\\\]|\\\\[\\s\\S])*>/.source].join(\"|\")+\")\"),greedy:!0,inside:{interpolation:t}},{pattern:/(\"|')(?:#\\{[^}]+\\}|#(?!\\{)|\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\#\\r\\n])*\\1/,greedy:!0,inside:{interpolation:t}},{pattern:/<<[-~]?([a-z_]\\w*)[\\r\\n](?:.*[\\r\\n])*?[\\t ]*\\1/i,alias:\"heredoc-string\",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\\w*|[a-z_]\\w*$/i,alias:\"symbol\",inside:{punctuation:/^<<[-~]?/}},interpolation:t}},{pattern:/<<[-~]?'([a-z_]\\w*)'[\\r\\n](?:.*[\\r\\n])*?[\\t ]*\\1/i,alias:\"heredoc-string\",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\\w*'|[a-z_]\\w*$/i,alias:\"symbol\",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby;}(Prism),Prism.languages.swift={comment:{pattern:/(^|[^\\\\:])(?:\\/\\/.*|\\/\\*(?:[^/*]|\\/(?!\\*)|\\*(?!\\/)|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*\\*\\/)/,lookbehind:!0,greedy:!0},\"string-literal\":[{pattern:RegExp(/(^|[^\"#])/.source+\"(?:\"+/\"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\\r\\n|[^(])|[^\\\\\\r\\n\"])*\"/.source+\"|\"+/\"\"\"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\\"]|\"(?!\"\"))*\"\"\"/.source+\")\"+/(?![\"#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\\\\()(?:[^()]|\\([^()]*\\))*(?=\\))/,lookbehind:!0,inside:null},\"interpolation-punctuation\":{pattern:/^\\)|\\\\\\($/,alias:\"punctuation\"},punctuation:/\\\\(?=[\\r\\n])/,string:/[\\s\\S]+/}},{pattern:RegExp(/(^|[^\"#])(#+)/.source+\"(?:\"+/\"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\\r\\n|[^#])|[^\\\\\\r\\n])*?\"/.source+\"|\"+/\"\"\"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?\"\"\"/.source+\")\\\\2\"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\\#+\\()(?:[^()]|\\([^()]*\\))*(?=\\))/,lookbehind:!0,inside:null},\"interpolation-punctuation\":{pattern:/^\\)|\\\\#+\\($/,alias:\"punctuation\"},string:/[\\s\\S]+/}}],directive:{pattern:RegExp(/#/.source+\"(?:\"+/(?:elseif|if)\\b/.source+\"(?:[ \\t]*\"+/(?:![ \\t]*)?(?:\\b\\w+\\b(?:[ \\t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \\t]*(?:&&|\\|\\|))?/.source+\")+|\"+/(?:else|endif)\\b/.source+\")\"),alias:\"property\",inside:{\"directive-name\":/^#\\w+/,boolean:/\\b(?:true|false)\\b/,number:/\\b\\d+(?:\\.\\d+)*\\b/,operator:/!|&&|\\|\\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\\b/,alias:\"constant\"},\"other-directive\":{pattern:/#\\w+\\b/,alias:\"property\"},attribute:{pattern:/@\\w+/,alias:\"atrule\"},\"function-definition\":{pattern:/(\\bfunc\\s+)\\w+/,lookbehind:!0,alias:\"function\"},label:{pattern:/\\b(break|continue)\\s+\\w+|\\b[a-zA-Z_]\\w*(?=\\s*:\\s*(?:for|repeat|while)\\b)/,lookbehind:!0,alias:\"important\"},keyword:/\\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\\b/,boolean:/\\b(?:true|false)\\b/,nil:{pattern:/\\bnil\\b/,alias:\"constant\"},\"short-argument\":/\\$\\d+\\b/,omit:{pattern:/\\b_\\b/,alias:\"keyword\"},number:/\\b(?:[\\d_]+(?:\\.[\\de_]+)?|0x[a-f0-9_]+(?:\\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b/i,\"class-name\":/\\b[A-Z](?:[A-Z_\\d]*[a-z]\\w*)?\\b/,function:/\\b[a-z_]\\w*(?=\\s*\\()/i,constant:/\\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\\b/,operator:/[-+*/%=!<>&|^~?]+|\\.[.\\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\\]();,.:\\\\]/},Prism.languages.swift[\"string-literal\"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift;})),function(e){var t=\"\\\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\\\b\",n={pattern:/(^([\"']?)\\w+\\2)[ \\t]+\\S.*/,lookbehind:!0,alias:\"punctuation\",inside:null},a={bash:n,environment:{pattern:RegExp(\"\\\\$\"+t),alias:\"constant\"},variable:[{pattern:/\\$?\\(\\([\\s\\S]+?\\)\\)/,greedy:!0,inside:{variable:[{pattern:/(^\\$\\(\\([\\s\\S]+)\\)\\)/,lookbehind:!0},/^\\$\\(\\(/],number:/\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee]-?\\d+)?/,operator:/--|\\+\\+|\\*\\*=?|<<=?|>>=?|&&|\\|\\||[=!+\\-*/%<>^&|]=?|[?~:]/,punctuation:/\\(\\(?|\\)\\)?|,|;/}},{pattern:/\\$\\((?:\\([^)]+\\)|[^()])+\\)|`[^`]+`/,greedy:!0,inside:{variable:/^\\$\\(|^`|\\)$|`$/}},{pattern:/\\$\\{[^}]+\\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\\/]|##?|%%?|\\^\\^?|,,?/,punctuation:/[\\[\\]]/,environment:{pattern:RegExp(\"(\\\\{)\"+t),lookbehind:!0,alias:\"constant\"}}},/\\$(?:\\w+|[#?*!@$])/],entity:/\\\\(?:[abceEfnrtv\\\\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\\s*\\/.*/,alias:\"important\"},comment:{pattern:/(^|[^\"{\\\\$])#.*/,lookbehind:!0},\"function-name\":[{pattern:/(\\bfunction\\s+)[\\w-]+(?=(?:\\s*\\(?:\\s*\\))?\\s*\\{)/,lookbehind:!0,alias:\"function\"},{pattern:/\\b[\\w-]+(?=\\s*\\(\\s*\\)\\s*\\{)/,alias:\"function\"}],\"for-or-select\":{pattern:/(\\b(?:for|select)\\s+)\\w+(?=\\s+in\\s)/,alias:\"variable\",lookbehind:!0},\"assign-left\":{pattern:/(^|[\\s;|&]|[<>]\\()\\w+(?=\\+?=)/,inside:{environment:{pattern:RegExp(\"(^|[\\\\s;|&]|[<>]\\\\()\"+t),lookbehind:!0,alias:\"constant\"}},alias:\"variable\",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\\s*)(\\w+)\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\\s*)([\"'])(\\w+)\\2\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\\\](?:\\\\\\\\)*)\"(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^\"\\\\`$])*\"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\\$'(?:[^'\\\\]|\\\\[\\s\\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp(\"\\\\$?\"+t),alias:\"constant\"},variable:a.variable,function:{pattern:/(^|[\\s;|&]|[<>]\\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\\s;|&]|[<>]\\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\\s;|&]|[<>]\\()(?:\\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\\s;|&])/,lookbehind:!0,alias:\"class-name\"},boolean:{pattern:/(^|[\\s;|&]|[<>]\\()(?:true|false)(?=$|[)\\s;|&])/,lookbehind:!0},\"file-descriptor\":{pattern:/\\B&\\d\\b/,alias:\"important\"},operator:{pattern:/\\d?<>|>\\||\\+=|=[=~]?|!=?|<<[<-]?|[&\\d]?>>|\\d[<>]&?|[<>][&=]?|&[>&]?|\\|[&|]?/,inside:{\"file-descriptor\":{pattern:/^\\d/,alias:\"important\"}}},punctuation:/\\$?\\(\\(?|\\)\\)?|\\.\\.|[{}[\\];\\\\]/,number:{pattern:/(^|\\s)(?:[1-9]\\d*|0)(?:[.,]\\d+)?\\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=[\"comment\",\"function-name\",\"for-or-select\",\"assign-left\",\"string\",\"environment\",\"function\",\"keyword\",\"builtin\",\"boolean\",\"file-descriptor\",\"operator\",\"punctuation\",\"number\"],i=a.variable[1].inside,s=0;s<r.length;s++)i[r[s]]=e.languages.bash[r[s]];e.languages.shell=e.languages.bash;}(Prism),function(e){var t=/(?:\\\\.|[^\\\\\\n\\r]|(?:\\n|\\r\\n?)(?![\\r\\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\\\])(?:\\\\{2})*)/.source+\"(?:\"+e+\")\")}var a=/(?:\\\\.|``(?:[^`\\r\\n]|`(?!`))+``|`[^`\\r\\n]+`|[^\\\\|\\r\\n`])+/.source,r=/\\|?__(?:\\|__)+\\|?(?:(?:\\n|\\r\\n?)|(?![\\s\\S]))/.source.replace(/__/g,(function(){return a})),i=/\\|?[ \\t]*:?-{3,}:?[ \\t]*(?:\\|[ \\t]*:?-{3,}:?[ \\t]*)+\\|?(?:\\n|\\r\\n?)/.source;e.languages.markdown=e.languages.extend(\"markup\",{}),e.languages.insertBefore(\"markdown\",\"prolog\",{\"front-matter-block\":{pattern:/(^(?:\\s*[\\r\\n])?)---(?!.)[\\s\\S]*?[\\r\\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,\"font-matter\":{pattern:/\\S+(?:\\s+\\S+)*/,alias:[\"yaml\",\"language-yaml\"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\\t ]*>)*/m,alias:\"punctuation\"},table:{pattern:RegExp(\"^\"+r+i+\"(?:\"+r+\")*\",\"m\"),inside:{\"table-data-rows\":{pattern:RegExp(\"^(\"+r+i+\")(?:\"+r+\")*$\"),lookbehind:!0,inside:{\"table-data\":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\\|/}},\"table-line\":{pattern:RegExp(\"^(\"+r+\")\"+i+\"$\"),lookbehind:!0,inside:{punctuation:/\\||:?-{3,}:?/}},\"table-header-row\":{pattern:RegExp(\"^\"+r+\"$\"),inside:{\"table-header\":{pattern:RegExp(a),alias:\"important\",inside:e.languages.markdown},punctuation:/\\|/}}}},code:[{pattern:/((?:^|\\n)[ \\t]*\\n|(?:^|\\r\\n?)[ \\t]*\\r\\n?)(?: {4}|\\t).+(?:(?:\\n|\\r\\n?)(?: {4}|\\t).+)*/,lookbehind:!0,alias:\"keyword\"},{pattern:/^```[\\s\\S]*?^```$/m,greedy:!0,inside:{\"code-block\":{pattern:/^(```.*(?:\\n|\\r\\n?))[\\s\\S]+?(?=(?:\\n|\\r\\n?)^```$)/m,lookbehind:!0},\"code-language\":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\\S.*(?:\\n|\\r\\n?)(?:==+|--+)(?=[ \\t]*$)/m,alias:\"important\",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\\s*)#.+/m,lookbehind:!0,alias:\"important\",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\\s*)([*-])(?:[\\t ]*\\2){2,}(?=\\s*$)/m,lookbehind:!0,alias:\"punctuation\"},list:{pattern:/(^\\s*)(?:[*+-]|\\d+\\.)(?=[\\t ].)/m,lookbehind:!0,alias:\"punctuation\"},\"url-reference\":{pattern:/!?\\[[^\\]]+\\]:[\\t ]+(?:\\S+|<(?:\\\\.|[^>\\\\])+>)(?:[\\t ]+(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\)))?/,inside:{variable:{pattern:/^(!?\\[)[^\\]]+/,lookbehind:!0},string:/(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\))$/,punctuation:/^[\\[\\]!:]|[<>]/},alias:\"url\"},bold:{pattern:n(/\\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\\b|\\*\\*(?:(?!\\*)<inner>|\\*(?:(?!\\*)<inner>)+\\*)+\\*\\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\\s\\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\\*\\*|__/}},italic:{pattern:n(/\\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\\b|\\*(?:(?!\\*)<inner>|\\*\\*(?:(?!\\*)<inner>)+\\*\\*)+\\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\\s\\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\\s\\S]+(?=\\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},\"code-snippet\":{pattern:/(^|[^\\\\`])(?:``[^`\\r\\n]+(?:`[^`\\r\\n]+)*``(?!`)|`[^`\\r\\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:[\"code\",\"keyword\"]},url:{pattern:n(/!?\\[(?:(?!\\])<inner>)+\\](?:\\([^\\s)]+(?:[\\t ]+\"(?:\\\\.|[^\"\\\\])*\")?\\)|[ \\t]?\\[(?:(?!\\])<inner>)+\\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\\[)[^\\]]+(?=\\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\\][ \\t]?\\[)[^\\]]+(?=\\]$)/,lookbehind:!0},url:{pattern:/(^\\]\\()[^\\s)]+/,lookbehind:!0},string:{pattern:/(^[ \\t]+)\"(?:\\\\.|[^\"\\\\])*\"(?=\\)$)/,lookbehind:!0}}}}),[\"url\",\"bold\",\"italic\",\"strike\"].forEach((function(t){[\"url\",\"bold\",\"italic\",\"strike\",\"code-snippet\"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n]);}));})),e.hooks.add(\"after-tokenize\",(function(e){\"markdown\"!==e.language&&\"md\"!==e.language||function e(t){if(t&&\"string\"!=typeof t)for(var n=0,a=t.length;n<a;n++){var r=t[n];if(\"code\"===r.type){var i=r.content[1],s=r.content[3];if(i&&s&&\"code-language\"===i.type&&\"code-block\"===s.type&&\"string\"==typeof i.content){var o=i.content.replace(/\\b#/g,\"sharp\").replace(/\\b\\+\\+/g,\"pp\"),l=\"language-\"+(o=(/[a-z][\\w-]*/i.exec(o)||[\"\"])[0].toLowerCase());s.alias?\"string\"==typeof s.alias?s.alias=[s.alias,l]:s.alias.push(l):s.alias=[l];}}else e(r.content);}}(e.tokens);})),e.hooks.add(\"wrap\",(function(t){if(\"code-block\"===t.type){for(var n=\"\",a=0,r=t.classes.length;a<r;a++){var i=t.classes[a],u=/language-(.+)/.exec(i);if(u){n=u[1];break}}var c=e.languages[n];if(c)t.content=e.highlight(function(e){var t=e.replace(s,\"\");return t=t.replace(/&(\\w{1,8}|#x?[\\da-f]{1,8});/gi,(function(e,t){var n;if(\"#\"===(t=t.toLowerCase())[0])return n=\"x\"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n);var a=o[t];return a||e}))}(t.content),c,n);else if(n&&\"none\"!==n&&e.plugins.autoloader){var d=\"md-\"+(new Date).valueOf()+\"-\"+Math.floor(1e16*Math.random());t.attributes.id=d,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(d);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n));}));}}}));var s=RegExp(e.languages.markup.tag.pattern.source,\"gi\"),o={amp:\"&\",lt:\"<\",gt:\">\",quot:'\"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown;}(Prism),Prism.languages.lua={comment:/^#!.+|--(?:\\[(=*)\\[[\\s\\S]*?\\]\\1\\]|.*)/m,string:{pattern:/([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\z(?:\\r\\n|\\s)|\\\\(?:\\r\\n|[^z]))*\\1|\\[(=*)\\[[\\s\\S]*?\\]\\2\\]/,greedy:!0},number:/\\b0x[a-f\\d]+(?:\\.[a-f\\d]*)?(?:p[+-]?\\d+)?\\b|\\b\\d+(?:\\.\\B|(?:\\.\\d*)?(?:e[+-]?\\d+)?\\b)|\\B\\.\\d+(?:e[+-]?\\d+)?\\b/i,keyword:/\\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/,function:/(?!\\d)\\w+(?=\\s*(?:[({]))/,operator:[/[-+*%^&|#]|\\/\\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\\.\\.(?!\\.)/,lookbehind:!0}],punctuation:/[\\[\\](){},;]|\\.+|:+/},Prism.languages.groovy=Prism.languages.extend(\"clike\",{string:[{pattern:/(\"\"\"|''')(?:[^\\\\]|\\\\[\\s\\S])*?\\1|\\$\\/(?:[^/$]|\\$(?:[/$]|(?![/$]))|\\/(?!\\$))*\\/\\$/,greedy:!0},{pattern:/([\"'/])(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0}],keyword:/\\b(?:as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\\b/,number:/\\b(?:0b[01_]+|0x[\\da-f_]+(?:\\.[\\da-f_p\\-]+)?|[\\d_]+(?:\\.[\\d_]+)?(?:e[+-]?\\d+)?)[glidf]?\\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\\?[.:]?|\\*(?:[.=]|\\*=?)?|\\.[@&]|\\.\\.<|\\.\\.(?!\\.)|-[-=>]?|\\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\\|[|=]?|\\/=?|\\^=?|%=?)/,lookbehind:!0},punctuation:/\\.+|[{}[\\];(),:$]/}),Prism.languages.insertBefore(\"groovy\",\"string\",{shebang:{pattern:/#!.+/,alias:\"comment\"}}),Prism.languages.insertBefore(\"groovy\",\"punctuation\",{\"spock-block\":/\\b(?:setup|given|when|then|and|cleanup|expect|where):/}),Prism.languages.insertBefore(\"groovy\",\"function\",{annotation:{pattern:/(^|[^.])@\\w+/,lookbehind:!0,alias:\"punctuation\"}}),Prism.hooks.add(\"wrap\",(function(e){if(\"groovy\"===e.language&&\"string\"===e.type){var t=e.content[0];if(\"'\"!=t){var n=/([^\\\\])(?:\\$(?:\\{.*?\\}|[\\w.]+))/;\"$\"===t&&(n=/([^\\$])(?:\\$(?:\\{.*?\\}|[\\w.]+))/),e.content=e.content.replace(/&lt;/g,\"<\").replace(/&amp;/g,\"&\"),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push(\"/\"===t?\"regex\":\"gstring\");}}}));var vn=[\"comment\",\"prolog\",\"doctype\",\"cdata\",\"punctuation\",\"namespace\",\"property\",\"tag\",\"boolean\",\"number\",\"constant\",\"symbol\",\"deleted\",\"selector\",\"attr-name\",\"string\",\"builtin\",\"inserted\",\"operator\",\"entity\",\"url\",\"string\",\"atrule\",\"attr-value\",\"keyword\",\"function\",\"class-name\",\"regex\",\"important\",\"variable\",\"bold\",\"italic\",\"entity\",\"char\"];function Sn(e){return \"string\"==typeof e?e.length:\"string\"==typeof e.content?e.content.length:e.content.reduce((function(e,t){return e+Sn(t)}),0)}var wn,kn=d.String,An=function(e){if(\"Symbol\"===nt(e))throw TypeError(\"Cannot convert a Symbol value to a string\");return kn(e)},xn=function(){var e=ie(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.dotAll&&(t+=\"s\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t},Tn=d.RegExp,_n=j((function(){var e=Tn(\"a\",\"y\");return e.lastIndex=2,null!=e.exec(\"abcd\")})),On=_n||j((function(){return !Tn(\"a\",\"y\").sticky})),In={BROKEN_CARET:_n||j((function(){var e=Tn(\"^r\",\"gy\");return e.lastIndex=2,null!=e.exec(\"str\")})),MISSED_STICKY:On,UNSUPPORTED_Y:_n},Rn=K?Object.defineProperties:function(e,t){ie(e);for(var n,a=jt(t),r=fn(t),i=r.length,s=0;i>s;)ke.f(e,n=r[s++],a[n]);return e},Nn=C(\"document\",\"documentElement\"),Ln=Ce(\"IE_PROTO\"),Pn=function(){},Cn=function(e){return \"<script>\"+e+\"</\"+\"script>\"},Fn=function(e){e.write(Cn(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t},Dn=function(){try{wn=new ActiveXObject(\"htmlfile\");}catch(e){}var e,t;Dn=\"undefined\"!=typeof document?document.domain&&wn?Fn(wn):((t=te(\"iframe\")).style.display=\"none\",Nn.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(Cn(\"document.F=Object\")),e.close(),e.F):Fn(wn);for(var n=Kt.length;n--;)delete Dn.prototype[Kt[n]];return Dn()};Fe[Ln]=!0;var $n,Mn,Bn=Object.create||function(e,t){var n;return null!==e?(Pn.prototype=ie(e),n=new Pn,Pn.prototype=null,n[Ln]=e):n=Dn(),void 0===t?n:Rn(n,t)},Un=d.RegExp,jn=j((function(){var e=Un(\".\",\"s\");return !(e.dotAll&&e.exec(\"\\n\")&&\"s\"===e.flags)})),zn=d.RegExp,Gn=j((function(){var e=zn(\"(?<a>b)\",\"g\");return \"b\"!==e.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(e,\"$<a>c\")})),Hn=He.get,qn=h(\"native-string-replace\",String.prototype.replace),Yn=RegExp.prototype.exec,Wn=Yn,Xn=S(\"\".charAt),Zn=S(\"\".indexOf),Vn=S(\"\".replace),Kn=S(\"\".slice),Jn=(Mn=/b*/g,oe(Yn,$n=/a/,\"a\"),oe(Yn,Mn,\"a\"),0!==$n.lastIndex||0!==Mn.lastIndex),Qn=In.BROKEN_CARET,ea=void 0!==/()??/.exec(\"\")[1];(Jn||ea||Qn||jn||Gn)&&(Wn=function(e){var t,n,a,r,i,s,o,l=this,u=Hn(l),c=An(e),d=u.raw;if(d)return d.lastIndex=l.lastIndex,t=oe(Wn,d,c),l.lastIndex=d.lastIndex,t;var p=u.groups,g=Qn&&l.sticky,f=oe(xn,l),b=l.source,h=0,m=c;if(g&&(f=Vn(f,\"y\",\"\"),-1===Zn(f,\"g\")&&(f+=\"g\"),m=Kn(c,l.lastIndex),l.lastIndex>0&&(!l.multiline||l.multiline&&\"\\n\"!==Xn(c,l.lastIndex-1))&&(b=\"(?: \"+b+\")\",m=\" \"+m,h++),n=new RegExp(\"^(?:\"+b+\")\",f)),ea&&(n=new RegExp(\"^\"+b+\"$(?!\\\\s)\",f)),Jn&&(a=l.lastIndex),r=oe(Yn,g?n:l,m),g?r?(r.input=Kn(r.input,h),r[0]=Kn(r[0],h),r.index=l.lastIndex,l.lastIndex+=r[0].length):l.lastIndex=0:Jn&&r&&(l.lastIndex=l.global?r.index+r[0].length:a),ea&&r&&r.length>1&&oe(qn,r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0);})),r&&p)for(r.groups=s=Bn(null),i=0;i<p.length;i++)s[(o=p[i])[0]]=r[o[1]];return r});var ta=Wn;gn({target:\"RegExp\",proto:!0,forced:/./.exec!==ta},{exec:ta});var na=Function.prototype,aa=na.apply,ra=na.bind,ia=na.call,sa=\"object\"==typeof Reflect&&Reflect.apply||(ra?ia.bind(aa):function(){return ia.apply(aa,arguments)}),oa=X(\"species\"),la=RegExp.prototype,ua=X(\"match\"),ca=d.TypeError,da=X(\"species\"),pa=function(e,t){var n,a=ie(e).constructor;return void 0===a||null==(n=ie(a)[da])?t:function(e){if(Ot(e))return e;throw ca(pe(e)+\" is not a constructor\")}(n)},ga=S(\"\".charAt),fa=S(\"\".charCodeAt),ba=S(\"\".slice),ha=function(e){return function(t,n){var a,r,i=An(k(t)),s=ht(n),o=i.length;return s<0||s>=o?e?\"\":void 0:(a=fa(i,s))<55296||a>56319||s+1===o||(r=fa(i,s+1))<56320||r>57343?e?ga(i,s):a:e?ba(i,s,s+2):r-56320+(a-55296<<10)+65536}},ma={codeAt:ha(!1),charAt:ha(!0)}.charAt,ya=function(e,t,n){return t+(n?ma(e,t).length:1)},Ea=d.Array,va=Math.max,Sa=function(e,t,n){for(var a,r,i,s,o=Et(e),l=Yt(t,o),u=Yt(void 0===n?o:n,o),c=Ea(va(u-l,0)),d=0;l<u;l++,d++)a=c,r=d,i=e[l],s=void 0,(s=ve(r))in a?ke.f(a,s,Ae(0,i)):a[s]=i;return c.length=d,c},wa=d.TypeError,ka=function(e,t){var n=e.exec;if(L(n)){var a=oe(n,e,t);return null!==a&&ie(a),a}if(\"RegExp\"===Je(e))return oe(ta,e,t);throw wa(\"RegExp#exec called on incompatible receiver\")},Aa=In.UNSUPPORTED_Y,xa=4294967295,Ta=Math.min,_a=[].push,Oa=S(/./.exec),Ia=S(_a),Ra=S(\"\".slice),Na=!j((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n=\"ab\".split(e);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]}));!function(e,t,n,a){var r=X(e),i=!j((function(){var t={};return t[r]=function(){return 7},7!=\"\"[e](t)})),s=i&&!j((function(){var t=!1,n=/a/;return \"split\"===e&&((n={}).constructor={},n.constructor[oa]=function(){return n},n.flags=\"\",n[r]=/./[r]),n.exec=function(){return t=!0,null},n[r](\"\"),!t}));if(!i||!s||n){var o=S(/./[r]),l=t(r,\"\"[e],(function(e,t,n,a,r){var s=S(e),l=t.exec;return l===ta||l===la.exec?i&&!r?{done:!0,value:o(t,n,a)}:{done:!0,value:s(n,t,a)}:{done:!1}}));Ze(String.prototype,e,l[0]),Ze(la,r,l[1]);}a&&xe(la[r],\"sham\",!0);}(\"split\",(function(e,t,n){var a;return a=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(e,n){var a,r,i=An(k(this)),s=void 0===n?xa:n>>>0;if(0===s)return [];if(void 0===e)return [i];if(!J(a=e)||!(void 0!==(r=a[ua])?r:\"RegExp\"==Je(a)))return oe(t,i,e,s);for(var o,l,u,c=[],d=(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.unicode?\"u\":\"\")+(e.sticky?\"y\":\"\"),p=0,g=new RegExp(e.source,d+\"g\");(o=oe(ta,g,i))&&!((l=g.lastIndex)>p&&(Ia(c,Ra(i,p,o.index)),o.length>1&&o.index<i.length&&sa(_a,c,Sa(o,1)),u=o[0].length,p=l,c.length>=s));)g.lastIndex===o.index&&g.lastIndex++;return p===i.length?!u&&Oa(g,\"\")||Ia(c,\"\"):Ia(c,Ra(i,p)),c.length>s?Sa(c,0,s):c}:\"0\".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:oe(t,this,e,n)}:t,[function(t,n){var r=k(this),i=null==t?void 0:be(t,e);return i?oe(i,t,r,n):oe(a,An(r),t,n)},function(e,r){var i=ie(this),s=An(e),o=n(a,i,s,r,a!==t);if(o.done)return o.value;var l=pa(i,RegExp),u=i.unicode,c=(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(Aa?\"g\":\"y\"),d=new l(Aa?\"^(?:\"+i.source+\")\":i,c),p=void 0===r?xa:r>>>0;if(0===p)return [];if(0===s.length)return null===ka(d,s)?[s]:[];for(var g=0,f=0,b=[];f<s.length;){d.lastIndex=Aa?0:f;var h,m=ka(d,Aa?Ra(s,f):s);if(null===m||(h=Ta(yt(d.lastIndex+(Aa?f:0)),s.length))===g)f=ya(s,f,u);else {if(Ia(b,Ra(s,g,f)),b.length===p)return b;for(var y=1;y<=m.length-1;y++)if(Ia(b,m[y]),b.length===p)return b;f=g=h;}}return Ia(b,Ra(s,g)),b}]}),!Na,Aa),gn({global:!0},{globalThis:d}),n.attr&&(i.default.fn.attr=n.attr);var La=Xe.PROPER,Pa=\"toString\",Ca=RegExp.prototype,Fa=Ca.toString,Da=S(xn),$a=j((function(){return \"/a/b\"!=Fa.call({source:\"a\",flags:\"b\"})})),Ma=La&&Fa.name!=Pa;($a||Ma)&&Ze(RegExp.prototype,Pa,(function(){var e=ie(this),t=An(e.source),n=e.flags;return \"/\"+t+\"/\"+An(void 0===n&&le(Ca,e)&&!(\"flags\"in Ca)?Da(e):n)}),{unsafe:!0});var Ba=function(){function e(){this.title=t.t(\"highLightModule.selectLang\"),this.iconSvg='<svg viewBox=\"0 0 1024 1024\"><path d=\"M64 64v896h896V64H64z m487.6 698.8c0 87.2-51.2 127-125.8 127-67.4 0-106.4-34.8-126.4-77l68.6-41.4c13.2 23.4 25.2 43.2 54.2 43.2 27.6 0 45.2-10.8 45.2-53V475.4h84.2v287.4z m199.2 127c-78.2 0-128.8-37.2-153.4-86l68.6-39.6c18 29.4 41.6 51.2 83 51.2 34.8 0 57.2-17.4 57.2-41.6 0-28.8-22.8-39-61.4-56l-21-9c-60.8-25.8-101-58.4-101-127 0-63.2 48.2-111.2 123.2-111.2 53.6 0 92 18.6 119.6 67.4L800 580c-14.4-25.8-30-36-54.2-36-24.6 0-40.2 15.6-40.2 36 0 25.2 15.6 35.4 51.8 51.2l21 9c71.6 30.6 111.8 62 111.8 132.4 0 75.6-59.6 117.2-139.4 117.2z\"></path></svg>',this.tag=\"select\",this.width=95,this.selectPanelWidth=115;}return e.prototype.getOptions=function(e){var t=[],n=e.getMenuConfig(\"codeSelectLang\").codeLangs,a=void 0===n?[]:n;t.push({text:\"plain text\",value:\"\"}),a.forEach((function(e){var n=e.text,a=e.value;t.push({text:n,value:a});}));var r=this.getValue(e);return t.forEach((function(e){e.value===r?e.selected=!0:delete e.selected;})),t},e.prototype.isActive=function(e){return !1},e.prototype.getValue=function(e){var t=this.getSelectCodeElem(e);if(null==t)return \"\";if(!a.Element.isElement(t))return \"\";var n=t.language.toString(),r=e.getMenuConfig(\"codeSelectLang\").codeLangs;return (void 0===r?[]:r).some((function(e){return e.value===n}))?n:\"\"},e.prototype.isDisabled=function(e){return null==e.selection||!this.getSelectCodeElem(e)},e.prototype.exec=function(e,n){if(null!=this.getSelectCodeElem(e)){var r={language:n.toString()};a.Transforms.setNodes(e,r,{match:function(e){return t.DomEditor.checkNodeType(e,\"code\")}});}},e.prototype.getSelectCodeElem=function(e){var n=t.DomEditor.getSelectedNodeByType(e,\"code\");if(null==n)return null;var r=t.DomEditor.getParentNode(e,n);return a.Element.isElement(r)?\"pre\"!==r.type?null:n:null},e}();var Ua={renderStyle:function(e,t){var n=e,a=t,r=\"\";return vn.forEach((function(e){n[e]&&(r=e);})),r&&function(e,t){null==e.data&&(e.data={});var n=e.data;null==n.props&&(n.props={}),Object.assign(n.props,{className:t});}(a,r=\"token \"+r),a},parseStyleHtml:function(e,n,r){var s=i.default(e);if(!a.Element.isElement(n))return n;if(\"code\"!==t.DomEditor.getNodeType(n))return n;var o=n,l=s.attr(\"class\")||\"\";return 0===l.indexOf(\"language-\")?o.language=l.split(\"-\")[1]||\"\":o.language=l.toLowerCase(),o},menus:[{key:\"codeSelectLang\",factory:function(){return new Ba},config:{codeLangs:[{text:\"CSS\",value:\"css\"},{text:\"HTML\",value:\"html\"},{text:\"XML\",value:\"xml\"},{text:\"Javascript\",value:\"javascript\"},{text:\"Typescript\",value:\"typescript\"},{text:\"JSX\",value:\"jsx\"},{text:\"Go\",value:\"go\"},{text:\"PHP\",value:\"php\"},{text:\"C\",value:\"c\"},{text:\"Python\",value:\"python\"},{text:\"Java\",value:\"java\"},{text:\"C++\",value:\"cpp\"},{text:\"C#\",value:\"csharp\"},{text:\"Visual Basic\",value:\"visual-basic\"},{text:\"SQL\",value:\"sql\"},{text:\"Ruby\",value:\"ruby\"},{text:\"Swift\",value:\"swift\"},{text:\"Bash\",value:\"bash\"},{text:\"Lua\",value:\"lua\"},{text:\"Groovy\",value:\"groovy\"},{text:\"Markdown\",value:\"markdown\"}]}}],elemsToHtml:[{type:\"code\",elemToHtml:function(e,t){var n=e.language,a=void 0===n?\"\":n;return \"<code \"+(a?'class=\"language-'+a+'\"':\"\")+\">\"+t+\"</code>\"}}]},ja=/\"/g,za=S(\"\".replace);gn({target:\"String\",proto:!0,forced:function(e){return j((function(){var t=\"\"[e]('\"');return t!==t.toLowerCase()||t.split('\"').length>3}))}(\"anchor\")},{anchor:function(e){return t=\"a\",n=\"name\",a=e,r=An(k(this)),i=\"<\"+t,\"\"!==n&&(i+=\" \"+n+'=\"'+za(An(a),ja,\"&quot;\")+'\"'),i+\">\"+r+\"</\"+t+\">\";var t,n,a,r,i;}});e.wangEditorCodeHighLightDecorate=function(e){var n,r,i,s=function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var a,r,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(a=i.next()).done;)s.push(a.value);}catch(e){r={error:e};}finally{try{a&&!a.done&&(n=i.return)&&n.call(i);}finally{if(r)throw r.error}}return s}(e,2),o=s[0],l=s[1],u=[],c=function(e){if(!a.Text.isText(e))return null;var n=t.DomEditor.getParentNode(null,e);if(n&&\"code\"===t.DomEditor.getNodeType(n)){var r=t.DomEditor.getParentNode(null,n);if(r&&\"pre\"===t.DomEditor.getNodeType(r))return n}return null}(o);if(null==c)return u;var d=c.language,p=void 0===d?\"\":d;if(!p)return u;var g=function(e,t){if(!t)return [];var n=En.languages[t];return n?En.tokenize(e.text,n):[]}(o,p),f=0;try{for(var b=\n  /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n  function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],a=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return {next:function(){return e&&a>=e.length&&(e=void 0),{value:e&&e[a++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")}(g),h=b.next();!h.done;h=b.next()){var m=h.value,y=f+Sn(m);\"string\"!=typeof m&&u.push(((i={})[m.type]=!0,i.anchor={path:l,offset:f},i.focus={path:l,offset:y},i)),f=y;}}catch(e){n={error:e};}finally{try{h&&!h.done&&(r=b.return)&&r.call(b);}finally{if(n)throw n.error}}return u},e.wangEditorCodeHighlightModule=Ua,Object.defineProperty(e,\"__esModule\",{value:!0});}));\n\n  });\n\n  /*! *****************************************************************************\n  Copyright (c) Microsoft Corporation.\n\n  Permission to use, copy, modify, and/or distribute this software for any\n  purpose with or without fee is hereby granted.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n  AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n  PERFORMANCE OF THIS SOFTWARE.\n  ***************************************************************************** */\n\n  var __assign = function() {\n      __assign = Object.assign || function __assign(t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n              s = arguments[i];\n              for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n      };\n      return __assign.apply(this, arguments);\n  };\n\n  /**\n   * @description Editor View class\n   * @author wangfupeng\n   */\n  var Boot = /** @class */ (function () {\n      function Boot() {\n          throw new Error('不能实例化\\nCan not construct a instance');\n      }\n      Boot.setEditorConfig = function (newConfig) {\n          if (newConfig === void 0) { newConfig = {}; }\n          this.editorConfig = __assign(__assign({}, this.editorConfig), newConfig);\n      };\n      Boot.setSimpleEditorConfig = function (newConfig) {\n          if (newConfig === void 0) { newConfig = {}; }\n          this.simpleEditorConfig = __assign(__assign({}, this.simpleEditorConfig), newConfig);\n      };\n      Boot.setToolbarConfig = function (newConfig) {\n          if (newConfig === void 0) { newConfig = {}; }\n          this.toolbarConfig = __assign(__assign({}, this.toolbarConfig), newConfig);\n      };\n      Boot.setSimpleToolbarConfig = function (newConfig) {\n          if (newConfig === void 0) { newConfig = {}; }\n          this.simpleToolbarConfig = __assign(__assign({}, this.simpleToolbarConfig), newConfig);\n      };\n      Boot.registerPlugin = function (plugin) {\n          this.plugins.push(plugin);\n      };\n      // 注册 menu\n      // TODO 可在注册时传入配置，在开发文档中说明\n      Boot.registerMenu = function (menuConf, customConfig) {\n          dist$6.registerMenu(menuConf, customConfig);\n      };\n      // 注册 renderElem\n      Boot.registerRenderElem = function (renderElemConf) {\n          dist$6.registerRenderElemConf(renderElemConf);\n      };\n      // 注册 renderStyle\n      Boot.registerRenderStyle = function (fn) {\n          dist$6.registerStyleHandler(fn);\n      };\n      // 注册 elemToHtml\n      Boot.registerElemToHtml = function (elemToHtmlConf) {\n          dist$6.registerElemToHtmlConf(elemToHtmlConf);\n      };\n      // 注册 styleToHtml\n      Boot.registerStyleToHtml = function (fn) {\n          dist$6.registerStyleToHtmlHandler(fn);\n      };\n      // 注册 preParseHtml\n      Boot.registerPreParseHtml = function (preParseHtmlConf) {\n          dist$6.registerPreParseHtmlConf(preParseHtmlConf);\n      };\n      // 注册 parseElemHtml\n      Boot.registerParseElemHtml = function (parseElemHtmlConf) {\n          dist$6.registerParseElemHtmlConf(parseElemHtmlConf);\n      };\n      // 注册 parseStyleHtml\n      Boot.registerParseStyleHtml = function (fn) {\n          dist$6.registerParseStyleHtmlHandler(fn);\n      };\n      // 注册 module\n      Boot.registerModule = function (module) {\n          registerModule(module);\n      };\n      // editor 配置\n      Boot.editorConfig = {};\n      Boot.simpleEditorConfig = {};\n      //toolbar 配置\n      Boot.toolbarConfig = {};\n      Boot.simpleToolbarConfig = {};\n      // 注册插件\n      Boot.plugins = [];\n      return Boot;\n  }());\n\n  /**\n   * @description 注册 module\n   * @author wangfupeng\n   */\n  function registerModule(module) {\n      var menus = module.menus, renderElems = module.renderElems, renderStyle = module.renderStyle, elemsToHtml = module.elemsToHtml, styleToHtml = module.styleToHtml, preParseHtml = module.preParseHtml, parseElemsHtml = module.parseElemsHtml, parseStyleHtml = module.parseStyleHtml, editorPlugin = module.editorPlugin;\n      if (menus) {\n          menus.forEach(function (menu) { return Boot.registerMenu(menu); });\n      }\n      if (renderElems) {\n          renderElems.forEach(function (renderElemConf) { return Boot.registerRenderElem(renderElemConf); });\n      }\n      if (renderStyle) {\n          Boot.registerRenderStyle(renderStyle);\n      }\n      if (elemsToHtml) {\n          elemsToHtml.forEach(function (elemToHtmlConf) { return Boot.registerElemToHtml(elemToHtmlConf); });\n      }\n      if (styleToHtml) {\n          Boot.registerStyleToHtml(styleToHtml);\n      }\n      if (preParseHtml) {\n          preParseHtml.forEach(function (conf) { return Boot.registerPreParseHtml(conf); });\n      }\n      if (parseElemsHtml) {\n          parseElemsHtml.forEach(function (parseElemHtmlConf) { return Boot.registerParseElemHtml(parseElemHtmlConf); });\n      }\n      if (parseStyleHtml) {\n          Boot.registerParseStyleHtml(parseStyleHtml);\n      }\n      if (editorPlugin) {\n          Boot.registerPlugin(editorPlugin);\n      }\n  }\n\n  /**\n   * @description register builtin modules\n   * @author wangfupeng\n   */\n  basicModules.forEach(function (module) { return registerModule(module); });\n  registerModule(dist$4);\n  registerModule(dist$3);\n  registerModule(dist$2);\n  registerModule(dist$1);\n  registerModule(dist.wangEditorCodeHighlightModule);\n\n  /**\n   * @description svg tag\n   * @author wangfupeng\n   */\n  /**\n   * 【注意】svg 字符串的长度 ，否则会导致代码体积过大\n   * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293\n   * 找不到再从 iconfont.com 搜索\n   */\n  // 缩进 right\n  var INDENT_RIGHT_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m0-128V320l256 192z\"></path></svg>';\n  // 左对齐\n  var JUSTIFY_LEFT_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>';\n  // 图片\n  var IMAGE_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>';\n  // plus\n  var MORE_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M204.8 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M505.6 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M806.4 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path></svg>';\n  // 视频\n  var VIDEO_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M981.184 160.096C837.568 139.456 678.848 128 512 128S186.432 139.456 42.816 160.096C15.296 267.808 0 386.848 0 512s15.264 244.16 42.816 351.904C186.464 884.544 345.152 896 512 896s325.568-11.456 469.184-32.096C1008.704 756.192 1024 637.152 1024 512s-15.264-244.16-42.816-351.904zM384 704V320l320 192-320 192z\"></path></svg>';\n\n  /**\n   * @description toolbar 配置\n   * @author wangfupeng\n   */\n  function genDefaultToolbarKeys() {\n      return [\n          'headerSelect',\n          // 'header1',\n          // 'header2',\n          // 'header3',\n          'blockquote',\n          '|',\n          'bold',\n          'underline',\n          'italic',\n          {\n              key: 'group-more-style',\n              title: dist$6.t('editor.more'),\n              iconSvg: MORE_SVG,\n              menuKeys: ['through', 'code', 'sup', 'sub', 'clearStyle'],\n          },\n          'color',\n          'bgColor',\n          '|',\n          'fontSize',\n          'fontFamily',\n          'lineHeight',\n          '|',\n          'bulletedList',\n          'numberedList',\n          'todo',\n          {\n              key: 'group-justify',\n              title: dist$6.t('editor.justify'),\n              iconSvg: JUSTIFY_LEFT_SVG,\n              menuKeys: ['justifyLeft', 'justifyRight', 'justifyCenter', 'justifyJustify'],\n          },\n          {\n              key: 'group-indent',\n              title: dist$6.t('editor.indent'),\n              iconSvg: INDENT_RIGHT_SVG,\n              menuKeys: ['indent', 'delIndent'],\n          },\n          '|',\n          'emotion',\n          'insertLink',\n          // 'editLink',\n          // 'unLink',\n          // 'viewLink',\n          {\n              key: 'group-image',\n              title: dist$6.t('editor.image'),\n              iconSvg: IMAGE_SVG,\n              menuKeys: ['insertImage', 'uploadImage'],\n          },\n          // 'deleteImage',\n          // 'editImage',\n          // 'viewImageLink',\n          {\n              key: 'group-video',\n              title: dist$6.t('editor.video'),\n              iconSvg: VIDEO_SVG,\n              menuKeys: ['insertVideo', 'uploadVideo'],\n          },\n          // 'deleteVideo',\n          'insertTable',\n          'codeBlock',\n          // 'codeSelectLang',\n          'divider',\n          // 'deleteTable',\n          '|',\n          'undo',\n          'redo',\n          '|',\n          'fullScreen',\n      ];\n  }\n  function genSimpleToolbarKeys() {\n      return [\n          'blockquote',\n          'header1',\n          'header2',\n          'header3',\n          '|',\n          'bold',\n          'underline',\n          'italic',\n          'through',\n          'color',\n          'bgColor',\n          'clearStyle',\n          '|',\n          'bulletedList',\n          'numberedList',\n          'todo',\n          'justifyLeft',\n          'justifyRight',\n          'justifyCenter',\n          '|',\n          'insertLink',\n          {\n              key: 'group-image',\n              title: dist$6.t('editor.image'),\n              iconSvg: IMAGE_SVG,\n              menuKeys: ['insertImage', 'uploadImage'],\n          },\n          'insertVideo',\n          'insertTable',\n          'codeBlock',\n          '|',\n          'undo',\n          'redo',\n          '|',\n          'fullScreen',\n      ];\n  }\n\n  /**\n   * @description hoverbar 配置\n   * @author wangfupeng\n   */\n  var COMMON_HOVERBAR_KEYS = {\n      // key 即 element type\n      link: {\n          menuKeys: ['editLink', 'unLink', 'viewLink'],\n      },\n      image: {\n          menuKeys: [\n              'imageWidth30',\n              'imageWidth50',\n              'imageWidth100',\n              'editImage',\n              'viewImageLink',\n              'deleteImage',\n          ],\n      },\n      pre: {\n          menuKeys: ['enter', 'codeBlock', 'codeSelectLang'],\n      },\n      table: {\n          menuKeys: [\n              'enter',\n              'tableHeader',\n              'tableFullWidth',\n              'insertTableRow',\n              'deleteTableRow',\n              'insertTableCol',\n              'deleteTableCol',\n              'deleteTable',\n          ],\n      },\n      divider: {\n          menuKeys: ['enter'],\n      },\n      video: {\n          menuKeys: ['enter', 'editVideoSize'],\n      },\n  };\n  function genDefaultHoverbarKeys() {\n      return __assign(__assign({}, COMMON_HOVERBAR_KEYS), {\n          // 也可以自定义 match 来匹配元素，此时 key 就随意了\n          text: {\n              menuKeys: [\n                  'headerSelect',\n                  'insertLink',\n                  'bulletedList',\n                  '|',\n                  'bold',\n                  'through',\n                  'color',\n                  'bgColor',\n                  'clearStyle',\n              ],\n          } });\n  }\n  function genSimpleHoverbarKeys() {\n      return COMMON_HOVERBAR_KEYS;\n  }\n\n  /**\n   * @description 获取编辑器默认配置\n   * @author wangfupeng\n   */\n  function getDefaultEditorConfig() {\n      return {\n          hoverbarKeys: genDefaultHoverbarKeys(),\n      };\n  }\n  function getSimpleEditorConfig() {\n      return {\n          hoverbarKeys: genSimpleHoverbarKeys(),\n      };\n  }\n  function getDefaultToolbarConfig() {\n      return {\n          toolbarKeys: genDefaultToolbarKeys(),\n      };\n  }\n  function getSimpleToolbarConfig() {\n      return {\n          toolbarKeys: genSimpleToolbarKeys(),\n      };\n  }\n\n  /**\n   * @description set default config\n   * @author wangfupeng\n   */\n  var defaultEditorConfig = getDefaultEditorConfig();\n  Boot.setEditorConfig(__assign(__assign({}, defaultEditorConfig), { decorate: dist.wangEditorCodeHighLightDecorate }));\n  var simpleEditorConfig = getSimpleEditorConfig();\n  Boot.setSimpleEditorConfig(__assign(__assign({}, simpleEditorConfig), { decorate: dist.wangEditorCodeHighLightDecorate }));\n  var defaultToolbarConfig = getDefaultToolbarConfig();\n  Boot.setToolbarConfig(defaultToolbarConfig);\n  var simpleToolbarConfig = getSimpleToolbarConfig();\n  Boot.setSimpleToolbarConfig(simpleToolbarConfig);\n\n  /**\n   * @description create\n   * @author wangfupeng\n   */\n  /**\n   * 创建 editor 实例\n   */\n  function createEditor(option) {\n      if (option === void 0) { option = {}; }\n      var _a = option.selector, selector = _a === void 0 ? '' : _a, _b = option.content, content = _b === void 0 ? [] : _b, html = option.html, _c = option.config, config = _c === void 0 ? {} : _c, _d = option.mode, mode = _d === void 0 ? 'default' : _d;\n      var globalConfig = mode === 'simple' ? Boot.simpleEditorConfig : Boot.editorConfig;\n      // 单独处理 hoverbarKeys\n      var newHoverbarKeys = __assign(__assign({}, (globalConfig.hoverbarKeys || {})), (config.hoverbarKeys || {}));\n      var editor = dist$6.coreCreateEditor({\n          selector: selector,\n          config: __assign(__assign(__assign({}, globalConfig), config), { hoverbarKeys: newHoverbarKeys }),\n          content: content,\n          html: html,\n          plugins: Boot.plugins,\n      });\n      return editor;\n  }\n  /**\n   * 创建 toolbar 实例\n   */\n  function createToolbar(option) {\n      var selector = option.selector, editor = option.editor, _a = option.config, config = _a === void 0 ? {} : _a, _b = option.mode, mode = _b === void 0 ? 'default' : _b;\n      if (!selector) {\n          throw new Error(\"Cannot find 'selector' when create toolbar\");\n      }\n      var globalConfig = mode === 'simple' ? Boot.simpleToolbarConfig : Boot.toolbarConfig;\n      var toolbar = dist$6.coreCreateToolbar(editor, {\n          selector: selector,\n          config: __assign(__assign({}, globalConfig), config),\n      });\n      return toolbar;\n  }\n\n  /**\n   * @description editor entry\n   * @author wangfupeng\n   */\n  var index = {};\n\n  exports.Boot = Boot;\n  exports.DomEditor = dist$6.DomEditor;\n  exports.SlateEditor = Editor_1;\n  exports.SlateElement = Element_1;\n  exports.SlateLocation = Location_1;\n  exports.SlateNode = Node_1;\n  exports.SlatePath = Path_1;\n  exports.SlatePoint = Point_1;\n  exports.SlateRange = Range_1;\n  exports.SlateText = Text_1;\n  exports.SlateTransforms = Transforms_1;\n  exports.Toolbar = dist$6.Toolbar;\n  exports.createEditor = createEditor;\n  exports.createToolbar = createToolbar;\n  exports.createUploader = dist$6.createUploader;\n  exports[\"default\"] = index;\n  exports.genModalButtonElems = dist$6.genModalButtonElems;\n  exports.genModalInputElems = dist$6.genModalInputElems;\n  exports.genModalTextareaElems = dist$6.genModalTextareaElems;\n  exports.i18nAddResources = dist$6.i18nAddResources;\n  exports.i18nChangeLanguage = dist$6.i18nChangeLanguage;\n  exports.i18nGetResources = dist$6.i18nGetResources;\n  exports.t = dist$6.t;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));"
  },
  {
    "path": "src/main/resources/static/admin/plugins/wangeditor-5.1.23/style.css",
    "content": ":root,\n:host {\n  --w-e-textarea-bg-color: #fff;\n  --w-e-textarea-color: #333;\n  --w-e-textarea-border-color: #ccc;\n  --w-e-textarea-slight-border-color: #e8e8e8;\n  --w-e-textarea-slight-color: #d4d4d4;\n  --w-e-textarea-slight-bg-color: #f5f2f0;\n  --w-e-textarea-selected-border-color: #B4D5FF;\n  --w-e-textarea-handler-bg-color: #4290f7;\n  --w-e-toolbar-color: #595959;\n  --w-e-toolbar-bg-color: #fff;\n  --w-e-toolbar-active-color: #333;\n  --w-e-toolbar-active-bg-color: #f1f1f1;\n  --w-e-toolbar-disabled-color: #999;\n  --w-e-toolbar-border-color: #e8e8e8;\n  --w-e-modal-button-bg-color: #fafafa;\n  --w-e-modal-button-border-color: #d9d9d9;\n}\n\n.w-e-text-container *,.w-e-toolbar *{box-sizing:border-box;margin:0;outline:none;padding:0}.w-e-text-container blockquote,.w-e-text-container li,.w-e-text-container p,.w-e-text-container td,.w-e-text-container th,.w-e-toolbar *{line-height:1.5}.w-e-text-container{background-color:var(--w-e-textarea-bg-color);color:var(--w-e-textarea-color);height:100%;position:relative}.w-e-text-container .w-e-scroll{-webkit-overflow-scrolling:touch;height:100%}.w-e-text-container [data-slate-editor]{word-wrap:break-word;border-top:1px solid transparent;min-height:100%;outline:0;padding:0 10px;white-space:pre-wrap}.w-e-text-container [data-slate-editor] p{margin:15px 0}.w-e-text-container [data-slate-editor] h1,.w-e-text-container [data-slate-editor] h2,.w-e-text-container [data-slate-editor] h3,.w-e-text-container [data-slate-editor] h4,.w-e-text-container [data-slate-editor] h5{margin:20px 0}.w-e-text-container [data-slate-editor] img{cursor:default;display:inline!important;max-width:100%;min-height:20px;min-width:20px}.w-e-text-container [data-slate-editor] span{text-indent:0}.w-e-text-container [data-slate-editor] [data-selected=true]{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-placeholder{font-style:italic;left:10px;top:17px;width:90%}.w-e-max-length-info,.w-e-text-placeholder{color:var(--w-e-textarea-slight-color);pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.w-e-max-length-info{bottom:.5em;right:1em}.w-e-bar{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-color);font-size:14px;padding:0 5px}.w-e-bar svg{fill:var(--w-e-toolbar-color);height:14px;width:14px}.w-e-bar-show{display:flex}.w-e-bar-hidden{display:none}.w-e-hover-bar{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 5px #0000001f;position:absolute}.w-e-toolbar{flex-wrap:wrap;position:relative}.w-e-bar-divider{background-color:var(--w-e-toolbar-border-color);display:inline-flex;height:40px;margin:0 5px;width:1px}.w-e-bar-item{display:flex;height:40px;padding:4px;position:relative;text-align:center}.w-e-bar-item,.w-e-bar-item button{align-items:center;justify-content:center}.w-e-bar-item button{background:transparent;border:none;color:var(--w-e-toolbar-color);cursor:pointer;display:inline-flex;height:32px;overflow:hidden;padding:0 8px;white-space:nowrap}.w-e-bar-item button:hover{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item button .title{margin-left:5px}.w-e-bar-item .active{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item .disabled{color:var(--w-e-toolbar-disabled-color);cursor:not-allowed}.w-e-bar-item .disabled svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-menu-tooltip-v5:before{background-color:var(--w-e-toolbar-active-color);border-radius:5px;color:var(--w-e-toolbar-bg-color);content:attr(data-tooltip);font-size:.75em;opacity:0;padding:5px 10px;position:absolute;text-align:center;top:40px;transition:opacity .6s;visibility:hidden;white-space:pre;z-index:1}.w-e-menu-tooltip-v5:after{border:5px solid transparent;border-bottom:5px solid var(--w-e-toolbar-active-color);content:\"\";opacity:0;position:absolute;top:30px;transition:opacity .6s;visibility:hidden}.w-e-menu-tooltip-v5:hover:after,.w-e-menu-tooltip-v5:hover:before{opacity:1;visibility:visible}.w-e-menu-tooltip-v5.tooltip-right:before{left:100%;top:10px}.w-e-menu-tooltip-v5.tooltip-right:after{border-bottom-color:transparent;border-left-color:transparent;border-right-color:var(--w-e-toolbar-active-color);border-top-color:transparent;left:100%;margin-left:-10px;top:16px}.w-e-bar-item-group .w-e-bar-item-menus-container{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;display:none;left:0;margin-top:40px;position:absolute;top:0;z-index:1}.w-e-bar-item-group:hover .w-e-bar-item-menus-container{display:block}.w-e-select-list{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;left:0;margin-top:40px;max-height:350px;min-width:100px;overflow-y:auto;position:absolute;top:0;z-index:1}.w-e-select-list ul{line-height:1;list-style:none}.w-e-select-list ul .selected{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li{cursor:pointer;padding:7px 0 7px 25px;position:relative;text-align:left;white-space:nowrap}.w-e-select-list ul li:hover{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li svg{left:0;margin-left:5px;margin-top:-7px;position:absolute;top:50%}.w-e-bar-bottom .w-e-select-list{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-drop-panel{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;margin-top:40px;min-width:200px;padding:10px;position:absolute;top:0;z-index:1}.w-e-bar-bottom .w-e-drop-panel{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-modal{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;color:var(--w-e-toolbar-color);font-size:14px;min-height:40px;min-width:100px;padding:20px 15px 0;position:absolute;text-align:left;z-index:1}.w-e-modal .btn-close{cursor:pointer;line-height:1;padding:5px;position:absolute;right:8px;top:7px}.w-e-modal .btn-close svg{fill:var(--w-e-toolbar-color);height:10px;width:10px}.w-e-modal .babel-container{display:block;margin-bottom:15px}.w-e-modal .babel-container span{display:block;margin-bottom:10px}.w-e-modal .button-container{margin-bottom:15px}.w-e-modal button{background-color:var(--w-e-modal-button-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);cursor:pointer;font-weight:400;height:32px;padding:4.5px 15px;text-align:center;touch-action:manipulation;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.w-e-modal input[type=number],.w-e-modal input[type=text],.w-e-modal textarea{font-feature-settings:\"tnum\";background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);font-variant:tabular-nums;padding:4.5px 11px;transition:all .3s;width:100%}.w-e-modal textarea{min-height:60px}body .w-e-modal,body .w-e-modal *{box-sizing:border-box}.w-e-progress-bar{background-color:var(--w-e-textarea-handler-bg-color);height:1px;position:absolute;transition:width .3s;width:0}.w-e-full-screen-container{bottom:0!important;display:flex!important;flex-direction:column!important;height:100%!important;left:0!important;margin:0!important;padding:0!important;position:fixed;right:0!important;top:0!important;width:100%!important}.w-e-full-screen-container [data-w-e-textarea=true]{flex:1!important}\n.w-e-text-container [data-slate-editor] code{background-color:var(--w-e-textarea-slight-bg-color);border-radius:3px;font-family:monospace;padding:3px}.w-e-panel-content-color{list-style:none;text-align:left;width:230px}.w-e-panel-content-color li{border:1px solid var(--w-e-toolbar-bg-color);border-radius:3px 3px;cursor:pointer;display:inline-block;padding:2px}.w-e-panel-content-color li:hover{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color li .color-block{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px 3px;height:17px;width:17px}.w-e-panel-content-color .active{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color .clear{line-height:1.5;margin-bottom:5px;width:100%}.w-e-panel-content-color .clear svg{height:16px;margin-bottom:-4px;width:16px}.w-e-text-container [data-slate-editor] blockquote{background-color:var(--w-e-textarea-slight-bg-color);border-left:8px solid var(--w-e-textarea-selected-border-color);display:block;font-size:100%;line-height:1.5;margin:10px 0;padding:10px}.w-e-panel-content-emotion{font-size:20px;list-style:none;text-align:left;width:300px}.w-e-panel-content-emotion li{border-radius:3px 3px;cursor:pointer;display:inline-block;padding:0 5px}.w-e-panel-content-emotion li:hover{background-color:var(--w-e-textarea-slight-bg-color)}.w-e-textarea-divider{border-radius:3px;margin:20px auto;padding:20px}.w-e-textarea-divider hr{background-color:var(--w-e-textarea-border-color);border:0;display:block;height:1px}.w-e-text-container [data-slate-editor] pre>code{background-color:var(--w-e-textarea-slight-bg-color);border:1px solid var(--w-e-textarea-slight-border-color);border-radius:4px 4px;display:block;font-size:14px;padding:10px;text-indent:0}.w-e-text-container [data-slate-editor] .w-e-image-container{display:inline-block;margin:0 3px}.w-e-text-container [data-slate-editor] .w-e-image-container:hover{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-container [data-slate-editor] .w-e-selected-image-container{overflow:hidden;position:relative}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .w-e-image-dragger{background-color:var(--w-e-textarea-handler-bg-color);height:7px;position:absolute;width:7px}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-top{cursor:nwse-resize;left:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-top{cursor:nesw-resize;right:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-bottom{bottom:0;cursor:nesw-resize;left:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-bottom{bottom:0;cursor:nwse-resize;right:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container:hover{box-shadow:none}.w-e-text-container [contenteditable=false] .w-e-image-container:hover{box-shadow:none}\n\n.w-e-text-container [data-slate-editor] .table-container{border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin-top:10px;overflow-x:auto;padding:10px;width:100%}.w-e-text-container [data-slate-editor] table{border-collapse:collapse}.w-e-text-container [data-slate-editor] table td,.w-e-text-container [data-slate-editor] table th{border:1px solid var(--w-e-textarea-border-color);line-height:1.5;min-width:30px;padding:3px 5px;text-align:left}.w-e-text-container [data-slate-editor] table th{background-color:var(--w-e-textarea-slight-bg-color);font-weight:700;text-align:center}.w-e-panel-content-table{background-color:var(--w-e-toolbar-bg-color)}.w-e-panel-content-table table{border-collapse:collapse}.w-e-panel-content-table td{border:1px solid var(--w-e-toolbar-border-color);cursor:pointer;height:15px;padding:3px 5px;width:20px}.w-e-panel-content-table td.active{background-color:var(--w-e-toolbar-active-bg-color)}\n.w-e-textarea-video-container{background-image:linear-gradient(45deg,#eee 25%,transparent 0,transparent 75%,#eee 0,#eee),linear-gradient(45deg,#eee 25%,#fff 0,#fff 75%,#eee 0,#eee);background-position:0 0,10px 10px;background-size:20px 20px;border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin:10px auto 0;padding:10px 0;text-align:center}\n\n.w-e-text-container [data-slate-editor] pre>code{word-wrap:normal;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;-webkit-hyphens:none;hyphens:none;line-height:1.5;margin:.5em 0;overflow:auto;padding:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px #fff;white-space:pre;word-break:normal;word-spacing:normal}.w-e-text-container [data-slate-editor] pre>code .token.cdata,.w-e-text-container [data-slate-editor] pre>code .token.comment,.w-e-text-container [data-slate-editor] pre>code .token.doctype,.w-e-text-container [data-slate-editor] pre>code .token.prolog{color:#708090}.w-e-text-container [data-slate-editor] pre>code .token.punctuation{color:#999}.w-e-text-container [data-slate-editor] pre>code .token.namespace{opacity:.7}.w-e-text-container [data-slate-editor] pre>code .token.boolean,.w-e-text-container [data-slate-editor] pre>code .token.constant,.w-e-text-container [data-slate-editor] pre>code .token.deleted,.w-e-text-container [data-slate-editor] pre>code .token.number,.w-e-text-container [data-slate-editor] pre>code .token.property,.w-e-text-container [data-slate-editor] pre>code .token.symbol,.w-e-text-container [data-slate-editor] pre>code .token.tag{color:#905}.w-e-text-container [data-slate-editor] pre>code .token.attr-name,.w-e-text-container [data-slate-editor] pre>code .token.builtin,.w-e-text-container [data-slate-editor] pre>code .token.char,.w-e-text-container [data-slate-editor] pre>code .token.inserted,.w-e-text-container [data-slate-editor] pre>code .token.selector,.w-e-text-container [data-slate-editor] pre>code .token.string{color:#690}.w-e-text-container [data-slate-editor] pre>code .language-css .token.string,.w-e-text-container [data-slate-editor] pre>code .style .token.string,.w-e-text-container [data-slate-editor] pre>code .token.entity,.w-e-text-container [data-slate-editor] pre>code .token.operator,.w-e-text-container [data-slate-editor] pre>code .token.url{color:#9a6e3a}.w-e-text-container [data-slate-editor] pre>code .token.atrule,.w-e-text-container [data-slate-editor] pre>code .token.attr-value,.w-e-text-container [data-slate-editor] pre>code .token.keyword{color:#07a}.w-e-text-container [data-slate-editor] pre>code .token.class-name,.w-e-text-container [data-slate-editor] pre>code .token.function{color:#dd4a68}.w-e-text-container [data-slate-editor] pre>code .token.important,.w-e-text-container [data-slate-editor] pre>code .token.regex,.w-e-text-container [data-slate-editor] pre>code .token.variable{color:#e90}.w-e-text-container [data-slate-editor] pre>code .token.bold,.w-e-text-container [data-slate-editor] pre>code .token.important{font-weight:700}.w-e-text-container [data-slate-editor] pre>code .token.italic{font-style:italic}.w-e-text-container [data-slate-editor] pre>code .token.entity{cursor:help}"
  },
  {
    "path": "src/main/resources/static/mall/css/bootstrap-modal.css",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n.container {\n    padding-right: 15px;\n    padding-left: 15px;\n    margin-right: auto;\n    margin-left: auto;\n}\n\n.container:before,\n.container:after {\n    display: table;\n    content: \" \";\n}\n\n.container:after {\n    clear: both;\n}\n\n.container:before,\n.container:after {\n    display: table;\n    content: \" \";\n}\n\n.container:after {\n    clear: both;\n}\n\n.row {\n    margin-right: -15px;\n    margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n    display: table;\n    content: \" \";\n}\n\n.row:after {\n    clear: both;\n}\n\n.row:before,\n.row:after {\n    display: table;\n    content: \" \";\n}\n\n.row:after {\n    clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n    position: relative;\n    min-height: 1px;\n    padding-right: 15px;\n    padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n    float: left;\n}\n\n.col-xs-12 {\n    width: 100%;\n}\n\n.col-xs-11 {\n    width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n    width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n    width: 75%;\n}\n\n.col-xs-8 {\n    width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n    width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n    width: 50%;\n}\n\n.col-xs-5 {\n    width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n    width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n    width: 25%;\n}\n\n.col-xs-2 {\n    width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n    width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n    right: 100%;\n}\n\n.col-xs-pull-11 {\n    right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n    right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n    right: 75%;\n}\n\n.col-xs-pull-8 {\n    right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n    right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n    right: 50%;\n}\n\n.col-xs-pull-5 {\n    right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n    right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n    right: 25%;\n}\n\n.col-xs-pull-2 {\n    right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n    right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n    right: 0;\n}\n\n.col-xs-push-12 {\n    left: 100%;\n}\n\n.col-xs-push-11 {\n    left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n    left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n    left: 75%;\n}\n\n.col-xs-push-8 {\n    left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n    left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n    left: 50%;\n}\n\n.col-xs-push-5 {\n    left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n    left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n    left: 25%;\n}\n\n.col-xs-push-2 {\n    left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n    left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n    left: 0;\n}\n\n.col-xs-offset-12 {\n    margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n    margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n    margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n    margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n    margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n    margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n    margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n    margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n    margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n    margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n    margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n    margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n    margin-left: 0;\n}\n\n@media (min-width: 768px) {\n    .col-sm-1,\n    .col-sm-2,\n    .col-sm-3,\n    .col-sm-4,\n    .col-sm-5,\n    .col-sm-6,\n    .col-sm-7,\n    .col-sm-8,\n    .col-sm-9,\n    .col-sm-10,\n    .col-sm-11,\n    .col-sm-12 {\n        float: left;\n    }\n    .col-sm-12 {\n        width: 100%;\n    }\n    .col-sm-11 {\n        width: 91.66666666666666%;\n    }\n    .col-sm-10 {\n        width: 83.33333333333334%;\n    }\n    .col-sm-9 {\n        width: 75%;\n    }\n    .col-sm-8 {\n        width: 66.66666666666666%;\n    }\n    .col-sm-7 {\n        width: 58.333333333333336%;\n    }\n    .col-sm-6 {\n        width: 50%;\n    }\n    .col-sm-5 {\n        width: 41.66666666666667%;\n    }\n    .col-sm-4 {\n        width: 33.33333333333333%;\n    }\n    .col-sm-3 {\n        width: 25%;\n    }\n    .col-sm-2 {\n        width: 16.666666666666664%;\n    }\n    .col-sm-1 {\n        width: 8.333333333333332%;\n    }\n    .col-sm-pull-12 {\n        right: 100%;\n    }\n    .col-sm-pull-11 {\n        right: 91.66666666666666%;\n    }\n    .col-sm-pull-10 {\n        right: 83.33333333333334%;\n    }\n    .col-sm-pull-9 {\n        right: 75%;\n    }\n    .col-sm-pull-8 {\n        right: 66.66666666666666%;\n    }\n    .col-sm-pull-7 {\n        right: 58.333333333333336%;\n    }\n    .col-sm-pull-6 {\n        right: 50%;\n    }\n    .col-sm-pull-5 {\n        right: 41.66666666666667%;\n    }\n    .col-sm-pull-4 {\n        right: 33.33333333333333%;\n    }\n    .col-sm-pull-3 {\n        right: 25%;\n    }\n    .col-sm-pull-2 {\n        right: 16.666666666666664%;\n    }\n    .col-sm-pull-1 {\n        right: 8.333333333333332%;\n    }\n    .col-sm-pull-0 {\n        right: 0;\n    }\n    .col-sm-push-12 {\n        left: 100%;\n    }\n    .col-sm-push-11 {\n        left: 91.66666666666666%;\n    }\n    .col-sm-push-10 {\n        left: 83.33333333333334%;\n    }\n    .col-sm-push-9 {\n        left: 75%;\n    }\n    .col-sm-push-8 {\n        left: 66.66666666666666%;\n    }\n    .col-sm-push-7 {\n        left: 58.333333333333336%;\n    }\n    .col-sm-push-6 {\n        left: 50%;\n    }\n    .col-sm-push-5 {\n        left: 41.66666666666667%;\n    }\n    .col-sm-push-4 {\n        left: 33.33333333333333%;\n    }\n    .col-sm-push-3 {\n        left: 25%;\n    }\n    .col-sm-push-2 {\n        left: 16.666666666666664%;\n    }\n    .col-sm-push-1 {\n        left: 8.333333333333332%;\n    }\n    .col-sm-push-0 {\n        left: 0;\n    }\n    .col-sm-offset-12 {\n        margin-left: 100%;\n    }\n    .col-sm-offset-11 {\n        margin-left: 91.66666666666666%;\n    }\n    .col-sm-offset-10 {\n        margin-left: 83.33333333333334%;\n    }\n    .col-sm-offset-9 {\n        margin-left: 75%;\n    }\n    .col-sm-offset-8 {\n        margin-left: 66.66666666666666%;\n    }\n    .col-sm-offset-7 {\n        margin-left: 58.333333333333336%;\n    }\n    .col-sm-offset-6 {\n        margin-left: 50%;\n    }\n    .col-sm-offset-5 {\n        margin-left: 41.66666666666667%;\n    }\n    .col-sm-offset-4 {\n        margin-left: 33.33333333333333%;\n    }\n    .col-sm-offset-3 {\n        margin-left: 25%;\n    }\n    .col-sm-offset-2 {\n        margin-left: 16.666666666666664%;\n    }\n    .col-sm-offset-1 {\n        margin-left: 8.333333333333332%;\n    }\n    .col-sm-offset-0 {\n        margin-left: 0;\n    }\n}\n\n@media (min-width: 992px) {\n    .col-md-1,\n    .col-md-2,\n    .col-md-3,\n    .col-md-4,\n    .col-md-5,\n    .col-md-6,\n    .col-md-7,\n    .col-md-8,\n    .col-md-9,\n    .col-md-10,\n    .col-md-11,\n    .col-md-12 {\n        float: left;\n    }\n    .col-md-12 {\n        width: 100%;\n    }\n    .col-md-11 {\n        width: 91.66666666666666%;\n    }\n    .col-md-10 {\n        width: 83.33333333333334%;\n    }\n    .col-md-9 {\n        width: 75%;\n    }\n    .col-md-8 {\n        width: 66.66666666666666%;\n    }\n    .col-md-7 {\n        width: 58.333333333333336%;\n    }\n    .col-md-6 {\n        width: 50%;\n    }\n    .col-md-5 {\n        width: 41.66666666666667%;\n    }\n    .col-md-4 {\n        width: 33.33333333333333%;\n    }\n    .col-md-3 {\n        width: 25%;\n    }\n    .col-md-2 {\n        width: 16.666666666666664%;\n    }\n    .col-md-1 {\n        width: 8.333333333333332%;\n    }\n    .col-md-pull-12 {\n        right: 100%;\n    }\n    .col-md-pull-11 {\n        right: 91.66666666666666%;\n    }\n    .col-md-pull-10 {\n        right: 83.33333333333334%;\n    }\n    .col-md-pull-9 {\n        right: 75%;\n    }\n    .col-md-pull-8 {\n        right: 66.66666666666666%;\n    }\n    .col-md-pull-7 {\n        right: 58.333333333333336%;\n    }\n    .col-md-pull-6 {\n        right: 50%;\n    }\n    .col-md-pull-5 {\n        right: 41.66666666666667%;\n    }\n    .col-md-pull-4 {\n        right: 33.33333333333333%;\n    }\n    .col-md-pull-3 {\n        right: 25%;\n    }\n    .col-md-pull-2 {\n        right: 16.666666666666664%;\n    }\n    .col-md-pull-1 {\n        right: 8.333333333333332%;\n    }\n    .col-md-pull-0 {\n        right: 0;\n    }\n    .col-md-push-12 {\n        left: 100%;\n    }\n    .col-md-push-11 {\n        left: 91.66666666666666%;\n    }\n    .col-md-push-10 {\n        left: 83.33333333333334%;\n    }\n    .col-md-push-9 {\n        left: 75%;\n    }\n    .col-md-push-8 {\n        left: 66.66666666666666%;\n    }\n    .col-md-push-7 {\n        left: 58.333333333333336%;\n    }\n    .col-md-push-6 {\n        left: 50%;\n    }\n    .col-md-push-5 {\n        left: 41.66666666666667%;\n    }\n    .col-md-push-4 {\n        left: 33.33333333333333%;\n    }\n    .col-md-push-3 {\n        left: 25%;\n    }\n    .col-md-push-2 {\n        left: 16.666666666666664%;\n    }\n    .col-md-push-1 {\n        left: 8.333333333333332%;\n    }\n    .col-md-push-0 {\n        left: 0;\n    }\n    .col-md-offset-12 {\n        margin-left: 100%;\n    }\n    .col-md-offset-11 {\n        margin-left: 91.66666666666666%;\n    }\n    .col-md-offset-10 {\n        margin-left: 83.33333333333334%;\n    }\n    .col-md-offset-9 {\n        margin-left: 75%;\n    }\n    .col-md-offset-8 {\n        margin-left: 66.66666666666666%;\n    }\n    .col-md-offset-7 {\n        margin-left: 58.333333333333336%;\n    }\n    .col-md-offset-6 {\n        margin-left: 50%;\n    }\n    .col-md-offset-5 {\n        margin-left: 41.66666666666667%;\n    }\n    .col-md-offset-4 {\n        margin-left: 33.33333333333333%;\n    }\n    .col-md-offset-3 {\n        margin-left: 25%;\n    }\n    .col-md-offset-2 {\n        margin-left: 16.666666666666664%;\n    }\n    .col-md-offset-1 {\n        margin-left: 8.333333333333332%;\n    }\n    .col-md-offset-0 {\n        margin-left: 0;\n    }\n}\n\n@media (min-width: 1200px) {\n    .col-lg-1,\n    .col-lg-2,\n    .col-lg-3,\n    .col-lg-4,\n    .col-lg-5,\n    .col-lg-6,\n    .col-lg-7,\n    .col-lg-8,\n    .col-lg-9,\n    .col-lg-10,\n    .col-lg-11,\n    .col-lg-12 {\n        float: left;\n    }\n    .col-lg-12 {\n        width: 100%;\n    }\n    .col-lg-11 {\n        width: 91.66666666666666%;\n    }\n    .col-lg-10 {\n        width: 83.33333333333334%;\n    }\n    .col-lg-9 {\n        width: 75%;\n    }\n    .col-lg-8 {\n        width: 66.66666666666666%;\n    }\n    .col-lg-7 {\n        width: 58.333333333333336%;\n    }\n    .col-lg-6 {\n        width: 50%;\n    }\n    .col-lg-5 {\n        width: 41.66666666666667%;\n    }\n    .col-lg-4 {\n        width: 33.33333333333333%;\n    }\n    .col-lg-3 {\n        width: 25%;\n    }\n    .col-lg-2 {\n        width: 16.666666666666664%;\n    }\n    .col-lg-1 {\n        width: 8.333333333333332%;\n    }\n    .col-lg-pull-12 {\n        right: 100%;\n    }\n    .col-lg-pull-11 {\n        right: 91.66666666666666%;\n    }\n    .col-lg-pull-10 {\n        right: 83.33333333333334%;\n    }\n    .col-lg-pull-9 {\n        right: 75%;\n    }\n    .col-lg-pull-8 {\n        right: 66.66666666666666%;\n    }\n    .col-lg-pull-7 {\n        right: 58.333333333333336%;\n    }\n    .col-lg-pull-6 {\n        right: 50%;\n    }\n    .col-lg-pull-5 {\n        right: 41.66666666666667%;\n    }\n    .col-lg-pull-4 {\n        right: 33.33333333333333%;\n    }\n    .col-lg-pull-3 {\n        right: 25%;\n    }\n    .col-lg-pull-2 {\n        right: 16.666666666666664%;\n    }\n    .col-lg-pull-1 {\n        right: 8.333333333333332%;\n    }\n    .col-lg-pull-0 {\n        right: 0;\n    }\n    .col-lg-push-12 {\n        left: 100%;\n    }\n    .col-lg-push-11 {\n        left: 91.66666666666666%;\n    }\n    .col-lg-push-10 {\n        left: 83.33333333333334%;\n    }\n    .col-lg-push-9 {\n        left: 75%;\n    }\n    .col-lg-push-8 {\n        left: 66.66666666666666%;\n    }\n    .col-lg-push-7 {\n        left: 58.333333333333336%;\n    }\n    .col-lg-push-6 {\n        left: 50%;\n    }\n    .col-lg-push-5 {\n        left: 41.66666666666667%;\n    }\n    .col-lg-push-4 {\n        left: 33.33333333333333%;\n    }\n    .col-lg-push-3 {\n        left: 25%;\n    }\n    .col-lg-push-2 {\n        left: 16.666666666666664%;\n    }\n    .col-lg-push-1 {\n        left: 8.333333333333332%;\n    }\n    .col-lg-push-0 {\n        left: 0;\n    }\n    .col-lg-offset-12 {\n        margin-left: 100%;\n    }\n    .col-lg-offset-11 {\n        margin-left: 91.66666666666666%;\n    }\n    .col-lg-offset-10 {\n        margin-left: 83.33333333333334%;\n    }\n    .col-lg-offset-9 {\n        margin-left: 75%;\n    }\n    .col-lg-offset-8 {\n        margin-left: 66.66666666666666%;\n    }\n    .col-lg-offset-7 {\n        margin-left: 58.333333333333336%;\n    }\n    .col-lg-offset-6 {\n        margin-left: 50%;\n    }\n    .col-lg-offset-5 {\n        margin-left: 41.66666666666667%;\n    }\n    .col-lg-offset-4 {\n        margin-left: 33.33333333333333%;\n    }\n    .col-lg-offset-3 {\n        margin-left: 25%;\n    }\n    .col-lg-offset-2 {\n        margin-left: 16.666666666666664%;\n    }\n    .col-lg-offset-1 {\n        margin-left: 8.333333333333332%;\n    }\n    .col-lg-offset-0 {\n        margin-left: 0;\n    }\n}\n\nfieldset {\n    padding: 0;\n    margin: 0;\n    border: 0;\n}\n\nlegend {\n    display: block;\n    width: 100%;\n    padding: 0;\n    margin-bottom: 20px;\n    font-size: 21px;\n    line-height: inherit;\n    color: #333333;\n    border: 0;\n    border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n    display: inline-block;\n    margin-bottom: 5px;\n    font-weight: bold;\n}\n\ninput[type=\"search\"] {\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n    margin: 4px 0 0;\n    margin-top: 1px \\9;\n    /* IE8-9 */\n\n    line-height: normal;\n}\n\ninput[type=\"file\"] {\n    display: block;\n}\n\nselect[multiple],\nselect[size] {\n    height: auto;\n}\n\nselect optgroup {\n    font-family: inherit;\n    font-size: inherit;\n    font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n    outline: thin dotted;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n    height: auto;\n}\n\noutput {\n    display: block;\n    padding-top: 7px;\n    font-size: 14px;\n    line-height: 1.428571429;\n    color: #555555;\n    vertical-align: middle;\n}\n\n.form-control {\n    display: block;\n    width: 94%;\n    height: 34px;\n    padding: 6px 12px;\n    font-size: 14px;\n    line-height: 1.428571429;\n    color: #555555;\n    vertical-align: middle;\n    background-color: #ffffff;\n    background-image: none;\n    border: 1px solid #cccccc;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n    -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n    transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n    border-color: #66afe9;\n    outline: 0;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n    color: #999999;\n}\n\n.form-control::-moz-placeholder {\n    color: #999999;\n    opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n    color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n    color: #999999;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n    cursor: not-allowed;\n    background-color: #eeeeee;\n}\n\ntextarea.form-control {\n    height: auto;\n}\n\n.form-group {\n    margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n    display: block;\n    min-height: 20px;\n    padding-left: 20px;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n    display: inline;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n    float: left;\n    margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n    margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n    display: inline-block;\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    vertical-align: middle;\n    cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n    margin-top: 0;\n    margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n    cursor: not-allowed;\n}\n\n.input-sm {\n    height: 30px;\n    padding: 5px 10px;\n    font-size: 12px;\n    line-height: 1.5;\n    border-radius: 3px;\n}\n\nselect.input-sm {\n    height: 30px;\n    line-height: 30px;\n}\n\ntextarea.input-sm {\n    height: auto;\n}\n\n.input-lg {\n    height: 46px;\n    padding: 10px 16px;\n    font-size: 18px;\n    line-height: 1.33;\n    border-radius: 6px;\n}\n\nselect.input-lg {\n    height: 46px;\n    line-height: 46px;\n}\n\ntextarea.input-lg {\n    height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n    color: #8a6d3b;\n}\n\n.has-warning .form-control {\n    border-color: #8a6d3b;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n    border-color: #66512c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n\n.has-warning .input-group-addon {\n    color: #8a6d3b;\n    background-color: #fcf8e3;\n    border-color: #8a6d3b;\n}\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n    color: #a94442;\n}\n\n.has-error .form-control {\n    border-color: #a94442;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n    border-color: #843534;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n\n.has-error .input-group-addon {\n    color: #a94442;\n    background-color: #f2dede;\n    border-color: #a94442;\n}\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n    color: #3c763d;\n}\n\n.has-success .form-control {\n    border-color: #3c763d;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n    border-color: #2b542c;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n\n.has-success .input-group-addon {\n    color: #3c763d;\n    background-color: #dff0d8;\n    border-color: #3c763d;\n}\n\n.form-control-static {\n    margin-bottom: 0;\n}\n\n.help-block {\n    display: block;\n    margin-top: 5px;\n    margin-bottom: 10px;\n    color: #737373;\n}\n\n@media (min-width: 768px) {\n    .form-inline .form-group {\n        display: inline-block;\n        margin-bottom: 0;\n        vertical-align: middle;\n    }\n    .form-inline .form-control {\n        display: inline-block;\n    }\n    .form-inline select.form-control {\n        width: auto;\n    }\n    .form-inline .radio,\n    .form-inline .checkbox {\n        display: inline-block;\n        padding-left: 0;\n        margin-top: 0;\n        margin-bottom: 0;\n    }\n    .form-inline .radio input[type=\"radio\"],\n    .form-inline .checkbox input[type=\"checkbox\"] {\n        float: none;\n        margin-left: 0;\n    }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n    padding-top: 7px;\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n    min-height: 27px;\n}\n\n.form-horizontal .form-group {\n    margin-right: -15px;\n    margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n    display: table;\n    content: \" \";\n}\n\n.form-horizontal .form-group:after {\n    clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n    display: table;\n    content: \" \";\n}\n\n.form-horizontal .form-group:after {\n    clear: both;\n}\n\n.form-horizontal .form-control-static {\n    padding-top: 7px;\n}\n\n@media (min-width: 768px) {\n    .form-horizontal .control-label {\n        text-align: right;\n    }\n}\n\n.btn-default {\n    color: #333333;\n    background-color: #ffffff;\n    border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n    color: #333333;\n    background-color: #ebebeb;\n    border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n    background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n    background-color: #ffffff;\n    border-color: #cccccc;\n}\n\n.btn-default .badge {\n    color: #ffffff;\n    background-color: #fff;\n}\n\n.btn-warning {\n    color: #ffffff;\n    background-color: #f0ad4e;\n    border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n    color: #ffffff;\n    background-color: #ed9c28;\n    border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n    background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n    background-color: #f0ad4e;\n    border-color: #eea236;\n}\n\n.btn-warning .badge {\n    color: #f0ad4e;\n    background-color: #fff;\n}\n\n.btn-danger {\n    color: #ffffff;\n    background-color: #d9534f;\n    border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n    color: #ffffff;\n    background-color: #d2322d;\n    border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n    background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n    background-color: #d9534f;\n    border-color: #d43f3a;\n}\n\n.btn-danger .badge {\n    color: #d9534f;\n    background-color: #fff;\n}\n\n.btn-success {\n    color: #ffffff;\n    background-color: #5cb85c;\n    border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n    color: #ffffff;\n    background-color: #47a447;\n    border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n    background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n    background-color: #5cb85c;\n    border-color: #4cae4c;\n}\n\n.btn-success .badge {\n    color: #5cb85c;\n    background-color: #fff;\n}\n\n.btn-info {\n    color: #ffffff;\n    background-color: #5bc0de;\n    border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n    color: #ffffff;\n    background-color: #39b3d7;\n    border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n    background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n    background-color: #5bc0de;\n    border-color: #46b8da;\n}\n\n.btn-info .badge {\n    color: #5bc0de;\n    background-color: #fff;\n}\n\n.btn-link {\n    font-weight: normal;\n    color: #428bca;\n    cursor: pointer;\n    border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n    background-color: transparent;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n    border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n    color: #2a6496;\n    text-decoration: underline;\n    background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n    color: #999999;\n    text-decoration: none;\n}\n\n.btn-lg {\n    padding: 10px 16px;\n    font-size: 18px;\n    line-height: 1.33;\n    border-radius: 6px;\n}\n\n.btn-sm {\n    padding: 5px 10px;\n    font-size: 12px;\n    line-height: 1.5;\n    border-radius: 3px;\n}\n\n.btn-xs {\n    padding: 1px 5px;\n    font-size: 12px;\n    line-height: 1.5;\n    border-radius: 3px;\n}\n\n.btn-block {\n    display: block;\n    width: 100%;\n    padding-right: 0;\n    padding-left: 0;\n}\n\n.btn-block + .btn-block {\n    margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n    width: 100%;\n}\n\n.fade {\n    opacity: 0;\n    -webkit-transition: opacity 0.15s linear;\n    transition: opacity 0.15s linear;\n}\n\n.fade.in {\n    opacity: 1;\n}\n\n.collapse {\n    display: none;\n}\n\n.collapse.in {\n    display: block;\n}\n\n.collapsing {\n    position: relative;\n    height: 0;\n    overflow: hidden;\n    -webkit-transition: height 0.35s ease;\n    transition: height 0.35s ease;\n}\n\n@font-face {\n    font-family: 'Glyphicons Halflings';\n    src: url('../fonts/glyphicons-halflings-regular.eot');\n    src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n    position: relative;\n    top: 1px;\n    display: inline-block;\n    font-family: 'Glyphicons Halflings';\n    -webkit-font-smoothing: antialiased;\n    font-style: normal;\n    font-weight: normal;\n    line-height: 1;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n    width: 1em;\n}\n\n.glyphicon-asterisk:before {\n    content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n    content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n    content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n    content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n    content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n    content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n    content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n    content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n    content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n    content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n    content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n    content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n    content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n    content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n    content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n    content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n    content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n    content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n    content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n    content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n    content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n    content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n    content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n    content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n    content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n    content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n    content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n    content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n    content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n    content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n    content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n    content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n    content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n    content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n    content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n    content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n    content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n    content: \"\\e032\";\n}\n\n.glyphicon-lock:before {\n    content: \"\\e033\";\n}\n\n.glyphicon-flag:before {\n    content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n    content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n    content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n    content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n    content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n    content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n    content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n    content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n    content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n    content: \"\\e043\";\n}\n\n.glyphicon-bookmark:before {\n    content: \"\\e044\";\n}\n\n.glyphicon-print:before {\n    content: \"\\e045\";\n}\n\n.glyphicon-camera:before {\n    content: \"\\e046\";\n}\n\n.glyphicon-font:before {\n    content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n    content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n    content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n    content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n    content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n    content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n    content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n    content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n    content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n    content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n    content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n    content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n    content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n    content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n    content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n    content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n    content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n    content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n    content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n    content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n    content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n    content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n    content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n    content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n    content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n    content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n    content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n    content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n    content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n    content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n    content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n    content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n    content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n    content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n    content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n    content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n    content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n    content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n    content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n    content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n    content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n    content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n    content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n    content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n    content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n    content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n    content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n    content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n    content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n    content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n    content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n    content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n    content: \"\\e103\";\n}\n\n.glyphicon-fire:before {\n    content: \"\\e104\";\n}\n\n.glyphicon-eye-open:before {\n    content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n    content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n    content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n    content: \"\\e108\";\n}\n\n.glyphicon-calendar:before {\n    content: \"\\e109\";\n}\n\n.glyphicon-random:before {\n    content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n    content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n    content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n    content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n    content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n    content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n    content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n    content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n    content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n    content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n    content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n    content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n    content: \"\\e122\";\n}\n\n.glyphicon-bell:before {\n    content: \"\\e123\";\n}\n\n.glyphicon-certificate:before {\n    content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n    content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n    content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n    content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n    content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n    content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n    content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n    content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n    content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n    content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n    content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n    content: \"\\e135\";\n}\n\n.glyphicon-wrench:before {\n    content: \"\\e136\";\n}\n\n.glyphicon-tasks:before {\n    content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n    content: \"\\e138\";\n}\n\n.glyphicon-briefcase:before {\n    content: \"\\e139\";\n}\n\n.glyphicon-fullscreen:before {\n    content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n    content: \"\\e141\";\n}\n\n.glyphicon-paperclip:before {\n    content: \"\\e142\";\n}\n\n.glyphicon-heart-empty:before {\n    content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n    content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n    content: \"\\e145\";\n}\n\n.glyphicon-pushpin:before {\n    content: \"\\e146\";\n}\n\n.glyphicon-usd:before {\n    content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n    content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n    content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n    content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n    content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n    content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n    content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n    content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n    content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n    content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n    content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n    content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n    content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n    content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n    content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n    content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n    content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n    content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n    content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n    content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n    content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n    content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n    content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n    content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n    content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n    content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n    content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n    content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n    content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n    content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n    content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n    content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n    content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n    content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n    content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n    content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n    content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n    content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n    content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n    content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n    content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n    content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n    content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n    content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n    content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n    content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n    content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n    content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n    content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n    content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n    content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n    content: \"\\e200\";\n}\n\n.caret {\n    display: inline-block;\n    width: 0;\n    height: 0;\n    margin-left: 2px;\n    vertical-align: middle;\n    border-top: 4px solid;\n    border-right: 4px solid transparent;\n    border-left: 4px solid transparent;\n}\n\n.dropdown {\n    position: relative;\n}\n\n.dropdown-toggle:focus {\n    outline: 0;\n}\n\n.dropdown-menu {\n    position: absolute;\n    top: 100%;\n    left: 0;\n    z-index: 1000;\n    display: none;\n    float: left;\n    min-width: 160px;\n    padding: 5px 0;\n    margin: 2px 0 0;\n    font-size: 14px;\n    list-style: none;\n    background-color: #ffffff;\n    border: 1px solid #cccccc;\n    border: 1px solid rgba(0, 0, 0, 0.15);\n    border-radius: 4px;\n    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n    background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n    right: 0;\n    left: auto;\n}\n\n.dropdown-menu .divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: 1.428571429;\n    color: #333333;\n    white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n    color: #262626;\n    text-decoration: none;\n    background-color: #f5f5f5;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    text-decoration: none;\n    background-color: #428bca;\n    outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n    color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n    text-decoration: none;\n    cursor: not-allowed;\n    background-color: transparent;\n    background-image: none;\n    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n    display: block;\n}\n\n.open > a {\n    outline: 0;\n}\n\n.dropdown-header {\n    display: block;\n    padding: 3px 20px;\n    font-size: 12px;\n    line-height: 1.428571429;\n    color: #999999;\n}\n\n.dropdown-backdrop {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n    right: 0;\n    left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n    border-top: 0;\n    border-bottom: 4px solid;\n    content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n    .navbar-right .dropdown-menu {\n        right: 0;\n        left: auto;\n    }\n}\n\n.btn-group,\n.btn-group-vertical {\n    position: relative;\n    display: inline-block;\n    vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n    position: relative;\n    float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n    z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n    outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n    margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n    display: table;\n    content: \" \";\n}\n\n.btn-toolbar:after {\n    clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n    display: table;\n    content: \" \";\n}\n\n.btn-toolbar:after {\n    clear: both;\n}\n\n.btn-toolbar .btn-group {\n    float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n    margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n    border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n    margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n    border-bottom-left-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n    float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n    border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n    border-bottom-left-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n    outline: 0;\n}\n\n.btn-group-xs > .btn {\n    padding: 1px 5px;\n    font-size: 12px;\n    line-height: 1.5;\n    border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n    padding: 5px 10px;\n    font-size: 12px;\n    line-height: 1.5;\n    border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n    padding: 10px 16px;\n    font-size: 18px;\n    line-height: 1.33;\n    border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n    padding-right: 8px;\n    padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n    padding-right: 12px;\n    padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n    -webkit-box-shadow: none;\n    box-shadow: none;\n}\n\n.btn .caret {\n    margin-left: 0;\n}\n\n.btn-lg .caret {\n    border-width: 5px 5px 0;\n    border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n    border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n    display: table;\n    content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n    clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n    display: table;\n    content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n    clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n    float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n    border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n    border-top-right-radius: 4px;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n    border-top-right-radius: 0;\n    border-bottom-left-radius: 4px;\n    border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n    border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n    border-top-right-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n    display: table;\n    width: 100%;\n    border-collapse: separate;\n    table-layout: fixed;\n}\n\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n    display: table-cell;\n    float: none;\n    width: 1%;\n}\n\n.btn-group-justified > .btn-group .btn {\n    width: 100%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n    display: none;\n}\n\n.input-group {\n    position: relative;\n    display: table;\n    border-collapse: separate;\n}\n\n.input-group[class*=\"col-\"] {\n    float: none;\n    padding-right: 0;\n    padding-left: 0;\n}\n\n.input-group .form-control {\n    width: 100%;\n    margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n    height: 46px;\n    padding: 10px 16px;\n    font-size: 18px;\n    line-height: 1.33;\n    border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n    height: 46px;\n    line-height: 46px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n    height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n    height: 30px;\n    padding: 5px 10px;\n    font-size: 12px;\n    line-height: 1.5;\n    border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n    height: 30px;\n    line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n    height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n    display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n    border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n    width: 1%;\n    white-space: nowrap;\n    vertical-align: middle;\n}\n\n.input-group-addon {\n    padding: 6px 12px;\n    font-size: 14px;\n    font-weight: normal;\n    line-height: 1;\n    color: #555555;\n    text-align: center;\n    background-color: #eeeeee;\n    border: 1px solid #cccccc;\n    border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n    padding: 5px 10px;\n    font-size: 12px;\n    border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n    padding: 10px 16px;\n    font-size: 18px;\n    border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n    margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n    border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n    border-bottom-left-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n    border-left: 0;\n}\n\n.input-group-btn {\n    position: relative;\n    white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n    margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n    margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n    position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n    margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n    z-index: 2;\n}\n\n.nav {\n    padding-left: 0;\n    margin-bottom: 0;\n    list-style: none;\n}\n\n.nav:before,\n.nav:after {\n    display: table;\n    content: \" \";\n}\n\n.nav:after {\n    clear: both;\n}\n\n.nav:before,\n.nav:after {\n    display: table;\n    content: \" \";\n}\n\n.nav:after {\n    clear: both;\n}\n\n.nav > li {\n    position: relative;\n    display: block;\n}\n\n.nav > li > a {\n    position: relative;\n    display: block;\n    padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n    text-decoration: none;\n    background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n    color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n    color: #999999;\n    text-decoration: none;\n    cursor: not-allowed;\n    background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n    background-color: #eeeeee;\n    border-color: #428bca;\n}\n\n.nav .nav-divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n    max-width: none;\n}\n\n.nav-tabs {\n    border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n    float: left;\n    margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n    margin-right: 2px;\n    line-height: 1.428571429;\n    border: 1px solid transparent;\n    border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n    border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n    color: #555555;\n    cursor: default;\n    background-color: #ffffff;\n    border: 1px solid #dddddd;\n    border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n    width: 100%;\n    border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n    float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n    margin-bottom: 5px;\n    text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n}\n\n@media (min-width: 768px) {\n    .nav-tabs.nav-justified > li {\n        display: table-cell;\n        width: 1%;\n    }\n    .nav-tabs.nav-justified > li > a {\n        margin-bottom: 0;\n    }\n}\n\n.nav-tabs.nav-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px;\n}\n\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n    border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n    .nav-tabs.nav-justified > li > a {\n        border-bottom: 1px solid #dddddd;\n        border-radius: 4px 4px 0 0;\n    }\n    .nav-tabs.nav-justified > .active > a,\n    .nav-tabs.nav-justified > .active > a:hover,\n    .nav-tabs.nav-justified > .active > a:focus {\n        border-bottom-color: #ffffff;\n    }\n}\n\n.nav-pills > li {\n    float: left;\n}\n\n.nav-pills > li > a {\n    border-radius: 4px;\n}\n\n.nav-pills > li + li {\n    margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n    color: #ffffff;\n    background-color: #428bca;\n}\n\n.nav-stacked > li {\n    float: none;\n}\n\n.nav-stacked > li + li {\n    margin-top: 2px;\n    margin-left: 0;\n}\n\n.nav-justified {\n    width: 100%;\n}\n\n.nav-justified > li {\n    float: none;\n}\n\n.nav-justified > li > a {\n    margin-bottom: 5px;\n    text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n}\n\n@media (min-width: 768px) {\n    .nav-justified > li {\n        display: table-cell;\n        width: 1%;\n    }\n    .nav-justified > li > a {\n        margin-bottom: 0;\n    }\n}\n\n.nav-tabs-justified {\n    border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px;\n}\n\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n    border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n    .nav-tabs-justified > li > a {\n        border-bottom: 1px solid #dddddd;\n        border-radius: 4px 4px 0 0;\n    }\n    .nav-tabs-justified > .active > a,\n    .nav-tabs-justified > .active > a:hover,\n    .nav-tabs-justified > .active > a:focus {\n        border-bottom-color: #ffffff;\n    }\n}\n\n.tab-content > .tab-pane {\n    display: none;\n}\n\n.tab-content > .active {\n    display: block;\n}\n\n.nav-tabs .dropdown-menu {\n    margin-top: -1px;\n    border-top-right-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.navbar {\n    position: relative;\n    min-height: 50px;\n    margin-bottom: 20px;\n    border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n    display: table;\n    content: \" \";\n}\n\n.navbar:after {\n    clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n    display: table;\n    content: \" \";\n}\n\n.navbar:after {\n    clear: both;\n}\n\n@media (min-width: 768px) {\n    .navbar {\n        border-radius: 4px;\n    }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n    display: table;\n    content: \" \";\n}\n\n.navbar-header:after {\n    clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n    display: table;\n    content: \" \";\n}\n\n.navbar-header:after {\n    clear: both;\n}\n\n@media (min-width: 768px) {\n    .navbar-header {\n        float: left;\n    }\n}\n\n.navbar-collapse {\n    max-height: 340px;\n    padding-right: 15px;\n    padding-left: 15px;\n    overflow-x: visible;\n    border-top: 1px solid transparent;\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n    -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n    display: table;\n    content: \" \";\n}\n\n.navbar-collapse:after {\n    clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n    display: table;\n    content: \" \";\n}\n\n.navbar-collapse:after {\n    clear: both;\n}\n\n.navbar-collapse.in {\n    overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n    .navbar-collapse {\n        width: auto;\n        border-top: 0;\n        box-shadow: none;\n    }\n    .navbar-collapse.collapse {\n        display: block !important;\n        height: auto !important;\n        padding-bottom: 0;\n        overflow: visible !important;\n    }\n    .navbar-collapse.in {\n        overflow-y: visible;\n    }\n    .navbar-fixed-top .navbar-collapse,\n    .navbar-static-top .navbar-collapse,\n    .navbar-fixed-bottom .navbar-collapse {\n        padding-right: 0;\n        padding-left: 0;\n    }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n    margin-right: -15px;\n    margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n    .container > .navbar-header,\n    .container > .navbar-collapse {\n        margin-right: 0;\n        margin-left: 0;\n    }\n}\n\n.navbar-static-top {\n    z-index: 1000;\n    border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n    .navbar-static-top {\n        border-radius: 0;\n    }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n    position: fixed;\n    right: 0;\n    left: 0;\n    z-index: 1030;\n}\n\n@media (min-width: 768px) {\n    .navbar-fixed-top,\n    .navbar-fixed-bottom {\n        border-radius: 0;\n    }\n}\n\n.navbar-fixed-top {\n    top: 0;\n    border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n    bottom: 0;\n    margin-bottom: 0;\n    border-width: 1px 0 0;\n}\n\n.navbar-brand {\n    float: left;\n    padding: 15px 15px;\n    font-size: 18px;\n    line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n    text-decoration: none;\n}\n\n@media (min-width: 768px) {\n    .navbar > .container .navbar-brand {\n        margin-left: -15px;\n    }\n}\n\n.navbar-toggle {\n    position: relative;\n    float: right;\n    padding: 9px 10px;\n    margin-top: 8px;\n    margin-right: 15px;\n    margin-bottom: 8px;\n    background-color: transparent;\n    background-image: none;\n    border: 1px solid transparent;\n    border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n    margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n    .navbar-toggle {\n        display: none;\n    }\n}\n\n.navbar-nav {\n    margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n    line-height: 20px;\n}\n\n@media (max-width: 767px) {\n    .navbar-nav .open .dropdown-menu {\n        position: static;\n        float: none;\n        width: auto;\n        margin-top: 0;\n        background-color: transparent;\n        border: 0;\n        box-shadow: none;\n    }\n    .navbar-nav .open .dropdown-menu > li > a,\n    .navbar-nav .open .dropdown-menu .dropdown-header {\n        padding: 5px 15px 5px 25px;\n    }\n    .navbar-nav .open .dropdown-menu > li > a {\n        line-height: 20px;\n    }\n    .navbar-nav .open .dropdown-menu > li > a:hover,\n    .navbar-nav .open .dropdown-menu > li > a:focus {\n        background-image: none;\n    }\n}\n\n@media (min-width: 768px) {\n    .navbar-nav {\n        float: left;\n        margin: 0;\n    }\n    .navbar-nav > li {\n        float: left;\n    }\n    .navbar-nav > li > a {\n        padding-top: 15px;\n        padding-bottom: 15px;\n    }\n    .navbar-nav.navbar-right:last-child {\n        margin-right: -15px;\n    }\n}\n\n@media (min-width: 768px) {\n    .navbar-left {\n        float: left !important;\n    }\n    .navbar-right {\n        float: right !important;\n    }\n}\n\n.navbar-form {\n    padding: 10px 15px;\n    margin-top: 8px;\n    margin-right: -15px;\n    margin-bottom: 8px;\n    margin-left: -15px;\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n    .navbar-form .form-group {\n        display: inline-block;\n        margin-bottom: 0;\n        vertical-align: middle;\n    }\n    .navbar-form .form-control {\n        display: inline-block;\n    }\n    .navbar-form select.form-control {\n        width: auto;\n    }\n    .navbar-form .radio,\n    .navbar-form .checkbox {\n        display: inline-block;\n        padding-left: 0;\n        margin-top: 0;\n        margin-bottom: 0;\n    }\n    .navbar-form .radio input[type=\"radio\"],\n    .navbar-form .checkbox input[type=\"checkbox\"] {\n        float: none;\n        margin-left: 0;\n    }\n}\n\n@media (max-width: 767px) {\n    .navbar-form .form-group {\n        margin-bottom: 5px;\n    }\n}\n\n@media (min-width: 768px) {\n    .navbar-form {\n        width: auto;\n        padding-top: 0;\n        padding-bottom: 0;\n        margin-right: 0;\n        margin-left: 0;\n        border: 0;\n        -webkit-box-shadow: none;\n        box-shadow: none;\n    }\n    .navbar-form.navbar-right:last-child {\n        margin-right: -15px;\n    }\n}\n\n.navbar-nav > li > .dropdown-menu {\n    margin-top: 0;\n    border-top-right-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n    right: 0;\n    left: auto;\n}\n\n.navbar-btn {\n    margin-top: 8px;\n    margin-bottom: 8px;\n}\n\n.navbar-btn.btn-sm {\n    margin-top: 10px;\n    margin-bottom: 10px;\n}\n\n.navbar-btn.btn-xs {\n    margin-top: 14px;\n    margin-bottom: 14px;\n}\n\n.navbar-text {\n    margin-top: 15px;\n    margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n    .navbar-text {\n        float: left;\n        margin-right: 15px;\n        margin-left: 15px;\n    }\n    .navbar-text.navbar-right:last-child {\n        margin-right: 0;\n    }\n}\n\n.navbar-default {\n    background-color: #f8f8f8;\n    border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n    color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n    color: #5e5e5e;\n    background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n    color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n    color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n    border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n    background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n    background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n    border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n}\n\n@media (max-width: 767px) {\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n        color: #777777;\n    }\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #333333;\n        background-color: transparent;\n    }\n    .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n    .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n    .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n        color: #555555;\n        background-color: #e7e7e7;\n    }\n    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n        color: #cccccc;\n        background-color: transparent;\n    }\n}\n\n.navbar-default .navbar-link {\n    color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n    color: #333333;\n}\n\n.navbar-inverse {\n    background-color: #222222;\n    border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n    color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n    color: #ffffff;\n    background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n    color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n    color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n    border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n    background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n    background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n    border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n}\n\n@media (max-width: 767px) {\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n        border-color: #080808;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n        background-color: #080808;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n        color: #999999;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n        color: #ffffff;\n        background-color: transparent;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n        color: #ffffff;\n        background-color: #080808;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n        color: #444444;\n        background-color: transparent;\n    }\n}\n\n.navbar-inverse .navbar-link {\n    color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n    color: #ffffff;\n}\n\n.breadcrumb {\n    padding: 8px 15px;\n    margin-bottom: 20px;\n    list-style: none;\n    background-color: #f5f5f5;\n    border-radius: 4px;\n}\n\n.breadcrumb > li {\n    display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n    padding: 0 5px;\n    color: #cccccc;\n    content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n    color: #999999;\n}\n\n.pagination {\n    display: inline-block;\n    padding-left: 0;\n    margin: 20px 0;\n    border-radius: 4px;\n}\n\n.pagination > li {\n    display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n    position: relative;\n    float: left;\n    padding: 6px 12px;\n    margin-left: -1px;\n    line-height: 1.428571429;\n    text-decoration: none;\n    background-color: #ffffff;\n    border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n    margin-left: 0;\n    border-bottom-left-radius: 4px;\n    border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n    border-top-right-radius: 4px;\n    border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n    background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n    z-index: 2;\n    color: #ffffff;\n    cursor: default;\n    background-color: #428bca;\n    border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n    color: #999999;\n    cursor: not-allowed;\n    background-color: #ffffff;\n    border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n    padding: 10px 16px;\n    font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n    border-bottom-left-radius: 6px;\n    border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n    border-top-right-radius: 6px;\n    border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n    padding: 5px 10px;\n    font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n    border-bottom-left-radius: 3px;\n    border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n    border-top-right-radius: 3px;\n    border-bottom-right-radius: 3px;\n}\n\n.pager {\n    padding-left: 0;\n    margin: 20px 0;\n    text-align: center;\n    list-style: none;\n}\n\n.pager:before,\n.pager:after {\n    display: table;\n    content: \" \";\n}\n\n.pager:after {\n    clear: both;\n}\n\n.pager:before,\n.pager:after {\n    display: table;\n    content: \" \";\n}\n\n.pager:after {\n    clear: both;\n}\n\n.pager li {\n    display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n    display: inline-block;\n    padding: 5px 14px;\n    background-color: #ffffff;\n    border: 1px solid #dddddd;\n    border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n    text-decoration: none;\n    background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n    float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n    float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n    color: #999999;\n    cursor: not-allowed;\n    background-color: #ffffff;\n}\n\n.label {\n    display: inline;\n    padding: .2em .6em .3em;\n    font-size: 75%;\n    font-weight: bold;\n    line-height: 1;\n    color: #ffffff;\n    text-align: center;\n    white-space: nowrap;\n    vertical-align: baseline;\n    border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n    color: #ffffff;\n    text-decoration: none;\n    cursor: pointer;\n}\n\n.label:empty {\n    display: none;\n}\n\n.btn .label {\n    position: relative;\n    top: -1px;\n}\n\n.label-default {\n    background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n    background-color: #808080;\n}\n\n.label-primary {\n    background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n    background-color: #3071a9;\n}\n\n.label-success {\n    background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n    background-color: #449d44;\n}\n\n.label-info {\n    background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n    background-color: #31b0d5;\n}\n\n.label-warning {\n    background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n    background-color: #ec971f;\n}\n\n.label-danger {\n    background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n    background-color: #c9302c;\n}\n\n.badge {\n    display: inline-block;\n    min-width: 10px;\n    padding: 3px 7px;\n    font-size: 12px;\n    font-weight: bold;\n    line-height: 1;\n    color: #ffffff;\n    text-align: center;\n    white-space: nowrap;\n    vertical-align: baseline;\n    background-color: #999999;\n    border-radius: 10px;\n}\n\n.badge:empty {\n    display: none;\n}\n\n.btn .badge {\n    position: relative;\n    top: -1px;\n}\n\na.badge:hover,\na.badge:focus {\n    color: #ffffff;\n    text-decoration: none;\n    cursor: pointer;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n    color: #428bca;\n    background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n    margin-left: 3px;\n}\n\n.jumbotron {\n    padding: 30px;\n    margin-bottom: 30px;\n    font-size: 21px;\n    font-weight: 200;\n    line-height: 2.1428571435;\n    color: inherit;\n    background-color: #eeeeee;\n}\n\n.jumbotron h1,\n.jumbotron .h1 {\n    line-height: 1;\n    color: inherit;\n}\n\n.jumbotron p {\n    line-height: 1.4;\n}\n\n.container .jumbotron {\n    border-radius: 6px;\n}\n\n.jumbotron .container {\n    max-width: 100%;\n}\n\n@media screen and (min-width: 768px) {\n    .jumbotron {\n        padding-top: 48px;\n        padding-bottom: 48px;\n    }\n    .container .jumbotron {\n        padding-right: 60px;\n        padding-left: 60px;\n    }\n    .jumbotron h1,\n    .jumbotron .h1 {\n        font-size: 63px;\n    }\n}\n\n.thumbnail {\n    display: block;\n    padding: 4px;\n    margin-bottom: 20px;\n    line-height: 1.428571429;\n    background-color: #ffffff;\n    border: 1px solid #dddddd;\n    border-radius: 4px;\n    -webkit-transition: all 0.2s ease-in-out;\n    transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img,\n.thumbnail a > img {\n    display: block;\n    height: auto;\n    max-width: 100%;\n    margin-right: auto;\n    margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n    border-color: #428bca;\n}\n\n.thumbnail .caption {\n    padding: 9px;\n    color: #333333;\n}\n\n.alert {\n    padding: 15px;\n    margin-bottom: 20px;\n    border: 1px solid transparent;\n    border-radius: 4px;\n}\n\n.alert h4 {\n    margin-top: 0;\n    color: inherit;\n}\n\n.alert .alert-link {\n    font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n    margin-bottom: 0;\n}\n\n.alert > p + p {\n    margin-top: 5px;\n}\n\n.alert-dismissable {\n    padding-right: 35px;\n}\n\n.alert-dismissable .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n}\n\n.alert-success {\n    color: #3c763d;\n    background-color: #dff0d8;\n    border-color: #d6e9c6;\n}\n\n.alert-success hr {\n    border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n    color: #2b542c;\n}\n\n.alert-info {\n    color: #31708f;\n    background-color: #d9edf7;\n    border-color: #bce8f1;\n}\n\n.alert-info hr {\n    border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n    color: #245269;\n}\n\n.alert-warning {\n    color: #8a6d3b;\n    background-color: #fcf8e3;\n    border-color: #faebcc;\n}\n\n.alert-warning hr {\n    border-top-color: #f7e1b5;\n}\n\n.alert-warning .alert-link {\n    color: #66512c;\n}\n\n.alert-danger {\n    color: #a94442;\n    background-color: #f2dede;\n    border-color: #ebccd1;\n}\n\n.alert-danger hr {\n    border-top-color: #e4b9c0;\n}\n\n.alert-danger .alert-link {\n    color: #843534;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n    from {\n        background-position: 40px 0;\n    }\n    to {\n        background-position: 0 0;\n    }\n}\n\n@keyframes progress-bar-stripes {\n    from {\n        background-position: 40px 0;\n    }\n    to {\n        background-position: 0 0;\n    }\n}\n\n.media,\n.media-body {\n    overflow: hidden;\n    zoom: 1;\n}\n\n.media,\n.media .media {\n    margin-top: 15px;\n}\n\n.media:first-child {\n    margin-top: 0;\n}\n\n.media-object {\n    display: block;\n}\n\n.media-heading {\n    margin: 0 0 5px;\n}\n\n.media > .pull-left {\n    margin-right: 10px;\n}\n\n.media > .pull-right {\n    margin-left: 10px;\n}\n\n.media-list {\n    padding-left: 0;\n    list-style: none;\n}\n\n.list-group {\n    padding-left: 0;\n    margin-bottom: 20px;\n}\n\n.list-group-item {\n    position: relative;\n    display: block;\n    padding: 10px 15px;\n    margin-bottom: -1px;\n    background-color: #ffffff;\n    border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n    border-top-right-radius: 4px;\n    border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n    margin-bottom: 0;\n    border-bottom-right-radius: 4px;\n    border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n    float: right;\n}\n\n.list-group-item > .badge + .badge {\n    margin-right: 5px;\n}\n\na.list-group-item {\n    color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n    color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n    text-decoration: none;\n    background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n    z-index: 2;\n    color: #ffffff;\n    background-color: #428bca;\n    border-color: #428bca;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n    color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n    color: #e1edf7;\n}\n\n.list-group-item-heading {\n    margin-top: 0;\n    margin-bottom: 5px;\n}\n\n.list-group-item-text {\n    margin-bottom: 0;\n    line-height: 1.3;\n}\n\n.panel {\n    margin-bottom: 20px;\n    background-color: #ffffff;\n    border: 1px solid transparent;\n    border-radius: 4px;\n    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n    padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n    display: table;\n    content: \" \";\n}\n\n.panel-body:after {\n    clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n    display: table;\n    content: \" \";\n}\n\n.panel-body:after {\n    clear: both;\n}\n\n.panel > .list-group {\n    margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n    border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n    border-top-right-radius: 0;\n    border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n    border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n    border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive > .table {\n    margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n    border-top: 1px solid #dddddd;\n}\n\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody:first-child td {\n    border-top: 0;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n    border: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n}\n\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n}\n\n.panel > .table-responsive {\n    margin-bottom: 0;\n    border: 0;\n}\n\n.panel-heading {\n    padding: 10px 15px;\n    border-bottom: 1px solid transparent;\n    border-top-right-radius: 3px;\n    border-top-left-radius: 3px;\n}\n\n.panel-heading > .dropdown .dropdown-toggle {\n    color: inherit;\n}\n\n.panel-title {\n    margin-top: 0;\n    margin-bottom: 0;\n    font-size: 16px;\n    color: inherit;\n}\n\n.panel-title > a {\n    color: inherit;\n}\n\n.panel-footer {\n    padding: 10px 15px;\n    background-color: #f5f5f5;\n    border-top: 1px solid #dddddd;\n    border-bottom-right-radius: 3px;\n    border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n    margin-bottom: 0;\n    overflow: hidden;\n    border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n    margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n    border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n    border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n    border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n    border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n    border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n    color: #333333;\n    background-color: #f5f5f5;\n    border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n    border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n    border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n    border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n    color: #ffffff;\n    background-color: #428bca;\n    border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n    border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n    border-bottom-color: #428bca;\n}\n\n.panel-success {\n    border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n    color: #3c763d;\n    background-color: #dff0d8;\n    border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n    border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n    border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n    border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading {\n    color: #8a6d3b;\n    background-color: #fcf8e3;\n    border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n    border-top-color: #faebcc;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n    border-bottom-color: #faebcc;\n}\n\n.panel-danger {\n    border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading {\n    color: #a94442;\n    background-color: #f2dede;\n    border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n    border-top-color: #ebccd1;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n    border-bottom-color: #ebccd1;\n}\n\n.panel-info {\n    border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n    color: #31708f;\n    background-color: #d9edf7;\n    border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n    border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n    border-bottom-color: #bce8f1;\n}\n\n.well {\n    min-height: 20px;\n    padding: 19px;\n    margin-bottom: 20px;\n    background-color: #f5f5f5;\n    border: 1px solid #e3e3e3;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n    border-color: #ddd;\n    border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n    padding: 24px;\n    border-radius: 6px;\n}\n\n.well-sm {\n    padding: 9px;\n    border-radius: 3px;\n}\n\n.close {\n    float: right;\n    font-size: 21px;\n    font-weight: bold;\n    line-height: 1;\n    color: #000000;\n    text-shadow: 0 1px 0 #ffffff;\n    opacity: 0.2;\n    filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n    color: #000000;\n    text-decoration: none;\n    cursor: pointer;\n    opacity: 0.5;\n    filter: alpha(opacity=50);\n}\n\nbutton.close {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n}\n\n.modal-open {\n    overflow: hidden;\n}\n\n.modal {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 1040;\n    display: none;\n    overflow: auto;\n    overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n    -webkit-transform: translate(0, -25%);\n    -ms-transform: translate(0, -25%);\n    transform: translate(0, -25%);\n    -webkit-transition: -webkit-transform 0.3s ease-out;\n    -moz-transition: -moz-transform 0.3s ease-out;\n    -o-transition: -o-transform 0.3s ease-out;\n    transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n    -webkit-transform: translate(0, 0);\n    -ms-transform: translate(0, 0);\n    transform: translate(0, 0);\n}\n\n.modal-dialog {\n    position: relative;\n    z-index: 1050;\n    width: auto;\n    margin: 10px;\n}\n\n.modal-content {\n    position: relative;\n    background-color: #ffffff;\n    border: 1px solid #999999;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    border-radius: 6px;\n    outline: none;\n    -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n    background-clip: padding-box;\n}\n\n.modal-backdrop {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 1030;\n    background-color: #000000;\n}\n\n.modal-backdrop.fade {\n    opacity: 0;\n    filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n    opacity: 0.5;\n    filter: alpha(opacity=50);\n}\n\n.modal-header {\n    min-height: 16.428571429px;\n    padding: 15px;\n    border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n    margin-top: -2px;\n}\n\n.modal-title {\n    margin: 0;\n    line-height: 1.428571429;\n}\n\n.modal-body {\n    position: relative;\n    padding: 20px;\n}\n\n.modal-footer {\n    padding: 19px 20px 20px;\n    margin-top: 15px;\n    text-align: right;\n    border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n    display: table;\n    content: \" \";\n}\n\n.modal-footer:after {\n    clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n    display: table;\n    content: \" \";\n}\n\n.modal-footer:after {\n    clear: both;\n}\n\n.modal-footer .btn + .btn {\n    margin-bottom: 0;\n    margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n    margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n    margin-left: 0;\n}\n\n.btn {\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    width: 158px;\n    height: 38px;\n    padding: 0;\n    margin: 0;\n    border: 1px solid #b0b0b0;\n    font-size: 14px;\n    line-height: 38px;\n    text-align: center;\n    color: #b0b0b0;\n    cursor: pointer;\n    -webkit-transition: all .4s;\n    transition: all .4s;\n}\n\n.btn-primary {\n    background: #1baeae;\n    border-color: #1baeae;\n    color: #fff;\n}\n\n@media screen and (min-width: 768px) {\n    .modal-dialog {\n        width: 600px;\n        margin: 30px auto;\n    }\n    .modal-content {\n        -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n        box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    }\n}\n\n.tooltip {\n    position: absolute;\n    z-index: 1030;\n    display: block;\n    font-size: 12px;\n    line-height: 1.4;\n    opacity: 0;\n    filter: alpha(opacity=0);\n    visibility: visible;\n}\n\n.tooltip.in {\n    opacity: 0.9;\n    filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n    padding: 5px 0;\n    margin-top: -3px;\n}\n\n.tooltip.right {\n    padding: 0 5px;\n    margin-left: 3px;\n}\n\n.tooltip.bottom {\n    padding: 5px 0;\n    margin-top: 3px;\n}\n\n.tooltip.left {\n    padding: 0 5px;\n    margin-left: -3px;\n}\n\n.tooltip-inner {\n    max-width: 200px;\n    padding: 3px 8px;\n    color: #ffffff;\n    text-align: center;\n    text-decoration: none;\n    background-color: #000000;\n    border-radius: 4px;\n}\n\n.tooltip-arrow {\n    position: absolute;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -5px;\n    border-top-color: #000000;\n    border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n    bottom: 0;\n    left: 5px;\n    border-top-color: #000000;\n    border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n    right: 5px;\n    bottom: 0;\n    border-top-color: #000000;\n    border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -5px;\n    border-right-color: #000000;\n    border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -5px;\n    border-left-color: #000000;\n    border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -5px;\n    border-bottom-color: #000000;\n    border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n    top: 0;\n    left: 5px;\n    border-bottom-color: #000000;\n    border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n    top: 0;\n    right: 5px;\n    border-bottom-color: #000000;\n    border-width: 0 5px 5px;\n}\n\n.popover {\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: 1010;\n    display: none;\n    max-width: 276px;\n    padding: 1px;\n    text-align: left;\n    white-space: normal;\n    background-color: #ffffff;\n    border: 1px solid #cccccc;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    border-radius: 6px;\n    -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    background-clip: padding-box;\n}\n\n.popover.top {\n    margin-top: -10px;\n}\n\n.popover.right {\n    margin-left: 10px;\n}\n\n.popover.bottom {\n    margin-top: 10px;\n}\n\n.popover.left {\n    margin-left: -10px;\n}\n\n.popover-title {\n    padding: 8px 14px;\n    margin: 0;\n    font-size: 14px;\n    font-weight: normal;\n    line-height: 18px;\n    background-color: #f7f7f7;\n    border-bottom: 1px solid #ebebeb;\n    border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n    padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n}\n\n.popover .arrow {\n    border-width: 11px;\n}\n\n.popover .arrow:after {\n    border-width: 10px;\n    content: \"\";\n}\n\n.popover.top .arrow {\n    bottom: -11px;\n    left: 50%;\n    margin-left: -11px;\n    border-top-color: #999999;\n    border-top-color: rgba(0, 0, 0, 0.25);\n    border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n    bottom: 1px;\n    margin-left: -10px;\n    border-top-color: #ffffff;\n    border-bottom-width: 0;\n    content: \" \";\n}\n\n.popover.right .arrow {\n    top: 50%;\n    left: -11px;\n    margin-top: -11px;\n    border-right-color: #999999;\n    border-right-color: rgba(0, 0, 0, 0.25);\n    border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n    bottom: -10px;\n    left: 1px;\n    border-right-color: #ffffff;\n    border-left-width: 0;\n    content: \" \";\n}\n\n.popover.bottom .arrow {\n    top: -11px;\n    left: 50%;\n    margin-left: -11px;\n    border-bottom-color: #999999;\n    border-bottom-color: rgba(0, 0, 0, 0.25);\n    border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n    top: 1px;\n    margin-left: -10px;\n    border-bottom-color: #ffffff;\n    border-top-width: 0;\n    content: \" \";\n}\n\n.popover.left .arrow {\n    top: 50%;\n    right: -11px;\n    margin-top: -11px;\n    border-left-color: #999999;\n    border-left-color: rgba(0, 0, 0, 0.25);\n    border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n    right: 1px;\n    bottom: -10px;\n    border-left-color: #ffffff;\n    border-right-width: 0;\n    content: \" \";\n}\n\n.carousel {\n    position: relative;\n}\n\n.carousel-inner {\n    position: relative;\n    width: 100%;\n    overflow: hidden;\n}\n\n.carousel-inner > .item {\n    position: relative;\n    display: none;\n    -webkit-transition: 0.6s ease-in-out left;\n    transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n    display: block;\n    height: auto;\n    max-width: 100%;\n    line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n    display: block;\n}\n\n.carousel-inner > .active {\n    left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n}\n\n.carousel-inner > .next {\n    left: 100%;\n}\n\n.carousel-inner > .prev {\n    left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n    left: 0;\n}\n\n.carousel-inner > .active.left {\n    left: -100%;\n}\n\n.carousel-inner > .active.right {\n    left: 100%;\n}\n\n.carousel-control {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    width: 15%;\n    font-size: 20px;\n    color: #ffffff;\n    text-align: center;\n    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n    opacity: 0.5;\n    filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n    background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n    right: 0;\n    left: auto;\n    background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n    color: #ffffff;\n    text-decoration: none;\n    outline: none;\n    opacity: 0.9;\n    filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n    left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n    right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n    width: 20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n    content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n    content: '\\203a';\n}\n\n.carousel-indicators {\n    position: absolute;\n    bottom: 10px;\n    left: 50%;\n    z-index: 15;\n    width: 60%;\n    padding-left: 0;\n    margin-left: -30%;\n    text-align: center;\n    list-style: none;\n}\n\n.carousel-indicators li {\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    cursor: pointer;\n    background-color: #000 \\9;\n    background-color: rgba(0, 0, 0, 0);\n    border: 1px solid #ffffff;\n    border-radius: 10px;\n}\n\n.carousel-indicators .active {\n    width: 12px;\n    height: 12px;\n    margin: 0;\n    background-color: #ffffff;\n}\n\n.carousel-caption {\n    position: absolute;\n    right: 15%;\n    bottom: 20px;\n    left: 15%;\n    z-index: 10;\n    padding-top: 20px;\n    padding-bottom: 20px;\n    color: #ffffff;\n    text-align: center;\n    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n    text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n    .carousel-control .glyphicons-chevron-left,\n    .carousel-control .glyphicons-chevron-right,\n    .carousel-control .icon-prev,\n    .carousel-control .icon-next {\n        width: 30px;\n        height: 30px;\n        margin-top: -15px;\n        margin-left: -15px;\n        font-size: 30px;\n    }\n    .carousel-caption {\n        right: 20%;\n        left: 20%;\n        padding-bottom: 30px;\n    }\n    .carousel-indicators {\n        bottom: 20px;\n    }\n}\n\n.clearfix:before,\n.clearfix:after {\n    display: table;\n    content: \" \";\n}\n\n.clearfix:after {\n    clear: both;\n}\n\n.center-block {\n    display: block;\n    margin-right: auto;\n    margin-left: auto;\n}\n\n.pull-right {\n    float: right !important;\n}\n\n.pull-left {\n    float: left !important;\n}\n\n.hide {\n    display: none !important;\n}\n\n.show {\n    display: block !important;\n}\n\n.invisible {\n    visibility: hidden;\n}\n\n.text-hide {\n    font: 0/0 a;\n    color: transparent;\n    text-shadow: none;\n    background-color: transparent;\n    border: 0;\n}\n\n.hidden {\n    display: none !important;\n    visibility: hidden !important;\n}\n\n.affix {\n    position: fixed;\n}\n\n@-ms-viewport {\n    width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n    display: none !important;\n}\n\n@media (max-width: 767px) {\n    .visible-xs {\n        display: block !important;\n    }\n    table.visible-xs {\n        display: table;\n    }\n    tr.visible-xs {\n        display: table-row !important;\n    }\n    th.visible-xs,\n    td.visible-xs {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .visible-xs.visible-sm {\n        display: block !important;\n    }\n    table.visible-xs.visible-sm {\n        display: table;\n    }\n    tr.visible-xs.visible-sm {\n        display: table-row !important;\n    }\n    th.visible-xs.visible-sm,\n    td.visible-xs.visible-sm {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .visible-xs.visible-md {\n        display: block !important;\n    }\n    table.visible-xs.visible-md {\n        display: table;\n    }\n    tr.visible-xs.visible-md {\n        display: table-row !important;\n    }\n    th.visible-xs.visible-md,\n    td.visible-xs.visible-md {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .visible-xs.visible-lg {\n        display: block !important;\n    }\n    table.visible-xs.visible-lg {\n        display: table;\n    }\n    tr.visible-xs.visible-lg {\n        display: table-row !important;\n    }\n    th.visible-xs.visible-lg,\n    td.visible-xs.visible-lg {\n        display: table-cell !important;\n    }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n    display: none !important;\n}\n\n@media (max-width: 767px) {\n    .visible-sm.visible-xs {\n        display: block !important;\n    }\n    table.visible-sm.visible-xs {\n        display: table;\n    }\n    tr.visible-sm.visible-xs {\n        display: table-row !important;\n    }\n    th.visible-sm.visible-xs,\n    td.visible-sm.visible-xs {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .visible-sm {\n        display: block !important;\n    }\n    table.visible-sm {\n        display: table;\n    }\n    tr.visible-sm {\n        display: table-row !important;\n    }\n    th.visible-sm,\n    td.visible-sm {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .visible-sm.visible-md {\n        display: block !important;\n    }\n    table.visible-sm.visible-md {\n        display: table;\n    }\n    tr.visible-sm.visible-md {\n        display: table-row !important;\n    }\n    th.visible-sm.visible-md,\n    td.visible-sm.visible-md {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .visible-sm.visible-lg {\n        display: block !important;\n    }\n    table.visible-sm.visible-lg {\n        display: table;\n    }\n    tr.visible-sm.visible-lg {\n        display: table-row !important;\n    }\n    th.visible-sm.visible-lg,\n    td.visible-sm.visible-lg {\n        display: table-cell !important;\n    }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n    display: none !important;\n}\n\n@media (max-width: 767px) {\n    .visible-md.visible-xs {\n        display: block !important;\n    }\n    table.visible-md.visible-xs {\n        display: table;\n    }\n    tr.visible-md.visible-xs {\n        display: table-row !important;\n    }\n    th.visible-md.visible-xs,\n    td.visible-md.visible-xs {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .visible-md.visible-sm {\n        display: block !important;\n    }\n    table.visible-md.visible-sm {\n        display: table;\n    }\n    tr.visible-md.visible-sm {\n        display: table-row !important;\n    }\n    th.visible-md.visible-sm,\n    td.visible-md.visible-sm {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .visible-md {\n        display: block !important;\n    }\n    table.visible-md {\n        display: table;\n    }\n    tr.visible-md {\n        display: table-row !important;\n    }\n    th.visible-md,\n    td.visible-md {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .visible-md.visible-lg {\n        display: block !important;\n    }\n    table.visible-md.visible-lg {\n        display: table;\n    }\n    tr.visible-md.visible-lg {\n        display: table-row !important;\n    }\n    th.visible-md.visible-lg,\n    td.visible-md.visible-lg {\n        display: table-cell !important;\n    }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n    display: none !important;\n}\n\n@media (max-width: 767px) {\n    .visible-lg.visible-xs {\n        display: block !important;\n    }\n    table.visible-lg.visible-xs {\n        display: table;\n    }\n    tr.visible-lg.visible-xs {\n        display: table-row !important;\n    }\n    th.visible-lg.visible-xs,\n    td.visible-lg.visible-xs {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .visible-lg.visible-sm {\n        display: block !important;\n    }\n    table.visible-lg.visible-sm {\n        display: table;\n    }\n    tr.visible-lg.visible-sm {\n        display: table-row !important;\n    }\n    th.visible-lg.visible-sm,\n    td.visible-lg.visible-sm {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .visible-lg.visible-md {\n        display: block !important;\n    }\n    table.visible-lg.visible-md {\n        display: table;\n    }\n    tr.visible-lg.visible-md {\n        display: table-row !important;\n    }\n    th.visible-lg.visible-md,\n    td.visible-lg.visible-md {\n        display: table-cell !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .visible-lg {\n        display: block !important;\n    }\n    table.visible-lg {\n        display: table;\n    }\n    tr.visible-lg {\n        display: table-row !important;\n    }\n    th.visible-lg,\n    td.visible-lg {\n        display: table-cell !important;\n    }\n}\n\n.hidden-xs {\n    display: block !important;\n}\n\ntable.hidden-xs {\n    display: table;\n}\n\ntr.hidden-xs {\n    display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n    display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n    .hidden-xs,\n    tr.hidden-xs,\n    th.hidden-xs,\n    td.hidden-xs {\n        display: none !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .hidden-xs.hidden-sm,\n    tr.hidden-xs.hidden-sm,\n    th.hidden-xs.hidden-sm,\n    td.hidden-xs.hidden-sm {\n        display: none !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .hidden-xs.hidden-md,\n    tr.hidden-xs.hidden-md,\n    th.hidden-xs.hidden-md,\n    td.hidden-xs.hidden-md {\n        display: none !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .hidden-xs.hidden-lg,\n    tr.hidden-xs.hidden-lg,\n    th.hidden-xs.hidden-lg,\n    td.hidden-xs.hidden-lg {\n        display: none !important;\n    }\n}\n\n.hidden-sm {\n    display: block !important;\n}\n\ntable.hidden-sm {\n    display: table;\n}\n\ntr.hidden-sm {\n    display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n    display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n    .hidden-sm.hidden-xs,\n    tr.hidden-sm.hidden-xs,\n    th.hidden-sm.hidden-xs,\n    td.hidden-sm.hidden-xs {\n        display: none !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .hidden-sm,\n    tr.hidden-sm,\n    th.hidden-sm,\n    td.hidden-sm {\n        display: none !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .hidden-sm.hidden-md,\n    tr.hidden-sm.hidden-md,\n    th.hidden-sm.hidden-md,\n    td.hidden-sm.hidden-md {\n        display: none !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .hidden-sm.hidden-lg,\n    tr.hidden-sm.hidden-lg,\n    th.hidden-sm.hidden-lg,\n    td.hidden-sm.hidden-lg {\n        display: none !important;\n    }\n}\n\n.hidden-md {\n    display: block !important;\n}\n\ntable.hidden-md {\n    display: table;\n}\n\ntr.hidden-md {\n    display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n    display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n    .hidden-md.hidden-xs,\n    tr.hidden-md.hidden-xs,\n    th.hidden-md.hidden-xs,\n    td.hidden-md.hidden-xs {\n        display: none !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .hidden-md.hidden-sm,\n    tr.hidden-md.hidden-sm,\n    th.hidden-md.hidden-sm,\n    td.hidden-md.hidden-sm {\n        display: none !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .hidden-md,\n    tr.hidden-md,\n    th.hidden-md,\n    td.hidden-md {\n        display: none !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .hidden-md.hidden-lg,\n    tr.hidden-md.hidden-lg,\n    th.hidden-md.hidden-lg,\n    td.hidden-md.hidden-lg {\n        display: none !important;\n    }\n}\n\n.hidden-lg {\n    display: block !important;\n}\n\ntable.hidden-lg {\n    display: table;\n}\n\ntr.hidden-lg {\n    display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n    display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n    .hidden-lg.hidden-xs,\n    tr.hidden-lg.hidden-xs,\n    th.hidden-lg.hidden-xs,\n    td.hidden-lg.hidden-xs {\n        display: none !important;\n    }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n    .hidden-lg.hidden-sm,\n    tr.hidden-lg.hidden-sm,\n    th.hidden-lg.hidden-sm,\n    td.hidden-lg.hidden-sm {\n        display: none !important;\n    }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n    .hidden-lg.hidden-md,\n    tr.hidden-lg.hidden-md,\n    th.hidden-lg.hidden-md,\n    td.hidden-lg.hidden-md {\n        display: none !important;\n    }\n}\n\n@media (min-width: 1200px) {\n    .hidden-lg,\n    tr.hidden-lg,\n    th.hidden-lg,\n    td.hidden-lg {\n        display: none !important;\n    }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n    display: none !important;\n}\n\n@media print {\n    .visible-print {\n        display: block !important;\n    }\n    table.visible-print {\n        display: table;\n    }\n    tr.visible-print {\n        display: table-row !important;\n    }\n    th.visible-print,\n    td.visible-print {\n        display: table-cell !important;\n    }\n    .hidden-print,\n    tr.hidden-print,\n    th.hidden-print,\n    td.hidden-print {\n        display: none !important;\n    }\n}"
  },
  {
    "path": "src/main/resources/static/mall/css/common.css",
    "content": "* {\n  margin: 0;\n  padding: 0;\n  text-decoration: none;\n  list-style-type: none;\n  font-family: Microsoft Yahei;\n}\n@media screen and (max-width: 1225px) {\n  body {\n    width: 1226px;\n  }\n}\nimg {\n  border: none;\n  max-width: 100%;\n  max-height: 100%;\n}\na {\n  border: none;\n  text-decoration: none;\n  color: #000;\n}\n.border {\n  border: 1px solid #f00;\n}\n.center {\n  margin: 0 auto;\n}\n.w {\n  width: 1226px;\n  margin: 0 auto;\n}\n.fl {\n  float: left;\n}\n.fr {\n  float: right;\n}\n.clear {\n  clear: both;\n}\n.clearfix::after {\n  content: \"\";\n  height: 0;\n  display: block;\n  clear: both;\n  visibility: hidden;\n}\n.mt20 {\n  margin-top: 20px;\n}\n.mt10 {\n  margin-top: 10px;\n}\n.ml20 {\n  margin-left: 20px;\n}\n.ml40 {\n  margin-left: 40px;\n}\n.mr40 {\n  margin-right: 40px;\n}\n.mb20 {\n  margin-bottom: 20px;\n}\n.border2 {\n  border: 2px solid #ff6700;\n}\n.ft20 {\n  font-size: 20px;\n}\n.ftbc {\n  color: #ff6700;\n  font-weight: bold;\n}\n.pr {\n  padding-right: 40px;\n}\n.h3 {\n  font-size: 22px;\n  font-weight: bold;\n}\n"
  },
  {
    "path": "src/main/resources/static/mall/css/iconfont.css",
    "content": "@font-face {font-family: \"iconfont\";\n  src: url('iconfont.eot?t=1550279452034'); /* IE9 */\n  src: url('iconfont.eot?t=1550279452034#iefix') format('embedded-opentype'), /* IE6-IE8 */\n  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAATAAAsAAAAACggAAARyAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDegqFbIRqATYCJAMkCxQABCAFhG0HgSMbqQhRlO3NMtnPArtlOcTT7Vg4ZHyuFNHGEG8RD/tizj6D59+1z/uSzPxMlggsFSwBWEAQflWRFKt/qoCypCt75n/n8o9BUoaKGHNpoJi+NB2Cn9/s9IwHev4m3IS65uBZYja0P3/gE9NWHdJKktIcybsf734c3L5DZEiD//5QNWNpLDiffYvLHqMDMNyFvQKNvaiiLVCtWhDuYZ7BhJBtb/PPl0MARzk1xE2dPrMCqRjYdgLI1k0cQ2pmwIxQBasOO4ca5CIBVp1SAxfs98sk3WJBEWjYrjPXjxow4JlM0QdjwFKNQXg9G7A4CjTQCmBATncdR9E+0UoCbvcww0KAdCyK0OPzfbHv8COTKXEMOb4I57qZQ0jn+EwdcGaABPba/3iGACSEKlIxcWfSgkciKPD5CCH4IoQE+GIBVNmBdWisHMEIApMOwcBkSgMBAJE+JBsgBfgMkg9TTbVLNArhWd1RVJxZpKTtLHq/3ifBnH4HHyR7TZ5MpDgYE9T1pZKMbvf9RPM5MnlmIkcSm10f/eBQklpt64tf/A//0E/aZfei/w85dCd7oOvM61PkdCPPPAYiLwPe6h3GZtozN0IB1zXv91pxBj+RlCtML/vacj43Bh9YLeYn+AsqJSNh5vsjsWDLQARzg7GIv1ic4QmQcmOkFKYwGuWaUeYbXCJTR6lwimSASDH5fMV3Js8OOgM7LH0xLDhVO9bPp8QIf/Fn1Le76HnIO1Cdo4rUj3r338NTd7CSg3ylXdG9lH9/by7R3D/Mbc2xYi/Ap4CuLy3JpK3a6ppovVmXv+l7FLRy4ZZIy92uE11W+W/yzrZS80I14wfTRnarrerJyeo9s3p3cipoTZA/BkP7AT5U36p5B3hfc6v6A+BjtdYnzfeXRzfvjryYYPFvmndvZtYnE+Oci/eKnci6nGj2+vz81cLVfLtKNGcdvBxfFGcFPrjeNJni7XVAOvI1mBjz8B+ZD1cHAeKX+o0eBOKP+pkWAD1LvQGoSZ1vN9TNKhcA9U1bhH33GwII3L206raC7flnUwwAX88dLUH++KXh+oI/ixKw8F8lBE4zezEzRmY7vNwKASKmksB3tBwOB/yfPNn8XVeVBy4FwZIXQZGgDDSWWqwhtkJACr0QYhkARwvjR6eQgyIBMRHQzAMCIZNXUKTzAjSZfGINMQoB+fxDSKZocMyXglOmUC+b3PBuijU1UOQEmUR6TJh1uitfojx0sErFlr5GVWCGUWNdQ5kepx5V19gjOORNWjPElHTRGLoadRyJfCUtSnSd0Nrvqq9nvQ+qI9KFdKagoGA0FANEhBMQJgSJB9OTNenV1y9B4YQ4YNRI3x3nGhRFgLlyRCN1NACw4woP1PdZ1g44hNOERsPoVgyFxAUxhm0UhyckCL+/kQWFoKlDnBHz6aKezMagirr7q9zXeg7gYLeKRIkWI4GEkhArkTjMmlVKpwTr9FmIaEzete/YxDLXMrGnZbif6DyuZuYXukDgWfPGZ2k8Y8KJDGn8NJQAAA==') format('woff2'),\n  url('iconfont.woff?t=1550279452034') format('woff'),\n  url('iconfont.ttf?t=1550279452034') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */\n  url('iconfont.svg?t=1550279452034#iconfont') format('svg'); /* iOS 4.1- */\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-cart:before {\n  content: \"\\e6af\";\n}\n\n.icon-search1:before {\n  content: \"\\e600\";\n}\n\n.icon-cancel:before {\n  content: \"\\e62f\";\n}\n\n.icon-up:before {\n  content: \"\\eb0b\";\n}\n\n.icon-down:before {\n  content: \"\\e616\";\n}\n\n.icon-right:before {\n  content: \"\\e619\";\n}\n\n.icon-left:before {\n  content: \"\\e61a\";\n}\n\n"
  },
  {
    "path": "src/main/resources/static/mall/js/bootstrap3.js",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\nif(\"undefined\"==typeof jQuery)throw new Error(\"Bootstrap requires jQuery\");+function(a){\"use strict\";function b(){var a=document.createElement(\"bootstrap\"),b={WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"transitionend\",OTransition:\"oTransitionEnd otransitionend\",transition:\"transitionend\"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){\"use strict\";var b='[data-dismiss=\"alert\"]',c=function(c){a(c).on(\"click\",b,this.close)};c.prototype.close=function(b){function c(){f.trigger(\"closed.bs.alert\").remove()}var d=a(this),e=d.attr(\"data-target\");e||(e=d.attr(\"href\"),e=e&&e.replace(/.*(?=#[^\\s]*$)/,\"\"));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass(\"alert\")?d:d.parent()),f.trigger(b=a.Event(\"close.bs.alert\")),b.isDefaultPrevented()||(f.removeClass(\"in\"),a.support.transition&&f.hasClass(\"fade\")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data(\"bs.alert\");e||d.data(\"bs.alert\",e=new c(this)),\"string\"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on(\"click.bs.alert.data-api\",b,c.prototype.close)}(jQuery),+function(a){\"use strict\";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:\"loading...\"},b.prototype.setState=function(a){var b=\"disabled\",c=this.$element,d=c.is(\"input\")?\"val\":\"html\",e=c.data();a+=\"Text\",e.resetText||c.data(\"resetText\",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){\"loadingText\"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle=\"buttons\"]'),b=!0;if(a.length){var c=this.$element.find(\"input\");\"radio\"===c.prop(\"type\")&&(c.prop(\"checked\")&&this.$element.hasClass(\"active\")?b=!1:a.find(\".active\").removeClass(\"active\")),b&&c.prop(\"checked\",!this.$element.hasClass(\"active\")).trigger(\"change\")}b&&this.$element.toggleClass(\"active\")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.button\"),f=\"object\"==typeof c&&c;e||d.data(\"bs.button\",e=new b(this,f)),\"toggle\"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on(\"click.bs.button.data-api\",\"[data-toggle^=button]\",function(b){var c=a(b.target);c.hasClass(\"btn\")||(c=c.closest(\".btn\")),c.button(\"toggle\"),b.preventDefault()})}(jQuery),+function(a){\"use strict\";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(\".carousel-indicators\"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,\"hover\"==this.options.pause&&this.$element.on(\"mouseenter\",a.proxy(this.pause,this)).on(\"mouseleave\",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:\"hover\",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(\".item.active\"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one(\"slid.bs.carousel\",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?\"next\":\"prev\",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(\".next, .prev\").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide(\"next\")},b.prototype.prev=function(){return this.sliding?void 0:this.slide(\"prev\")},b.prototype.slide=function(b,c){var d=this.$element.find(\".item.active\"),e=c||d[b](),f=this.interval,g=\"next\"==b?\"left\":\"right\",h=\"next\"==b?\"first\":\"last\",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(\".item\")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event(\"slide.bs.carousel\",{relatedTarget:e[0],direction:g});if(!e.hasClass(\"active\")){if(this.$indicators.length&&(this.$indicators.find(\".active\").removeClass(\"active\"),this.$element.one(\"slid.bs.carousel\",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass(\"active\")})),a.support.transition&&this.$element.hasClass(\"slide\")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(\" \")).addClass(\"active\"),d.removeClass([\"active\",g].join(\" \")),i.sliding=!1,setTimeout(function(){i.$element.trigger(\"slid.bs.carousel\")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass(\"active\"),e.addClass(\"active\"),this.sliding=!1,this.$element.trigger(\"slid.bs.carousel\")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.carousel\"),f=a.extend({},b.DEFAULTS,d.data(),\"object\"==typeof c&&c),g=\"string\"==typeof c?c:f.slide;e||d.data(\"bs.carousel\",e=new b(this,f)),\"number\"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on(\"click.bs.carousel.data-api\",\"[data-slide], [data-slide-to]\",function(b){var c,d=a(this),e=a(d.attr(\"data-target\")||(c=d.attr(\"href\"))&&c.replace(/.*(?=#[^\\s]+$)/,\"\")),f=a.extend({},e.data(),d.data()),g=d.attr(\"data-slide-to\");g&&(f.interval=!1),e.carousel(f),(g=d.attr(\"data-slide-to\"))&&e.data(\"bs.carousel\").to(g),b.preventDefault()}),a(window).on(\"load\",function(){a('[data-ride=\"carousel\"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){\"use strict\";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass(\"width\");return a?\"width\":\"height\"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass(\"in\")){var b=a.Event(\"show.bs.collapse\");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find(\"> .panel > .in\");if(c&&c.length){var d=c.data(\"bs.collapse\");if(d&&d.transitioning)return;c.collapse(\"hide\"),d||c.data(\"bs.collapse\",null)}var e=this.dimension();this.$element.removeClass(\"collapse\").addClass(\"collapsing\")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass(\"collapsing\").addClass(\"in\")[e](\"auto\"),this.transitioning=0,this.$element.trigger(\"shown.bs.collapse\")};if(!a.support.transition)return f.call(this);var g=a.camelCase([\"scroll\",e].join(\"-\"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass(\"in\")){var b=a.Event(\"hide.bs.collapse\");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass(\"collapsing\").removeClass(\"collapse\").removeClass(\"in\"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger(\"hidden.bs.collapse\").removeClass(\"collapsing\").addClass(\"collapse\")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass(\"in\")?\"hide\":\"show\"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.collapse\"),f=a.extend({},b.DEFAULTS,d.data(),\"object\"==typeof c&&c);e||d.data(\"bs.collapse\",e=new b(this,f)),\"string\"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on(\"click.bs.collapse.data-api\",\"[data-toggle=collapse]\",function(b){var c,d=a(this),e=d.attr(\"data-target\")||b.preventDefault()||(c=d.attr(\"href\"))&&c.replace(/.*(?=#[^\\s]+$)/,\"\"),f=a(e),g=f.data(\"bs.collapse\"),h=g?\"toggle\":d.data(),i=d.attr(\"data-parent\"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent=\"'+i+'\"]').not(d).addClass(\"collapsed\"),d[f.hasClass(\"in\")?\"addClass\":\"removeClass\"](\"collapsed\")),f.collapse(h)})}(jQuery),+function(a){\"use strict\";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass(\"open\")&&(d.trigger(b=a.Event(\"hide.bs.dropdown\")),b.isDefaultPrevented()||d.removeClass(\"open\").trigger(\"hidden.bs.dropdown\"))})}function c(b){var c=b.attr(\"data-target\");c||(c=b.attr(\"href\"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\\s]*$)/,\"\"));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=\".dropdown-backdrop\",e=\"[data-toggle=dropdown]\",f=function(b){a(b).on(\"click.bs.dropdown\",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(\".disabled, :disabled\")){var f=c(e),g=f.hasClass(\"open\");if(b(),!g){if(\"ontouchstart\"in document.documentElement&&!f.closest(\".navbar-nav\").length&&a('<div class=\"dropdown-backdrop\"/>').insertAfter(a(this)).on(\"click\",b),f.trigger(d=a.Event(\"show.bs.dropdown\")),d.isDefaultPrevented())return;f.toggleClass(\"open\").trigger(\"shown.bs.dropdown\"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(\".disabled, :disabled\")){var f=c(d),g=f.hasClass(\"open\");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a(\"[role=menu] li:not(.divider):visible a\",f);if(h.length){var i=h.index(h.filter(\":focus\"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data(\"bs.dropdown\");d||c.data(\"bs.dropdown\",d=new f(this)),\"string\"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on(\"click.bs.dropdown.data-api\",b).on(\"click.bs.dropdown.data-api\",\".dropdown form\",function(a){a.stopPropagation()}).on(\"click.bs.dropdown.data-api\",e,f.prototype.toggle).on(\"keydown.bs.dropdown.data-api\",e+\", [role=menu]\",f.prototype.keydown)}(jQuery),+function(a){\"use strict\";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?\"hide\":\"show\"](a)},b.prototype.show=function(b){var c=this,d=a.Event(\"show.bs.modal\",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on(\"click.dismiss.modal\",'[data-dismiss=\"modal\"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass(\"fade\");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass(\"in\").attr(\"aria-hidden\",!1),c.enforceFocus();var e=a.Event(\"shown.bs.modal\",{relatedTarget:b});d?c.$element.find(\".modal-dialog\").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event(\"hide.bs.modal\"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off(\"focusin.bs.modal\"),this.$element.removeClass(\"in\").attr(\"aria-hidden\",!0).off(\"click.dismiss.modal\"),a.support.transition&&this.$element.hasClass(\"fade\")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off(\"focusin.bs.modal\").on(\"focusin.bs.modal\",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on(\"keyup.dismiss.bs.modal\",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off(\"keyup.dismiss.bs.modal\")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger(\"hidden.bs.modal\")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass(\"fade\")?\"fade\":\"\";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class=\"modal-backdrop '+c+'\" />').appendTo(document.body),this.$element.on(\"click.dismiss.modal\",a.proxy(function(a){a.target===a.currentTarget&&(\"static\"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass(\"in\"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass(\"in\"),a.support.transition&&this.$element.hasClass(\"fade\")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data(\"bs.modal\"),g=a.extend({},b.DEFAULTS,e.data(),\"object\"==typeof c&&c);f||e.data(\"bs.modal\",f=new b(this,g)),\"string\"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on(\"click.bs.modal.data-api\",'[data-toggle=\"modal\"]',function(b){var c=a(this),d=c.attr(\"href\"),e=a(c.attr(\"data-target\")||d&&d.replace(/.*(?=#[^\\s]+$)/,\"\")),f=e.data(\"modal\")?\"toggle\":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one(\"hide\",function(){c.is(\":visible\")&&c.focus()})}),a(document).on(\"show.bs.modal\",\".modal\",function(){a(document.body).addClass(\"modal-open\")}).on(\"hidden.bs.modal\",\".modal\",function(){a(document.body).removeClass(\"modal-open\")})}(jQuery),+function(a){\"use strict\";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init(\"tooltip\",a,b)};b.DEFAULTS={animation:!0,placement:\"top\",selector:!1,template:'<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(\" \"),f=e.length;f--;){var g=e[f];if(\"click\"==g)this.$element.on(\"click.\"+this.type,this.options.selector,a.proxy(this.toggle,this));else if(\"manual\"!=g){var h=\"hover\"==g?\"mouseenter\":\"focus\",i=\"hover\"==g?\"mouseleave\":\"blur\";this.$element.on(h+\".\"+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+\".\"+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:\"manual\",selector:\"\"}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&\"number\"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data(\"bs.\"+this.type);return clearTimeout(c.timeout),c.hoverState=\"in\",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){\"in\"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data(\"bs.\"+this.type);return clearTimeout(c.timeout),c.hoverState=\"out\",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){\"out\"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event(\"show.bs.\"+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass(\"fade\");var d=\"function\"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\\s?auto?\\s?/i,f=e.test(d);f&&(d=d.replace(e,\"\")||\"top\"),c.detach().css({top:0,left:0,display:\"block\"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m=\"body\"==this.options.container?window.innerWidth:j.outerWidth(),n=\"body\"==this.options.container?window.innerHeight:j.outerHeight(),o=\"body\"==this.options.container?0:j.offset().left;d=\"bottom\"==d&&g.top+g.height+i-l>n?\"top\":\"top\"==d&&g.top-l-i<0?\"bottom\":\"right\"==d&&g.right+h>m?\"left\":\"left\"==d&&g.left-h<o?\"right\":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger(\"shown.bs.\"+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css(\"margin-top\"),10),h=parseInt(d.css(\"margin-left\"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass(\"in\");var i=d[0].offsetWidth,j=d[0].offsetHeight;if(\"top\"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,\"left\")}else this.replaceArrow(j-f,j,\"top\");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+\"%\":\"\")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(\".tooltip-inner\")[this.options.html?\"html\":\"text\"](b),a.removeClass(\"fade in top bottom left right\")},b.prototype.hide=function(){function b(){\"in\"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event(\"hide.bs.\"+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass(\"in\"),a.support.transition&&this.$tip.hasClass(\"fade\")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger(\"hidden.bs.\"+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr(\"title\")||\"string\"!=typeof a.attr(\"data-original-title\"))&&a.attr(\"data-original-title\",a.attr(\"title\")||\"\").attr(\"title\",\"\")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},\"function\"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return\"bottom\"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:\"top\"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:\"left\"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr(\"data-original-title\")||(\"function\"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".tooltip-arrow\")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data(\"bs.\"+this.type):this;c.tip().hasClass(\"in\")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off(\".\"+this.type).removeData(\"bs.\"+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.tooltip\"),f=\"object\"==typeof c&&c;e||d.data(\"bs.tooltip\",e=new b(this,f)),\"string\"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){\"use strict\";var b=function(a,b){this.init(\"popover\",a,b)};if(!a.fn.tooltip)throw new Error(\"Popover requires tooltip.js\");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(\".popover-title\")[this.options.html?\"html\":\"text\"](b),a.find(\".popover-content\")[this.options.html?\"html\":\"text\"](c),a.removeClass(\"fade top bottom left right in\"),a.find(\".popover-title\").html()||a.find(\".popover-title\").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr(\"data-content\")||(\"function\"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".arrow\")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.popover\"),f=\"object\"==typeof c&&c;e||d.data(\"bs.popover\",e=new b(this,f)),\"string\"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){\"use strict\";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is(\"body\")?a(window):a(c),this.$body=a(\"body\"),this.$scrollElement=this.$element.on(\"scroll.bs.scroll-spy.data-api\",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr(\"href\"))&&e.replace(/.*(?=#[^\\s]+$)/,\"\")||\"\")+\" .nav li > a\",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?\"offset\":\"position\";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data(\"target\")||d.attr(\"href\"),f=/^#\\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(\".active\").removeClass(\"active\");var c=this.selector+'[data-target=\"'+b+'\"],'+this.selector+'[href=\"'+b+'\"]',d=a(c).parents(\"li\").addClass(\"active\");d.parent(\".dropdown-menu\").length&&(d=d.closest(\"li.dropdown\").addClass(\"active\")),d.trigger(\"activate.bs.scrollspy\")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.scrollspy\"),f=\"object\"==typeof c&&c;e||d.data(\"bs.scrollspy\",e=new b(this,f)),\"string\"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on(\"load\",function(){a('[data-spy=\"scroll\"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){\"use strict\";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest(\"ul:not(.dropdown-menu)\"),d=b.data(\"target\");if(d||(d=b.attr(\"href\"),d=d&&d.replace(/.*(?=#[^\\s]*$)/,\"\")),!b.parent(\"li\").hasClass(\"active\")){var e=c.find(\".active:last a\")[0],f=a.Event(\"show.bs.tab\",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent(\"li\"),c),this.activate(g,g.parent(),function(){b.trigger({type:\"shown.bs.tab\",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass(\"active\").find(\"> .dropdown-menu > .active\").removeClass(\"active\"),b.addClass(\"active\"),g?(b[0].offsetWidth,b.addClass(\"in\")):b.removeClass(\"fade\"),b.parent(\".dropdown-menu\")&&b.closest(\"li.dropdown\").addClass(\"active\"),d&&d()}var f=c.find(\"> .active\"),g=d&&a.support.transition&&f.hasClass(\"fade\");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass(\"in\")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.tab\");e||d.data(\"bs.tab\",e=new b(this)),\"string\"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on(\"click.bs.tab.data-api\",'[data-toggle=\"tab\"], [data-toggle=\"pill\"]',function(b){b.preventDefault(),a(this).tab(\"show\")})}(jQuery),+function(a){\"use strict\";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on(\"scroll.bs.affix.data-api\",a.proxy(this.checkPosition,this)).on(\"click.bs.affix.data-api\",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET=\"affix affix-top affix-bottom\",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(\":visible\")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;\"object\"!=typeof f&&(h=g=f),\"function\"==typeof g&&(g=f.top()),\"function\"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?\"bottom\":null!=g&&g>=d?\"top\":!1;this.affixed!==i&&(this.unpin&&this.$element.css(\"top\",\"\"),this.affixed=i,this.unpin=\"bottom\"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass(\"affix\"+(i?\"-\"+i:\"\")),\"bottom\"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data(\"bs.affix\"),f=\"object\"==typeof c&&c;e||d.data(\"bs.affix\",e=new b(this,f)),\"string\"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on(\"load\",function(){a('[data-spy=\"affix\"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);"
  },
  {
    "path": "src/main/resources/static/mall/js/detail.js",
    "content": "var newbeeSwiper = new Swiper('.swiper-container', {\n    //设置自动播放\n    autoplay: {\n        delay: 3000,\n        disableOnInteraction: false\n    },\n    //设置无限循环播放\n    loop: true,\n    //设置圆点指示器\n    pagination: {\n        el: '.swiper-pagination',\n    },\n    //设置上下页按钮\n    navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n    }\n})"
  },
  {
    "path": "src/main/resources/static/mall/js/index.js",
    "content": "var newbeeSwiper = new Swiper('.swiper-container', {\n    //设置自动播放\n    autoplay: {\n        delay: 2000,\n        disableOnInteraction: false\n    },\n    //设置无限循环播放\n    loop: true,\n    //设置圆点指示器\n    pagination: {\n        el: '.swiper-pagination',\n    },\n    //设置上下页按钮\n    navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n    }\n})\n\n$('.all-sort-list > .item').hover(function () {\n    var eq = $('.all-sort-list > .item').index(this),\t\t\t\t//获取当前滑过是第几个元素\n        h = $('.all-sort-list').offset().top,\t\t\t\t\t\t//获取当前下拉菜单距离窗口多少像素\n        s = $(window).scrollTop(),\t\t\t\t\t\t\t\t\t//获取游览器滚动了多少高度\n        i = $(this).offset().top,\t\t\t\t\t\t\t\t\t//当前元素滑过距离窗口多少像素\n        item = $(this).children('.item-list').height(),\t\t\t\t//下拉菜单子类内容容器的高度\n        sort = $('.all-sort-list').height();\t\t\t\t\t\t//父类分类列表容器的高度\n\n    if (item < sort) {\t\t\t\t\t\t\t\t\t\t\t\t//如果子类的高度小于父类的高度\n        if (eq == 0) {\n            $(this).children('.item-list').css('top', (i - h));\n        } else {\n            $(this).children('.item-list').css('top', (i - h) + 1);\n        }\n    } else {\n        if (s > h) {\t\t\t\t\t\t\t\t\t\t\t\t//判断子类的显示位置，如果滚动的高度大于所有分类列表容器的高度\n            if (i - s > 0) {\t\t\t\t\t\t\t\t\t\t\t//则 继续判断当前滑过容器的位置 是否有一半超出窗口一半在窗口内显示的Bug,\n                $(this).children('.item-list').css('top', (s - h) + 2);\n            } else {\n                $(this).children('.item-list').css('top', (s - h) - (-(i - s)) + 2);\n            }\n        } else {\n            $(this).children('.item-list').css('top', 3);\n        }\n    }\n\n    $(this).addClass('hover');\n    $(this).children('.item-list').css('display', 'block');\n}, function () {\n    $(this).removeClass('hover');\n    $(this).children('.item-list').css('display', 'none');\n});"
  },
  {
    "path": "src/main/resources/static/mall/js/jquery-1.8.0.js",
    "content": "/*!\n * jQuery JavaScript Library v1.8.0\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: Thu Aug 09 2012 16:24:48 GMT-0400 (Eastern Daylight Time)\n */\n(function( window, undefined ) {\nvar\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\tlocation = window.location,\n\tnavigator = window.navigator,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// Save a reference to some core methods\n\tcore_push = Array.prototype.push,\n\tcore_slice = Array.prototype.slice,\n\tcore_indexOf = Array.prototype.indexOf,\n\tcore_toString = Object.prototype.toString,\n\tcore_hasOwn = Object.prototype.hasOwnProperty,\n\tcore_trim = String.prototype.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source,\n\n\t// Used for detecting and trimming whitespace\n\tcore_rnotwhite = /\\S/,\n\tcore_rspace = /\\s+/,\n\n\t// IE doesn't match non-breaking spaces with \\s\n\trtrim = core_rnotwhite.test(\"\\xA0\") ? (/^[\\s\\xA0]+|[\\s\\xA0]+$/g) : /^\\s+|\\s+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\trquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn ( letter + \"\" ).toUpperCase();\n\t},\n\n\t// The ready event handler and self cleanup method\n\tDOMContentLoaded = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\t\tjQuery.ready();\n\t\t} else if ( document.readyState === \"complete\" ) {\n\t\t\t// we're here because readyState === \"complete\" in oldIE\n\t\t\t// which is good enough for us to call the dom ready!\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = ( context && context.nodeType ? context.ownerDocument || context : document );\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tselector = jQuery.parseHTML( match[1], doc, true );\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tthis.attr.call( selector, context, true );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.8.0\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\ti = +i;\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ),\n\t\t\t\"slice\", core_slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// scripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, scripts ) {\n\t\tvar parsed;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tscripts = context;\n\t\t\tcontext = 0;\n\t\t}\n\t\tcontext = context || document;\n\n\t\t// Single tag\n\t\tif ( (parsed = rsingleTag.exec( data )) ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );\n\t\treturn jQuery.merge( [],\n\t\t\t(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( !data || typeof data !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn ( new Function( \"return \" + data ) )();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && core_rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar name,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in obj ) {\n\t\t\t\t\tif ( callback.apply( obj[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( obj[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in obj ) {\n\t\t\t\t\tif ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar type,\n\t\t\tret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\ttype = jQuery.type( arr );\n\n\t\t\tif ( arr.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( arr ) ) {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\n\t\tvar exec,\n\t\t\tbulk = key == null,\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\n\t\t// Sets many values\n\t\tif ( key && typeof key === \"object\" ) {\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\n\t\t\t}\n\t\t\tchainable = 1;\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations only iterate when executing function values\n\t\t\t\tif ( exec ) {\n\t\t\t\t\texec = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\n\t\t\t\t// Otherwise they run against the entire set\n\t\t\t\t} else {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor (; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchainable = 1;\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" || ( document.readyState !== \"loading\" && document.addEventListener ) ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready, 1 );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.split( core_rspace ), function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) && ( !options.unique || !self.has( arg ) ) ) {\n\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t} else if ( arg && arg.length ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\treturn jQuery.inArray( fn, list ) > -1;\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\targs = args || [];\n\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ]( jQuery.isFunction( fn ) ?\n\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\tvar returned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} :\n\t\t\t\t\t\t\t\tnewDefer[ action ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn typeof obj === \"object\" ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ] = list.fire\n\t\t\tdeferred[ tuple[0] ] = list.fire;\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function() {\n\n\tvar support,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tfragment,\n\t\teventName,\n\t\ti,\n\t\tisSupported,\n\t\tclickFn,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Preliminary tests\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form(#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: ( document.compatMode === \"CSS1Compat\" ),\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", clickFn = function() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent(\"onclick\");\n\t\tdiv.detachEvent( \"onclick\", clickFn );\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute( \"checked\", \"checked\" );\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.lastChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild( input );\n\tfragment.appendChild( div );\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor ( i in {\n\t\t\tsubmit: true,\n\t\t\tchange: true,\n\t\t\tfocusin: true\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, div, tds, marginDiv,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;overflow:hidden;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px\";\n\t\tbody.insertBefore( container, body.firstChild );\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild( div );\n\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\t// (only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\t\tsupport.boxSizing = ( div.offsetWidth === 4 );\n\t\tsupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );\n\n\t\t// NOTE: To any future maintainer, window.getComputedStyle was used here\n\t\t// instead of getComputedStyle because it gave a better gzip size.\n\t\t// The difference between window.getComputedStyle and getComputedStyle is\n\t\t// 7 bytes\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. For more\n\t\t\t// info see bug #3333\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = document.createElement(\"div\");\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\t\t\tdiv.appendChild( marginDiv );\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\t// Null elements to avoid leaks in IE\n\t\tbody.removeChild( container );\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tfragment.removeChild( div );\n\tall = a = select = opt = input = fragment = div = null;\n\n\treturn support;\n})();\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\tdeletedIds: [],\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, ret,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tgetByName = typeof name === \"string\",\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = internalKey;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t\t// is serialized using JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t\t} else {\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t\t}\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data.\n\t\tif ( !pvt ) {\n\t\t\tif ( !thisCache.data ) {\n\t\t\t\tthisCache.data = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache.data;\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// Check for both converted-to-camel and non-converted data property names\n\t\t// If a data property was specified\n\t\tif ( getByName ) {\n\n\t\t\t// First Try to find as-is property data\n\t\t\tret = thisCache[ name ];\n\n\t\t\t// Test for null|undefined property data\n\t\t\tif ( ret == null ) {\n\n\t\t\t\t// Try to find the camelCased property\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t\t}\n\t\t} else {\n\t\t\tret = thisCache;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, i, l,\n\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\t\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\t\tif ( thisCache ) {\n\n\t\t\t\t// Support array or space separated string names for data keys\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t\t}\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( !pvt ) {\n\t\t\tdelete cache[ id ].data;\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Destroy the cache\n\t\tif ( isNode ) {\n\t\t\tjQuery.cleanData( [ elem ], true );\n\n\t\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t\tdelete cache[ id ];\n\n\t\t// When all else fails, null\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar parts, part, attr, name, l,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattr = elem.attributes;\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tparts = key.split( \".\", 2 );\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\t\tpart = parts[1] + \"!\";\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\n\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\tif ( data === undefined && elem ) {\n\t\t\t\t\tdata = jQuery.data( elem, key );\n\t\t\t\t\tdata = dataAttr( elem, key, data );\n\t\t\t\t}\n\n\t\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\t\tdata;\n\t\t\t}\n\n\t\t\tparts[1] = value;\n\t\t\tthis.each(function() {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, false );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\t\tif ( !queue.length && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery.removeData( elem, type + \"queue\", true );\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\tif ( (tmp = jQuery._data( elements[ i ], type + \"queueHooks\" )) && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook, fixSpecified,\n\trclass = /[\\t\\r\\n]/g,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea|)$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classNames, i, l, elem,\n\t\t\tsetClass, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tclassNames = value.split( core_rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\n\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar removes, className, elem, c, cl, i, l;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tremoves = ( value || \"\" ).split( core_rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\n\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n\n\t\t\t\t\t// loop over each item in the removal list\n\t\t\t\t\tfor ( c = 0, cl = removes.length; c < cl; c++ ) {\n\t\t\t\t\t\t// Remove until there is nothing to remove,\n\t\t\t\t\t\twhile ( className.indexOf(\" \" + removes[ c ] + \" \") > -1 ) {\n\t\t\t\t\t\t\tclassName = className.replace( \" \" + removes[ c ] + \" \" , \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( className ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( core_rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val,\n\t\t\t\tself = jQuery(this);\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, i, max, option,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\ti = one ? index : 0;\n\t\t\t\tmax = one ? index + 1 : options.length;\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\t// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9\n\tattrFn: {},\n\n\tattr: function( elem, name, value, pass ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar propName, attrNames, name, isBool,\n\t\t\ti = 0;\n\n\t\tif ( value && elem.nodeType === 1 ) {\n\n\t\t\tattrNames = value.split( core_rspace );\n\n\t\t\tfor ( ; i < attrNames.length; i++ ) {\n\t\t\t\tname = attrNames[ i ];\n\n\t\t\t\tif ( name ) {\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\t\t\tisBool = rboolean.test( name );\n\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\n\t\t\t\t\tif ( !isBool ) {\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t\t}\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\tif ( isBool && propName in elem ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Use the value property for back compat\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\n\t\tvalue: {\n\t\t\tget: function( elem, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.get( elem, name );\n\t\t\t\t}\n\t\t\t\treturn name in elem ?\n\t\t\t\t\telem.value :\n\t\t\t\t\tnull;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\n\t\t\t\t}\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.value = value;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\t// Fall back to attribute presence where some booleans are not supported\n\t\tvar attrNode,\n\t\t\tproperty = jQuery.prop( elem, name );\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = true;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\tfixSpecified = {\n\t\tname: true,\n\t\tid: true,\n\t\tcoords: true\n\t};\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.value !== \"\" : ret.specified ) ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\tret = document.createAttribute( name );\n\t\t\t\telem.setAttributeNode( ret );\n\t\t\t}\n\t\t\treturn ( ret.value = value + \"\" );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = \"false\";\n\t\t\t}\n\t\t\tnodeHook.set( elem, value, name );\n\t\t}\n\t};\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = \"\" + value );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t});\n});\nvar rformElems = /^(?:textarea|input|select)$/i,\n\trtypenamespace = /^([^\\.]*|)(?:\\.(.+)|)$/,\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+|)\\b/,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\thoverHack = function( events ) {\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n\t};\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar elemData, eventHandle, events,\n\t\t\tt, tns, type, namespaces, handleObj,\n\t\t\thandleObjIn, handlers, special;\n\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tevents = elemData.events;\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\t\teventHandle = elemData.handle;\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: tns[1],\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\thandlers = events[ type ];\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar t, tns, type, origType, namespaces, origCount,\n\t\t\tj, events, special, eventType, handleObj,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tns[1];\n\t\t\tnamespaces = tns[2];\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\n\t\t\teventType = events[ type ] || [];\n\t\t\torigCount = eventType.length;\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\n\t\t\t// Remove matching events\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t ( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\teventType.splice( j--, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\teventType.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery.removeData( elem, \"events\", true );\n\t\t}\n\t},\n\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Event object or event type\n\t\tvar cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,\n\t\t\ttype = event.type || event,\n\t\t\tnamespaces = [];\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.isTrigger = true;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tcache = jQuery.cache;\n\t\t\tfor ( i in cache ) {\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\teventPath = [[ elem, special.bindType || type ]];\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\n\t\t\tfor ( old = elem; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push([ cur, bubbleType ]);\n\t\t\t\told = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( old === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\n\n\t\t\tcur = eventPath[i][0];\n\t\t\tevent.type = eventPath[i][1];\n\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event || window.event );\n\n\t\tvar i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related,\n\t\t\thandlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\targs = [].slice.call( arguments ),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\n\t\t\thandlerQueue = [];\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers that should run if there are delegated events\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\n\n\t\t\t// Pregenerate a single jQuery object for reuse with .is()\n\t\t\tjqcur = jQuery(this);\n\t\t\tjqcur.context = this;\n\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #xxxx)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tselMatch = {};\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tjqcur[0] = cur;\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\t\t\t\t\t\tsel = handleObj.selector;\n\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\n\t\t\t\t\t\t\tselMatch[ sel ] = jqcur.is( sel );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( selMatch[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( handlers.length > delegateCount ) {\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n\t\t\tmatched = handlerQueue[ i ];\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\n\t\t\t\thandleObj = matched.matches[ j ];\n\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.data = handleObj.data;\n\t\t\t\t\tevent.handleObj = handleObj;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tevent.result = ret;\n\t\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( i = copy.length; i; ) {\n\t\t\tprop = copy[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Target should not be a text node (#504, Safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady\n\t\t},\n\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\n\t\tfocus: {\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\n// The 1.7 special event interface should provide all the hooks needed now.\njQuery.event.handle = jQuery.event.dispatch;\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8 –\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === \"undefined\" ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj,\n\t\t\t\tselector = handleObj.selector;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"_submit_attached\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"_submit_attached\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"_change_attached\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"_change_attached\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tlive: function( types, data, fn ) {\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\n\t\treturn this;\n\t},\n\tdie: function( types, fn ) {\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2012 jQuery Foundation and other contributors\n *  Released under the MIT license\n *  http://sizzlejs.com/\n */\n(function( window, undefined ) {\n\nvar cachedruns,\n\tdirruns,\n\tsortOrder,\n\tsiblingCheck,\n\tassertGetIdNotName,\n\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\tstrundefined = \"undefined\",\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\tdone = 0,\n\tslice = [].slice,\n\tpush = [].push,\n\n\texpando = ( \"sizcache\" + Math.random() ).replace( \".\", \"\" ),\n\n\t// Regex\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[-\\\\w]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\2|((?:[^,]|\\\\\\\\,|(?:,(?=[^\\\\[]*\\\\]))|(?:,(?=[^\\\\(]*\\\\))))*))\\\\)|)\",\n\tpos = \":(nth|eq|gt|lt|first|last|even|odd)(?:\\\\((\\\\d*)\\\\)|)(?=[^-]|$)\",\n\tcombinators = whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\",\n\tgroups = \"(?=[^\\\\x20\\\\t\\\\r\\\\n\\\\f])(?:\\\\\\\\.|\" + attributes + \"|\" + pseudos.replace( 2, 7 ) + \"|[^\\\\\\\\(),])+\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcombinators = new RegExp( \"^\" + combinators ),\n\n\t// All simple (non-comma) selectors, excluding insignifant trailing whitespace\n\trgroups = new RegExp( groups + \"?(?=\" + whitespace + \"*,|$)\", \"g\" ),\n\n\t// A selector, or everything after leading whitespace\n\t// Optionally followed in either case by a \")\" for terminating sub-selectors\n\trselector = new RegExp( \"^(?:(?!,)(?:(?:^|,)\" + whitespace + \"*\" + groups + \")*?|\" + whitespace + \"*(.*?))(\\\\)|$)\" ),\n\n\t// All combinators and selector components (attribute test, tag, pseudo, etc.), the latter appearing together when consecutive\n\trtokens = new RegExp( groups.slice( 19, -6 ) + \"\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])+|\" + combinators, \"g\" ),\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w\\-]+)|(\\w+)|\\.([\\w\\-]+))$/,\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\trendsWithNot = /:not\\($/,\n\n\trheader = /h\\d/i,\n\trinputs = /input|select|textarea|button/i,\n\n\trbackslash = /\\\\(?!\\\\)/g,\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"[-\", \"[-\\\\*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|nth|last|first)-child(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"POS\": new RegExp( pos, \"ig\" ),\n\t\t// For use in libraries implementing .is()\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|\" + pos, \"i\" )\n\t},\n\n\tclassCache = {},\n\tcachedClasses = [],\n\tcompilerCache = {},\n\tcachedSelectors = [],\n\n\t// Mark a function for use in filtering\n\tmarkFunction = function( fn ) {\n\t\tfn.sizzleFilter = true;\n\t\treturn fn;\n\t},\n\n\t// Returns a function to use in pseudos for input types\n\tcreateInputFunction = function( type ) {\n\t\treturn function( elem ) {\n\t\t\t// Check the input's nodeName and type\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && elem.type === type;\n\t\t};\n\t},\n\n\t// Returns a function to use in pseudos for buttons\n\tcreateButtonFunction = function( type ) {\n\t\treturn function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t\t};\n\t},\n\n\t// Used for testing something on an element\n\tassert = function( fn ) {\n\t\tvar pass = false,\n\t\t\tdiv = document.createElement(\"div\");\n\t\ttry {\n\t\t\tpass = fn( div );\n\t\t} catch (e) {}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t\treturn pass;\n\t},\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tassertAttributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"<select></select>\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t}),\n\n\t// Check if getElementById returns elements by name\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\tassertUsableName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\tdiv.innerHTML = \"<a name='\" + expando + \"'></a><div name='\" + expando + \"'></div>\";\n\t\tdocElem.insertBefore( div, docElem.firstChild );\n\n\t\t// Test\n\t\tvar pass = document.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdocument.getElementsByName( expando ).length ===\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\t2 + document.getElementsByName( expando + 0 ).length;\n\t\tassertGetIdNotName = !document.getElementById( expando );\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t}),\n\n\t// Check if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\tassertTagNameNoComments = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn div.getElementsByTagName(\"*\").length === 0;\n\t}),\n\n\t// Check if getAttribute returns normalized href attributes\n\tassertHrefNotNormalized = assert(function( div ) {\n\t\tdiv.innerHTML = \"<a href='#'></a>\";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}),\n\n\t// Check if getElementsByClassName can be trusted\n\tassertUsableClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"<div class='hidden e'></div><div class='hidden'></div>\";\n\t\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length !== 1;\n\t});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\tvar match, elem, xml, m,\n\t\tnodeType = context.nodeType;\n\n\tif ( nodeType !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\txml = isXML( context );\n\n\tif ( !xml && !seed ) {\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector, context, results, seed, xml );\n};\n\nvar Expr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tmatch: matchExpr,\n\n\torder: [ \"ID\", \"TAG\" ],\n\n\tattrHandle: {},\n\n\tcreatePseudo: markFunction,\n\n\tfind: {\n\t\t\"ID\": assertGetIdNotName ?\n\t\t\tfunction( id, context, xml ) {\n\t\t\t\tif ( typeof context.getElementById !== strundefined && !xml ) {\n\t\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t\t}\n\t\t\t} :\n\t\t\tfunction( id, context, xml ) {\n\t\t\t\tif ( typeof context.getElementById !== strundefined && !xml ) {\n\t\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\t\treturn m ?\n\t\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t\t[m] :\n\t\t\t\t\t\t\tundefined :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\"TAG\": assertTagNameNoComments ?\n\t\t\tfunction( tag, context ) {\n\t\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t\t}\n\t\t\t} :\n\t\t\tfunction( tag, context ) {\n\t\t\t\tvar results = context.getElementsByTagName( tag );\n\n\t\t\t\t// Filter out possible comments\n\t\t\t\tif ( tag === \"*\" ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\ttmp = [],\n\t\t\t\t\t\ti = 0;\n\n\t\t\t\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\treturn results;\n\t\t\t}\n\t},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( rbackslash, \"\" );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( rbackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr.CHILD\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t3 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t4 sign of xn-component\n\t\t\t\t5 x of xn-component\n\t\t\t\t6 sign of y-component\n\t\t\t\t7 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\t// nth-child requires argument\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === \"even\" || match[2] === \"odd\" ) );\n\t\t\t\tmatch[4] = +( ( match[6] + match[7] ) || match[2] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar argument,\n\t\t\t\tunquoted = match[4];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Relinquish our claim on characters in `unquoted` from a closing parenthesis on\n\t\t\tif ( unquoted && (argument = rselector.exec( unquoted )) && argument.pop() ) {\n\n\t\t\t\tmatch[0] = match[0].slice( 0, argument[0].length - unquoted.length - 1 );\n\t\t\t\tunquoted = argument[0].slice( 0, -1 );\n\t\t\t}\n\n\t\t\t// Quoted or unquoted, we have the full argument\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\tmatch.splice( 2, 3, unquoted || match[3] );\n\t\t\treturn match;\n\t\t}\n\t},\n\n\tfilter: {\n\t\t\"ID\": assertGetIdNotName ?\n\t\t\tfunction( id ) {\n\t\t\t\tid = id.replace( rbackslash, \"\" );\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\treturn elem.getAttribute(\"id\") === id;\n\t\t\t\t};\n\t\t\t} :\n\t\t\tfunction( id ) {\n\t\t\t\tid = id.replace( rbackslash, \"\" );\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\t\treturn node && node.value === id;\n\t\t\t\t};\n\t\t\t},\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\t\t\tnodeName = nodeName.replace( rbackslash, \"\" ).toLowerCase();\n\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className ];\n\t\t\tif ( !pattern ) {\n\t\t\t\tpattern = classCache[ className ] = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" );\n\t\t\t\tcachedClasses.push( className );\n\t\t\t\t// Avoid too large of a cache\n\t\t\t\tif ( cachedClasses.length > Expr.cacheLength ) {\n\t\t\t\t\tdelete classCache[ cachedClasses.shift() ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn function( elem ) {\n\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t};\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\tif ( !operator ) {\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\treturn Sizzle.attr( elem, name ) != null;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name ),\n\t\t\t\t\tvalue = result + \"\";\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\n\t\t\t\tswitch ( operator ) {\n\t\t\t\t\tcase \"=\":\n\t\t\t\t\t\treturn value === check;\n\t\t\t\t\tcase \"!=\":\n\t\t\t\t\t\treturn value !== check;\n\t\t\t\t\tcase \"^=\":\n\t\t\t\t\t\treturn check && value.indexOf( check ) === 0;\n\t\t\t\t\tcase \"*=\":\n\t\t\t\t\t\treturn check && value.indexOf( check ) > -1;\n\t\t\t\t\tcase \"$=\":\n\t\t\t\t\t\treturn check && value.substr( value.length - check.length ) === check;\n\t\t\t\t\tcase \"~=\":\n\t\t\t\t\t\treturn ( \" \" + value + \" \" ).indexOf( check ) > -1;\n\t\t\t\t\tcase \"|=\":\n\t\t\t\t\t\treturn value === check || value.substr( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, argument, first, last ) {\n\n\t\t\tif ( type === \"nth\" ) {\n\t\t\t\tvar doneName = done++;\n\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\tvar parent, diff,\n\t\t\t\t\t\tcount = 0,\n\t\t\t\t\t\tnode = elem;\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tparent = elem.parentNode;\n\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.sizset = ++count;\n\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent[ expando ] = doneName;\n\t\t\t\t\t}\n\n\t\t\t\t\tdiff = elem.sizset - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = elem;\n\n\t\t\t\tswitch ( type ) {\n\t\t\t\t\tcase \"only\":\n\t\t\t\t\tcase \"first\":\n\t\t\t\t\t\twhile ( (node = node.previousSibling) ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\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\n\t\t\t\t\t\tif ( type === \"first\" ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnode = elem;\n\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase \"last\":\n\t\t\t\t\t\twhile ( (node = node.nextSibling) ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\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\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument, context, xml ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\tvar fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\n\n\t\t\tif ( !fn ) {\n\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\t\t\t}\n\n\t\t\t// The user may set fn.sizzleFilter to indicate\n\t\t\t// that arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( !fn.sizzleFilter ) {\n\t\t\t\treturn fn;\n\t\t\t}\n\n\t\t\treturn fn( argument, context, xml );\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t\"not\": markFunction(function( selector, context, xml ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar matcher = compile( selector.replace( rtrim, \"$1\" ), context, xml );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !matcher( elem );\n\t\t\t};\n\t\t}),\n\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tvar nodeType;\n\t\t\telem = elem.firstChild;\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telem = elem.nextSibling;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar type, attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\t(type = elem.type) === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === type );\n\t\t},\n\n\t\t// Input types\n\t\t\"radio\": createInputFunction(\"radio\"),\n\t\t\"checkbox\": createInputFunction(\"checkbox\"),\n\t\t\"file\": createInputFunction(\"file\"),\n\t\t\"password\": createInputFunction(\"password\"),\n\t\t\"image\": createInputFunction(\"image\"),\n\n\t\t\"submit\": createButtonFunction(\"submit\"),\n\t\t\"reset\": createButtonFunction(\"reset\"),\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\tvar doc = elem.ownerDocument;\n\t\t\treturn elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\n\t\t},\n\n\t\t\"active\": function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\n\tsetFilters: {\n\t\t\"first\": function( elements, argument, not ) {\n\t\t\treturn not ? elements.slice( 1 ) : [ elements[0] ];\n\t\t},\n\n\t\t\"last\": function( elements, argument, not ) {\n\t\t\tvar elem = elements.pop();\n\t\t\treturn not ? elements : [ elem ];\n\t\t},\n\n\t\t\"even\": function( elements, argument, not ) {\n\t\t\tvar results = [],\n\t\t\t\ti = not ? 1 : 0,\n\t\t\t\tlen = elements.length;\n\t\t\tfor ( ; i < len; i = i + 2 ) {\n\t\t\t\tresults.push( elements[i] );\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\n\t\t\"odd\": function( elements, argument, not ) {\n\t\t\tvar results = [],\n\t\t\t\ti = not ? 0 : 1,\n\t\t\t\tlen = elements.length;\n\t\t\tfor ( ; i < len; i = i + 2 ) {\n\t\t\t\tresults.push( elements[i] );\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\n\t\t\"lt\": function( elements, argument, not ) {\n\t\t\treturn not ? elements.slice( +argument ) : elements.slice( 0, +argument );\n\t\t},\n\n\t\t\"gt\": function( elements, argument, not ) {\n\t\t\treturn not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\n\t\t},\n\n\t\t\"eq\": function( elements, argument, not ) {\n\t\t\tvar elem = elements.splice( +argument, 1 );\n\t\t\treturn not ? elements : elem;\n\t\t}\n\t}\n};\n\n// Deprecated\nExpr.setFilters[\"nth\"] = Expr.setFilters[\"eq\"];\n\n// Back-compat\nExpr.filters = Expr.pseudos;\n\n// IE6/7 return a modified href\nif ( !assertHrefNotNormalized ) {\n\tExpr.attrHandle = {\n\t\t\"href\": function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t},\n\t\t\"type\": function( elem ) {\n\t\t\treturn elem.getAttribute(\"type\");\n\t\t}\n\t};\n}\n\n// Add getElementsByName if usable\nif ( assertUsableName ) {\n\tExpr.order.push(\"NAME\");\n\tExpr.find[\"NAME\"] = function( name, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n}\n\n// Add getElementsByClassName if usable\nif ( assertUsableClassName ) {\n\tExpr.order.splice( 1, 0, \"CLASS\" );\n\tExpr.find[\"CLASS\"] = function( className, context, xml ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && !xml ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n}\n\n// If slice is not available, provide a backup\ntry {\n\tslice.call( docElem.childNodes, 0 )[0].nodeType;\n} catch ( e ) {\n\tslice = function( i ) {\n\t\tvar elem, results = [];\n\t\tfor ( ; (elem = this[i]); i++ ) {\n\t\t\tresults.push( elem );\n\t\t}\n\t\treturn results;\n\t};\n}\n\nvar isXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Element contains another\nvar contains = Sizzle.contains = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\t\treturn !!( a.compareDocumentPosition( b ) & 16 );\n\t} :\n\tdocElem.contains ?\n\tfunction( a, b ) {\n\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\tbup = b.parentNode;\n\t\treturn a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\n\t} :\n\tfunction( a, b ) {\n\t\twhile ( (b = b.parentNode) ) {\n\t\t\tif ( b === a ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\nvar getText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( nodeType ) {\n\t\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent for elements\n\t\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else {\n\t\t\t\t// Traverse its children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t\t// Do not include comment or processing instruction nodes\n\t} else {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t}\n\treturn ret;\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar attr,\n\t\txml = isXML( elem );\n\n\tif ( !xml ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( Expr.attrHandle[ name ] ) {\n\t\treturn Expr.attrHandle[ name ]( elem );\n\t}\n\tif ( assertAttributes || xml ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\tattr = elem.getAttributeNode( name );\n\treturn attr ?\n\t\ttypeof elem[ name ] === \"boolean\" ?\n\t\t\telem[ name ] ? name : null :\n\t\t\tattr.specified ? attr.value : null :\n\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n\treturn (baseHasDuplicate = 0);\n});\n\n\nif ( docElem.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\n\t\t\ta.compareDocumentPosition :\n\t\t\ta.compareDocumentPosition(b) & 4\n\t\t) ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\ti = 1;\n\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\t\tif ( elem === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nfunction multipleContexts( selector, contexts, results, seed ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results, seed );\n\t}\n}\n\nfunction handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\n\tvar results,\n\t\tfn = Expr.setFilters[ posfilter.toLowerCase() ];\n\n\tif ( !fn ) {\n\t\tSizzle.error( posfilter );\n\t}\n\n\tif ( selector || !(results = seed) ) {\n\t\tmultipleContexts( selector || \"*\", contexts, (results = []), seed );\n\t}\n\n\treturn results.length > 0 ? fn( results, argument, not ) : [];\n}\n\nfunction handlePOS( selector, context, results, seed, groups ) {\n\tvar match, not, anchor, ret, elements, currentContexts, part, lastIndex,\n\t\ti = 0,\n\t\tlen = groups.length,\n\t\trpos = matchExpr[\"POS\"],\n\t\t// This is generated here in case matchExpr[\"POS\"] is extended\n\t\trposgroups = new RegExp( \"^\" + rpos.source + \"(?!\" + whitespace + \")\", \"i\" ),\n\t\t// This is for making sure non-participating\n\t\t// matching groups are represented cross-browser (IE6-8)\n\t\tsetUndefined = function() {\n\t\t\tvar i = 1,\n\t\t\t\tlen = arguments.length - 2;\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tif ( arguments[i] === undefined ) {\n\t\t\t\t\tmatch[i] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\tfor ( ; i < len; i++ ) {\n\t\t// Reset regex index to 0\n\t\trpos.exec(\"\");\n\t\tselector = groups[i];\n\t\tret = [];\n\t\tanchor = 0;\n\t\telements = seed;\n\t\twhile ( (match = rpos.exec( selector )) ) {\n\t\t\tlastIndex = rpos.lastIndex = match.index + match[0].length;\n\t\t\tif ( lastIndex > anchor ) {\n\t\t\t\tpart = selector.slice( anchor, match.index );\n\t\t\t\tanchor = lastIndex;\n\t\t\t\tcurrentContexts = [ context ];\n\n\t\t\t\tif ( rcombinators.test(part) ) {\n\t\t\t\t\tif ( elements ) {\n\t\t\t\t\t\tcurrentContexts = elements;\n\t\t\t\t\t}\n\t\t\t\t\telements = seed;\n\t\t\t\t}\n\n\t\t\t\tif ( (not = rendsWithNot.test( part )) ) {\n\t\t\t\t\tpart = part.slice( 0, -5 ).replace( rcombinators, \"$&*\" );\n\t\t\t\t}\n\n\t\t\t\tif ( match.length > 1 ) {\n\t\t\t\t\tmatch[0].replace( rposgroups, setUndefined );\n\t\t\t\t}\n\t\t\t\telements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\n\t\t\t}\n\t\t}\n\n\t\tif ( elements ) {\n\t\t\tret = ret.concat( elements );\n\n\t\t\tif ( (part = selector.slice( anchor )) && part !== \")\" ) {\n\t\t\t\tif ( rcombinators.test(part) ) {\n\t\t\t\t\tmultipleContexts( part, ret, results, seed );\n\t\t\t\t} else {\n\t\t\t\t\tSizzle( part, context, results, seed ? seed.concat(elements) : elements );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpush.apply( results, ret );\n\t\t\t}\n\t\t} else {\n\t\t\tSizzle( selector, context, results, seed );\n\t\t}\n\t}\n\n\t// Do not sort if this is a single filter\n\treturn len === 1 ? results : Sizzle.uniqueSort( results );\n}\n\nfunction tokenize( selector, context, xml ) {\n\tvar tokens, soFar, type,\n\t\tgroups = [],\n\t\ti = 0,\n\n\t\t// Catch obvious selector issues: terminal \")\"; nonempty fallback match\n\t\t// rselector never fails to match *something*\n\t\tmatch = rselector.exec( selector ),\n\t\tmatched = !match.pop() && !match.pop(),\n\t\tselectorGroups = matched && selector.match( rgroups ) || [\"\"],\n\n\t\tpreFilters = Expr.preFilter,\n\t\tfilters = Expr.filter,\n\t\tcheckContext = !xml && context !== document;\n\n\tfor ( ; (soFar = selectorGroups[i]) != null && matched; i++ ) {\n\t\tgroups.push( tokens = [] );\n\n\t\t// Need to make sure we're within a narrower context if necessary\n\t\t// Adding a descendant combinator will generate what is needed\n\t\tif ( checkContext ) {\n\t\t\tsoFar = \" \" + soFar;\n\t\t}\n\n\t\twhile ( soFar ) {\n\t\t\tmatched = false;\n\n\t\t\t// Combinators\n\t\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\t\tsoFar = soFar.slice( match[0].length );\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\tmatched = tokens.push({ part: match.pop().replace( rtrim, \" \" ), captures: match });\n\t\t\t}\n\n\t\t\t// Filters\n\t\t\tfor ( type in filters ) {\n\t\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t\t(match = preFilters[ type ]( match, context, xml )) ) ) {\n\n\t\t\t\t\tsoFar = soFar.slice( match.shift().length );\n\t\t\t\t\tmatched = tokens.push({ part: type, captures: match });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !matched ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !matched ) {\n\t\tSizzle.error( selector );\n\t}\n\n\treturn groups;\n}\n\nfunction addCombinator( matcher, combinator, context ) {\n\tvar dir = combinator.dir,\n\t\tdoneName = done++;\n\n\tif ( !matcher ) {\n\t\t// If there is no matcher to check, check against the context\n\t\tmatcher = function( elem ) {\n\t\t\treturn elem === context;\n\t\t};\n\t}\n\treturn combinator.first ?\n\t\tfunction( elem, context ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\treturn matcher( elem, context ) && elem;\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\t\tfunction( elem, context ) {\n\t\t\tvar cache,\n\t\t\t\tdirkey = doneName + \".\" + dirruns,\n\t\t\t\tcachedkey = dirkey + \".\" + cachedruns;\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( (cache = elem[ expando ]) === cachedkey ) {\n\t\t\t\t\t\treturn elem.sizset;\n\t\t\t\t\t} else if ( typeof cache === \"string\" && cache.indexOf(dirkey) === 0 ) {\n\t\t\t\t\t\tif ( elem.sizset ) {\n\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ expando ] = cachedkey;\n\t\t\t\t\t\tif ( matcher( elem, context ) ) {\n\t\t\t\t\t\t\telem.sizset = true;\n\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.sizset = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction addMatcher( higher, deeper ) {\n\treturn higher ?\n\t\tfunction( elem, context ) {\n\t\t\tvar result = deeper( elem, context );\n\t\t\treturn result && higher( result === true ? elem : result, context );\n\t\t} :\n\t\tdeeper;\n}\n\n// [\"TAG\", \">\", \"ID\", \" \", \"CLASS\"]\nfunction matcherFromTokens( tokens, context, xml ) {\n\tvar token, matcher,\n\t\ti = 0;\n\n\tfor ( ; (token = tokens[i]); i++ ) {\n\t\tif ( Expr.relative[ token.part ] ) {\n\t\t\tmatcher = addCombinator( matcher, Expr.relative[ token.part ], context );\n\t\t} else {\n\t\t\ttoken.captures.push( context, xml );\n\t\t\tmatcher = addMatcher( matcher, Expr.filter[ token.part ].apply( null, token.captures ) );\n\t\t}\n\t}\n\n\treturn matcher;\n}\n\nfunction matcherFromGroupMatchers( matchers ) {\n\treturn function( elem, context ) {\n\t\tvar matcher,\n\t\t\tj = 0;\n\t\tfor ( ; (matcher = matchers[j]); j++ ) {\n\t\t\tif ( matcher(elem, context) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n}\n\nvar compile = Sizzle.compile = function( selector, context, xml ) {\n\tvar tokens, group, i,\n\t\tcached = compilerCache[ selector ];\n\n\t// Return a cached group function if already generated (context dependent)\n\tif ( cached && cached.context === context ) {\n\t\treturn cached;\n\t}\n\n\t// Generate a function of recursive functions that can be used to check each element\n\tgroup = tokenize( selector, context, xml );\n\tfor ( i = 0; (tokens = group[i]); i++ ) {\n\t\tgroup[i] = matcherFromTokens( tokens, context, xml );\n\t}\n\n\t// Cache the compiled function\n\tcached = compilerCache[ selector ] = matcherFromGroupMatchers( group );\n\tcached.context = context;\n\tcached.runs = cached.dirruns = 0;\n\tcachedSelectors.push( selector );\n\t// Ensure only the most recent are cached\n\tif ( cachedSelectors.length > Expr.cacheLength ) {\n\t\tdelete compilerCache[ cachedSelectors.shift() ];\n\t}\n\treturn cached;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\treturn Sizzle( expr, null, null, [ elem ] ).length > 0;\n};\n\nvar select = function( selector, context, results, seed, xml ) {\n\t// Remove excessive whitespace\n\tselector = selector.replace( rtrim, \"$1\" );\n\tvar elements, matcher, i, len, elem, token,\n\t\ttype, findContext, notTokens,\n\t\tmatch = selector.match( rgroups ),\n\t\ttokens = selector.match( rtokens ),\n\t\tcontextNodeType = context.nodeType;\n\n\t// POS handling\n\tif ( matchExpr[\"POS\"].test(selector) ) {\n\t\treturn handlePOS( selector, context, results, seed, match );\n\t}\n\n\tif ( seed ) {\n\t\telements = slice.call( seed, 0 );\n\n\t// To maintain document order, only narrow the\n\t// set if there is one group\n\t} else if ( match && match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\tif ( tokens.length > 1 && contextNodeType === 9 && !xml &&\n\t\t\t\t(match = matchExpr[\"ID\"].exec( tokens[0] )) ) {\n\n\t\t\tcontext = Expr.find[\"ID\"]( match[1], context, xml )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().length );\n\t\t}\n\n\t\tfindContext = ( (match = rsibling.exec( tokens[0] )) && !match.index && context.parentNode ) || context;\n\n\t\t// Get the last token, excluding :not\n\t\tnotTokens = tokens.pop();\n\t\ttoken = notTokens.split(\":not\")[0];\n\n\t\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\n\t\t\ttype = Expr.order[i];\n\n\t\t\tif ( (match = matchExpr[ type ].exec( token )) ) {\n\t\t\t\telements = Expr.find[ type ]( (match[1] || \"\").replace( rbackslash, \"\" ), findContext, xml );\n\n\t\t\t\tif ( elements == null ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( token === notTokens ) {\n\t\t\t\t\tselector = selector.slice( 0, selector.length - notTokens.length ) +\n\t\t\t\t\t\ttoken.replace( matchExpr[ type ], \"\" );\n\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, slice.call(elements, 0) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Only loop over the given elements once\n\t// If selector is empty, we're already done\n\tif ( selector ) {\n\t\tmatcher = compile( selector, context, xml );\n\t\tdirruns = matcher.dirruns++;\n\n\t\tif ( elements == null ) {\n\t\t\telements = Expr.find[\"TAG\"]( \"*\", (rsibling.test( selector ) && context.parentNode) || context );\n\t\t}\n\t\tfor ( i = 0; (elem = elements[i]); i++ ) {\n\t\t\tcachedruns = matcher.runs++;\n\t\t\tif ( matcher(elem, context) ) {\n\t\t\t\tresults.push( elem );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nif ( document.querySelectorAll ) {\n\t(function() {\n\t\tvar disconnectedMatch,\n\t\t\toldSelect = select,\n\t\t\trescape = /'|\\\\/g,\n\t\t\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\t\t\trbuggyQSA = [],\n\t\t\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\t\t\t// A support test would require too much code (would include document ready)\n\t\t\t// just skip matchesSelector for :active\n\t\t\trbuggyMatches = [\":active\"],\n\t\t\tmatches = docElem.matchesSelector ||\n\t\t\t\tdocElem.mozMatchesSelector ||\n\t\t\t\tdocElem.webkitMatchesSelector ||\n\t\t\t\tdocElem.oMatchesSelector ||\n\t\t\t\tdocElem.msMatchesSelector;\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\tdiv.innerHTML = \"<select><option selected></option></select>\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here (do not put tests after this one)\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE9 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"<p test=''></p>\";\n\t\t\tif ( div.querySelectorAll(\"[test^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here (do not put tests after this one)\n\t\t\tdiv.innerHTML = \"<input type='hidden'>\";\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push(\":enabled\", \":disabled\");\n\t\t\t}\n\t\t});\n\n\t\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\n\t\tselect = function( selector, context, results, seed, xml ) {\n\t\t\t// Only use querySelectorAll when not filtering,\n\t\t\t// when this is not xml,\n\t\t\t// and when no QSA bugs apply\n\t\t\tif ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results, slice.call(context.querySelectorAll( selector ), 0) );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch(qsaError) {}\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar old = context.getAttribute(\"id\"),\n\t\t\t\t\t\tnid = old || expando,\n\t\t\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results, slice.call( newContext.querySelectorAll(\n\t\t\t\t\t\t\tselector.replace( rgroups, \"[id='\" + nid + \"'] $&\" )\n\t\t\t\t\t\t), 0 ) );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch(qsaError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn oldSelect( selector, context, results, seed, xml );\n\t\t};\n\n\t\tif ( matches ) {\n\t\t\tassert(function( div ) {\n\t\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t\t// on a disconnected node (IE 9)\n\t\t\t\tdisconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t\t// This should fail with an exception\n\t\t\t\t// Gecko does not error, returns false instead\n\t\t\t\ttry {\n\t\t\t\t\tmatches.call( div, \"[test!='']:sizzle\" );\n\t\t\t\t\trbuggyMatches.push( Expr.match.PSEUDO );\n\t\t\t\t} catch ( e ) {}\n\t\t\t});\n\n\t\t\t// rbuggyMatches always contains :active, so no need for a length check\n\t\t\trbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join(\"|\") );\n\n\t\t\tSizzle.matchesSelector = function( elem, expr ) {\n\t\t\t\t// Make sure that attribute selectors are quoted\n\t\t\t\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t\t\t\t// rbuggyMatches always contains :active, so no need for an existence check\n\t\t\t\tif ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {}\n\t\t\t\t}\n\n\t\t\t\treturn Sizzle( expr, null, null, [ elem ] ).length > 0;\n\t\t\t};\n\t\t}\n\t})();\n}\n\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i, l, length, n, r, ret,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tret = this.pushStack( \"\", \"find\", selector );\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\trneedsContext.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\taddBack: 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\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( this.length > 1 && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, core_slice.call( arguments ).join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trcheckableType = /^(?:checkbox|radio)$/,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)|[\\]\\-]{2}>\\s*$/g,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n// unless wrapped in a div with non-breaking characters in front of it.\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"X<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\treturn this.pushStack( jQuery.merge( set, this ), \"before\", this.selector );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\treturn this.pushStack( jQuery.merge( this, set ), \"after\", this.selector );\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn this.length ?\n\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\tthis;\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = [].concat.apply( [], args );\n\n\t\tvar results, first, fragment, iNoClone,\n\t\t\ti = 0,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [],\n\t\t\tl = this.length;\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && l > 1 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call( this, i, table ? self.html() : undefined );\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\tfragment = results.fragment;\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\t// Fragments from the fragment cache must always be cloned and never used in place.\n\t\t\t\tfor ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable && jQuery.nodeName( this[i], \"table\" ) ?\n\t\t\t\t\t\t\tfindOrAppend( this[i], \"tbody\" ) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\ti === iNoClone ?\n\t\t\t\t\t\t\tfragment :\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\tfragment = first = null;\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\n\t\t\t\t\tif ( elem.src ) {\n\t\t\t\t\t\tif ( jQuery.ajax ) {\n\t\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\t\turl: elem.src,\n\t\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\t\t\"throws\": true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.error(\"no ajax\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction findOrAppend( elem, tag ) {\n\treturn elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\tif ( nodeName === \"object\" ) {\n\t\t// IE6-10 improperly clones children of object elements using classid.\n\t\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\n\t// IE blanks contents when cloning scripts\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdest.text = src.text;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, context, scripts ) {\n\tvar fragment, cacheable, cachehit,\n\t\tfirst = args[ 0 ];\n\n\t// Set context from what may come in as undefined or a jQuery collection or a node\n\tcontext = context || document;\n\tcontext = (context[0] || context).ownerDocument || context[0] || context;\n\n\t// Ensure that an attr object doesn't incorrectly stand in as a document object\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\n\t// Fixes #8950\n\tif ( typeof context.createDocumentFragment === \"undefined\" ) {\n\t\tcontext = document;\n\t}\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && context === document &&\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\n\n\t\t// Mark cacheable and look for a hit\n\t\tcacheable = true;\n\t\tfragment = jQuery.fragments[ first ];\n\t\tcachehit = fragment !== undefined;\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = context.createDocumentFragment();\n\t\tjQuery.clean( args, context, fragment, scripts );\n\n\t\t// Update the cache, but only store false\n\t\t// unless this is a second parsing of the same content\n\t\tif ( cacheable ) {\n\t\t\tjQuery.fragments[ first ] = cachehit && fragment;\n\t\t}\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tl = insert.length,\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\t\t} else {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\telems = ( i > 0 ? this.clone(true) : this ).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar srcElements,\n\t\t\tdestElements,\n\t\t\ti,\n\t\t\tclone;\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsrcElements = destElements = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar j, safe, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Ensure that context is a document\n\t\tif ( !context || typeof context.createDocumentFragment === \"undefined\" ) {\n\t\t\tcontext = document;\n\t\t}\n\n\t\t// Use the already-created safe fragment if context permits\n\t\tfor ( safe = context === document && safeFragment; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Ensure a safe container in which to render the html\n\t\t\t\t\tsafe = safe || createSafeFragment( context );\n\t\t\t\t\tdiv = div || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\tdepth = wrap[0];\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\thasBody = rtbody.test(elem);\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\tdiv = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from safeFragment\n\t\tif ( div ) {\n\t\t\tsafe.removeChild( div );\n\t\t\telem = div = safe = null;\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tfixDefaultChecked( elem );\n\t\t\t\t} else if ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Append elements to a provided document fragment\n\t\tif ( fragment ) {\n\t\t\t// Special handling of each script element\n\t\t\thandleScript = function( elem ) {\n\t\t\t\t// Check if we consider it executable\n\t\t\t\tif ( !elem.type || rscriptType.test( elem.type ) ) {\n\t\t\t\t\t// Detach the script and store it in the scripts array (if provided) or the fragment\n\t\t\t\t\t// Return truthy to indicate that it has been handled\n\t\t\t\t\treturn scripts ?\n\t\t\t\t\t\tscripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :\n\t\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\t// Check if we're done after handling an executable script\n\t\t\t\tif ( !( jQuery.nodeName( elem, \"script\" ) && handleScript( elem ) ) ) {\n\t\t\t\t\t// Append to fragment and handle embedded scripts\n\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\t\t// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration\n\t\t\t\t\t\tjsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName(\"script\") ), handleScript );\n\n\t\t\t\t\t\t// Splice the scripts into ret after their former ancestor and advance our index beyond them\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t\ti += jsTags.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar data, id, elem, type,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjQuery.deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n// Limit scope pollution from any deprecated API\n(function() {\n\nvar matched, browser;\n\n// Use of jQuery.browser is frowned upon.\n// More details: http://api.jquery.com/jQuery.browser\n// jQuery.uaMatch maintained for back-compat\njQuery.uaMatch = function( ua ) {\n\tua = ua.toLowerCase();\n\n\tvar match = /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(msie) ([\\w.]+)/.exec( ua ) ||\n\t\tua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n\t\t[];\n\n\treturn {\n\t\tbrowser: match[ 1 ] || \"\",\n\t\tversion: match[ 2 ] || \"0\"\n\t};\n};\n\nmatched = jQuery.uaMatch( navigator.userAgent );\nbrowser = {};\n\nif ( matched.browser ) {\n\tbrowser[ matched.browser ] = true;\n\tbrowser.version = matched.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\n// Maintained for back-compat only\nif ( browser.webkit ) {\n\tbrowser.safari = true;\n}\n\njQuery.browser = browser;\n\njQuery.sub = function() {\n\tfunction jQuerySub( selector, context ) {\n\t\treturn new jQuerySub.fn.init( selector, context );\n\t}\n\tjQuery.extend( true, jQuerySub, this );\n\tjQuerySub.superclass = this;\n\tjQuerySub.fn = jQuerySub.prototype = this();\n\tjQuerySub.fn.constructor = jQuerySub;\n\tjQuerySub.sub = this.sub;\n\tjQuerySub.fn.init = function init( selector, context ) {\n\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\tcontext = jQuerySub( context );\n\t\t}\n\n\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t};\n\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\tvar rootjQuerySub = jQuerySub(document);\n\treturn jQuerySub;\n};\n\t\n})();\nvar curCSS, iframe, iframeDoc,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([-+])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = {},\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400,\n\t\tlineHeight: 1\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ],\n\n\teventsToggle = jQuery.fn.toggle;\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar elem, display,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && elem.style.display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\tdisplay = curCSS( elem, \"display\" );\n\n\t\t\tif ( !values[ index ] && display !== \"none\" ) {\n\t\t\t\tjQuery._data( elem, \"olddisplay\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state, fn2 ) {\n\t\tvar bool = typeof state === \"boolean\";\n\n\t\tif ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {\n\t\t\treturn eventsToggle.apply( this, arguments );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( bool ? state : isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, numeric, extra ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( numeric || extra !== undefined ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn numeric || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// NOTE: To any future maintainer, we've used both window.getComputedStyle\n// and getComputedStyle here to produce a better gzip size\nif ( window.getComputedStyle ) {\n\tcurCSS = function( elem, name ) {\n\t\tvar ret, width, minWidth, maxWidth,\n\t\t\tcomputed = getComputedStyle( elem, null ),\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tret = computed[ name ];\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tcurCSS = function( elem, name ) {\n\t\tvar left, rsLeft,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\t// we use jQuery.css instead of curCSS here\n\t\t\t// because of the reliableMarginRight CSS hook!\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true );\n\t\t}\n\n\t\t// From this point on we use curCSS for maximum performance (relevant in animations)\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= parseFloat( curCSS( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= parseFloat( curCSS( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += parseFloat( curCSS( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += parseFloat( curCSS( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tvalueIsBorderBox = true,\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\" ) === \"border-box\";\n\n\tif ( val <= 0 ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox\n\t\t)\n\t) + \"px\";\n}\n\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tif ( elemdisplay[ nodeName ] ) {\n\t\treturn elemdisplay[ nodeName ];\n\t}\n\n\tvar elem = jQuery( \"<\" + nodeName + \">\" ).appendTo( document.body ),\n\t\tdisplay = elem.css(\"display\");\n\telem.remove();\n\n\t// If the simple way fails,\n\t// get element's real default display by attaching it to a temp iframe\n\tif ( display === \"none\" || display === \"\" ) {\n\t\t// Use the already-created iframe if possible\n\t\tiframe = document.body.appendChild(\n\t\t\tiframe || jQuery.extend( document.createElement(\"iframe\"), {\n\t\t\t\tframeBorder: 0,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t})\n\t\t);\n\n\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\n\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\tiframeDoc.write(\"<!doctype html><html><body>\");\n\t\t\tiframeDoc.close();\n\t\t}\n\n\t\telem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );\n\n\t\tdisplay = curCSS( elem, \"display\" );\n\t\tdocument.body.removeChild( iframe );\n\t}\n\n\t// Store the correct default display\n\telemdisplay[ nodeName ] = display;\n\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 || curCSS( elem, \"display\" ) !== \"none\" ) {\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t} else {\n\t\t\t\t\treturn jQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\" ) === \"border-box\"\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\treturn curCSS( elem, \"marginRight\" );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tvar ret = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + \"px\" : ret;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\treturn ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i,\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ],\n\t\t\t\texpanded = {};\n\n\t\t\tfor ( i = 0; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\trselectTextarea = /^(?:select|textarea)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\nvar // Document location\n\tajaxLocation,\n\t// Document location segments\n\tajaxLocParts,\n\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType, list, placeBefore,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),\n\t\t\ti = 0,\n\t\t\tlength = dataTypes.length;\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar selection,\n\t\tlist = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters );\n\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\t// Don't do a request if no elements are being requested\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// Request the remote document\n\tjQuery.ajax({\n\t\turl: url,\n\n\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\ttype: type,\n\t\tdataType: \"html\",\n\t\tdata: params,\n\t\tcomplete: function( jqXHR, status ) {\n\t\t\tif ( callback ) {\n\t\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t}\n\t\t}\n\t}).done(function( responseText ) {\n\n\t\t// Save response for use in complete callback\n\t\tresponse = arguments;\n\n\t\t// See if a selector was specified\n\t\tself.html( selector ?\n\n\t\t\t// Create a dummy div to hold the results\n\t\t\tjQuery(\"<div>\")\n\n\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t.append( responseText.replace( rscript, \"\" ) )\n\n\t\t\t\t// Locate the specified elements\n\t\t\t\t.find( selector ) :\n\n\t\t\t// If not, just inject the full result\n\t\t\tresponseText );\n\n\t});\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.on( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\tif ( settings ) {\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\n\t\t} else {\n\t\t\t// Extending ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.ajaxSettings;\n\t\t}\n\t\tajaxExtend( target, settings );\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": allTypes\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\tcontext: true,\n\t\t\turl: true\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\tisSuccess = ajaxConvert( s, response );\n\t\t\t\t\tstatusText = isSuccess.state;\n\t\t\t\t\tsuccess = isSuccess.data;\n\t\t\t\t\terror = isSuccess.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = \"\" + ( nativeStatusText || statusText );\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.add;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor ( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.always( tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( core_rspace );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already and return\n\t\t\t\treturn jqXHR.abort();\n\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\tvar conv, conv2, current, tmp,\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice(),\n\t\tprev = dataTypes[ 0 ],\n\t\tconverters = {},\n\t\ti = 0;\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\t// Convert to each sequential dataType, tolerating list modification\n\tfor ( ; (current = dataTypes[++i]); ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\tif ( current !== \"*\" ) {\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\tif ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split(\" \");\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.splice( i--, 0, current );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[\"throws\"] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update prev for next iteration\n\t\t\tprev = current;\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\nvar oldCallbacks = [],\n\trquestion = /\\?/,\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/,\n\tnonce = jQuery.now();\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tdata = s.data,\n\t\turl = s.url,\n\t\thasCallback = s.jsonp !== false,\n\t\treplaceInUrl = hasCallback && rjsonp.test( url ),\n\t\treplaceInData = hasCallback && !replaceInUrl && typeof data === \"string\" &&\n\t\t\t!( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") &&\n\t\t\trjsonp.test( data );\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" || replaceInUrl || replaceInData ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\t\toverwritten = window[ callbackName ];\n\n\t\t// Insert callback into url or form data\n\t\tif ( replaceInUrl ) {\n\t\t\ts.url = url.replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( replaceInData ) {\n\t\t\ts.data = data.replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( hasCallback ) {\n\t\t\ts.url += ( rquestion.test( url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar xhrCallbacks,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t} catch( _ ) {\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback, 0 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([-+])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar end, unit, prevScale,\n\t\t\t\ttween = this.createTween( prop, value ),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tstart = +target || 0,\n\t\t\t\tscale = 1;\n\n\t\t\tif ( parts ) {\n\t\t\t\tend = +parts[2];\n\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\n\t\t\t\t// We need to compute starting value\n\t\t\t\tif ( unit !== \"px\" && start ) {\n\t\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\t\t// Prefer the current property, because this process will be trivial if it uses the same units\n\t\t\t\t\t// Fallback to end or a simple constant\n\t\t\t\t\tstart = jQuery.css( tween.elem, prop, true ) || end || 1;\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\t\tprevScale = scale = scale || \".5\";\n\n\t\t\t\t\t\t// Adjust and apply\n\t\t\t\t\t\tstart = start / scale;\n\t\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t\t\t// Update scale, tolerating zeroes from tween.cur()\n\t\t\t\t\t\tscale = tween.cur() / target;\n\n\t\t\t\t\t// Stop looping if we've hit the mark or scale is unchanged\n\t\t\t\t\t} while ( scale !== 1 && scale !== prevScale );\n\t\t\t\t}\n\n\t\t\t\ttween.unit = unit;\n\t\t\t\ttween.start = start;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;\n\t\t\t}\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t}, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTweens( animation, props ) {\n\tjQuery.each( props, function( prop, value ) {\n\t\tvar collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\t\tindex = 0,\n\t\t\tlength = collection.length;\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tif ( collection[ index ].call( animation, prop, value ) ) {\n\n\t\t\t\t// we're done with this property\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tindex = 0,\n\t\ttweenerIndex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\tpercent = 1 - ( remaining / animation.duration || 0 ),\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end, easing ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tcreateTweens( animation, props );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue,\n\t\t\telem: elem\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar index, prop, value, length, dataShow, tween, hooks, oldfire,\n\t\tanim = this,\n\t\tstyle = elem.style,\n\t\torig = {},\n\t\thandled = [],\n\t\thidden = elem.nodeType && isHidden( elem );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.done(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( index in props ) {\n\t\tvalue = props[ index ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ index ];\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandled.push( index );\n\t\t}\n\t}\n\n\tlength = handled.length;\n\tif ( length ) {\n\t\tdataShow = jQuery._data( elem, \"fxshow\" ) || jQuery._data( elem, \"fxshow\", {} );\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery.removeData( elem, \"fxshow\", true );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( index = 0 ; index < length ; index++ ) {\n\t\t\tprop = handled[ index ];\n\t\t\ttween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );\n\t\t\torig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tthis.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration );\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing any value as a 4th parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, false, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Remove in 2.0 - this supports IE8's panic based approach\n// to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ||\n\t\t\t// special check for .toggle( handler, handler, ... )\n\t\t\t( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations resolve immediately\n\t\t\t\tif ( empty ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) && !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\nvar rroot = /^(?:body|html)$/i;\n\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tif ( (body = doc.body) === elem ) {\n\t\treturn jQuery.offset.bodyOffset( elem );\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure we're not dealing with a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn { top: 0, left: 0 };\n\t}\n\n\tbox = elem.getBoundingClientRect();\n\twin = getWindow( doc );\n\tclientTop  = docElem.clientTop  || body.clientTop  || 0;\n\tclientLeft = docElem.clientLeft || body.clientLeft || 0;\n\tscrollTop  = win.pageYOffset || docElem.scrollTop;\n\tscrollLeft = win.pageXOffset || docElem.scrollLeft;\n\ttop  = box.top  + scrollTop  - clientTop;\n\tleft = box.left + scrollLeft - clientLeft;\n\n\treturn { top: top, left: left };\n};\n\njQuery.offset = {\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || document.body;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, value, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t});\n});\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n})( window );\n"
  },
  {
    "path": "src/main/resources/static/mall/js/search.js",
    "content": "$(function () {\n    $('#keyword').keypress(function (e) {\n        var key = e.which; //e.which是按键的值\n        if (key == 13) {\n            var q = $(this).val();\n            if (q && q != '') {\n                window.location.href = '/search?keyword=' + q;\n            }\n        }\n    });\n});\n\nfunction search() {\n    var q = $('#keyword').val();\n    if (q && q != '') {\n        window.location.href = '/search?keyword=' + q;\n    }\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/addresses.css",
    "content": "#personal {\n    width: 100%;\n    height: auto;\n    background: #f5f5f5;\n    padding-bottom: 20px;\n    padding-top: 20px;\n}\n\n#personal .self-info {\n    width: 1226px;\n}\n\n#personal .self-info .lfnav {\n    width: 234px;\n    height: 500px;\n    background: #fff;\n}\n\n#personal .self-info .lfnav .nav_title {\n    width: 234px;\n    height: 40px;\n    line-height: 40px;\n    font-size: 19px;\n    margin: 30px 20px 10px 40px;\n    color: #333;\n}\n\n#personal .self-info .lfnav .title_list ul li {\n    display: block;\n    width: 194px;\n    height: 40px;\n    line-height: 40px;\n    padding-left: 40px;\n}\n\n#personal .self-info .lfnav .title_list ul li .active {\n    color: #1baeae;\n    font-weight: bold;\n}\n\n#personal .self-info .lfnav .title_list ul li a {\n    color: #757575;\n}\n\n#personal .self-info .lfnav .title_list ul li a:hover {\n    color: #333;\n}\n\n#personal .self-info .intro {\n    width: 978px;\n    background: #fff;\n}\n\n#personal .self-info .intro .grzlbt {\n    width: 938px;\n    height: 60px;\n    line-height: 60px;\n    font-size: 20px;\n    color: #757575;\n}\n\n#personal .self-info .intro .info_item {\n    height: 45px;\n    line-height: 45px;\n    width: 900px;\n    background: #fdfdfd;\n    border: 1px solid #aaa;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border-radius: 3px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(1) {\n    display: inline-block;\n    font-size: 15px;\n    font-weight: bold;\n    color: #757575;\n    width: 70px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 20px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(2) {\n    display: inline-block;\n    font-size: 15px;\n    color: #757575;\n    width: 480px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 120px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(3) {\n    display: inline-block;\n    font-size: 15px;\n    width: 160px;\n    height: 45px;\n    line-height: 45px;\n    text-align: right;\n}\n\n#personal .self-info .intro .info_item span a {\n    color: #008080;\n}\n\n#personal .self-info .intro .info_item span a:hover {\n    color: #1baeae;\n}\n\n.uc-main-box {\n    padding: 36px 0;\n}\n\n.uc-box {\n    background: #fff;\n}\n\n.uc-content-box {\n    margin: 0 48px;\n}\n\n.uc-content-box .box-hd .title {\n    margin: 0;\n    font-size: 30px;\n    font-weight: 400;\n    line-height: 68px;\n    color: #757575;\n}\n\n.user-address-list {\n    padding-top: 30px;\n}\n\n.user-address-list .address-item {\n    float: left;\n    margin-right: 17px;\n    margin-bottom: 20px;\n}\n.address-item-new {\n    text-align: center;\n    color: #b0b0b0;\n}\n.address-item {\n    width: 268px;\n    height: 178px;\n    border: 1px solid #e0e0e0;\n    cursor: pointer;\n    position: relative;\n    -webkit-transition: all .4s ease;\n    transition: all .4s ease;\n}\n\n.address-item-new .iconfont {\n    display: block;\n    width: 30px;\n    height: 30px;\n    margin: 63px auto 8px;\n    font-size: 30px;\n    line-height: 30px;\n    background-color: #e0e0e0;\n    border-radius: 17px;\n    text-align: center;\n    -webkit-transition: all .4s ease;\n    transition: all .4s ease;\n    color: #fff;\n}\n.iconfont {\n    font-family: \"iconfont\" !important;\n    font-style: normal;\n    -webkit-font-smoothing: antialiased;\n    -webkit-text-stroke-width: 0.2px;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.user-address-list .address-item {\n    float: left;\n    margin-right: 17px;\n    margin-bottom: 20px;\n}\n.address-item {\n    width: 268px;\n    height: 178px;\n    border: 1px solid #e0e0e0;\n    cursor: pointer;\n    position: relative;\n    -webkit-transition: all .4s ease;\n    transition: all .4s ease;\n}\n.address-item dl {\n    padding: 15px 24px 0;\n    margin: 0;\n}\n.address-item dt {\n    margin: 0 0 10px;\n    line-height: 30px;\n}\n.address-item .uname {\n    font-size: 18px;\n    color: #333;\n    font-style: normal;\n}\n.address-item dd {\n    margin: 0;\n    line-height: 22px;\n    color: #757575;\n}\n.address-item .actions {\n    position: absolute;\n    right: 24px;\n    bottom: 10px;\n    width: 100px;\n    height: 24px;\n}\n.address-item .modify {\n    margin-left: 10px;\n    color: #1baeae;\n}\n"
  },
  {
    "path": "src/main/resources/static/mall/styles/cart.css",
    "content": "#cart .banner_x {\n  width: 1226px;\n  height: 100px;\n}\n#cart .banner_x .logo {\n  width: 100px;\n  height: 100px;\n}\n\n#cart .banner_x .logo img {\n  width: 100px;\n  height: 100px;\n}\n#cart .banner_x .wdgwc {\n  height: 100px;\n  line-height: 100px;\n  font-weight: bold;\n  font-size: 24px;\n}\n#cart .banner_x .wxts {\n  height: 90px;\n  line-height: 105px;\n  font-size: 12px;\n  color: #777;\n}\n#cart .banner_x .dlzc {\n  height: 100px;\n  line-height: 100px;\n  display: flex;\n  align-items: center;\n}\n#cart .banner_x .dlzc .user {\n  width: 120px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 12px;\n  text-align: center;\n  position: relative;\n}\n#cart .banner_x .dlzc .user:hover .username {\n  color: #1baeae;\n  background-color: #fff;\n}\n#cart .banner_x .dlzc .user:hover .selector {\n  padding: 7px 0;\n  height: 120px;\n}\n#cart .banner_x .dlzc .user .username {\n  display: block;\n  width: 100%;\n  height: 100%;\n  line-height: 40px;\n  color: #b0b0b0;\n  position: relative;\n  z-index: 201;\n}\n#cart .banner_x .dlzc .user .selector {\n  position: absolute;\n  left: 0;\n  top: 40px;\n  width: 100%;\n  z-index: 200;\n  box-shadow: 0 2px 10px rgba(0,0,0,0.15);\n  height: 0;\n  background-color: #fff;\n  overflow: hidden;\n  transition: all 0.2s;\n}\n#cart .banner_x .dlzc .user .selector li {\n  width: 100%;\n  height: 30px;\n}\n#cart .banner_x .dlzc .user .selector li:hover a {\n  color: #1baeae;\n  background-color: #fafafa;\n}\n#cart .banner_x .dlzc .user .selector li a {\n  display: block;\n  width: 100%;\n  height: 100%;\n  line-height: 30px;\n  padding: 0;\n  border: 0;\n}\n#cart .banner_x .dlzc .login {\n  display: flex;\n  align-items: center;\n  width: 81px;\n  height: 40px;\n}\n#cart .banner_x .dlzc .login li a {\n  display: flex;\n  align-items: center;\n  height: 12px;\n  font-size: 12px;\n  color: #b0b0b0;\n  padding: 0 8px;\n  border-right: 1px solid #b0b0b0;\n}\n#cart .banner_x .dlzc .login li:last-of-type a {\n  border-right: none;\n}\n#cart .cart_line {\n  width: 100%;\n  height: 2px;\n  background: #1baeae;\n}\n#cart .cart_bg {\n  width: 100%;\n  background: #f5f5f5;\n  padding-bottom: 20px;\n}\n#cart .cart_bg .list {\n  background: #fff;\n  width: 1226px;\n  height: auto;\n  padding-top: 30px;\n  min-height: 300px;\n}\n#cart .cart_bg .list .top2 {\n  width: 1226px;\n  height: 70px;\n}\n#cart .cart_bg .list .top2 .sub_top {\n  width: 100px;\n  height: 70px;\n  line-height: 36px;\n  margin-right: 0px;\n  margin-top: 0px;\n  margin-left: 30px;\n  font-weight: bold;\n}\n#cart .cart_bg .list .top2 .sub_top:nth-of-type(2) {\n  margin-left: 100px;\n}\n#cart .cart_bg .list .top2 .sub_top:nth-of-type(3) {\n  margin-left: 270px;\n}\n#cart .cart_bg .list .top2 .sub_top:nth-of-type(4) {\n  margin-left: 70px;\n}\n#cart .cart_bg .list .top2 .sub_top:nth-of-type(5) {\n  margin-left: 65px;\n}\n#cart .cart_bg .list .top2 .sub_top .white_d {\n  width: 18px;\n  height: 18px;\n  border: 1px solid #ccc;\n  background: none;\n}\n#cart .cart_bg .list .content2 {\n  width: 1226px;\n  height: 120px;\n  border-top: 1px solid #ccc;\n}\n#cart .cart_bg .list .content2 .sub_content {\n  font-size: 14px;\n  width: 50px;\n  height: 120px;\n  line-height: 120px;\n  margin-right: 0px;\n  white-space: nowrap;\n}\n#cart .cart_bg .list .content2 .sub_content img {\n  vertical-align: middle;\n}\n.cover {\n  width: 60px;\n  height: 60px;\n}\n\n.cover img{\n  width: 60px;\n  height: 60px;\n}\n\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(1) {\n  margin-left: 30px;\n}\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(2) {\n  margin-left: 35px;\n}\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(3) {\n  margin-left: 55px;\n  width: 330px;\n}\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(4) {\n  margin-left: 55px;\n}\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(5) {\n  margin-left: 115px;\n}\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(6) {\n  margin-left: 115px;\n  color: #1baeae;\n}\n#cart .cart_bg .list .content2 .sub_content:nth-of-type(7) {\n  margin-left: 145px;\n  font-size: 25px;\n}\n#cart .cart_bg .list .content2 .sub_content .goods_count {\n  width: 70px;\n  height: 35px;\n  border: 1px solid #ececec;\n  text-align: center;\n  font-size: 14px;\n  color: #1baeae;\n}\n#cart .cart_bg .list .content2 .sub_content a {\n  display: block;\n  width: 20px;\n  height: 20px;\n  border-radius: 10px;\n  color: #000;\n}\n#cart .cart_bg .list .content2 .sub_content a:hover {\n  color: #1baeae;\n}\n#cart .cart_bg .list .sub_content .white_d {\n  width: 18px;\n  height: 18px;\n  border: 1px solid #ccc;\n  background: none;\n}\n#cart .cart_bg .pre_order {\n  width: 1226px;\n  height: 50px;\n  background: #fff;\n}\n#cart .cart_bg .pre_order .tips {\n  width: 400px;\n  height: 50px;\n  line-height: 50px;\n}\n#cart .cart_bg .pre_order .tips ul li {\n  float: left;\n  font-size: 14px;\n  display: inline-block;\n  padding: 0 10px;\n  color: #666;\n}\n#cart .cart_bg .pre_order .tips ul li a {\n  color: #666;\n}\n#cart .cart_bg .pre_order .tips ul li a:hover {\n  color: #1baeae;\n}\n#cart .cart_bg .pre_order .tips ul li span {\n  display: inline-block;\n  color: #1baeae;\n  margin: 0 4px;\n}\n#cart .cart_bg .pre_order .order_div {\n  width: 500px;\n  height: 50px;\n  line-height: 50px;\n  font-size: 14px;\n  color: #1baeae;\n}\n#cart .cart_bg .pre_order .order_div .order_total span {\n  font-size: 24px;\n  font-weight: bold;\n}\n#cart .cart_bg .pre_order .order_div .order_button .order_button_d {\n  width: 200px;\n  height: 50px;\n  color: #fff;\n  background: #1baeae;\n  font-size: 20px;\n  border: none;\n  cursor: pointer;\n}\n#cart .cart_bg .pre_order .order_div .order_button .order_button_d:hover {\n  background: #1bd1d1;\n}\n\n#cart .cart_bg .pre_order .order_div .order_button .order_button_c {\n  width: 200px;\n  height: 50px;\n  color: #fff;\n  background: #aeadb2;\n  font-size: 20px;\n  border: none;\n  cursor: pointer;\n}\n\n#cart .cart_bg .pre_order .order_div .order_button .order_button_c:hover {\n  background: #aeadb2;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/detail.css",
    "content": "/*detail*/\n#detail .dc {\n    width: 100%;\n    height: 58px;\n    background: #f0f0f0;\n}\n\n#detail .dc .content {\n    height: 58px;\n    width: 1226px;\n}\n\n#detail .dc .content .title {\n    width: 300px;\n    height: 58px;\n    line-height: 58px;\n    font-size: 22px;\n    font-weight: bold;\n}\n\n#detail .dc .content nav {\n    display: inline-block;\n    width: 170px;\n    height: 58px;\n    line-height: 58px;\n}\n\n#detail .dc .content nav li {\n    font-size: 14px;\n    float: left;\n    display: block;\n    margin: 0px 5px;\n}\n\n#detail .dc .content nav li a {\n    color: #333;\n    font-size: 14px;\n}\n\n#detail .dc .content nav li a:hover {\n    color: #ff6700;\n}\n\n#detail .intro .left {\n    width: 560px;\n}\n\n#detail .intro .left > img {\n    width: 100%;\n    height: 100%;\n}\n\n#detail .intro .left .smallbox {\n    display: none;\n    background-color: rgba(0, 255, 0, 0.3);\n    width: 280px;\n    height: 280px;\n    position: absolute;\n    top: 0;\n    left: 0;\n}\n\n#detail .intro .left .swiper-container {\n    width: 100%;\n    height: 100%;\n    margin: 20px auto;\n    padding: 0 34px;\n    box-sizing: border-box;\n}\n\n#detail .intro .left .swiper-container .swiper-button-prev {\n    left: 0;\n    background-position: left;\n}\n\n#detail .intro .left .swiper-container .swiper-button-next {\n    right: 0;\n    background-position: right;\n}\n\n#detail .intro .right {\n    width: 620px;\n    background: #f8f8f8;\n    padding-bottom: 50px;\n}\n\n#detail .intro .right .sub_title {\n    font-size: 16px;\n    color: #b0b0b0;\n    line-height: 20px;\n    height: 100px;\n    margin-top: 44px;\n}\n\n#detail .intro .right .item_price {\n    width: 180px;\n    font-size: 18px;\n    color: #1baeae;\n    height: 100px;\n    font-weight: bold;\n    float: right;\n}\n\n#detail .intro .right .item_price del {\n    font-size: 14px;\n    margin-left: 5px;\n    color: #b0b0b0;\n    text-decoration: line-through;\n}\n\n#detail .intro .right .order {\n    height: 50px;\n    line-height: 50px;\n    float: right;\n}\n\n#detail .intro .right .order .car {\n    height: 50px;\n    width: 156px;\n    border: none;\n    background: #1baeae;\n    color: #fff;\n    font-size: 18px;\n    cursor: pointer;\n    margin-right: 40px;\n}\n\n#detail .intro .right .order .car:hover {\n    border: 1px solid #fff;\n}\n\n.swiper-container {\n    width: 300px;\n    height: 100%;\n}\n\n.swiper-container .swiper-wrapper .swiper-slide img {\n    width: 100%;\n    height: 100%;\n}\n\n.pro-policy {\n    height: 100px;\n    line-height: 50px;\n    float: right;\n    margin-top: 80px;\n}\n\n.pro-policy a {\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    cursor: default;\n    white-space: nowrap;\n    color: #b0b0b0;\n}\n\n.pro-policy span i {\n    font-size: 20px;\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    font-style: normal;\n    vertical-align: middle;\n}\n\n.pro-policy span em {\n    font-style: normal;\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    margin-left: 2px;\n    vertical-align: middle;\n}\n\n.tb-extra {\n    font-size: 13px;\n    margin-top: 40px;\n    height: 70px;\n    width: 55%;\n    float: left;\n}\n\n.tb-extra dl {\n    overflow: hidden;\n    *zoom: 1;\n}\n\n.tb-extra dl dt {\n    float: left;\n    width: 60px;\n    height: 22px;\n    line-height: 22px;\n    margin-bottom: 4px;\n    color: #6C6C6C;\n}\n\n.tb-extra dl dd a {\n    float: left;\n    margin-bottom: 15px;\n    margin-right: 15px;\n    height: 22px;\n    line-height: 22px;\n    color: #6C6C6C;\n}\n\n.goods img {\n    width: 100%;\n    margin-top: 2px;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/header.css",
    "content": "#header {\n    display: flex;\n    justify-content: center;\n    width: 100%;\n    height: 40px;\n    background-color: #333;\n}\n\n#header .center {\n    width: 1226px;\n    height: 40px;\n    flex-shrink: 0;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n}\n\n#header .center ul li a {\n    display: flex;\n    align-items: center;\n    height: 12px;\n    font-size: 14px;\n    color: #b0b0b0;\n    padding: 0 8px;\n    border-right: 1px solid #b0b0b0;\n}\n\n#header .center ul li:last-of-type a {\n    border-right: none;\n}\n\n#header .center .fl {\n    flex-shrink: 0;\n    display: flex;\n    width: 680px;\n}\n\n#header .center .fr {\n    display: flex;\n    height: 40px;\n}\n\n#header .center .fr .user {\n    width: 120px;\n    height: 40px;\n    line-height: 40px;\n    font-size: 12px;\n    text-align: center;\n    position: relative;\n}\n\n#header .center .fr .user:hover .username {\n    color: #1baeae;\n    background-color: #fff;\n}\n\n#header .center .fr .user:hover .selector {\n    padding: 7px 0;\n    height: 120px;\n}\n\n#header .center .fr .user .username {\n    display: block;\n    width: 100%;\n    height: 100%;\n    line-height: 40px;\n    color: #b0b0b0;\n    position: relative;\n    z-index: 201;\n}\n\n#header .center .fr .user .selector {\n    position: absolute;\n    left: 0;\n    top: 40px;\n    width: 100%;\n    z-index: 200;\n    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15);\n    height: 0;\n    background-color: #fff;\n    overflow: hidden;\n    transition: all 0.2s;\n}\n\n#header .center .fr .user .selector li {\n    width: 100%;\n    height: 27px;\n    margin-top: 8px;\n}\n\n#header .center .fr .user .selector li:hover a {\n    color: #1baeae;\n    background-color: #fafafa;\n}\n\n#header .center .fr .user .selector li a {\n    display: block;\n    width: 100%;\n    height: 100%;\n    line-height: 30px;\n    padding: 0;\n    border: 0;\n}\n\n#header .center .fr .login {\n    display: flex;\n    align-items: center;\n    width: 98px;\n    height: 40px;\n}\n\n#header .center .fr .login li a {\n    display: flex;\n    align-items: center;\n    height: 12px;\n    font-size: 12px;\n    color: #b0b0b0;\n    padding: 0 8px;\n    border-right: 1px solid #b0b0b0;\n}\n\n#header .center .fr .login li:last-of-type a {\n    border-right: none;\n}\n\n#header .center .fr .shopcart {\n    display: flex;\n    width: 120px;\n    font-size: 12px;\n    color: #fff;\n    margin: 0 20px;\n    justify-content: center;\n    align-items: center;\n    background-color: #1baeae;\n}\n\n\n#nav {\n    width: 100%;\n    height: 100px;\n    flex-shrink: 0;\n    position: relative;\n}\n\n#nav .banner_x {\n    width: 1226px;\n    height: 100%;\n    display: flex;\n}\n\n#nav .banner_x > a {\n    display: block;\n    height: 100%;\n}\n\n#nav .banner_x .logo {\n    width: 240px;\n    text-indent: -10000px;\n    background: url(../image/login-logo-2.png) no-repeat;\n    background-size: 100%;\n    background-position: center;\n    margin-top: 10px;\n}\n\n#nav .banner_x .icon-search {\n    width: 100px;\n    text-indent: -10000px;\n    background: url(\"../image/search.png\") no-repeat;\n    background-size: 50%;\n    background-position: center;\n}\n\n#nav .banner_x .list {\n    display: flex;\n    height: 100%;\n}\n\n#nav .banner_x .list a {\n    color: #000000;\n    text-decoration: none;\n    background-color: transparent;\n    -webkit-text-decoration-skip: objects;\n}\n\n#nav .banner_x .list > li {\n    display: flex;\n    align-items: center;\n    margin: 0 10px;\n    font-size: 16px;\n}\n\n#nav .banner_x .list > li:hover a {\n    color: #1baeae;\n}\n\n#nav .banner_x .fr {\n    display: flex;\n    justify-content: flex-end;\n    align-items: center;\n    height: 100%;\n    flex-grow: 1;\n}\n\n#nav .banner_x .fr .button {\n    box-sizing: border-box;\n    width: 50px;\n    height: 50px;\n    background-color: #fff;\n    border: 1px solid #ccc;\n    text-align: center;\n    line-height: 50px;\n    font-size: 18px;\n    font-weight: bold;\n    cursor: pointer;\n}\n\n#nav .banner_x .fr .button:active {\n    background-color: #1baeae;\n    color: #fff;\n}\n\n#nav .banner_x .fr .search {\n    position: relative;\n}\n\n#nav .banner_x .fr .search .text {\n    box-sizing: border-box;\n    width: 250px;\n    height: 50px;\n    border: 1px solid #ccc;\n    padding: 0 10px;\n}\n\n#nav .banner_x .fr .search .text:focus {\n    outline: none;\n    border: 1px solid #1baeae;\n}\n\n#nav .banner_x .fr .search .text:focus ~ .keyword_list {\n    display: block;\n}\n\n#nav .banner_x .fr .search .search_hot {\n    position: absolute;\n    top: 16px;\n    right: 12px;\n}\n\n#nav .banner_x .fr .search .search_hot a {\n    float: left;\n    display: block;\n    font-size: 12px;\n    height: 18px;\n    line-height: 18px;\n    margin-left: 5px;\n    padding: 0 5px;\n    background-color: #eee;\n    color: #757575;\n    transition: all 0.2s;\n}\n\n#nav .banner_x .fr .search .search_hot a:hover {\n    color: #fff;\n    background-color: #1baeae;\n}\n\n#nav .banner_x .fr .search .keyword_list {\n    display: none;\n    position: absolute;\n    top: 50px;\n    left: 0;\n    z-index: 100;\n    width: 250px;\n    box-sizing: border-box;\n    border: 1px solid #1baeae;\n}\n\n#nav .banner_x .fr .search .keyword_list li {\n    position: relative;\n    box-sizing: border-box;\n    width: 100%;\n    height: 30px;\n    padding: 6px 15px;\n    background-color: #fff;\n}\n\n#nav .banner_x .fr .search .keyword_list li:hover {\n    background-color: #fafafa;\n}\n\n#nav .banner_x .fr .search .keyword_list li a {\n    display: block;\n    width: 100%;\n    height: 100%;\n    font-size: 12px;\n}\n\n#nav .banner_x .fr .search .keyword_list li a .result {\n    float: right;\n    color: #b0b0b0;\n}\n\n.container {\n    width: 1226px;\n    *zoom: 1;\n    margin-right: auto;\n    margin-left: auto;\n}\n\n.container:before, .container:after {\n    content: \" \";\n    display: table;\n}\n\n.site-footer { font-size: 14px; line-height: 1.8; color: #a8aaba; background: #32333b;}\n.w1100 {width: 1100px;margin: 0 auto;}\n.fl {float: left;}\n.site-footer a { color: #a8aaba;}\n.site-footer a:hover { color: #1baeae !important;}\n.site-footer .footer-article { padding: 30px 0 20px; overflow: hidden;}\n.site-footer .contact { float: left; width: 280px;}\n.site-footer .contact dt { width: 90px;}\n.site-footer .contact .iconfont { width: 66px;height: 66px; display: block;float: left;background: url(../image/tel.png) center center no-repeat;background-size: 55px;}\n.site-footer .contact .text { font-size: 14px; line-height: 30px; color: #fff;}\n.site-footer .contact .tel { padding: 3px 0 15px; font-size: 20px; color: #fff;}\n.site-footer .contact a { display: block; width: 90px; font-size: 14px; line-height: 30px; color: #9b9ea0; text-align: center; border: 1px solid #9b9ea0; border-radius: 4px;}\n.site-footer .contact a:hover { color: #fff !important;}\n.site-footer .col-article { float: left; width: 171px;}\n.site-footer .col-article dt { margin-bottom: 15px; font-size: 16px; font-weight: normal; color: #d7d8d9;}\n.site-footer .col-article dd { margin-bottom: 8px; overflow: hidden;}\n.site-footer .col-article dd a { font-size: 12px; color: #9b9ea0; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;}\n.site-footer .wx { float: left; width: 135px; margin-right: 0;}\n.site-footer .wx dt { margin-bottom: 15px; font-size: 16px; font-weight: normal; color: #d7d8d9;}\n.site-footer .wx dd { margin-bottom: 15px;}\n.site-footer .wx dd img { display: block; width: 110px; height: 110px; margin: 5px 0; border-radius: 2px;}\n.site-footer .wx dd.other { margin-bottom: 0; line-height: 18px;}\n.site-footer .wx dd.other span { display: block; font-size: 12px;}\n.site-footer .wx dd.other a { display: inline-block; margin-right: 5px; font-size: 12px; line-height: 18px; vertical-align: top;}\n.footer-links { padding: 10px 0; border-top: 1px solid #41424c; border-bottom: 1px solid #41424c;}\n.footer-links p { font-size: 14px; color: #a8aaba;}\n.footer-links a { margin-right: 20px; font-size: 12px; color: #a8aaba;}\n.footer-info .info-text { padding: 20px 0; font-size: 12px; text-align: center;}\n.footer-info .info-text .nav-bottom { padding: 20px 0 5px; font-size: 14px; color: #ccc; text-align: center;}\n.footer-info .info-text .nav-bottom a { padding: 0 8px; color: #9b9ea0;}\n.footer-info .info-text .copyright { padding-top: 5px;}\n.footer-info .info-text em { padding: 0 8px;}\n"
  },
  {
    "path": "src/main/resources/static/mall/styles/index.css",
    "content": ".all-sort-list {\n    position: relative;\n    float: left;\n    width: 228px;\n    border-top: none;\n    background: #000;\n    height: 100%;\n}\n\n.all-sort-list .item {\n    height: 49px;\n    border-top: 1px solid #FFFFFF;\n}\n\n.all-sort-list .item.bo {\n    border-top: none;\n}\n\n.all-sort-list .item h3 {\n    height: 30px;\n    line-height: 45px;\n    font-size: 15px;\n    font-weight: normal;\n    width: 199px;\n    overflow: hidden;\n}\n\n.all-sort-list .item span {\n    padding: 0px 5px;\n    color: #1baeae;\n    font-family: \"\\5B8B\\4F53\";\n}\n\n.all-sort-list .item a {\n    color: #fff;\n    text-decoration: none;\n}\n\n.all-sort-list .item a:hover {\n    font-weight: bold;\n    color: #1baeae;\n}\n\n.all-sort-list .item-list {\n    display: none;\n    position: absolute;\n    width: 495px;\n    min-height: 200px;\n    _height: 200px;\n    background: #FFF;\n    left: 210px;\n    box-shadow: 0px 0px 10px #DDDDDD;\n    border: 1px solid #DDD;\n    top: 3px;\n    z-index: 10;\n}\n\n.item-list .subitem {\n    float: left;\n    width: 477px;\n    padding: 0px 4px 0px 8px;\n}\n\n.item-list .subitem dl {\n    border-top: 1px solid #EEE;\n    padding: 6px 0px;\n    overflow: hidden;\n    zoom: 1;\n}\n\n.item-list .subitem .fore1 {\n    border-top: none;\n}\n\n.item-list .subitem dt {\n    float: left;\n    width: 84px;\n    line-height: 20px;\n    text-align: left;\n    padding: 3px 6px 0px 0px;\n    font-weight: 700;\n    color: #1baeae;\n}\n\n.item-list .subitem dt a {\n    color: #1baeae;\n    text-decoration: underline;\n}\n\n.item-list .subitem dd {\n    float: left;\n    width: 415px;\n    padding: 3px 0px 0px;\n    overflow: hidden;\n}\n\n.item-list .subitem dd em {\n    float: left;\n    height: 14px;\n    line-height: 14px;\n    padding: 0px 8px;\n    margin-top: 5px;\n    border-left: 1px solid #CCC;\n}\n\n.item-list .subitem dd em a, .item-list .cat-right dd a {\n    color: #666;\n    text-decoration: none;\n}\n\n.item-list .subitem dd em a:hover, .item-list .cat-right dd a:hover {\n    font-weight: normal;\n    text-decoration: underline;\n}\n\n#content {\n    display: flex;\n    justify-content: center;\n    flex-wrap: wrap;\n    width: 100%;\n}\n\n#content #banner {\n    width: 1226px;\n    flex-shrink: 0;\n    height: 447px;\n}\n\n#content #banner #cate_menu {\n    width: 234px;\n    height: 100%;\n    background-color: #0c0c13;\n    box-sizing: border-box;\n    position: relative;\n}\n\n#content #banner #cate_menu > ul {\n    position: relative;\n    padding: 20px 0;\n}\n\n#content #banner #cate_menu > ul:hover li:last-of-type {\n    display: block;\n}\n\n#content #banner #cate_menu > ul > li {\n    display: flex;\n    align-items: center;\n    height: 40px;\n    padding: 0 30px;\n    font-size: 14px;\n}\n\n#content #banner #cate_menu > ul > li:last-of-type {\n    display: none;\n    padding: 0;\n    width: 800px;\n    height: 461px;\n    z-index: 2;\n    position: absolute;\n    left: 100%;\n    top: 0;\n}\n\n#content #banner #cate_menu > ul > li:hover {\n    background-color: #1baeae;\n}\n\n#content #banner #cate_menu > ul > li a {\n    color: #fff;\n    margin-left: 10px;\n}\n\n#content #banner #cate_menu > ul > li .pop {\n    box-shadow: 2px 3px 5px #ccc;\n    width: 800px;\n    height: 461px;\n    background-color: #fff;\n    padding: 20px 0 0 20px;\n    font-size: 12px;\n    box-sizing: border-box;\n}\n\n#content #banner #cate_menu > ul > li .pop > li {\n    margin-bottom: 10px;\n    white-space: nowrap;\n}\n\n#content #banner #cate_menu > ul > li .pop > li .title {\n    float: left;\n    width: 70px;\n    height: 20px;\n    line-height: 20px;\n    font-weight: bold;\n}\n\n#content #banner #cate_menu > ul > li .pop > li .title .iconfont {\n    font-size: 12px;\n}\n\n#content #banner #cate_menu > ul > li .pop > li .list {\n    float: left;\n    max-width: 700px;\n}\n\n#content #banner #cate_menu > ul > li .pop > li .list li {\n    float: left;\n    margin-top: 2px;\n    margin-bottom: 5px;\n}\n\n#content #banner #cate_menu > ul > li .pop > li .list li a {\n    display: block;\n    height: 16px;\n    margin-left: 0;\n    line-height: 16px;\n    white-space: nowrap;\n    padding: 0 10px;\n    text-align: center;\n    color: #666;\n    border-left: 1px solid #e0e0e0;\n}\n\n#content #banner #cate_menu > ul > li .pop > li .list li a:hover {\n    color: #1baeae;\n}\n\n#content #banner .swiper-container {\n    width: 998px;\n    height: 100%;\n}\n\n#content #banner .swiper-container .swiper-wrapper .swiper-slide img {\n    width: 100%;\n    height: 100%;\n}\n\n#content #sub_banner {\n    display: flex;\n    width: 1226px;\n    flex-shrink: 0;\n    justify-content: space-between;\n    height: 295px;\n    margin-top: 15px;\n}\n\n#content #sub_banner .selector {\n    width: 234px;\n    height: 100%;\n}\n\n#content #sub_banner .selector .sidebar {\n    float: left;\n    display: block;\n    width: 78px;\n    height: 85px;\n}\n\n#content #sub_banner .selector .sidebar img {\n    opacity: 0.8;\n}\n\n#content #sub_banner .selector .sidebar img:hover {\n    opacity: 1;\n}\n\n#content #sub_banner .hot-image {\n    width: 295px;\n    height: 295px;\n}\n\n#content #sub_banner .hot-image a {\n    display: block;\n    width: 100%;\n    height: 100%;\n}\n\n#content #sub_banner .hot-image a img {\n    width: 100%;\n    height: 100%;\n    opacity: 0.8;\n}\n\n#content #sub_banner .hot-image a img:hover {\n    opacity: 1;\n}\n\n#content #flash {\n    width: 1226px;\n    flex-shrink: 0;\n    height: 398px;\n    margin-top: 20px;\n}\n\n#content #flash > h2 {\n    height: 58px;\n    line-height: 58px;\n}\n\n#content #flash ul {\n    display: flex;\n    justify-content: space-between;\n}\n\n#content #flash ul li {\n    width: 234px;\n    height: 352px;\n    background-color: #fafafa;\n    border-top: 1px solid #ffa500;\n}\n\n#content #flash ul li:nth-child(2) {\n    border-color: #008000;\n}\n\n#content #flash ul li:nth-child(3) {\n    border-color: #00f;\n}\n\n#content #flash ul li:nth-child(4) {\n    border-color: #f00;\n}\n\n#content #flash ul li:nth-child(5) {\n    border-color: #008080;\n}\n\n#content #flash ul li a {\n    display: block;\n    font-size: 14px;\n    text-align: center;\n}\n\n#content #flash ul li a img {\n    width: 160px;\n    height: 160px;\n    opacity: 0.8;\n    margin: 37px;\n}\n\n#content #flash ul li a .discount {\n    font-size: 12px;\n    color: #b0b0b0;\n    margin: 15px 0;\n}\n\n#content #flash ul li a .item_price {\n    color: #1baeae;\n}\n\n#content #flash ul li a:hover img {\n    opacity: 1;\n}\n\n#content #flash .time {\n    background-color: #f1eded;\n}\n\n#content #flash .time .name {\n    margin-top: 53px;\n    font-size: 21px;\n    color: #ef3a3b;\n}\n\n#content #flash .time img {\n    width: 34px;\n    height: 53px;\n}\n\n#content #flash .time .text {\n    font-size: 15px;\n    color: rgba(0, 0, 0, 0.54);\n}\n\n#content #flash .time .flashTime {\n    margin: 28px 33px 0;\n    color: #fff;\n    font-size: 24px;\n    line-height: 46px;\n    display: flex;\n    justify-content: center;\n}\n\n#content #flash .time .flashTime .box {\n    width: 46px;\n    height: 46px;\n    background-color: #605751;\n}\n\n#content #flash .time .flashTime .dosh {\n    height: 46px;\n    font-size: 28px;\n    color: #605751;\n}\n\n#content #recommend {\n    width: 1226px;\n    position: relative;\n    flex-shrink: 0;\n    height: 730px;\n    margin-top: 20px;\n    background-color: #f5f5f5;\n}\n\n#content #recommend > h2 {\n    height: 58px;\n    line-height: 58px;\n}\n\n#content #recommend .more {\n    position: absolute;\n    top: 18px;\n    right: 30px;\n}\n\n#content #recommend .more:hover {\n    color: #1baeae;\n}\n\n#content #recommend ul {\n    display: flex;\n    height: 614px;\n    justify-content: space-between;\n    align-content: space-between;\n    flex-wrap: wrap;\n}\n\n#content #recommend ul li {\n    width: 234px;\n    height: 314px;\n    background-color: #fff;\n    margin-bottom: 20px;\n    margin-left: 4px;\n    margin-right: 6px;\n}\n\n#content #recommend ul li:nth-child(1) .hot-image,\n#content #recommend ul li:nth-child(6) .hot-image {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n}\n\n#content #recommend ul li:hover {\n    box-shadow: 0px 0px 30px #ccc;\n}\n\n#content #recommend ul li:hover .comment {\n    transform: translateY(0);\n}\n\n#content #recommend ul li a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    font-size: 14px;\n    text-align: center;\n    width: 100%;\n    height: 100%;\n    position: relative;\n    overflow: hidden;\n}\n\n#content #recommend ul li a .info {\n    width: 104px;\n    height: 20px;\n    text-align: center;\n    line-height: 20px;\n    color: #fff;\n    font-size: 10px;\n}\n\n#content #recommend ul li a .new {\n    background-color: #83c44e;\n}\n\n#content #recommend ul li a .discount {\n    background-color: #f00;\n}\n\n#content #recommend ul li a > p {\n    height: 25px;\n    line-height: 25px;\n    font-size: 14px;\n}\n\n#content #recommend ul li a .item_price {\n    color: #1baeae;\n}\n\n#content #recommend ul li a .counter {\n    height: 15px;\n    line-height: 15px;\n    color: #aaa;\n    font-size: 12px;\n}\n\n#content #recommend ul li a img {\n    width: 160px;\n    height: 160px;\n    margin: 10px 0 20px;\n}\n\n#content #recommend ul li a .comment {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    transform: translateY(101%);\n    transition: transform 0.4s;\n    box-sizing: border-box;\n    height: 70px;\n    padding: 10px 0 0 30px;\n    background-color: #1baeae;\n    color: #fff;\n    text-align: left;\n}\n\n#content #recommend ul li a .comment p {\n    font-size: 12px;\n    margin-top: 5px;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/login.css",
    "content": "body {\n    background: #14212a;\n}\n\n.top {\n    width: 100%;\n    height: 100px;\n    background: #fff;\n}\n\n.top .logo {\n    width: 1130px;\n    height: 160px;\n}\n\n.top .logo img {\n    border: none;\n    margin-top: -15px;\n}\n\n.form {\n    width: 1130px;\n    height: 588px;\n    background: url(\"../image/login_bg.png\") no-repeat center center;\n}\n\n.form .login {\n    width: 400px;\n    height: 470px;\n    margin: 30px auto;\n    background: #444;\n    color: #fff;\n    margin-right: 0px;\n    border-radius: 4px;\n    font: 12px \"宋体\", Times New Roman;\n}\n\n.form .login .login_center {\n    width: 360px;\n    margin: 10px auto;\n    padding: 30px 0;\n}\n\n.form .login .login_center.hide {\n    display: none;\n}\n\n.form .login .login_center .login_top {\n    margin: 10px 0;\n}\n\n.form .login .login_center .login_top .left {\n    height: 40px;\n    line-height: 40px;\n    font-weight: bold;\n    font-size: 20px;\n}\n\n.form .login .login_center .login_top .right {\n    height: 40px;\n    line-height: 40px;\n    font-size: 13px;\n}\n\n.form .login .login_center .login_top .right a {\n    color: #1baeae;\n    font-weight: bold;\n}\n\n.form .login .login_center .login_top .right a:hover {\n    color: #1baeae;\n}\n\n.form .login .login_center .login_top .under-line {\n    height: 2px;\n    background: #1baeae;\n    margin: 8px 0;\n}\n\n.form .login .login_center .login_main {\n    padding: 5px 0;\n}\n\n.form .login .login_center .login_main input:focus {\n    border: 1px solid #1baeae;\n}\n\n.form .login .login_center .login-info {\n    font: 16px Times New Roman;\n    height: 40px;\n    line-height: 40px;\n    margin: 35px 0;\n}\n\n.form .login .login_center .login-info .login-info-input {\n    width: 220px;\n    height: 30px;\n    border: 1px solid #ccc;\n    padding: 5px 10px;\n}\n\n.form .login .login_center .login-info .verify-code {\n    width: 100px;\n    height: 30px;\n    padding: 5px 10px;\n}\n\n.form .login .login_center .login-info .send {\n    width: 100px;\n    height: 42px;\n    margin-left: 12px;\n}\n\n.form .login .login_center .login_submit .submit {\n    border: none;\n    width: 240px;\n    height: 45px;\n    margin-left: 55px;\n    background: #1baeae;\n    color: #fff;\n    font-size: 20px;\n    font-weight: bold;\n    letter-spacing: 2px;\n    cursor: pointer;\n    border-radius: 4px;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/my-orders.css",
    "content": "#personal {\n    width: 100%;\n    height: auto;\n    background: #f5f5f5;\n    padding-bottom: 20px;\n    padding-top: 20px;\n}\n\n#personal .self-info {\n    width: 1226px;\n}\n\n#personal .self-info .lfnav {\n    width: 234px;\n    height: 500px;\n    background: #fff;\n}\n\n#personal .self-info .lfnav .nav_title {\n    width: 234px;\n    height: 40px;\n    line-height: 40px;\n    font-size: 19px;\n    margin: 30px 20px 10px 40px;\n    color: #333;\n}\n\n#personal .self-info .lfnav .title_list ul li {\n    display: block;\n    width: 194px;\n    height: 40px;\n    line-height: 40px;\n    padding-left: 40px;\n}\n\n#personal .self-info .lfnav .title_list ul li .active {\n    color: #1baeae;\n    font-weight: bold;\n}\n\n#personal .self-info .lfnav .title_list ul li a {\n    color: #757575;\n}\n\n#personal .self-info .lfnav .title_list ul li a:hover {\n    color: #333;\n}\n\n#personal .self-info .intro {\n    width: 978px;\n    background: #fff;\n}\n\n#personal .self-info .intro .grzlbt {\n    width: 938px;\n    height: 60px;\n    line-height: 60px;\n    font-size: 20px;\n    color: #757575;\n}\n\n#personal .self-info .intro .info_item {\n    height: 45px;\n    line-height: 45px;\n    width: 900px;\n    background: #fdfdfd;\n    border: 1px solid #aaa;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border-radius: 3px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(1) {\n    display: inline-block;\n    font-size: 15px;\n    font-weight: bold;\n    color: #757575;\n    width: 70px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 20px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(2) {\n    display: inline-block;\n    font-size: 15px;\n    color: #757575;\n    width: 480px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 120px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(3) {\n    display: inline-block;\n    font-size: 15px;\n    width: 160px;\n    height: 45px;\n    line-height: 45px;\n    text-align: right;\n}\n\n#personal .self-info .intro .info_item span a {\n    color: #008080;\n}\n\n#personal .self-info .intro .info_item span a:hover {\n    color: #1baeae;\n}\n\n.uc-main-box {\n    padding: 36px 0;\n}\n\n.uc-box {\n    background: #fff;\n}\n\n.uc-content-box {\n    margin: 0 48px;\n}\n\n.uc-content-box .box-hd .title {\n    margin: 0;\n    font-size: 30px;\n    font-weight: 400;\n    line-height: 68px;\n    color: #757575;\n}\n\n.uc-content-box .box-hd small {\n    margin-left: 10px;\n    font-size: 12px;\n    line-height: 1.5;\n}\n\n.uc-content-box .box-hd small a {\n    color: #757575;\n}\n\n.uc-content-box .box-hd .more {\n    border-bottom: 0;\n}\n\n.uc-content-box .box-hd .filter-list {\n    float: left;\n    margin: 0;\n    padding: 18px 0;\n    list-style-type: none;\n    font-size: 16px;\n    line-height: 1.25;\n}\n\n.uc-content-box .box-hd .filter-list li.tab-active, .uc-content-box .box-hd .filter-list li.active {\n    color: #1baeae;\n}\n\n.box-hd .filter-list li.active a {\n    color: #1baeae;\n}\n\n.uc-content-box .box-hd .filter-list li {\n    float: left;\n    padding: 0 20px;\n    border-left: 1px solid #e0e0e0;\n    color: #757575;\n}\n\n.uc-content-box .box-hd .filter-list a {\n    color: #757575;\n}\n\n.uc-content-box .box-hd .search-form {\n    float: right;\n    position: relative;\n    width: 262px;\n    height: 40px;\n    margin-top: 8px;\n}\n\n.uc-content-box .box-hd .search-text {\n    position: absolute;\n    top: 0;\n    right: 41px;\n    z-index: 1;\n    width: 189px;\n    height: 40px;\n    padding: 0 15px;\n    border: 1px solid #e0e0e0;\n    font-size: 12px;\n    line-height: 40px;\n    outline: 0;\n    color: #757575;\n    -webkit-transition: all .2s;\n    transition: all .2s;\n}\n\n.uc-content-box .box-hd .search-btn {\n    position: absolute;\n    right: 0;\n    top: 0;\n    z-index: 2;\n    width: 39px;\n    height: 38px;\n    border: 1px solid #e0e0e0;\n    font-size: 24px;\n    line-height: 24px;\n    background: #fff;\n    color: #616161;\n    outline: 0;\n    -webkit-transition: all .2s;\n    transition: all .2s;\n}\n\n.uc-content-box .box-hd .icon-search {\n    width: 39px;\n    text-indent: -10000px;\n    background: url(../image/search.png) no-repeat;\n    background-size: 50%;\n    background-position: center;\n}\n\n.clearfix:after {\n    clear: both;\n}\n\n.clearfix:before, .clearfix:after {\n    content: \" \";\n    display: table;\n}\n\n.order-list-box .order-list {\n    margin: 0;\n    padding: 10px 0;\n    list-style-type: none;\n}\n\n.order-list-box .uc-order-item-list {\n    border-color: #b0b0b0;\n}\n\n.order-list-box .uc-order-item {\n    margin-bottom: 20px;\n    border: 1px solid #e0e0e0;\n}\n\n.uc-order-item {\n    position: relative;\n}\n\n.order-list-box .order-summary {\n    padding: 25px 30px 1px;\n}\n\n.uc-order-item-list .order-status-closed, .uc-order-item-list .order-desc {\n    color: #b0b0b0;\n}\n\n.uc-order-item-list .order-status-need-pay {\n    color: #1baeae;\n}\n\n.uc-order-item-list .order-status-success {\n    color: green;\n}\n\n.order-list-box .order-detail-table {\n    width: 100%;\n}\n\n.order-list-box .order-detail-table th.col-main {\n    padding-right: 10px;\n}\n\n.order-list-box .uc-order-item-list .order-detail-table th {\n    border-bottom: 1px solid #e0e0e0;\n}\n\n.order-list-box .order-detail-table th {\n    height: 28px;\n    padding: 0 30px 24px;\n    border-bottom: 1px solid #e0e0e0;\n    font-weight: 400;\n    text-align: left;\n    color: #757575;\n    vertical-align: bottom;\n}\n\n.order-list-box .order-detail-table th p {\n    margin: 0;\n    font-size: 13px;\n}\n\n.order-list-box .order-detail-table th .sep {\n    color: #e0e0e0;\n    margin-right: 4px;\n    margin-left: 4px;\n}\n\n.order-list-box .order-detail-table th.col-sub {\n    width: 240px;\n    padding-left: 10px;\n    text-align: right;\n}\n\n.order-list-box .order-detail-table th .num {\n    height: 18px;\n    margin-right: 5px;\n    font-size: 28px;\n    font-weight: 200;\n    line-height: 1;\n    color: #333;\n}\n\n.order-list-box .order-detail-table td {\n    padding: 0 30px;\n}\n\n.order-list-box .goods-list {\n    margin: 0;\n    padding: 10px 0;\n    list-style-type: none;\n}\n\n.order-list-box .goods-list li {\n    position: relative;\n    height: 44px;\n    margin: 10px 0;\n    padding: 18px 18px 18px 100px;\n    line-height: 22px;\n    color: #333;\n}\n\n.hide {\n    display: none !important;\n}\n\np {\n    display: block;\n    margin-block-start: 1em;\n    margin-block-end: 1em;\n    margin-inline-start: 0px;\n    margin-inline-end: 0px;\n}\n\n.order-list-box .goods-list .figure-thumb {\n    position: absolute;\n    left: 0;\n    top: 0;\n}\n\n.order-list-box .goods-list .figure-thumb a {\n    display: block;\n}\n\na {\n    color: #757575;\n    text-decoration: none;\n}\n\n.order-list-box .goods-list .figure-thumb img {\n    width: 80px;\n    height: 80px;\n}\n\n.order-list-box .goods-list .name {\n    margin: 0;\n}\n\n.order-list-box .goods-list .name a {\n    color: #333;\n}\n\n.order-list-box .goods-list .price {\n    margin: 0;\n}\n\n.order-list-box .order-detail-table .order-actions {\n    padding-top: 20px;\n    text-align: right;\n    vertical-align: top;\n}\n\n.order-list-box .order-detail-table td {\n    padding: 0 30px;\n}\n\n.order-list-box .order-detail-table .order-actions .btn {\n    display: block;\n    margin: 0 0 10px auto;\n}\n\n.btn-line-gray {\n    border-color: #b0b0b0;\n    background: #fff;\n    color: #757575;\n}\n\n.btn-line-pay {\n    border-color: #b0b0b0;\n    background: #fff;\n    color: #1baeae;\n}\n\n.btn-small {\n    width: 118px;\n    height: 28px;\n    font-size: 12px;\n    line-height: 28px;\n}\n\n.newbee-pagenavi {\n    height: 30px;\n    padding: 15px 0;\n    text-align: center;\n}\n\n.newbee-pagenavi .numbers {\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    width: 48px;\n    height: 24px;\n    padding: 3px 0;\n    margin: 0 7px;\n    font-size: 18px;\n    font-weight: 200;\n    line-height: 24px;\n    color: #b0b0b0;\n}\n\n.newbee-pagenavi .iconfont {\n    font-size: 24px;\n    vertical-align: bottom;\n}\n\n.newbee-pagenavi .current {\n    background-color: #757575;\n    color: #fff;\n}\n\n.newbee-pagenavi a.numbers {\n    -webkit-transition: all .2s linear;\n    transition: all .2s linear\n}\n\n.newbee-pagenavi a.numbers:hover {\n    background: #b0b0b0;\n    color: #fff\n}\n\n.order-list-box .order-detail-table th.col-main {\n    padding-right: 10px;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/main/resources/static/mall/styles/order-detail.css",
    "content": "#personal {\n    width: 100%;\n    height: auto;\n    background: #f5f5f5;\n    padding-bottom: 20px;\n    padding-top: 20px;\n}\n\n#personal .self-info {\n    width: 1226px;\n}\n\n#personal .self-info .lfnav {\n    width: 234px;\n    height: 500px;\n    background: #fff;\n}\n\n#personal .self-info .lfnav .nav_title {\n    width: 234px;\n    height: 40px;\n    line-height: 40px;\n    font-size: 19px;\n    margin: 30px 20px 10px 40px;\n    color: #333;\n}\n\n#personal .self-info .lfnav .title_list ul li {\n    display: block;\n    width: 194px;\n    height: 40px;\n    line-height: 40px;\n    padding-left: 40px;\n}\n\n#personal .self-info .lfnav .title_list ul li .active {\n    color: #1baeae;\n    font-weight: bold;\n}\n\n#personal .self-info .lfnav .title_list ul li a {\n    color: #757575;\n}\n\n#personal .self-info .lfnav .title_list ul li a:hover {\n    color: #333;\n}\n\n#personal .self-info .intro {\n    width: 978px;\n    background: #fff;\n}\n\n#personal .self-info .intro .grzlbt {\n    width: 938px;\n    height: 60px;\n    line-height: 60px;\n    font-size: 20px;\n    color: #757575;\n}\n\n#personal .self-info .intro .info_item {\n    height: 45px;\n    line-height: 45px;\n    width: 900px;\n    background: #fdfdfd;\n    border: 1px solid #aaa;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border-radius: 3px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(1) {\n    display: inline-block;\n    font-size: 15px;\n    font-weight: bold;\n    color: #757575;\n    width: 70px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 20px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(2) {\n    display: inline-block;\n    font-size: 15px;\n    color: #757575;\n    width: 480px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 120px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(3) {\n    display: inline-block;\n    font-size: 15px;\n    width: 160px;\n    height: 45px;\n    line-height: 45px;\n    text-align: right;\n}\n\n#personal .self-info .intro .info_item span a {\n    color: #008080;\n}\n\n#personal .self-info .intro .info_item span a:hover {\n    color: #1baeae;\n}\n\n.uc-main-box {\n    padding: 36px 0;\n}\n\n.uc-box {\n    background: #fff;\n}\n\n.uc-content-box {\n    margin: 0 48px;\n}\n\n.uc-content-box .box-hd .title {\n    margin: 0;\n    font-size: 30px;\n    font-weight: 400;\n    line-height: 68px;\n    color: #757575;\n}\n\n.uc-content-box .box-hd small {\n    margin-left: 10px;\n    font-size: 12px;\n    line-height: 1.5;\n}\n\n.uc-content-box .box-hd small a {\n    color: #757575;\n}\n\n.uc-content-box .box-hd .more {\n    border-bottom: 1px solid #e0e0e0;\n}\n\n.uc-content-box .box-hd .subtitle {\n    float: left;\n    font-size: 18px;\n    font-weight: 400;\n    color: #333;\n}\n\n.uc-content-box .box-hd .tag-subsidy {\n    background-color: #2196f3;\n}\n\n.uc-content-box .box-hd .tag {\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    padding: 0 12px;\n    margin-left: 10px;\n    margin-top: -2px;\n    font-size: 12px;\n    color: #fff;\n    vertical-align: middle;\n}\n\n.uc-content-box .box-hd .actions {\n    float: right;\n    padding-top: 5px;\n}\n\n.uc-content-box .box-hd .actions .btn {\n    margin-left: 5px;\n}\n.btn-line-gray {\n    border-color: #b0b0b0;\n    background: #fff;\n    color: #757575;\n}\n.btn-small {\n    width: 118px;\n    height: 28px;\n    font-size: 12px;\n    line-height: 28px;\n}\n.btn {\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    width: 158px;\n    height: 38px;\n    padding: 0;\n    margin: 0;\n    border: 1px solid #b0b0b0;\n    font-size: 14px;\n    line-height: 38px;\n    text-align: center;\n    color: #b0b0b0;\n    cursor: pointer;\n    -webkit-transition: all .4s;\n    transition: all .4s;\n}\n\n.btn-primary {\n    background: #1baeae;\n    border-color: #1baeae;\n    color: #fff;\n}\n\n.uc-order-item {\n    position: relative;\n}\n\n.order-view-box .uc-order-item .order-detail {\n    padding: 25px 0;\n    margin-bottom: 5px;\n}\n\n.order-view-box .uc-order-item .order-status {\n    margin-bottom: 25px;\n}\n.uc-order-item-pay .order-status, .uc-order-item-pay .order-desc {\n    color: #1baeae;\n}\n.uc-order-item .order-status {\n    font-size: 18px;\n}\n\n.order-view-box .uc-order-item .order-desc {\n    margin: -15px 0 25px;\n}\n.uc-order-item-pay .order-status, .uc-order-item-pay .order-desc {\n    color: #1baeae;\n}\n.uc-order-item .order-desc {\n    margin: 10px 0 0;\n}\n\n.order-view-box .uc-order-item .order-progress {\n    height: 65px;\n    margin-bottom: 15px;\n}\n\n.order-view-box .uc-order-item .progress-list {\n    width: 880px;\n    height: 20px;\n    margin: 0 auto;\n    padding: 0;\n    list-style-type: none;\n    border-radius: 20px;\n    font-size: 12px;\n    line-height: 20px;\n    text-align: center;\n    color: #424242;\n    background-color: #eee;\n}\n\n.order-view-box .uc-order-item .progress-list .step-active {\n    border-top-right-radius: 20px;\n    border-bottom-right-radius: 20px;\n    background-color: #83c44e;\n    color: #fff;\n}\n\n.order-view-box .uc-order-item .progress-list .step-first {\n    border-top-left-radius: 20px;\n    border-bottom-left-radius: 20px;\n    background-color: #83c44e;\n    color: #fff;\n}\n.order-view-box .uc-order-item .progress-list .step {\n    float: left;\n    width: 176px;\n    height: 20px;\n}\n\n.order-view-box .uc-order-item .progress-list .step-done {\n    background-color: #83c44e;\n    color: #fff\n}\n\n.order-view-box .uc-order-item .progress-list .step-last {\n    border-top-right-radius: 20px;\n    border-bottom-right-radius: 20px;\n}\n\n.order-view-box .uc-order-item .progress-list .step .info {\n    margin-top: 15px;\n    color: #757575;\n}\n\n.uc-content-box .box-hd .clearfix {\n    *zoom: 1;\n}\n\n.uc-content-box .box-hd .clearfix::after {\n    content: \"\";\n    height: 16px;\n    display: block;\n    clear: both;\n    visibility: hidden;\n}\n\n.order-view-box .uc-order-item .order-detail table {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n\n/**\n.order-view-box .uc-order-item .order-detail\n */\n\ntable {\n    display: table;\n    border-collapse: separate;\n    border-spacing: 2px;\n    border-color: grey;\n}\n\ntd {\n    display: table-cell;\n    vertical-align: inherit;\n}\n\n.order-view-box .uc-order-item .order-items-table .col {\n    height: 90px;\n    border-bottom: 1px solid #e0e0e0;\n    text-align: left;\n    color: #333;\n}\n\n.order-view-box .uc-order-item .order-items-table .figure-thumb {\n    width: 80px;\n}\n\n.order-view-box .uc-order-item .order-items-table .figure-thumb a {\n    display: block;\n}\n\n.order-view-box .uc-order-item .order-items-table .figure-thumb img {\n    width: 80px;\n    height: 80px;\n    border: 0;\n}\n\n.order-view-box .uc-order-item .order-items-table .col-name {\n    width: 290px;\n}\n.order-view-box .uc-order-item .order-items-table .col {\n    height: 90px;\n    border-bottom: 1px solid #e0e0e0;\n    text-align: left;\n    color: #333;\n}\n\n.order-view-box .uc-order-item .order-items-table .name {\n    margin: 0;\n}\n\n.order-view-box .uc-order-item .order-items-table .name a {\n    color: #333;\n}\n\n.order-view-box .uc-order-item .order-items-table .price {\n    margin: 0;\n}\n\n.order-view-box .uc-order-item .order-items-table .col-actions {\n    width: 120px;\n    padding: 0;\n    text-align: right;\n}\n\n.order-view-box .uc-order-item .order-detail-info {\n    position: relative;\n    _height: 120px;\n    height: auto;\n    min-height: 120px;\n    padding: 6px 0 12px;\n    margin-bottom: 30px;\n    border-bottom: 1px solid #e0e0e0;\n}\n\n.order-view-box .uc-order-item .order-detail-info h3 {\n    margin: 0 0 15px;\n    font-size: 18px;\n    font-weight: 400;\n    color: #333;\n}\n\n.order-view-box .uc-order-item .order-detail-info .info-table {\n    color: #757575;\n}\n\n.order-view-box .uc-order-item .order-detail-info .info-table th {\n    width: 80px;\n    font-weight: 400;\n}\n\n.order-view-box .uc-order-item .order-detail-info .actions {\n    position: absolute;\n    top: 5px;\n    right: 0;\n}\n\n.order-view-box .uc-order-item .order-detail-info .actions .btn {\n    display: block;\n    margin: 0 0 10px auto;\n}\n\n.order-view-box .uc-order-item .order-detail-info .info-table {\n    color: #757575;\n}\n\n.order-view-box .uc-order-item .order-detail-total .total-table {\n    width: 255px;\n    margin: 0 0 0 auto;\n    color: #757575;\n}\n\n.order-view-box .uc-order-item .order-detail-total .total-table th {\n    width: 100px;\n    font-weight: 400;\n    text-align: right;\n}\n\n.order-view-box .uc-order-item .order-detail-total .num {\n    margin-right: .125em;\n}\n.order-view-box .uc-order-item .order-detail-total .total-table td {\n    text-align: right;\n    color: #1baeae;\n}\n\n.order-view-box .uc-order-item .order-detail-total .total-table th.total, .order-view-box .uc-order-item .order-detail-total .total-table td.total {\n    padding-top: 25px;\n    vertical-align: text-bottom;\n}\n\n.order-view-box .uc-order-item .order-detail-total .total-table th.total .num, .order-view-box .uc-order-item .order-detail-total .total-table td.total .num {\n    font-size: 30px;\n    font-weight: 200;\n    line-height: 1;\n}\n\n.uc-order-item-list .order-status, .uc-order-item-list .order-desc {\n    color: #b0b0b0;\n}\n\n\n\n\n"
  },
  {
    "path": "src/main/resources/static/mall/styles/order-settle.css",
    "content": ".order-header {\n  position: relative;\n}\n.order-header .newbee-mall-logo {\n  width: 100px;\n  height: 85px;\n  margin: 20px 360px;\n}\n.order-header span {\n  font-size: 22px;\n  position: absolute;\n  left: 496px;\n  top: 45px;\n}\n.order-header .order-process {\n  margin-left: -120px;\n  position: absolute;\n  top: 30px;\n}\n.p1 {\n  color: #696969;\n  text-indent: 360px;\n}\n.section {\n  width: 1050px;\n  border: 1px solid #e3e4e5;\n  margin: 10px 360px 160px;\n}\n.section .top-2 {\n  display: flex;\n  justify-content: space-between;\n}\n.section .top-2 span {\n  font-size: 14px;\n  padding: 10px 25px;\n}\n.section .top-2 span:first-child {\n  font-weight: 600;\n}\n.section .top-2 span:last-child {\n  color: #1baeae;\n}\n.section .top-3 {\n  width: 600px;\n  height: 50px;\n  display: flex;\n  align-items: center;\n  margin-left: 50px;\n}\n.section .top-3 p {\n  width: 135px;\n  height: 27px;\n  border: 1px solid #1baeae;\n  line-height: 27px;\n  font-size: 12px;\n  text-align: center;\n  color: #696969;\n}\n.section .top-3 span {\n  font-size: 13px;\n  color: #808080;\n  margin-left: 10px;\n}\n.section .p2 {\n  font-size: 10px;\n  color: #696969;\n  text-indent: 50px;\n  margin-top: 8px;\n}\n.section .hh1 {\n  width: 94%;\n  height: 1px;\n  margin: 12px 30px;\n  background: #e3e4e5;\n  width: 94%;\n  height: 1px;\n  margin: 15px 30px;\n  background: #e3e4e5;\n}\n.section .h4 {\n  font-size: 14px;\n  text-indent: 30px;\n}\n.section .top-6 {\n  display: flex;\n  margin-left: 50px;\n  margin-top: 15px;\n}\n.section .top-6 p {\n  width: 100px;\n  height: 25px;\n  border: 1px solid #e3e4e5;\n  font-size: 13px;\n  line-height: 25px;\n  text-align: center;\n  color: #696969;\n  margin: 5px;\n}\n.section .top-6 p:last-child {\n  border: 1px solid #2de7e7;\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n}\n.section .top-6 p:last-child span {\n  width: 15px;\n  height: 15px;\n  background: #1baeae;\n  color: #fff;\n  font-size: 10px;\n  line-height: 15px;\n  text-align: center;\n}\n.section .order-item {\n  width: 951px;\n  margin-left: 30px;\n  margin-top: 10px;\n  overflow: hidden;\n}\n.section .order-item .to_left {\n  width: 350px;\n  height: 300px;\n  background: #f7f7f7;\n  float: left;\n  padding-left: 23px;\n}\n.section .order-item .to_left > * {\n  margin: 2px 0;\n}\n.section .order-item .to_left h5 {\n  margin: 15px 10px 15px 0px;\n  font-size: 14px;\n  color: #666;\n}\n.section .order-item .to_left h5 .peisong {\n  font-size: 12px;\n}\n.section .order-item .to_left h5 .dui {\n  padding-left: 200px;\n  color: #4f9dd0;\n  font-size: 12px;\n}\n.section .order-item .to_left h5 .dui img {\n  width: 15px;\n  height: 15px;\n  margin: 2px 0px 0px 0px;\n}\n.section .order-item .to_left .box {\n  width: 135px;\n  height: 27px;\n  border: 2px solid #1baeae;\n  line-height: 27px;\n  font-size: 12px;\n  text-align: center;\n  color: #696969;\n  margin-bottom: 20px;\n}\n.section .order-item .to_left .til {\n  color: #a9a9a9;\n  font-size: 14px;\n}\n.section .order-item .to_left .con {\n  font-size: 12px;\n  color: #666;\n}\n.section .order-item .to_left hr {\n  color: #f6f6f6;\n  width: 90%;\n  text-align: center;\n  margin-top: 3px;\n}\n.section .order-item .to_left .biao a {\n  font-size: 12px;\n  color: #0081c6;\n}\n.section .order-item .to_left .nul {\n  font-size: 12px;\n  padding-left: 92px;\n}\n.section .order-item .to_left .kg {\n  font-size: 14px;\n  color: #a9a9a9;\n}\n.section .order-item .to_left .kg span {\n  color: #a9a9a9;\n  font-size: 14px;\n}\n.section .order-item .to_left .updata-1 {\n  width: 210px;\n  height: 25px;\n  line-height: 30px;\n  margin-left: 100px;\n  margin-top: 2px;\n  margin-bottom: 5px;\n  border: 1px #edd28b solid;\n  background: #fff;\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n}\n.section .order-item .to_left .updata-1 span {\n  font-size: 12px;\n  color: #00f;\n}\n.section .order-item .to_left .hh1 {\n  width: 94%;\n  height: 1px;\n  background: #e3e4e5;\n}\n.section .order-item .to_left .updata-2 {\n  width: 300px;\n  height: 38px;\n  line-height: 38px;\n  border: 1px #e3e4e5 solid;\n  margin-bottom: 5px;\n  margin-top: 8px;\n}\n.section .order-item .to_left .updata-2 span {\n  color: #9c64cc;\n  font-size: 14px;\n}\n.section .order-item .to_left .updata-2 img {\n  float: left;\n}\n.section .order-item .to_right {\n  width: 575px;\n  float: left;\n  display: flex;\n  flex-direction: column;\n  margin-bottom: 4px;\n  border: 1px #c7eaea solid;\n  border-radius: 6px;\n}\n.section .order-item .to_right h5 {\n  margin: 10px;\n  font-size: 12px;\n  color: #666;\n}\n.section .order-item .to_right div {\n  display: flex;\n  margin-left: 10px;\n}\n.section .order-item .to_right div button {\n  color: #fffafa;\n  background: #1baeae;\n  border: none;\n  font-size: 12px;\n  padding: 1px 2.5px;\n}\n.section .order-item .to_right div span {\n  font-size: 12px;\n  color: #666;\n  margin-left: 5px;\n}\n.section .order-item .to_right .yun1 .yun {\n  width: 90px;\n  height: 90px;\n  margin: 10px;\n}\n.section .order-item .to_right .yun1 .mi {\n  display: flex;\n  flex-direction: column;\n}\n.section .order-item .to_right .yun1 .mi p {\n  color: #666;\n  font-size: 12px;\n  margin: 5px;\n}\n.section .order-item .to_right .yun1 .mi .tui-1 {\n  color: #6679b3;\n}\n.section .order-item .to_right .yun1 .mi .tui-1 img {\n  margin-right: 5px;\n}\n.section .order-item .to_right .yun1 .mi span {\n  margin-left: 30px;\n}\n.section .order-item .to_right p {\n  font-size: 12px;\n  margin: 10px;\n}\n.section .order-item .to_right p .money {\n  font-size: 12px;\n  font-weight: bold;\n  margin-left: 400px;\n  color: #1baeae;\n}\n.section .order-item .to_right img {\n  float: left;\n}\n.section .settle_content {\n  width: 1000px;\n  margin-bottom: 20px;\n  float: right;\n  margin-right: 2px;\n}\n.section .settle_content .qian .qian_y {\n  text-align: right;\n  margin-top: 5px;\n}\n.section .settle_content .qian .qian_y span {\n  font-size: 12px;\n  color: #666;\n}\n.section .settle_content .qian .qian_y .rmb {\n  margin-left: 50px;\n}\n.section .settle_content .yfze {\n  background: #f4f4f4;\n  height: 80px;\n  width: 1000px;\n  margin-top: 20px;\n}\n.section .settle_content .yfze .yfze_a {\n  text-align: right;\n  margin-top: 10px;\n}\n.section .settle_content .yfze .yfze_a .z {\n  font-size: 12px;\n  color: #666;\n}\n.section .settle_content .yfze .yfze_a .hq {\n  font-size: 20px;\n  color: #1baeae;\n  margin-left: 44px;\n}\n.section .settle_content .yfze .yfze_b {\n  text-align: right;\n  margin-top: 10px;\n  font-size: 12px;\n  color: #999;\n}\n.section .settle_content .submmit_button {\n  margin-left: 900px;\n  margin-top: 10px;\n  text-align: center;\n  background: #1baeae;\n  border: none;\n  color: #fff;\n  font-size: 20px;\n  width: 100px;\n  height: 40px;\n  padding: 5px;\n  border-radius: 5px;\n}\n"
  },
  {
    "path": "src/main/resources/static/mall/styles/pay-select.css",
    "content": ".page-main {\n    padding: 38px 0;\n    background: #f5f5f5;\n}\n.container {\n    width: 1226px;\n    *zoom: 1;\n    margin-right: auto;\n    margin-left: auto;\n}\n.container:before, .container:after {\n    content: \" \";\n    display: table;\n}\n\nform {\n    margin: 0;\n}\n\n.section-order {\n    padding-left: 183px;\n    position: relative;\n}\n\n.section {\n    padding: 30px 48px;\n    margin-bottom: 30px;\n    background-color: #fff;\n    color: #424242;\n}\n\n.order-info {\n    padding: 20px 0;\n}\n\n.clearfix {\n    *zoom: 1;\n}\n\n.clearfix:before, .clearfix:after {\n    content: \" \";\n    display: table;\n}\n\n.order-info .fl {\n    float: left;\n}\n\n.order-info .title {\n    margin-bottom: 10px;\n    font-size: 24px;\n    font-weight: normal;\n    line-height: 36px;\n}\n\n.section h2, .section h3, .section p, .section li {\n    margin: 0;\n    padding: 0;\n}\n\n.order-info .order-time {\n    color: #616161;\n    margin-bottom: 5px;\n    line-height: 2;\n}\n\n.section h2, .section h3, .section p, .section li {\n    margin: 0;\n    padding: 0;\n}\n\n.order-info .post-info {\n    color: #616161;\n    -webkit-transition: height .3s ease;\n    transition: height .3s ease;\n}\n\n.section h2, .section h3, .section p, .section li {\n    margin: 0;\n    padding: 0;\n}\n\n.order-info .fr {\n    float: right;\n    text-align: right;\n}\n\n.order-info .total {\n    margin-bottom: 10px;\n    color: #757575;\n}\n\n.money {\n    color: #1baeae;\n    font-size: 14px;\n}\n\n.money em {\n    font-style: normal;\n    font-size: 24px;\n}\n\na {\n    color: #757575;\n    text-decoration: none;\n}\n\n.clearfix:after {\n    clear: both;\n}\n\n.section-order .icon-right {\n    width: 80px;\n    height: 80px;\n    line-height: 80px;\n    position: absolute;\n    top: 40px;\n    left: 50px;\n    font-size: 80px;\n    color: #83c44e;\n    text-align: center;\n    border: 2px solid #83c44e;\n    border-radius: 42px;\n    overflow: hidden;\n    _zoom: 1;\n}\n\n.iconfont {\n    font-family: \"iconfont\" !important;\n    font-style: normal;\n    -webkit-font-smoothing: antialiased;\n    -webkit-text-stroke-width: 0.2px;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.section {\n    padding: 30px 48px;\n    margin-bottom: 30px;\n    background-color: #fff;\n    color: #424242;\n}\n\n.order-detail ul {\n    padding: 0;\n}\n\n.section ul, .section li {\n    list-style: none;\n}\n\n.cash-title {\n    height: 50px;\n    margin-bottom: 30px;\n    border-bottom: 1px solid #e0e0e0;\n    font-size: 18px;\n}\n\n.payment-box {\n    margin-bottom: 30px;\n}\n\n.payment-box .payment-header {\n    margin-bottom: 15px;\n}\n\n.payment-box .payment-header .title {\n    float: left;\n    font-size: 16px;\n    color: #616161;\n}\n\n.payment-box .payment-header .desc {\n    float: left;\n    margin-left: 10px;\n    margin-top: 6px;\n    font-size: 12px;\n    color: #b0b0b0;\n}\n\n.payment-list {\n    margin: 0 0 0 -14px;\n    padding: 0;\n    overflow: hidden;\n    _zoom: 1;\n}\n.clearfix {\n    *zoom: 1;\n}\nmenu, ol, ul {\n    padding: 0 0 0 40px;\n}\ndl, menu, ol, ul {\n    margin: 1em 0;\n}\n\n.payment-list li {\n    float: left;\n    width: 174px;\n    height: 60px;\n    line-height: 60px;\n    margin-left: 14px;\n    margin-bottom: 14px;\n    border: 1px solid #e0e0e0;\n    text-align: center;\n    cursor: pointer;\n    overflow: hidden;\n    _zoom: 1;\n    -webkit-transition: all .4s;\n    transition: all .4s;\n}\n\n.payment-box-last {\n    margin-bottom: 0;\n}\n\n.payment-list li input {\n    display: none;\n}\n\n.payment-list li img {\n    cursor: pointer;\n    margin-left: -10px;\n}\n\nimg {\n    border: 0;\n    -ms-interpolation-mode: bicubic;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/pay.css",
    "content": "html {\n    font-size: 62.5%;\n    font-family: \"Microsoft YaHei\";\n}\n\nbody, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td, hr {\n    margin: 0;\n    padding: 0px 2px;\n}\n\nbody {\n    line-height: 1.333;\n    font-size: 12px\n}\n\nh1, h2, h3, h4, h5, h6 {\n    font-size: 100%;\n    font-family: \"Microsoft YaHei\";\n}\n\ninput, textarea, select, button {\n    font-size: 12px;\n    font-weight: normal\n}\n\n.btn-small {\n    width: 118px;\n    height: 28px;\n    font-size: 12px;\n    line-height: 28px;\n}\n.btn {\n    display: inline-block;\n    *zoom: 1;\n    *display: inline;\n    width: 158px;\n    height: 38px;\n    padding: 0;\n    margin: 0;\n    border: 1px solid #b0b0b0;\n    font-size: 14px;\n    line-height: 38px;\n    text-align: center;\n    color: #b0b0b0;\n    cursor: pointer;\n    -webkit-transition: all .4s;\n    transition: all .4s;\n}\n\n.btn-success {\n    background: green;\n    border-color: green;\n    color: #fff;\n}\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0\n}\n\naddress, caption, cite, code, dfn, em, th, var {\n    font-style: normal;\n    font-weight: normal\n}\n\nli {\n    list-style: none\n}\n\ncaption, th {\n    text-align: left\n}\n\nq:before, q:after {\n    content: ''\n}\n\nabbr, acronym {\n    border: 0;\n    font-variant: normal\n}\n\nsup {\n    vertical-align: text-top\n}\n\nsub {\n    vertical-align: text-bottom\n}\n\nfieldset, img, a img, iframe {\n    border-width: 0;\n    border-style: none\n}\n\nimg {\n    -ms-interpolation-mode: bicubic\n}\n\ntextarea {\n    overflow-y: auto\n}\n\nlegend {\n    color: #000\n}\n\na:link, a:visited {\n    text-decoration: none\n}\n\nhr {\n    height: 0\n}\n\nlabel {\n    cursor: pointer\n}\n\na {\n    color: #1baeae\n}\n\na:hover {\n    color: #1baeae;\n    text-decoration: none\n}\n\na:focus {\n    outline: none\n}\n\nbody, .body {\n    background: #f7f7f7;\n    height: 100%;\n    max-width: 640px;\n    min-width: 300px;\n    min-height: 100%;\n\n    margin: 0 auto;\n}\n\n.mod-title {\n    height: 60px;\n    line-height: 60px;\n    text-align: center;\n    border-bottom: 1px solid #ddd;\n    background: #fff\n}\n\n.ico_log {\n    display: inline-block;\n    width: 130px;\n    height: 38px;\n    vertical-align: middle;\n    margin-right: 7px\n}\n\n.icon-ali-pay {\n    background: url(\"../image/pay/alipay_logo.jpg\") no-repeat;\n    background-size: cover;\n}\n\n.icon-wx-pay {\n    background: url(\"../image/pay/wx_logo.jpg\") no-repeat;\n    background-size: cover;\n}\n\n.mod-title .text {\n    font-size: 20px;\n    color: #333;\n    font-weight: normal;\n    vertical-align: middle\n}\n\n.mod-ct {\n    min-width: 300px;\n    max-width: 640px;\n    margin: 0 auto;\n    margin-top: 15px;\n    margin-bottom: 15px;\n    padding-bottom: 10px;\n    background: #fff url(\"../image/pay/wave-repeat.png\") top center repeat-x;\n    text-align: center;\n    color: #333;\n    border: 1px solid #e5e5e5;\n    border-top: none\n}\n\n.mod-ct .order {\n    font-size: 20px;\n    padding-top: 10px\n}\n\n.mod-ct .amount {\n    font-size: 42px;\n    margin-top: 10px\n}\n\n.mod-ct .qr-image {\n    margin-top: 30px\n}\n\n.mod-ct .qr-image img {\n    width: 230px;\n    height: 230px\n}\n\n.mod-ct .detail {\n    margin-top: 10px;\n    padding-top: 0px;\n    padding-bottom: 10px;\n\n}\n\n.mod-ct .detail .detail-ct {\n    display: none;\n    font-size: 12px;\n    text-align: right;\n    line-height: 28px\n}\n\n.mod-ct .detail .detail-ct dt {\n    float: left\n}\n\n.mod-ct .detail-open {\n    border-top: 1px solid #e5e5e5\n}\n\n.mod-ct .detail .arrow {\n    padding: 6px 34px;\n    border: 1px solid #e5e5e5\n}\n\n.mod-ct .detail-open .detail-ct {\n    display: block\n}\n\n.mod-ct .tip {\n    margin-top: 20px;\n    border-top: 1px dashed #e5e5e5;\n    padding: 10px 0;\n    position: relative\n}\n\n.mod-ct .tip .ico-scan-wx {\n    display: inline-block;\n    width: 56px;\n    height: 55px;\n    background: url(\"../image/pay/scan-wx.png\") no-repeat;\n    vertical-align: middle;\n    *display: inline;\n    *zoom: 1\n}\n\n.mod-ct .tip .ico-scan-ali {\n    display: inline-block;\n    width: 56px;\n    height: 55px;\n    background: url(\"../image/pay/scan-alipay.png\") no-repeat;\n    vertical-align: middle;\n    *display: inline;\n    *zoom: 1\n}\n\n.mod-ct .tip .tip-text {\n    display: inline-block;\n    vertical-align: middle;\n    text-align: left;\n    margin-left: 23px;\n    font-size: 16px;\n    line-height: 28px;\n    *display: inline;\n    *zoom: 1\n}\n\n.mod-ct .tip .dec-left {\n    background-position: 0 -55px;\n    left: -136px\n}\n\n.mod-ct .tip .dec-right {\n    background-position: -25px -55px;\n    right: -136px\n}\n\n.foot {\n    text-align: center;\n    margin: 30px auto;\n    color: #888888;\n    font-size: 12px;\n    line-height: 20px;\n    font-family: \"Microsoft YaHei\";\n}\n\n.copyRight {\n    text-align: center;\n    color: #888888;\n    margin-bottom: 1px;\n}\n\n.copyRight a {\n    color: #888888;\n}\n\nh1 {\n    font-family: \"Microsoft YaHei\";\n    font-size: 15px;\n    margin: 5px 0;\n    padding-bottom: 2px;\n    letter-spacing: 2px;\n}\n\n.time-item strong {\n    background: #1baeae;\n    color: #fff;\n    line-height: 25px;\n    font-size: 15px;\n    font-family: \"Microsoft YaHei\";\n    padding: 0 10px;\n    margin-right: 10px;\n    border-radius: 5px;\n    box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.item-title {\n    background: none;\n    line-height: 25px;\n    font-size: 24px;\n    padding: 0 10px;\n    float: left;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/personal.css",
    "content": "#personal {\n    width: 100%;\n    height: auto;\n    background: #f5f5f5;\n    padding-bottom: 20px;\n    padding-top: 20px;\n}\n\n#personal .self-info {\n    width: 1226px;\n}\n\n#personal .self-info .lfnav {\n    width: 234px;\n    height: 500px;\n    background: #fff;\n}\n\n#personal .self-info .lfnav .nav_title {\n    width: 234px;\n    height: 40px;\n    line-height: 40px;\n    font-size: 19px;\n    margin: 30px 20px 10px 40px;\n    color: #333;\n}\n\n#personal .self-info .lfnav .title_list ul li {\n    display: block;\n    width: 194px;\n    height: 40px;\n    line-height: 40px;\n    padding-left: 40px;\n}\n\n#personal .self-info .lfnav .title_list ul li .active {\n    color: #1baeae;\n    font-weight: bold;\n}\n\n#personal .self-info .lfnav .title_list ul li a {\n    color: #757575;\n}\n\n#personal .self-info .lfnav .title_list ul li a:hover {\n    color: #333;\n}\n\n#personal .self-info .intro {\n    width: 978px;\n    height: 500px;\n    background: #fff;\n}\n\n#personal .self-info .intro .grzlbt {\n    width: 938px;\n    height: 60px;\n    line-height: 60px;\n    font-size: 20px;\n    color: #757575;\n}\n\n#personal .self-info .intro .info_item {\n    height: 45px;\n    line-height: 45px;\n    width: 900px;\n    background: #fdfdfd;\n    border: 1px solid #aaa;\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border-radius: 3px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(1) {\n    display: inline-block;\n    font-size: 15px;\n    font-weight: bold;\n    color: #757575;\n    width: 70px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 20px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(2) {\n    display: inline-block;\n    font-size: 15px;\n    color: #757575;\n    width: 480px;\n    height: 45px;\n    line-height: 45px;\n    padding-left: 120px;\n}\n\n#personal .self-info .intro .info_item span:nth-of-type(3) {\n    display: inline-block;\n    font-size: 15px;\n    width: 160px;\n    height: 45px;\n    line-height: 45px;\n    text-align: right;\n}\n\n#personal .self-info .intro .info_item span a {\n    color: #008080;\n}\n\n#personal .self-info .intro .info_item span a:hover {\n    color: #1baeae;\n}"
  },
  {
    "path": "src/main/resources/static/mall/styles/search.css",
    "content": ".classify .category {\n  width: 1210px;\n  margin: 0 auto 15px;\n}\n.classify .category .category_bar {\n  height: 24px;\n  line-height: 24px;\n}\n.classify .category .category_bar .fm {\n  float: left;\n  margin-right: 5px;\n}\n.classify .category .category_bar .fm a {\n  text-decoration: none;\n  background: #fff;\n}\n.classify .category .category_bar .c,\n.classify .category .category_bar .b {\n  position: relative;\n}\n.classify .category .category_bar .c:hover div,\n.classify .category .category_bar .b:hover div {\n  display: block;\n}\n.classify .category .category_bar .c a,\n.classify .category .category_bar .b a {\n  display: inline-block;\n  height: 22px;\n  padding: 0 4px 0 8px;\n  border: 1px solid #ddd;\n  line-height: 22px;\n  vertical-align: top;\n  font-size: 14px;\n  position: relative;\n}\n.classify .category .category_bar .c div,\n.classify .category .category_bar .b div {\n  position: absolute;\n  top: 23px;\n  left: 0;\n  width: 400px;\n  padding: 10px 0;\n  border: 1px solid #1baeae;\n  background: #fff;\n  z-index: 20;\n  display: none;\n}\n.classify .category .category_bar .c div a,\n.classify .category .category_bar .b div a {\n  border: 0;\n  display: block;\n  float: left;\n  margin-right: 5px;\n}\n.classify .category .category_bar .c div a:hover,\n.classify .category .category_bar .b div a:hover {\n  color: #1baeae;\n}\n.classify .category .category_bar .b:hover .qqq {\n  border: 1px solid #1baeae;\n  border-bottom: 1px solid #fff;\n}\n.classify .category .category_bar .c:hover .qqq {\n  border: 1px solid #1baeae;\n  border-bottom: 1px solid #fff;\n}\n.classify .category .category_bar .a {\n  font-size: 20px;\n  font-weight: 900;\n}\n.classify .category .category_bar i {\n  float: left;\n  margin-right: 5px;\n}\n.classify .category .category_bar .findword {\n  font-weight: bold;\n  color: #666;\n  font-size: 15px;\n}\n.sort {\n  width: 100%;\n  height: 81px;\n  background-color: #f5f5f5;\n}\n.sort .list {\n  width: 1226px;\n  height: 81px;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  font-size: 14px;\n}\n.sort .list div {\n  height: 20px;\n  line-height: 20px;\n  padding: 0 30px;\n  flex-shrink: 0;\n  cursor: pointer;\n  border-left: 1px solid #e0e0e0;\n  transition: color 0.2s;\n}\n.sort .list div:nth-child(1) {\n  text-align: left;\n  padding-left: 0;\n  border-left: 0;\n}\n.sort .list div:hover {\n  color: #1baeae;\n}\n.sort .list .active {\n  color: #1baeae;\n}\n.goods_item .main {\n  width: 1226px;\n}\n.goods_item .main .item_card_frame {\n  float: left;\n  width: 230px;\n  height: 339px;\n  background: #fafafa;\n  cursor: pointer;\n  margin-bottom: 16px;\n  margin-top: 4px;\n  margin-left: 2px;\n}\n.goods_item .main .item_card_frame:hover {\n  border-color: #1baeae;\n}\n.goods_item .main .item_card_frame .item_card {\n  padding: 37px;\n}\n.goods_item .main .item_card_frame .item_card a img {\n  display: block;\n  width: 160px;\n  height: 160px;\n  opacity: 0.85;\n}\n.goods_item .main .item_card_frame .item_card a img:hover {\n  width: 160px;\n  height: 160px;\n  opacity: 1;\n}\n.goods_item .main .item_card_frame .item_brand {\n  width: 226px;\n  height: 14px;\n  line-height: 14px;\n  text-align: center;\n  margin-top: -10px;\n}\n.goods_item .main .item_card_frame .item_brand a {\n  font-size: 14px;\n  color: #333;\n  font-size: 14px;\n  color: #333;\n  padding: 0 8px 0 8px;\n}\n.goods_item .main .item_card_frame .item_sub_intro {\n  width: 208px;\n  height: 14px;\n  line-height: 14px;\n  margin: 18px 0;\n  font-size: 12px;\n  color: #b0b0b0;\n  text-align: center;\n  padding: 0 8px 0 8px;\n}\n.goods_item .main .item_card_frame .item_price {\n  font-size: 14px;\n  text-align: center;\n  color: #1baeae;\n}\n.goods_item .pages {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin: 35px 0 20px;\n  width: 100%;\n  height: 50px;\n}\n.goods_item .pages .page_wrap {\n  width: 1226px;\n}\n.goods_item .pages .page_wrap .page_span1 {\n  float: right;\n}\n.goods_item .pages .page_wrap .page_span1 .active {\n  border: 0;\n  color: #1baeae;\n  background: #fff;\n}\n.goods_item .pages .page_wrap .page_span1 a {\n  font-size: 14px;\n  display: block;\n  float: left;\n  text-decoration: none;\n  height: 36px;\n  background: #f0f0f0;\n  line-height: 36px;\n  padding: 0 14px;\n  margin-right: 5px;\n  border: 1px solid #ddd;\n}\n.goods_item .pages .page_wrap .page_span1 a:nth-child(1) {\n  color: #ccc;\n  background: #fff;\n}\n.goods_item .pages .page_wrap .page_span2 {\n  float: right;\n  margin-right: 55px;\n}\n.goods_item .pages .page_wrap .page_span2 em {\n  float: left;\n  line-height: 38px;\n  font-size: 14px;\n}\n.goods_item .pages .page_wrap .page_span2 em b {\n  font-weight: bold;\n}\n.goods_item .pages .page_wrap .page_span2 input {\n  float: left;\n  width: 30px;\n  height: 30px;\n  margin: 0 3px;\n  line-height: 30px;\n  font-size: 14px;\n  text-align: center;\n  border: 1px solid #ccc;\n  padding: 3px;\n}\n.goods_item .pages .page_wrap .page_span2 a {\n  float: left;\n  height: 27px;\n  margin-left: 10px;\n  font-size: 14px;\n  line-height: 27px;\n  display: inline-block;\n  border-radius: 2px;\n  background: #f7f7f7;\n  text-align: center;\n  text-decoration: none;\n  cursor: pointer;\n  border: 1px solid #ddd;\n  padding: 4px 13px 5px;\n  color: #666;\n  background-repeat: repeat-x;\n}"
  },
  {
    "path": "src/main/resources/templates/admin/footer.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<footer class=\"main-footer\" th:fragment=\"footer-fragment\">\n    <strong>Copyright &copy; 2019-2020 <a href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">十三</a>.</strong>\n    All rights reserved.\n    <div class=\"float-right d-none d-sm-inline-block\">\n        <b>newbee-mall #Version</b> 1.0.0\n    </div>\n</footer>\n</html>"
  },
  {
    "path": "src/main/resources/templates/admin/header.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:fragment=\"header-fragment\">\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>newbee-mall | 后台管理系统</title>\n    <!-- Tell the browser to be responsive to screen width -->\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <!-- Font Awesome -->\n    <link rel=\"shortcut icon\" th:href=\"@{/admin/dist/img/favicon.ico}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/font-awesome.min.css}\">\n    <!-- Ionicons -->\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/ionicons.min.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/main.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/bootstrap/css/bootstrap.css}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/wangeditor-5.1.23/style.css}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/sweetalert2/sweetalert2.min.css}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/jqgrid-5.7.0/ui.jqgrid-bootstrap4.css}\"/>\n    <!-- Theme style -->\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/adminlte.min.css}\">\n</head>\n<!-- Navbar -->\n<nav class=\"main-header navbar navbar-expand bg-white navbar-light border-bottom\" th:fragment=\"header-nav\">\n    <!-- Left navbar links -->\n    <ul class=\"navbar-nav\">\n        <li class=\"nav-item d-none d-sm-inline-block\">\n            <a th:href=\"@{/admin/index}\" class=\"nav-link\">Dashboard</a>\n        </li>\n    </ul>\n    <!-- Right navbar links -->\n    <ul class=\"navbar-nav ml-auto\">\n        <li class=\"nav-item dropdown\">\n            <a class=\"nav-link\" th:href=\"@{/}\">\n                <i class=\"fa fa-paper-plane\">&nbsp;&nbsp;newbee-mall首页</i>\n            </a>\n        </li>\n        <li class=\"nav-item dropdown\">\n            <a class=\"nav-link\" data-toggle=\"dropdown\" href=\"#\">\n                <i class=\"fa fa-user\">&nbsp;&nbsp;作者</i>\n            </a>\n            <div class=\"dropdown-menu dropdown-menu-lg dropdown-menu-right\">\n                <div class=\"dropdown-divider\"></div>\n                <a href=\"#\" class=\"dropdown-item\">\n                    <i class=\"fa fa-user-o mr-2\"></i> 姓名\n                    <span class=\"float-right text-muted text-sm\">十三 / 13</span>\n                </a>\n                <div class=\"dropdown-divider\"></div>\n                <a href=\"#\" class=\"dropdown-item\">\n                    <i class=\"fa fa-user-secret mr-2\"></i> 身份\n                    <span class=\"float-right text-muted text-sm\">Java开发工程师</span>\n                </a>\n                <div class=\"dropdown-divider\"></div>\n                <a href=\"#\" class=\"dropdown-item\">\n                    <i class=\"fa fa-address-card mr-2\"></i> 邮箱\n                    <span class=\"float-right text-muted text-sm\">2449207463@qq.com</span>\n                </a>\n            </div>\n        </li>\n    </ul>\n</nav>\n<!-- /.navbar -->\n</html>"
  },
  {
    "path": "src/main/resources/templates/admin/index.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\"></header>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains page content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (Page header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"card card-primary card-outline\">\n                <div class=\"card-header\">\n                    <h3 class=\"card-title\">首页</h3>\n                </div> <!-- /.card-body -->\n                <div class=\"card-body\">\n                    <div class=\"panel panel-default\">\n                        <div style=\"padding: 10px 0 20px 10px;\">\n                            <a href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">\n                                <img th:src=\"@{/admin/dist/img/newbee-logo.png}\" style=\"width: 480px;height: 240px;\">\n                                <p>newbee-mall 项目是一套电商系统，包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统，基于 Spring Boot\n                                    2.X\n                                    及相关技术栈开发。\n                                    前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。\n                                    后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。</p>\n                                <ul>\n                                    <li>newbee-mall 对新手开发者十分友好，无需复杂的操作步骤，仅需 2 秒就可以启动这个完整的商城项目；</li>\n                                    <li>newbee-mall 也是一个企业级别的 Spring Boot 大型项目，对于各个阶段的 Java 开发者都是极佳的选择；</li>\n                                    <li>你可以把它作为 Spring Boot 技术栈的综合实践项目，newbee-mall 足够符合要求，且代码开源、功能完备、流程完整、页面交互美观；</li>\n                                    <li>技术栈新颖且知识点丰富，学习后可以提升大家对于知识的理解和掌握，可以进一步提升你的市场竞争力；</li>\n                                    <li>对于部分求职中的 Java 开发者，你也可以将该项目放入求职简历中以丰富你的工作履历；</li>\n                                    <li>newbee-mall 还有一些不完善的地方，鄙人才疏学浅，望见谅；</li>\n                                    <li>有任何问题都可以反馈给我，我会尽量完善该项目。</li>\n                                </ul>\n                            </a>\n                            <h3>联系作者</h3>\n                            <ul>\n                                <li>我的邮箱：2449207463@qq.com</li>\n                                <li>QQ技术交流群：796794009\n                                </li>\n                            </ul>\n                            <p>newbee-mall 在 GitHub 和国内的码云都创建了代码仓库，如果有人访问 GitHub 比较慢的话，建议在 Gitee 上查看该项目，两个仓库会保持同步更新。</p>\n                            <ul>\n                                <li><a href=\"https://github.com/newbee-ltd/newbee-mall\" target=\"_blank\">newbee-mall in GitHub</a></li>\n                                <li><a href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">newbee-mall in Gitee</a></li>\n                            </ul>\n                        </div>\n                    </div>\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- /.content -->\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/login.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>newbee-mall管理系统 | Log in</title>\n    <!-- Tell the browser to be responsive to screen width -->\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"shortcut icon\" th:href=\"@{/admin/dist/img/favicon.ico}\"/>\n    <!-- Font Awesome -->\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/font-awesome.min.css}\">\n    <!-- Ionicons -->\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/ionicons.min.css}\">\n    <!-- Theme style -->\n    <link rel=\"stylesheet\" th:href=\"@{/admin/dist/css/adminlte.min.css}\">\n    <style>\n        canvas {\n            display: block;\n            vertical-align: bottom;\n        }\n        #particles {\n            background-color: #F7FAFC;\n            position: absolute;\n            top: 0;\n            width: 100%;\n            height: 100%;\n            z-index: -1;\n        }\n    </style>\n</head>\n<body class=\"hold-transition login-page\">\n<div id=\"particles\">\n</div>\n<div class=\"login-box\">\n    <div class=\"login-logo\" style=\"color: #1baeae;\">\n        <img th:src=\"@{/mall/image/new-bee-logo-3.png}\" style=\"    height: 58px;float: left;margin-left: 10px;\">\n        <h1>管理系统登陆</h1>\n    </div>\n    <!-- /.login-logo -->\n    <div class=\"card\">\n        <div class=\"card-body login-card-body\">\n            <p class=\"login-box-msg\"> NewBee MALL , Let's Go !</p>\n            <form th:action=\"@{/admin/login}\" method=\"post\">\n                <div th:if=\"${not #strings.isEmpty(session.errorMsg)}\" class=\"form-group\">\n                    <div class=\"alert alert-danger\" th:text=\"${session.errorMsg}\"></div>\n                </div>\n                <div class=\"form-group has-feedback\">\n                    <span class=\"fa fa-user form-control-feedback\"></span>\n                    <input type=\"text\" id=\"userName\" name=\"userName\" class=\"form-control\" placeholder=\"请输入账号\"\n                           required=\"true\">\n                </div>\n                <div class=\"form-group has-feedback\">\n                    <span class=\"fa fa-lock form-control-feedback\"></span>\n                    <input type=\"password\" id=\"password\" name=\"password\" class=\"form-control\" placeholder=\"请输入密码\"\n                           required=\"true\">\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-6\">\n                        <input type=\"text\" class=\"form-control\" name=\"verifyCode\" placeholder=\"请输入验证码\" required=\"true\">\n                    </div>\n                    <div class=\"col-6\">\n                        <img alt=\"单击图片刷新！\" class=\"pointer\" th:src=\"@{/common/kaptcha}\"\n                             onclick=\"this.src='/common/kaptcha?d='+new Date()*1\">\n                    </div>\n                </div>\n                <div class=\"form-group has-feedback\"></div>\n                <div class=\"row\">\n                    <div class=\"col-8\">\n                    </div>\n                    <div class=\"col-4\">\n                        <button type=\"submit\" class=\"btn btn-primary btn-block btn-flat\">登录\n                        </button>\n                    </div>\n                </div>\n            </form>\n\n        </div>\n        <!-- /.login-card-body -->\n    </div>\n</div>\n<!-- /.login-box -->\n\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/plugins/particles.js}\"></script>\n<script th:src=\"@{/admin/dist/js/plugins/login-bg-particles.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_carousel.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\">\n</header>\n<style>\n    .ui-jqgrid tr.jqgrow td {\n        white-space: normal !important;\n        height: auto;\n        vertical-align: text-top;\n        padding-top: 2px;\n    }\n</style>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains 图标content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (图标header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">轮播图管理</h3>\n                    </div> <!-- /.card-body -->\n                    <div class=\"card-body\">\n                        <div class=\"grid-btn\">\n                            <button class=\"btn btn-info\" onclick=\"carouselAdd()\"><i\n                                    class=\"fa fa-plus\"></i>&nbsp;新增\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"carouselEdit()\"><i\n                                    class=\"fa fa-pencil-square-o\"></i>&nbsp;修改\n                            </button>\n                            <button class=\"btn btn-danger\" onclick=\"deleteCarousel()\"><i\n                                    class=\"fa fa-trash-o\"></i>&nbsp;删除\n                            </button>\n                        </div>\n                        <br>\n                        <table id=\"jqGrid\" class=\"table table-bordered\">\n                        </table>\n                        <div id=\"jqGridPager\"></div>\n                    </div><!-- /.card-body -->\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- /.content -->\n        <div class=\"content\">\n            <!-- 模态框（Modal） -->\n            <div class=\"modal fade\" id=\"carouselModal\" tabindex=\"-1\" role=\"dialog\"\n                 aria-labelledby=\"carouselModalLabel\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                    aria-hidden=\"true\">&times;</span></button>\n                            <h6 class=\"modal-title\" id=\"carouselModalLabel\">Modal</h6>\n                        </div>\n                        <div class=\"modal-body\">\n                            <form id=\"indexConfigForm\">\n                                <div class=\"form-group\">\n                                    <div class=\"alert alert-danger\" id=\"edit-error-msg\" style=\"display: none;\">\n                                        错误信息展示栏。\n                                    </div>\n                                </div>\n                                <div class=\"form-group\">\n                                    <div class=\"col-sm-4\">\n                                        <img id=\"carouselImg\" src=\"/admin/dist/img/img-upload.png\"\n                                             style=\"height: 64px;width: 64px;\">\n                                    </div>\n                                </div>\n                                <br>\n                                <div class=\"form-group\">\n                                    <div class=\"col-sm-4\">\n                                        <button class=\"btn btn-info\" style=\"margin-bottom: 5px;\"\n                                                id=\"uploadCarouselImage\">\n                                            <i class=\"fa fa-picture-o\"></i>&nbsp;上传轮播图\n                                        </button>\n                                    </div>\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"redirectUrl\" class=\"control-label\">跳转链接:</label>\n                                    <input type=\"text\" class=\"form-control\" id=\"redirectUrl\" name=\"redirectUrl\"\n                                           placeholder=\"请输入跳转链接\" value=\"##\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"carouselRank\" class=\"control-label\">排序值:</label>\n                                    <input type=\"number\" class=\"form-control\" id=\"carouselRank\" name=\"carouselRank\"\n                                           placeholder=\"请输入排序值\">\n                                </div>\n                            </form>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                            <button type=\"button\" class=\"btn btn-primary\" id=\"saveButton\">确认</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- /.modal -->\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- jqgrid -->\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/jquery.jqGrid.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js}\"></script>\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<!-- ajaxupload -->\n<script th:src=\"@{/admin/plugins/ajaxupload/ajaxupload.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_carousel.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_category.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\">\n</header>\n<style>\n    .ui-jqgrid tr.jqgrow td {\n        white-space: normal !important;\n        height: auto;\n        vertical-align: text-top;\n        padding-top: 2px;\n    }\n</style>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains 图标content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (图标header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">分类管理</h3>\n                    </div> <!-- /.card-body -->\n                    <div class=\"card-body\">\n                        <div class=\"grid-btn\">\n                            <button class=\"btn btn-info\" onclick=\"categoryAdd()\"><i\n                                    class=\"fa fa-plus\"></i>&nbsp;新增\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"categoryEdit()\"><i\n                                    class=\"fa fa-pencil-square-o\"></i>&nbsp;修改\n                            </button>\n                            <button class=\"btn btn-danger\" onclick=\"deleteCagegory()\"><i\n                                    class=\"fa fa-trash-o\"></i>&nbsp;删除\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"categoryManage()\"><i\n                                    class=\"fa fa-list\"></i>&nbsp;下级分类管理\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"categoryBack()\"><i\n                                    class=\"fa fa-backward\"></i>&nbsp;返回\n                            </button>\n                        </div>\n                        <br>\n                        <table id=\"jqGrid\" class=\"table table-bordered\">\n                        </table>\n                        <div id=\"jqGridPager\"></div>\n                    </div><!-- /.card-body -->\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- /.content -->\n        <div class=\"content\">\n            <!-- 模态框（Modal） -->\n            <div class=\"modal fade\" id=\"categoryModal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"categoryModalLabel\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                    aria-hidden=\"true\">&times;</span></button>\n                            <h6 class=\"modal-title\" id=\"categoryModalLabel\">Modal</h6>\n                        </div>\n                        <div class=\"modal-body\">\n                            <form id=\"categoryForm\">\n                                <div class=\"form-group\">\n                                    <div class=\"alert alert-danger\" id=\"edit-error-msg\" style=\"display: none;\">\n                                        错误信息展示栏。\n                                    </div>\n                                </div>\n                                <input type=\"hidden\" class=\"form-control\" id=\"categoryId\" name=\"categoryId\">\n                                <input type=\"hidden\" id=\"categoryLevel\" th:value=\"${categoryLevel}\">\n                                <input type=\"hidden\" id=\"parentId\" th:value=\"${parentId}\">\n                                <input type=\"hidden\" id=\"backParentId\" th:value=\"${backParentId}\">\n                                <div class=\"form-group\">\n                                    <label for=\"categoryName\" class=\"control-label\">分类名称:</label>\n                                    <input type=\"text\" class=\"form-control\" id=\"categoryName\" name=\"categoryName\"\n                                           placeholder=\"请输入分类名称\" required=\"true\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"categoryName\" class=\"control-label\">排序值:</label>\n                                    <input type=\"number\" class=\"form-control\" id=\"categoryRank\" name=\"categoryRank\"\n                                           placeholder=\"请输入分类排序值\" required=\"true\">\n                                </div>\n                            </form>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                            <button type=\"button\" class=\"btn btn-primary\" id=\"saveButton\">确认</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- /.modal -->\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- jqgrid -->\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/jquery.jqGrid.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js}\"></script>\n\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_category.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_goods.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\">\n</header>\n<style>\n    .ui-jqgrid tr.jqgrow td {\n        white-space: normal !important;\n        height: auto;\n        vertical-align: text-top;\n        padding-top: 2px;\n    }\n\n    a {\n        color: #1baeae;\n        text-decoration: none;\n        background-color: transparent;\n        -webkit-text-decoration-skip: objects;\n    }\n\n    a:hover {\n        color: white;\n        background-color: #1baeae;\n    }\n</style>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains 图标content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (图标header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">商品管理</h3>\n                    </div> <!-- /.card-body -->\n                    <div class=\"card-body\">\n                        <div class=\"grid-btn\">\n                            <button class=\"btn btn-info\" onclick=\"addGoods()\"><i\n                                    class=\"fa fa-plus\"></i>&nbsp;添加商品\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"editGoods()\"><i\n                                    class=\"fa fa-pencil-square-o\"></i>&nbsp;修改商品\n                            </button>\n                            <button class=\"btn btn-success\" onclick=\"putUpGoods()\"><i\n                                    class=\"fa fa-arrow-up\"></i>&nbsp;上架商品\n                            </button>\n                            <button class=\"btn btn-danger\" onclick=\"putDownGoods()\"><i\n                                    class=\"fa fa-arrow-down\"></i>&nbsp;下架商品\n                            </button>\n                        </div>\n                        <table id=\"jqGrid\" class=\"table table-bordered\">\n                        </table>\n                        <div id=\"jqGridPager\"></div>\n                    </div><!-- /.card-body -->\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- jqgrid -->\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/jquery.jqGrid.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js}\"></script>\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_goods.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_goods_edit.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\"></header>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains page content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (Page header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">商品信息编辑</h3>\n                    </div>\n                    <div class=\"card-body\">\n                        <form id=\"goodsForm\" onsubmit=\"return false;\">\n                            <div class=\"form-group\" style=\"display:flex;\">\n                                <label class=\"control-label\">请选择分类:&nbsp;&nbsp;&nbsp;&nbsp;</label>\n                                <select class=\"form-control col-sm-3\" id=\"levelOne\"\n                                        data-placeholder=\"请选择分类...\">\n                                    <th:block th:unless=\"${null == firstLevelCategories}\">\n                                        <th:block th:each=\"c : ${firstLevelCategories}\">\n                                            <option th:value=\"${c.categoryId}\" th:text=\"${c.categoryName}\"\n                                                    th:selected=\"${null !=firstLevelCategoryId and firstLevelCategoryId==c.categoryId} ?true:false\">\n                                                >\n                                            </option>\n                                        </th:block>\n                                    </th:block>\n                                </select>&nbsp;\n                                <select class=\"form-control col-sm-3\"\n                                        id=\"levelTwo\"\n                                        data-placeholder=\"请选择分类...\">\n                                    <th:block th:unless=\"${null == secondLevelCategories}\">\n                                        <th:block th:each=\"c : ${secondLevelCategories}\">\n                                            <option th:value=\"${c.categoryId}\" th:text=\"${c.categoryName}\"\n                                                    th:selected=\"${null !=secondLevelCategoryId and secondLevelCategoryId==c.categoryId} ?true:false\">\n                                                >\n                                            </option>\n                                        </th:block>\n                                    </th:block>\n                                </select>&nbsp;\n                                <select class=\"form-control col-sm-3\"\n                                        id=\"levelThree\"\n                                        data-placeholder=\"请选择分类...\">\n                                    <th:block th:unless=\"${null == thirdLevelCategories}\">\n                                        <th:block th:each=\"c : ${thirdLevelCategories}\">\n                                            <option th:value=\"${c.categoryId}\" th:text=\"${c.categoryName}\"\n                                                    th:selected=\"${null !=thirdLevelCategoryId and thirdLevelCategoryId==c.categoryId} ?true:false\">\n                                                >\n                                            </option>\n                                        </th:block>\n                                    </th:block>\n                                </select>\n                            </div>\n                            <div class=\"form-group\" style=\"display:flex;\">\n                                <input type=\"hidden\" id=\"goodsId\" name=\"goodsId\"\n                                       th:value=\"${goods!=null and goods.goodsId!=null }?${goods.goodsId}: 0\">\n                                <input type=\"text\" class=\"form-control col-sm-6\" id=\"goodsName\" name=\"goodsName\"\n                                       placeholder=\"*请输入商品名称(必填)\"\n                                       th:value=\"${goods!=null and goods.goodsName!=null }?${goods.goodsName}: ''\"\n                                       required=\"true\">\n                                &nbsp;&nbsp;\n                                <input type=\"text\" class=\"form-control col-sm-6\" id=\"goodsIntro\" name=\"goodsIntro\"\n                                       placeholder=\"*请输入商品简介(100字以内)\"\n                                       th:value=\"${goods!=null and goods.goodsIntro!=null }?${goods.goodsIntro}: ''\"\n                                       required=\"true\">\n                            </div>\n                            <div class=\"form-group\" style=\"display:flex;\">\n                                <input type=\"number\" class=\"form-control col-sm-6\" id=\"originalPrice\"\n                                       name=\"originalPrice\"\n                                       placeholder=\"*请输入商品价格\"\n                                       th:value=\"${goods!=null and goods.originalPrice!=null }?${goods.originalPrice}: 1\"\n                                       required=\"true\">\n                                &nbsp;&nbsp;\n                                <input type=\"number\" class=\"form-control col-sm-6\" id=\"sellingPrice\"\n                                       name=\"sellingPrice\"\n                                       placeholder=\"*请输入商品售卖价\"\n                                       th:value=\"${goods!=null and goods.sellingPrice!=null }?${goods.sellingPrice}: 1\"\n                                       required=\"true\">\n                            </div>\n                            <div class=\"form-group\" style=\"display:flex;\">\n                                <input type=\"number\" class=\"form-control col-sm-6\" id=\"stockNum\" name=\"stockNum\"\n                                       placeholder=\"*请输入商品库存数\"\n                                       th:value=\"${goods!=null and goods.stockNum!=null }?${goods.stockNum}: 0\"\n                                       required=\"true\">\n                                &nbsp;&nbsp;\n                                <input type=\"text\" class=\"form-control col-sm-6\" id=\"tag\" name=\"tag\"\n                                       placeholder=\"*请输入商品小标签\"\n                                       th:value=\"${goods!=null and goods.tag!=null }?${goods.tag}: ''\"\n                                       required=\"true\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">上架状态:&nbsp;</label>\n                                <input name=\"goodsSellStatus\" type=\"radio\" id=\"goodsSellStatusTrue\" checked=true\n                                       th:checked=\"${null==goods||(null !=goods and null !=goods.goodsSellStatus and goods.goodsSellStatus==0)} ?true:false\"\n                                       value=\"0\"/>&nbsp;上架&nbsp;\n                                <input name=\"goodsSellStatus\" type=\"radio\" id=\"goodsSellStatusFalse\" value=\"1\"\n                                       th:checked=\"${null !=goods and null !=goods.goodsSellStatus and goods.goodsSellStatus==1} ?true:false\"/>&nbsp;下架&nbsp;\n                            </div>\n                            <div class=\"form-group\">\n                                <div class=\"form-group\">\n                                    <div class=\"col-sm-4\">\n                                        <th:block th:if=\"${null == goods}\">\n                                            <img id=\"goodsCoverImg\" src=\"/admin/dist/img/img-upload.png\"\n                                                 style=\"height: 64px;width: 64px;\">\n                                        </th:block>\n                                        <th:block th:unless=\"${null == goods}\">\n                                            <img id=\"goodsCoverImg\" th:src=\"${goods.goodsCoverImg}\"\n                                                 style=\"width:160px ;height: 160px;display:block;\">\n                                        </th:block>\n                                    </div>\n                                </div>\n                                <br>\n                                <div class=\"form-group\">\n                                    <div class=\"col-sm-4\">\n                                        <button class=\"btn btn-info\" style=\"margin-bottom: 5px;\"\n                                                id=\"uploadGoodsCoverImg\">\n                                            <i class=\"fa fa-picture-o\"></i>&nbsp;上传商品主图\n                                        </button>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\" style=\"border: 1px solid #ccc;z-index: 1100;\">\n                                <div id=\"editor-toolbar\" class=\"editor-toolbar\" style=\"border-bottom: 1px solid #ccc;\"></div>\n                                <input type=\"hidden\" class=\"editor-text\" th:value=\"${goods!=null and goods.goodsDetailContent !=null}?${goods.goodsDetailContent}: ''\">\n                                <div id=\"editor-text-area\" class=\"editor-text-area\" style=\"height: 750px\"></div>\n                            </div>\n                            <div class=\"form-group\">\n                                <!-- 按钮 -->\n                                &nbsp;<button class=\"btn btn-info float-right\" style=\"margin-left: 5px;\"\n                                              id=\"saveButton\">保存商品\n                            </button>&nbsp;\n                                &nbsp;<button class=\"btn btn-secondary float-right\" style=\"margin-left: 5px;\"\n                                              id=\"cancelButton\">返回商品列表\n                            </button>&nbsp;\n                            </div>\n                        </form>\n                    </div>\n\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<!-- ajaxupload -->\n<script th:src=\"@{/admin/plugins/ajaxupload/ajaxupload.js}\"></script>\n<!-- wangEditor -->\n<script th:src=\"@{/admin/plugins/wangeditor-5.1.23/index.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_goods_edit.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_index_config.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\">\n</header>\n<style>\n    .ui-jqgrid tr.jqgrow td {\n        white-space: normal !important;\n        height: auto;\n        vertical-align: text-top;\n        padding-top: 2px;\n    }\n</style>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains 图标content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (图标header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">首页配置管理</h3>\n                    </div> <!-- /.card-body -->\n                    <div class=\"card-body\">\n                        <div class=\"grid-btn\">\n                            <button class=\"btn btn-info\" onclick=\"configAdd()\"><i\n                                    class=\"fa fa-plus\"></i>&nbsp;新增\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"configEdit()\"><i\n                                    class=\"fa fa-pencil-square-o\"></i>&nbsp;修改\n                            </button>\n                            <button class=\"btn btn-danger\" onclick=\"deleteConfig()\"><i\n                                    class=\"fa fa-trash-o\"></i>&nbsp;删除\n                            </button>\n                        </div>\n                        <br>\n                        <table id=\"jqGrid\" class=\"table table-bordered\">\n                        </table>\n                        <div id=\"jqGridPager\"></div>\n                    </div><!-- /.card-body -->\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- /.content -->\n        <div class=\"content\">\n            <!-- 模态框（Modal） -->\n            <div class=\"modal fade\" id=\"indexConfigModal\" tabindex=\"-1\" role=\"dialog\"\n                 aria-labelledby=\"indexConfigModalLabel\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                    aria-hidden=\"true\">&times;</span></button>\n                            <h6 class=\"modal-title\" id=\"categoryModalLabel\">Modal</h6>\n                        </div>\n                        <div class=\"modal-body\">\n                            <form id=\"indexConfigForm\">\n                                <div class=\"form-group\">\n                                    <div class=\"alert alert-danger\" id=\"edit-error-msg\" style=\"display: none;\">\n                                        错误信息展示栏。\n                                    </div>\n                                </div>\n                                <input type=\"hidden\" class=\"form-control\" id=\"indexConfigModaconfigId\" name=\"indexConfigModaconfigId\">\n                                <input type=\"hidden\" id=\"configType\" th:value=\"${configType}\">\n                                <div class=\"form-group\">\n                                    <label for=\"configName\" class=\"control-label\">配置项显示字符:</label>\n                                    <input type=\"text\" class=\"form-control\" id=\"configName\" name=\"configName\"\n                                           placeholder=\"请输入配置项显示字符\" required=\"true\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"redirectUrl\" class=\"control-label\">跳转链接:</label>\n                                    <input type=\"text\" class=\"form-control\" id=\"redirectUrl\" name=\"redirectUrl\"\n                                           placeholder=\"请输入跳转链接\" value=\"##\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"goodsId\" class=\"control-label\">关联商品编号:</label>\n                                    <input type=\"number\" class=\"form-control\" id=\"goodsId\" name=\"goodsId\"\n                                           placeholder=\"关联商品编号\" value=\"0\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"configRank\" class=\"control-label\">排序值:</label>\n                                    <input type=\"number\" class=\"form-control\" id=\"configRank\" name=\"configRank\"\n                                           placeholder=\"请输入排序值\">\n                                </div>\n                            </form>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                            <button type=\"button\" class=\"btn btn-primary\" id=\"saveButton\">确认</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- /.modal -->\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- jqgrid -->\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/jquery.jqGrid.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js}\"></script>\n\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_index_config.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_order.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\">\n</header>\n<style>\n    .ui-jqgrid tr.jqgrow td {\n        white-space: normal !important;\n        height: auto;\n        vertical-align: text-top;\n        padding-top: 2px;\n    }\n\n    a {\n        color: #1baeae;\n        text-decoration: none;\n        background-color: transparent;\n        -webkit-text-decoration-skip: objects;\n    }\n\n    a:hover {\n        color: white;\n        background-color: #1baeae;\n    }\n</style>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains 图标content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (图标header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">订单管理</h3>\n                    </div> <!-- /.card-body -->\n                    <div class=\"card-body\">\n                        <div class=\"grid-btn\">\n                            <button class=\"btn btn-info\" onclick=\"orderEdit()\"><i\n                                    class=\"fa fa-pencil-square-o\"></i>&nbsp;修改订单\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"orderCheckDone()\"><i\n                                    class=\"fa fa-truck\"></i>&nbsp;配货完成\n                            </button>\n                            <button class=\"btn btn-info\" onclick=\"orderCheckOut()\"><i\n                                    class=\"fa fa-truck\"></i>&nbsp;出库\n                            </button>\n                            <button class=\"btn btn-danger\" onclick=\"closeOrder()\"><i\n                                    class=\"fa fa-trash-o\"></i>&nbsp;关闭订单\n                            </button>\n                        </div>\n                        <table id=\"jqGrid\" class=\"table table-bordered\">\n                        </table>\n                        <div id=\"jqGridPager\"></div>\n                    </div><!-- /.card-body -->\n                </div>\n            </div><!-- /.container-fluid -->\n        </div>\n        <div class=\"content\">\n            <!-- 模态框（Modal） -->\n            <div class=\"modal fade\" id=\"orderInfoModal\" tabindex=\"-1\" role=\"dialog\"\n                 aria-labelledby=\"orderInfoModalLabel\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                    aria-hidden=\"true\">&times;</span></button>\n                            <h6 class=\"modal-title\" id=\"orderInfoModalLabel\">Modal</h6>\n                        </div>\n                        <div class=\"modal-body\">\n                            <form id=\"##\">\n                                <div class=\"form-group\">\n                                    <div class=\"alert alert-danger\" id=\"edit-error-msg\" style=\"display: none;\">\n                                        错误信息展示栏。\n                                    </div>\n                                </div>\n                                <input type=\"hidden\" id=\"orderId\">\n                                <div class=\"form-group\">\n                                    <label for=\"totalPrice\" class=\"control-label\">订单价格:&nbsp;&nbsp;&nbsp;&nbsp;</label>\n                                    <input type=\"number\" class=\"form-control\" id=\"totalPrice\" name=\"totalPrice\"\n                                           placeholder=\"请输入改价金额\" required=\"true\">\n                                </div>\n                                <div class=\"form-group\">\n                                    <label for=\"userAddress\"\n                                           class=\"control-label\">收件人信息:&nbsp;&nbsp;&nbsp;&nbsp;</label>\n                                    <input type=\"text\" class=\"form-control\" id=\"userAddress\" name=\"userAddress\"\n                                           placeholder=\"请输入收件人地址\" value=\"##\">\n                                </div>\n\n                            </form>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                            <button type=\"button\" class=\"btn btn-primary\" id=\"saveButton\">确认</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- /.modal -->\n        </div>\n        <div class=\"content\">\n            <!-- 模态框（Modal） -->\n            <div class=\"modal fade\" id=\"expressInfoModal\" tabindex=\"-1\" role=\"dialog\"\n                 aria-labelledby=\"expressInfoModalLabel\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                    aria-hidden=\"true\">&times;</span></button>\n                            <h6 class=\"modal-title\" id=\"expressInfoModalLabel\">Modal</h6>\n                        </div>\n                        <div class=\"modal-body\">\n                            <form id=\"##\">\n                                <div class=\"form-group\">\n                                    <label class=\"control-label\">收件信息:</label>\n                                    <label id=\"userAddressInfo\" class=\"control-label\"></label>\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- /.modal -->\n        </div>\n        <div class=\"content\">\n            <!-- 模态框（Modal） -->\n            <div class=\"modal fade\" id=\"orderItemModal\" tabindex=\"-1\" role=\"dialog\"\n                 aria-labelledby=\"orderItemModalLabel\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                    aria-hidden=\"true\">&times;</span></button>\n                            <h6 class=\"modal-title\" id=\"orderItemModalLabel\">Modal</h6>\n                        </div>\n                        <div class=\"modal-body\">\n                            <form id=\"##\">\n                                <div class=\"form-group\">\n                                    <label id=\"orderItemString\" class=\"control-label\"></label>\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- /.modal -->\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- jqgrid -->\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/jquery.jqGrid.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js}\"></script>\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_order.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/newbee_mall_user.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\">\n</header>\n<style>\n    .ui-jqgrid tr.jqgrow td {\n        white-space: normal !important;\n        height: auto;\n        vertical-align: text-top;\n        padding-top: 2px;\n    }\n</style>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains 图标content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (图标header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <div class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"card card-primary card-outline\">\n                    <div class=\"card-header\">\n                        <h3 class=\"card-title\">会员管理</h3>\n                    </div> <!-- /.card-body -->\n                    <div class=\"card-body\">\n                        <div class=\"grid-btn\">\n                            <button class=\"btn btn-info\" onclick=\"lockUser(0)\"><i\n                                    class=\"fa fa-plus\"></i>&nbsp;解除禁用\n                            </button>\n                            <button class=\"btn btn-danger\" onclick=\"lockUser(1)\"><i\n                                    class=\"fa fa-trash-o\"></i>&nbsp;禁用账户\n                            </button>\n                        </div>\n                        <table id=\"jqGrid\" class=\"table table-bordered\">\n                        </table>\n                        <div id=\"jqGridPager\"></div>\n                    </div><!-- /.card-body -->\n                </div><!-- /.container-fluid -->\n            </div>\n        </div>\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- jqgrid -->\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/jquery.jqGrid.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/jqgrid-5.7.0/grid.locale-cn.js}\"></script>\n<!-- sweetalert -->\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/dist/js/newbee_mall_user.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/profile.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\">\n<header th:replace=\"admin/header::header-fragment\"></header>\n<body class=\"hold-transition sidebar-mini\">\n<div class=\"wrapper\">\n    <!-- 引入页面头header-fragment -->\n    <div th:replace=\"admin/header::header-nav\"></div>\n    <!-- 引入工具栏sidebar-fragment -->\n    <div th:replace=\"admin/sidebar::sidebar-fragment(${path})\"></div>\n    <!-- Content Wrapper. Contains page content -->\n    <div class=\"content-wrapper\">\n        <!-- Content Header (Page header) -->\n        <div class=\"content-header\">\n            <div class=\"container-fluid\">\n            </div><!-- /.container-fluid -->\n        </div>\n        <!-- Main content -->\n        <section class=\"content\">\n            <div class=\"container-fluid\">\n                <div class=\"row\">\n                    <div class=\"col-md-6\">\n                        <div class=\"card card-primary card-outline\">\n                            <div class=\"card-header\">\n                                <h3 class=\"card-title\">基本信息</h3>\n                            </div> <!-- /.card-body -->\n                            <div class=\"card-body\">\n                                <form role=\"form\" id=\"userNameForm\">\n                                    <div class=\"form-group col-sm-8\">\n                                        <div class=\"alert alert-danger\" id=\"updateUserName-info\" style=\"display: none;\"></div>\n                                    </div>\n                                    <!-- text input -->\n                                    <div class=\"form-group\">\n                                        <label>登陆名称</label>\n                                        <input type=\"text\" class=\"form-control\" id=\"loginUserName\"\n                                               name=\"loginUserName\"\n                                               placeholder=\"请输入登陆名称\" required=\"true\" th:value=\"${loginUserName}\">\n                                    </div>\n                                    <div class=\"form-group\">\n                                        <label>昵称</label>\n                                        <input type=\"text\" class=\"form-control\" id=\"nickName\"\n                                               name=\"nickName\"\n                                               placeholder=\"请输入昵称\" required=\"true\" th:value=\"${nickName}\">\n                                    </div>\n                                    <div class=\"card-footer\">\n                                        <button type=\"button\" id=\"updateUserNameButton\" onsubmit=\"return false;\"\n                                                class=\"btn btn-danger float-right\">确认修改\n                                        </button>\n                                    </div>\n                                </form>\n                            </div><!-- /.card-body -->\n                        </div>\n                    </div>\n                    <div class=\"col-md-6\">\n                        <div class=\"card card-primary card-outline\">\n                            <div class=\"card-header\">\n                                <h3 class=\"card-title\">修改密码</h3>\n                            </div> <!-- /.card-body -->\n                            <div class=\"card-body\">\n                                <form role=\"form\" id=\"userPasswordForm\">\n                                    <div class=\"form-group col-sm-8\">\n                                        <div class=\"alert alert-danger updatePassword-info\" id=\"updatePassword-info\" style=\"display: none;\"></div>\n                                    </div>\n                                    <!-- input states -->\n                                    <div class=\"form-group\">\n                                        <label class=\"control-label\"><i class=\"fa fa-key\"></i> 原密码</label>\n                                        <input type=\"text\" class=\"form-control\" id=\"originalPassword\"\n                                               name=\"originalPassword\"\n                                               placeholder=\"请输入原密码\" required=\"true\">\n                                    </div>\n                                    <div class=\"form-group\">\n                                        <label class=\"control-label\"><i class=\"fa fa-key\"></i> 新密码</label>\n                                        <input type=\"text\" class=\"form-control\" id=\"newPassword\" name=\"newPassword\"\n                                               placeholder=\"请输入新密码\" required=\"true\">\n                                    </div>\n                                    <div class=\"card-footer\">\n                                        <button type=\"button\" id=\"updatePasswordButton\" onsubmit=\"return false;\"\n                                                class=\"btn btn-danger float-right\">确认修改\n                                        </button>\n                                    </div>\n                                </form>\n                            </div><!-- /.card-body -->\n                        </div>\n                    </div>\n                </div>\n            </div><!-- /.container-fluid -->\n        </section>\n        <!-- /.content -->\n    </div>\n    <!-- /.content-wrapper -->\n    <!-- 引入页脚footer-fragment -->\n    <div th:replace=\"admin/footer::footer-fragment\"></div>\n</div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<!-- AdminLTE App -->\n<script th:src=\"@{/admin/dist/js/adminlte.min.js}\"></script>\n<!-- public.js -->\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<!-- profile -->\n<script th:src=\"@{/admin/dist/js/profile.js}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/admin/sidebar.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<aside th:fragment=\"sidebar-fragment(path)\" class=\"main-sidebar sidebar-dark-primary elevation-4\">\n    <!-- Brand Logo -->\n    <a th:href=\"@{/admin/index}\" class=\"brand-link\">\n        <img th:src=\"@{/admin/dist/img/new-bee-logo-1.png}\" alt=\"ssm-cluster Logo\"\n             class=\"brand-image img-circle elevation-3\"\n             style=\"opacity: .8\">\n        <span class=\"brand-text font-weight-light\">NEWBEE商城</span>\n    </a>\n    <!-- Sidebar -->\n    <div class=\"sidebar\">\n        <!-- Sidebar Menu -->\n        <nav class=\"mt-2\">\n            <ul class=\"nav nav-pills nav-sidebar flex-column\" data-widget=\"treeview\" role=\"menu\"\n                data-accordion=\"false\">\n                <!-- Add icons to the links using the .nav-icon class\n                     with font-awesome or any other icon font library -->\n                <li class=\"nav-header\">Dashboard</li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/index}\" th:class=\"${path}=='index'?'nav-link active':'nav-link'\">\n                        <i class=\"nav-icon fa fa-dashboard\"></i>\n                        <p>\n                            Dashboard\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/goods/edit}\" th:class=\"${path}=='goods-edit'?'nav-link active':'nav-link'\">\n                        <i class=\"nav-icon fa fa-plus\"></i>\n                        <p>\n                            商品信息\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-header\">首页配置</li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/carousels}\"\n                       th:class=\"${path}=='newbee_mall_carousel'?'nav-link active':'nav-link'\">\n                        <i class=\"nav-icon fa fa-file-image-o\"></i>\n                        <p>\n                            轮播图配置\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/indexConfigs?configType=3}\"\n                       th:class=\"${path}=='INDEX_GOODS_HOTS'?'nav-link active':'nav-link'\">\n                        <i class=\"nav-icon fa fa-hand-o-up\"></i>\n                        <p>\n                            热销商品配置\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/indexConfigs?configType=4}\"\n                       th:class=\"${path}=='INDEX_GOODS_NEW'?'nav-link active':'nav-link'\">\n                        <i class=\"nav-icon fa fa-hand-o-up\"></i>\n                        <p>\n                            新品上线配置\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/indexConfigs?configType=5}\"\n                       th:class=\"${path}=='INDEX_GOODS_RECOMMOND'?'nav-link active':'nav-link'\">\n                        <i class=\"nav-icon fa fa-hand-o-up\"></i>\n                        <p>\n                            为你推荐配置\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-header\">管理模块</li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/categories?parentId=0&categoryLevel=1&backParentId=0}\"\n                       th:class=\"${path}=='newbee_mall_category'?'nav-link active':'nav-link'\">\n                        <i class=\"fa fa-list-alt nav-icon\" aria-hidden=\"true\"></i>\n                        <p>\n                            分类管理\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/goods}\" th:class=\"${path}=='newbee_mall_goods'?'nav-link active':'nav-link'\">\n                        <i class=\"fa fa-archive nav-icon\" aria-hidden=\"true\"></i>\n                        <p>\n                            商品管理\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/users}\" th:class=\"${path}=='users'?'nav-link active':'nav-link'\">\n                        <i class=\"fa fa-users nav-icon\" aria-hidden=\"true\"></i>\n                        <p>\n                            会员管理\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/orders}\" th:class=\"${path}=='orders'?'nav-link active':'nav-link'\">\n                        <i class=\"fa fa-money nav-icon\" aria-hidden=\"true\"></i>\n                        <p>\n                            订单管理\n                        </p>\n                    </a>\n                </li>\n                <li class=\"nav-header\">系统管理</li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/profile}\"\n                       th:class=\"${path}=='profile'?'nav-link active':'nav-link'\">\n                        <i class=\"fa fa-user-secret nav-icon\"></i>\n                        <p>修改密码</p>\n                    </a>\n                </li>\n                <li class=\"nav-item\">\n                    <a th:href=\"@{/admin/logout}\" class=\"nav-link\">\n                        <i class=\"fa fa-sign-out nav-icon\"></i>\n                        <p>安全退出</p>\n                    </a>\n                </li>\n                </li>\n            </ul>\n        </nav>\n        <!-- /.sidebar-menu -->\n    </div>\n    <!-- /.sidebar -->\n</aside>\n</html>"
  },
  {
    "path": "src/main/resources/templates/error/error.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"utf-8\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <title>NEW BEE ERROR PAGE</title>\n    <style type=\"text/css\">/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! Simple HttpErrorPages | MIT X11 License | https://github.com/AndiDittrich/HttpErrorPages */body,html{width:100%;height:100%;background-color:#21232a}body{color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.5);padding:0;min-height:100%;-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.8);box-shadow:inset 0 0 100px rgba(0,0,0,.8);display:table;font-family:\"Open Sans\",Arial,sans-serif}h1{font-family:inherit;font-weight:500;line-height:1.1;color:inherit;font-size:36px}h1 small{font-size:68%;font-weight:400;line-height:1;color:#777}a{text-decoration:none;color:#fff;font-size:inherit;border-bottom:dotted 1px #707070}.lead{color:silver;font-size:21px;line-height:1.4}.cover{display:table-cell;vertical-align:middle;padding:0 20px}footer{position:fixed;width:100%;height:40px;left:0;bottom:0;color:#a0a0a0;font-size:14px}</style>\n</head>\n<body>\n<div class=\"cover\">\n    <h1>你的请求出错了</h1>\n    <p th:text=\"'错误信息：'+${message}\" style=\"color: red;font-weight: 600;\"></p>\n    <p th:text=\"'请求地址：'+${url}\"></p>\n    <h2>报告问题</h2>\n    <a href=\"https://github.com/newbee-ltd/newbee-mall/issues/new\" target=\"_blank\" style=\"color: #1baeae\">提交issue</a>&nbsp;&nbsp;&nbsp;&nbsp;\n    <h2>异常堆栈跟踪日志</h2>\n    <div th:each=\"string:${stackTrace}\">\n        <small><th:block th:text=\"${string}\"></th:block></small>\n    </div>\n    <h2>Copy Right</h2>\n    <p th:text=\"'author：'+${author}\" style=\"color: #1baeae;\"></p>\n    <p th:text=\"'ltd：'+${ltd}\" style=\"color: #1baeae;\"></p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/error/error_400.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <title>We've got some trouble | 400 - Bad Request</title>\n    <style type=\"text/css\">/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! Simple HttpErrorPages | MIT X11 License | https://github.com/AndiDittrich/HttpErrorPages */body,html{width:100%;height:100%;background-color:#21232a}body{color:#fff;text-align:center;text-shadow:0 2px 4px rgba(0,0,0,.5);padding:0;min-height:100%;-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.8);box-shadow:inset 0 0 100px rgba(0,0,0,.8);display:table;font-family:\"Open Sans\",Arial,sans-serif}h1{font-family:inherit;font-weight:500;line-height:1.1;color:inherit;font-size:36px}h1 small{font-size:68%;font-weight:400;line-height:1;color:#777}a{text-decoration:none;color:#fff;font-size:inherit;border-bottom:dotted 1px #707070}.lead{color:silver;font-size:21px;line-height:1.4}.cover{display:table-cell;vertical-align:middle;padding:0 20px}footer{position:fixed;width:100%;height:40px;left:0;bottom:0;color:#a0a0a0;font-size:14px}</style>\n</head>\n<body>\n<div class=\"cover\"><h1>Bad Request <small>Error 400</small></h1><p class=\"lead\">The server cannot process the request due to something that is perceived to be a client error.</p></div>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/error/error_404.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <title>We've got some trouble | 404 - Resource not found</title>\n    <style type=\"text/css\">/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! Simple HttpErrorPages | MIT X11 License | https://github.com/AndiDittrich/HttpErrorPages */body,html{width:100%;height:100%;background-color:#21232a}body{color:#fff;text-align:center;text-shadow:0 2px 4px rgba(0,0,0,.5);padding:0;min-height:100%;-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.8);box-shadow:inset 0 0 100px rgba(0,0,0,.8);display:table;font-family:\"Open Sans\",Arial,sans-serif}h1{font-family:inherit;font-weight:500;line-height:1.1;color:inherit;font-size:36px}h1 small{font-size:68%;font-weight:400;line-height:1;color:#777}a{text-decoration:none;color:#fff;font-size:inherit;border-bottom:dotted 1px #707070}.lead{color:silver;font-size:21px;line-height:1.4}.cover{display:table-cell;vertical-align:middle;padding:0 20px}footer{position:fixed;width:100%;height:40px;left:0;bottom:0;color:#a0a0a0;font-size:14px}</style>\n</head>\n<body>\n<div class=\"cover\"><h1>Resource not found <small>Error 404</small></h1><p class=\"lead\">The requested resource could not be found but may be available again in the future.</p></div>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/error/error_5xx.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <title>We've got some trouble | 500 - Webservice currently unavailable</title>\n    <style type=\"text/css\">/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! Simple HttpErrorPages | MIT X11 License | https://github.com/AndiDittrich/HttpErrorPages */body,html{width:100%;height:100%;background-color:#21232a}body{color:#fff;text-align:center;text-shadow:0 2px 4px rgba(0,0,0,.5);padding:0;min-height:100%;-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.8);box-shadow:inset 0 0 100px rgba(0,0,0,.8);display:table;font-family:\"Open Sans\",Arial,sans-serif}h1{font-family:inherit;font-weight:500;line-height:1.1;color:inherit;font-size:36px}h1 small{font-size:68%;font-weight:400;line-height:1;color:#777}a{text-decoration:none;color:#fff;font-size:inherit;border-bottom:dotted 1px #707070}.lead{color:silver;font-size:21px;line-height:1.4}.cover{display:table-cell;vertical-align:middle;padding:0 20px}footer{position:fixed;width:100%;height:40px;left:0;bottom:0;color:#a0a0a0;font-size:14px}</style>\n</head>\n<body>\n<div class=\"cover\"><h1>Webservice currently unavailable <small>Error 500</small></h1><p class=\"lead\">An unexpected condition was encountered.<br />Our service team has been dispatched to bring it back online.</p></div>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/mall/alipay.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <meta http-equiv=\"Content-Language\" content=\"zh-cn\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"no\"/>\n    <meta name=\"apple-touch-fullscreen\" content=\"yes\"/>\n    <meta name=\"format-detection\" content=\"telephone=no,email=no\"/>\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"white\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge,chrome=1\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Cache-control\" content=\"no-cache\">\n    <meta http-equiv=\"Cache\" content=\"no-cache\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <title>newbee-mall 支付</title>\n    <link th:href=\"@{/mall/styles/pay.css}\" rel=\"stylesheet\" media=\"screen\">\n    <script type=\"text/javascript\" src=\"https://cdn.staticfile.org/jquery/1.11.1/jquery.min.js\"></script>\n</head>\n\n<body>\n<div class=\"body\">\n    <h1 class=\"mod-title\">\n        <span class=\"ico_log icon-ali-pay\"></span>\n    </h1>\n\n    <div class=\"mod-ct\">\n        <div class=\"order\">\n        </div>\n        <div class=\"amount\" id=\"money\">￥\n            <th:block th:text=\"${totalPrice+'.00'}\"></th:block>\n        </div>\n        <div class=\"qrcode-img-wrapper\" data-role=\"qrPayImgWrapper\">\n            <div data-role=\"qrPayImg\" class=\"qrcode-img-area\">\n                <div class=\"ui-loading qrcode-loading\" data-role=\"qrPayImgLoading\"></div>\n                <div style=\"position: relative;display: inline-block;\">\n                    <img width=\"300\" height=\"300\"\n                         th:src=\"@{/mall/image/pay/alipay_qrcode.png}\"\n                         title=\"请尽快支付~\"\n                         style=\"display: block;\">\n                </div>\n            </div>\n        </div>\n\n        <div class=\"time-item\" style=\"padding-top: 10px\">\n            <div class=\"time-item\" id=\"msg\">\n                <h1>支付完成后，将跳转至订单详情</h1>\n            </div>\n            <div class=\"time-item\">\n                <h1>订单:\n                    <th:block th:text=\"${orderNo}\"></th:block>\n                </h1>\n            </div>\n            <input type=\"hidden\" id=\"orderNoValue\" th:value=\"${orderNo}\">\n        </div>\n\n        <div class=\"tip\">\n            <div class=\"ico-scan-ali\"></div>\n            <div class=\"tip-text\">\n                <p id=\"showtext\">打开支付宝 [扫一扫]</p>\n            </div>\n            <div class=\"tip-text\">\n                <a onclick=\"payOrderSuccess()\"\n                   class=\"btn btn-small btn-success\" title=\"支付成功\">支付成功</a>\n            </div>\n        </div>\n\n        <div class=\"tip-text\">\n        </div>\n\n    </div>\n    <div class=\"foot\">\n    </div>\n</div>\n<script type=\"text/javascript\">\n    function payOrderSuccess() {\n        var orderNo = $(\"#orderNoValue\").val();\n        $.ajax({\n            type: 'GET',\n            url: '/paySuccess?payType=1&orderNo=' + orderNo,\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    window.location.href = '/orders/' + orderNo;\n                } else {\n                    alert(result.message);\n                }\n            },\n            error: function () {\n                alert(\"操作失败\");\n            }\n        });\n    }\n</script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/cart.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>NewBee商城-购物车</title>\n    <link rel=\"stylesheet\" th:href=\"@{mall/css/iconfont.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/css/common.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/styles/header.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/styles/cart.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/sweetalert2/sweetalert2.min.css}\"/>\n</head>\n<body>\n\n<div id=\"cart\">\n    <div class=\"banner_x center\">\n        <a th:href=\"@{/index}\" target=\"_blank\">\n            <div class=\"logo fl\">\n                <img src=\"mall/image/new-bee-logo-3.png\"/>\n            </div>\n        </a>\n\n        <div class=\"wdgwc fl ml20\">购物车</div>\n        <div class=\"wxts fl ml20\">温馨提示：产品是否购买成功，以最终下单为准哦，请尽快结算</div>\n        <div class=\"clear\"></div>\n    </div>\n    <div class=\"cart_line\"></div>\n    <div class=\"cart_bg\">\n        <th:block th:if=\"${#lists.isEmpty(myShoppingCartItems)}\">\n            <div class=\"list center\">\n                <img style=\"position: absolute;margin-top: 16px;left: 45%;\" th:src=\"@{/mall/image/null-content.png}\">\n            </div>\n        </th:block>\n        <th:block th:unless=\"${#lists.isEmpty(myShoppingCartItems)}\">\n            <div class=\"list center\">\n                <div class=\"top2 center\">\n                    <div class=\"sub_top fl\">\n                    </div>\n                    <div class=\"sub_top fl\">商品名称</div>\n                    <div class=\"sub_top fl\">单价</div>\n                    <div class=\"sub_top fl\">数量</div>\n                    <div class=\"sub_top fl\">小计</div>\n                    <div class=\"sub_top fr\">操作</div>\n                    <div class=\"clear\"></div>\n                </div>\n                <th:block th:each=\"item : ${myShoppingCartItems}\">\n                    <div class=\"content2 center\">\n                        <div class=\"sub_content fl \">\n                        </div>\n                        <div class=\"sub_content cover fl\"><img th:src=\"@{${item.goodsCoverImg}}\"></div>\n                        <div class=\"sub_content fl ft20\" th:text=\"${item.goodsName}\">商品名称</div>\n                        <div class=\"sub_content fl\" th:text=\"${item.sellingPrice+'元'}\">1299元</div>\n                        <div class=\"sub_content fl\">\n                            <input class=\"goods_count\" th:id=\"${'goodsCount'+item.cartItemId}\" type=\"number\"\n                                   th:onblur=\"'updateItem('+${item.cartItemId}+')'\"\n                                   th:value=\"${item.goodsCount}\" step=\"1\" min=\"1\"\n                                   max=\"5\">\n                        </div>\n                        <div class=\"sub_content fl\" th:text=\"${item.goodsCount*item.sellingPrice+'元'}\">1299元</div>\n                        <div class=\"sub_content fl\"><a href=\"##\" th:onclick=\"'deleteItem('+${item.cartItemId}+')'\">×</a>\n                        </div>\n                        <div class=\"clear\"></div>\n                    </div>\n                </th:block>\n            </div>\n        </th:block>\n        <div class=\"pre_order mt20 center\">\n            <div class=\"tips fl ml20\">\n                <ul>\n                    <li><a th:href=\"@{/index}\">继续购物</a></li>\n                    <li>|</li>\n                    <li>共<span th:text=\"${itemsTotal}\">13</span>件商品</li>\n                    <div class=\"clear\"></div>\n                </ul>\n            </div>\n            <div class=\"order_div fr\">\n                <div class=\"order_total fl\">合计（不含运费）：<span th:text=\"${priceTotal}+'.00元'\">1299.00元</span></div>\n                <div class=\"order_button fr\">\n                    <th:block th:if=\"${itemsTotal == 0}\">\n                        <input class=\"order_button_c\" type=\"button\" name=\"tip\"\n                               onclick=\"tip()\"\n                               value=\"去结算\"/>\n                    </th:block>\n                    <th:block th:unless=\"${itemsTotal == 0}\">\n                        <input class=\"order_button_d\" type=\"button\" name=\"settle\"\n                               onclick=\"settle()\"\n                               value=\"去结算\"/>\n                    </th:block>\n                </div>\n                <div class=\"clear\"></div>\n            </div>\n            <div class=\"clear\"></div>\n        </div>\n    </div>\n</div>\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n\n</body>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script type=\"text/javascript\">\n\n    /**\n     * 购物车中数量为0时提示\n     */\n    function tip() {\n        Swal.fire({\n            text: \"购物车中无数据，无法结算\",\n            icon: \"error\",iconColor:\"#f05b72\",\n        });\n    }\n\n    /**\n     * 跳转至结算页面\n     */\n    function settle() {\n        window.location.href = '/shop-cart/settle'\n    }\n\n    /**\n     *更新购物项\n     */\n    function updateItem(id) {\n        var domId = 'goodsCount' + id;\n        var goodsCount = $(\"#\" + domId).val();\n        if (goodsCount > 5) {\n            Swal.fire({\n                text: \"单个商品最多可购买5个\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        if (goodsCount < 1) {\n            Swal.fire({\n                text: \"数量异常\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        var data = {\n            \"cartItemId\": id,\n            \"goodsCount\": goodsCount\n        };\n        $.ajax({\n            type: 'PUT',\n            url: '/shop-cart',\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    window.location.reload();\n                } else {\n                    Swal.fire({\n                        text: \"操作失败\",\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n\n    /**\n     * * 删除购物项\n     * @param id\n     */\n    function deleteItem(id) {\n        Swal.fire({\n            title: \"确认弹框\",\n            text: \"确认要删除数据吗?\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n            showCancelButton: true,\n            confirmButtonText: '确认',\n            cancelButtonText: '取消'\n        }).then((flag) => {\n                if (flag.value) {\n                    $.ajax({\n                        type: 'DELETE',\n                        url: '/shop-cart/' + id,\n                        success: function (result) {\n                            if (result.resultCode == 200) {\n                                window.location.reload();\n                            } else {\n                                Swal.fire({\n                                    text: \"操作失败\",\n                                    icon: \"error\",iconColor:\"#f05b72\",\n                                });\n                            }\n                        },\n                        error: function () {\n                            Swal.fire({\n                                text: \"操作失败\",\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    });\n                }\n            }\n        )\n        ;\n    }\n</script>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/mall/detail.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-商品详情','detail')\">\n</head>\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n\n<div id=\"detail\">\n    <!-- nav -->\n    <nav th:replace=\"mall/header::nav-fragment\"></nav>\n\n    <div class=\"dc\">\n        <div class=\"content w\">\n            <div class=\"title fl\">商品详情</div>\n            <div class=\"clear\"></div>\n        </div>\n    </div>\n\n    <div class=\"intro mt20 w clearfix\">\n        <div class=\"left fl\" style=\"position: relative;\">\n            <div class=\"swiper-container fl\">\n                <img th:src=\"@{${goodsDetail.goodsCoverImg}}\">\n            </div>\n        </div>\n        <div class=\"right fr\">\n            <div class=\"h3 ml20 mt20\" th:text=\"${goodsDetail.goodsName}\">NewBeeMall</div>\n            <div class=\"sub_title mr40 ml20 mt10\" th:text=\"${goodsDetail.goodsIntro}\">NewBeeMall</div>\n            <div class=\"item_price mr40 ml20 mt10\">\n                <th:block th:text=\"${goodsDetail.sellingPrice}+'.00 元'\"></th:block>\n                <del>\n                    <th:block th:text=\"${goodsDetail.originalPrice}+'.00 元'\"></th:block>\n                </del>\n            </div>\n\n            <div class=\"order\">\n                <input class=\"car\" type=\"button\" th:onclick=\"'saveAndGoCart('+${goodsDetail.goodsId}+')'\" value=\"立即选购\"/>\n                <input class=\"car\" type=\"button\" th:onclick=\"'saveToCart('+${goodsDetail.goodsId}+')'\" value=\"加入购物车\"/>\n            </div>\n            <div class=\"tb-extra ml20\" id=\"J_tbExtra\">\n                <dl>\n                    <dt>承诺</dt>\n                    <dd><a class=\"J_Cont\" title=\"满足7天无理由退换货申请的前提下，包邮商品需要买家承担退货邮费，非包邮商品需要买家承担发货和退货邮费。\" href=\"#\"\n                           target=\"_blank\"><img th:src=\"@{/mall/image/7d.jpg}\">7天无理由</a></dd>\n                </dl>\n                <dl>\n                    <dt>支付</dt>\n                    <dd><a href=\"##\" target=\"_blank\"><img th:src=\"@{/mall/image/hua.png}\">蚂蚁花呗</a><a href=\"##\"\n                                                                                                     target=\"_blank\"><img\n                            th:src=\"@{/mall/image/card.png}\">信用卡支付</a><a href=\"##\" target=\"_blank\"><img\n                            th:src=\"@{/mall/image/ji.png}\">集分宝</a></dd>\n                </dl>\n                <dl>\n                    <dt>支持</dt>\n                    <dd>折旧变现，买新更省钱。<a style=\"float:none;text-decoration: underline;\" href=\"##\">详情</a></dd>\n                </dl>\n\n            </div>\n        </div>\n        <div class=\"clear\"></div>\n    </div>\n    <!-- 这里使用的是 th:utext 标签，用 th:text 不会解析 html，用 th:utext 会解析 html -->\n    <div class=\"goods mt20 w clearfix\" th:utext=\"${goodsDetail.goodsDetailContent}\">\n    </div>\n</div>\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/mall/js/search.js}\" type=\"text/javascript\"></script>\n<script type=\"text/javascript\">\n    /**\n     * 添加到购物车\n     */\n    function saveToCart(id) {\n        var goodsCount = 1;\n        var data = {\n            \"goodsId\": id,\n            \"goodsCount\": goodsCount\n        };\n        $.ajax({\n            type: 'POST',\n            url: '/shop-cart',\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    Swal.fire({\n                        title: \"确认框\",\n                        text: \"添加成功\",\n                        icon: \"success\",iconColor:\"#1d953f\",\n                        showCancelButton: true,\n                        confirmButtonText: '确认',\n                        cancelButtonText: '取消'\n                    }).then((flag) => {\n                           if (flag.value) {\n                                window.location.reload();\n                            }\n                        }\n                    );\n                } else {\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n\n    /**\n     * 添加到购物车并跳转至购物车页面\n     */\n    function saveAndGoCart(id) {\n        var goodsCount = 1;\n        var data = {\n            \"goodsId\": id,\n            \"goodsCount\": goodsCount\n        };\n        $.ajax({\n            type: 'POST',\n            url: '/shop-cart',\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    Swal.fire({\n                        title: \"确认框\",\n                        text: \"已将商品加入购物车\",\n                        icon: \"success\",iconColor:\"#1d953f\",\n                        showCancelButton: true,\n                        confirmButtonText: '去购物车结算',\n                        cancelButtonText: '留在当前页'\n                    }).then((flag) => {\n                            if (flag.value) {\n                                window.location.href = '/shop-cart';\n                            }\n                        }\n                    );\n                } else {\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/mall/footer.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<div class=\"site-footer\" th:fragment=\"footer-fragment\">\n    <div class=\"footer-related\">\n        <div class=\"footer-article w1100\">\n            <dl class=\"contact clearfix\">\n                <dt class=\"fl\">\n                    <i class=\"iconfont\"></i>\n                </dt>\n                <dd class=\"fl\">\n                    <p class=\"text\">人工客服</p>\n                    <p class=\"tel\">400-xxx-xx13</p>\n                    <a href=\"##\">在线咨询</a>\n                </dd>\n            </dl>\n            <dl class=\"col-article\">\n                <dt>帮助中心</dt>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">账户管理</a></dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">购物指南</a></dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">订单操作</a></dd>\n            </dl>\n            <dl class=\"col-article\">\n                <dt>关注我们</dt>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">新浪微博</a></dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">官方微信</a></dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">联系我们</a></dd>\n            </dl>\n            <dl class=\"col-article\">\n                <dt>线下门店</dt>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">NEWBEE TOWN</a>\n                </dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">服务网点</a></dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">授权体验店</a></dd>\n            </dl>\n            <dl class=\"col-article\">\n                <dt>关于新蜂</dt>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">了解新蜂</a>\n                </dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">加入新蜂</a>\n                </dd>\n                <dd><a rel=\"nofollow\" href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">捐赠维护</a>\n                </dd>\n            </dl>\n            <dl class=\"wx\">\n                <dt>newbee-mall</dt>\n                <dd>\n                    <img th:src=\"@{/mall/image/pay/wxpay_qrcode.png}\">\n                </dd>\n                <dd class=\"other\">\n                    <span>分公司：</span>\n                    <a href=\"##\">北京</a>\n                    <a href=\"##\">上海</a>\n                    <a href=\"##\">广州</a>\n                    <a href=\"##\">深圳</a>\n                    <a href=\"##\">杭州</a>\n                </dd>\n            </dl>\n        </div>\n        <div class=\"footer-links w1100\">\n            <p>友情链接：</p>\n            <div class=\"clearfix\">\n                <a th:href=\"@{/index}\">新蜂商城</a>\n                <a th:href=\"@{/admin}\">后台管理系统</a>\n                <a href=\"https://edu.csdn.net/course/detail/26258\">课程视频</a>\n                <a href=\"https://juejin.im/book/5da2f9d4f265da5b81794d48?referrer=59199e22a22b9d0058279886\">课程文档</a>\n                <a href=\"https://gitee.com/newbee-ltd/newbee-donate\">捐赠</a>\n                <a href=\"https://github.com/newbee-ltd/newbee-mall/issues\">问题反馈</a>\n                <a href=\"https://github.com/newbee-ltd/newbee-mall\">GitHub 地址</a>\n                <a href=\"https://gitee.com/newbee-ltd/newbee-mall\">码云Gitee 地址</a>\n            </div>\n        </div>\n        <div class=\"footer-info w1100\">\n            <div class=\"info-text w1100\">\n                <p><a href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">新蜂商城 &nbsp; | &nbsp;\n                    Powered by 十三&nbsp;\n                    | &nbsp;</a>\n                    &nbsp;QQ交流群：796794009\n                </p>\n                <p><a href=\"https://gitee.com/newbee-ltd/newbee-mall\" target=\"_blank\">Copyright © 2019-2020 十三  All\n                    Rights\n                    Reserved.&nbsp; | &nbsp; 浙ICP备17008806号-5 </a></p>\n            </div>\n        </div>\n\n    </div>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/header.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:fragment=\"head-fragment(title,path)\">\n    <meta charset=\"UTF-8\">\n    <title>新蜂商城 NewBee商城 newbee-mall</title>\n    <link rel=\"stylesheet\" th:href=\"@{/mall/css/swiper-bundle.min.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/mall/css/iconfont.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/mall/css/common.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/mall/styles/header.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{'/mall/styles/'+${path}+'.css'}\">\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/sweetalert2/sweetalert2.min.css}\"/>\n    <meta name=\"keywords\" content=\"新蜂商城,newbee-mall,新蜂,商城,开源商城,newbee,企业级商城,大型商城项目,Java商城,springboot商城,SpringBoot商城项目,Spring Boot 大型线上商城项目实战教程\" />\n    <meta name=\"description\" content=\"newbee-mall 项目（新蜂商城）是一套电商系统，包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统，基于 Spring Boot 2.X 及相关技术栈开发。前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。Spring Boot 大型线上商城项目实战教程\"/>\n</head>\n<nav id=\"nav\" th:fragment=\"nav-fragment\">\n    <div class=\"banner_x center\">\n        <a th:href=\"@{/index}\" class=\"logo\"><h1>新蜂商城</h1></a>\n        <div class=\"fr\">\n            <div class=\"search\">\n                <input class=\"text\" type=\"text\" id=\"keyword\" autocomplete=\"off\">\n                <div class=\"search_hot\">\n                </div>\n            </div>\n            <div class=\"button iconfont icon-search\" onclick=\"search()\"></div>\n        </div>\n    </div>\n</nav>\n<header id=\"header\" th:fragment=\"header-fragment\">\n    <div class=\"center\">\n        <ul class=\"fl\">\n            <li><a th:href=\"@{/index}\">新蜂商城</a></li>\n            <li><a th:href=\"@{/admin}\">后台管理系统</a></li>\n            <li><a href=\"https://edu.csdn.net/course/detail/26258\">课程视频</a></li>\n            <li><a href=\"https://juejin.cn/book/6844733814074245133?suid=3808363978174302&source=pc\">课程文档</a></li>\n            <li><a href=\"https://gitee.com/newbee-ltd/newbee-donate\">捐赠</a></li>\n            <li><a href=\"https://github.com/newbee-ltd/newbee-mall/issues\">问题反馈</a></li>\n            <li><a href=\"https://github.com/newbee-ltd/newbee-mall\">GitHub 地址</a></li>\n            <li><a href=\"https://gitee.com/newbee-ltd/newbee-mall\">码云Gitee 地址</a></li>\n        </ul>\n        <div class=\"fr\">\n            <th:block th:unless=\"${session.newBeeMallUser==null}\">\n                <div class=\"user\">\n                    <ul class=\"selector\">\n                        <li>\n                            <a th:href=\"@{/personal}\">\n                                个人中心\n                            </a>\n                        </li>\n                        <li>\n                            <a th:href=\"@{/orders}\">\n                                我的订单\n                            </a>\n                        </li>\n                        <li>\n                            <a th:href=\"@{/logout}\">\n                                退出登录\n                            </a>\n                        </li>\n                    </ul>\n                    <a href=\"##\" class=\"username\">\n                        <th:block th:text=\"${session.newBeeMallUser.nickName}\"></th:block>\n                        <i class=\"iconfont icon-down\"></i>\n                    </a>\n                </div>\n                <div class=\"shopcart\">\n                    <a th:href=\"@{/shop-cart}\" style=\"color: white;\"><i class=\"iconfont icon-cart\"></i>\n                        购物车(\n                        <th:block th:text=\"${session.newBeeMallUser.shopCartItemCount}\"></th:block>\n                        )</a>\n                </div>\n            </th:block>\n            <th:block th:if=\"${session.newBeeMallUser==null}\">\n                <ul class=\"login\">\n                    <li><a th:href=\"@{/login}\">登录</a></li>\n                    <li><a th:href=\"@{/register}\">注册</a></li>\n                </ul>\n                <div class=\"shopcart\">\n                    <a href=\"##\" style=\"color: white;\"><i class=\"iconfont icon-cart\"></i>\n                        购物车(0)</a>\n                </div>\n            </th:block>\n        </div>\n    </div>\n</header>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/mall/index.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-首页','index')\">\n</head>\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n<content id=\"content\">\n    <nav th:replace=\"mall/header::nav-fragment\"></nav>\n    <div id=\"banner\">\n        <div class=\"all-sort-list\">\n            <th:block th:each=\"category : ${categories}\">\n            <div class=\"item\">\n                <h3><span>·</span><a href=\"##\"><th:block th:text=\"${category.categoryName}\"></th:block></a></h3>\n                <div class=\"item-list clearfix\">\n                    <div class=\"subitem\">\n                        <th:block th:each=\"secondLevelCategory : ${category.secondLevelCategoryVOS}\">\n                        <dl class=\"fore1\">\n                            <dt><a href=\"#\"><th:block th:text=\"${secondLevelCategory.categoryName}\"></th:block></a></dt>\n                            <dd>\n                                <th:block th:each=\"thirdLevelCategory : ${secondLevelCategory.thirdLevelCategoryVOS}\">\n                                <em><a href=\"#\"th:href=\"@{'/search?goodsCategoryId='+${thirdLevelCategory.categoryId}}\">\n                                    <th:block th:text=\"${thirdLevelCategory.categoryName}\"></th:block>\n                                </a></em>\n                                </th:block>\n                            </dd>\n                        </dl>\n                        </th:block>\n                    </div>\n                </div>\n            </div>\n            </th:block>\n        </div>\n        <div class=\"swiper-container fl\">\n            <div class=\"swiper-wrapper\">\n                <!-- 配置了轮播图则显示后台配置的轮播图 -->\n                <th:block th:unless=\"${#lists.isEmpty(carousels)}\">\n                    <th:block th:each=\"carousel : ${carousels}\">\n                        <div class=\"swiper-slide\">\n                            <a th:href=\"@{${carousel.redirectUrl}}\">\n                                <img th:src=\"@{${carousel.carouselUrl}}\" alt=\"\">\n                            </a>\n                        </div>\n                    </th:block>\n                </th:block>\n                <!-- 未配置轮播图则显示默认的三张轮播图 -->\n                <th:block th:if=\"${#lists.isEmpty(carousels)}\">\n                    <div class=\"swiper-slide\">\n                        <img src=\"./mall/image/swiper/banner01.jpg\" alt=\"\">\n                    </div>\n                    <div class=\"swiper-slide\">\n                        <img src=\"./mall/image/swiper/banner02.jpg\" alt=\"\">\n                    </div>\n                    <div class=\"swiper-slide\">\n                        <img src=\"./mall/image/swiper/banner03.jpg\" alt=\"\">\n                    </div>\n                </th:block>\n            </div>\n            <div class=\"swiper-pagination\"></div>\n            <div class=\"swiper-button-prev\"></div>\n            <div class=\"swiper-button-next\"></div>\n        </div>\n    </div>\n\n    <div id=\"sub_banner\">\n        <!-- 已配置热销商品则显示配置内容 -->\n        <th:block th:unless=\"${#lists.isEmpty(hotGoodses)}\">\n            <th:block th:each=\"hotGoodse : ${hotGoodses}\">\n                <div class=\"hot-image\">\n                    <a th:href=\"@{'/goods/detail/'+${hotGoodse.goodsId}}\">\n                        <img th:src=\"@{${hotGoodse.goodsCoverImg}}\" th:alt=\"${hotGoodse.goodsName}\">\n                    </a>\n                </div>\n            </th:block>\n        </th:block>\n        <!-- 未配置热销商品则显示默认 -->\n        <th:block th:if=\"${#lists.isEmpty(hotGoodses)}\">\n            <div class=\"hot-image\">\n                <a href=\"##\">\n                    <img src=\"./mall/image/sub_banner/r4.jpg\" alt=\"\">\n                </a>\n            </div>\n            <div class=\"hot-image\">\n                <a href=\"##\">\n                    <img src=\"./mall/image/sub_banner/hot2.jpg\" alt=\"\">\n                </a>\n            </div>\n            <div class=\"hot-image\">\n                <a href=\"##\">\n                    <img src=\"./mall/image/sub_banner/hot3.jpg\" alt=\"\">\n                </a>\n            </div>\n            <div class=\"hot-image\">\n                <a href=\"##\">\n                    <img src=\"./mall/image/sub_banner/hot4.jpg\" alt=\"\">\n                </a>\n            </div>\n        </th:block>\n    </div>\n\n    <div id=\"flash\">\n        <h2>新品上线</h2>\n        <ul>\n            <!-- 已配置新品则显示配置内容 -->\n            <th:block th:unless=\"${#lists.isEmpty(newGoodses)}\">\n                <th:block th:each=\"newGoods : ${newGoodses}\">\n                    <li>\n                        <a th:href=\"@{'/goods/detail/'+${newGoods.goodsId}}\">\n                            <img th:src=\"@{${newGoods.goodsCoverImg}}\" th:alt=\"${newGoods.goodsName}\">\n                            <p class=\"name\" th:text=\"${newGoods.goodsName}\">NewBeeMall</p>\n                            <p class=\"discount\" th:text=\"${newGoods.goodsIntro}\">NewBeeMall</p>\n                            <p class=\"item_price\" th:text=\"${newGoods.sellingPrice}\">NewBeeMall</p>\n                        </a>\n                    </li>\n                </th:block>\n            </th:block>\n            <!-- 未配置则显示默认 -->\n            <th:block th:if=\"${#lists.isEmpty(newGoodses)}\">\n                <li>\n                    <a href=\"##\">\n                        <img src=\"./mall/image/sub_banner/m6.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"discount\">醇香音质 身临其境</p>\n                        <p class=\"price\">1499元起</p>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <img src=\"./mall/image/sub_banner/headphones.jpg\" alt=\"\"/>\n                        <p class=\"name\">蓝牙耳机</p>\n                        <p class=\"discount\">一键变声 原唱消音</p>\n                        <p class=\"price\">228元</p>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <img src=\"./mall/image/sub_banner/pc.jpg\" alt=\"\"/>\n                        <p class=\"name\">15.6\" i3笔记本</p>\n                        <p class=\"discount\">纤薄机身 金属材质</p>\n                        <p class=\"price\">3099元起</p>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <img src=\"./mall/image/sub_banner/air.jpg\" alt=\"\"/>\n                        <p class=\"name\">空气净化器</p>\n                        <p class=\"discount\">大空间 快循环</p>\n                        <p class=\"price\">1099元起</p>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <img src=\"./mall/image/sub_banner/baby-car.jpg\" alt=\"\"/>\n                        <p class=\"name\">折叠婴儿推车</p>\n                        <p class=\"discount\">出发去向往的地方</p>\n                        <p class=\"price\">649元起</p>\n                    </a>\n                </li>\n            </th:block>\n        </ul>\n    </div>\n\n    <div id=\"recommend\">\n        <h2>为你推荐</h2>\n        <a href=\"##\" class=\"more\">查看更多>></a>\n        <ul>\n            <!-- 已配置推荐商品则显示配置内容 -->\n            <th:block th:unless=\"${#lists.isEmpty(recommendGoodses)}\">\n                <th:block th:each=\"recommendGoods : ${recommendGoodses}\">\n                    <li>\n                        <a th:href=\"@{'/goods/detail/'+${recommendGoods.goodsId}}\">\n                            <div class=\"info discount\" th:text=\"${recommendGoods.tag}\">\n                                新品\n                            </div>\n                            <img th:src=\"@{${recommendGoods.goodsCoverImg}}\" th:alt=\"${recommendGoods.goodsName}\">\n                            <p class=\"name\" th:text=\"${recommendGoods.goodsName}\">NewBeeMall</p>\n                            <p class=\"item_price\" th:text=\"${recommendGoods.sellingPrice}\">NewBeeMall</p>\n                            <p class=\"counter\">猜你喜欢</p>\n                            <div class=\"comment\">\n                                <p>新蜂精选</p>\n                                <p>好物也可以不贵</p>\n                            </div>\n                        </a>\n                    </li>\n                </th:block>\n            </th:block>\n            <!-- 未配置则显示默认 -->\n            <th:block th:if=\"${#lists.isEmpty(recommendGoodses)}\">\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            新品\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r1.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            5折起\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r2.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            新品\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r5.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            官降\n                        </div>\n                        <img src=\"./mall/image/sub_banner/m6.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            新品\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r6.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            热销\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r5.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            享折扣\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r4.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            最低价\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r3.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            热销\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r2.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"##\">\n                        <div class=\"info discount\">\n                            热销\n                        </div>\n                        <img src=\"./mall/image/sub_banner/r1.jpg\" alt=\"\"/>\n                        <p class=\"name\">华为平板 M6</p>\n                        <p class=\"price\">1499元</p>\n                        <p class=\"counter\">猜你喜欢</p>\n                        <div class=\"comment\">\n                            <p>新蜂精选</p>\n                            <p>好物也可以不贵</p>\n                        </div>\n                    </a>\n                </li>\n            </th:block>\n        </ul>\n    </div>\n</content>\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 4 -->\n<script th:src=\"@{/admin/plugins/bootstrap/js/bootstrap.bundle.min.js}\"></script>\n<script th:src=\"@{/mall/js/swiper-bundle.min.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/mall/js/index.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/mall/js/search.js}\" type=\"text/javascript\"></script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/login.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>NewBee商城-登录</title>\n    <link rel=\"stylesheet\" th:href=\"@{mall/css/common.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/styles/login.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/styles/header.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/sweetalert2/sweetalert2.min.css}\"/>\n</head>\n<body>\n<div class=\"top center\">\n    <div class=\"logo center\">\n        <a href=\"./index.html\" target=\"_blank\"><img src=\"mall/image/login-logo-2.png\" alt=\"\"></a>\n    </div>\n</div>\n<div class=\"form center\">\n    <div class=\"login\">\n        <div class=\"login_center\">\n            <div class=\"login_top\">\n                <div class=\"left fl\">会员登录</div>\n                <div class=\"right fr\">您还不是我们的会员？<a href=\"register.html\" target=\"_self\">立即注册</a></div>\n                <div class=\"clear\"></div>\n                <div class=\"under-line center\"></div>\n            </div>\n            <form id=\"loginForm\" onsubmit=\"return false;\" action=\"##\">\n                <div class=\"login_main center\">\n                    <div class=\"login-info\">手机号:&nbsp;<input class=\"login-info-input\" type=\"text\" name=\"loginName\"\n                                                             id=\"loginName\"\n                                                             placeholder=\"请输入你的手机号\"/>\n                    </div>\n                    <div class=\"login-info\">密&nbsp;&nbsp;&nbsp;&nbsp;码:&nbsp;<input class=\"login-info-input\"\n                                                                                    id=\"password\"\n                                                                                    type=\"password\"\n                                                                                    name=\"password\"\n                                                                                    placeholder=\"请输入你的密码\"/></div>\n                    <div class=\"login-info\">\n                        验证码:&nbsp;\n                        <input class=\"login-info-input verify-code\" type=\"text\" name=\"verifyCode\"\n                               placeholder=\"请输入验证码\" id=\"verifyCode\"/>\n                        <img alt=\"单击图片刷新！\" style=\"top: 16px;position: relative;\" th:src=\"@{/common/mall/kaptcha}\"\n                             onclick=\"this.src='/common/mall/kaptcha?d='+new Date()*1\">\n                    </div>\n                </div>\n                <div class=\"login_submit\">\n                    <input class=\"submit\" type=\"submit\" onclick=\"login()\" value=\"立即登录\">\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n</body>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script type=\"text/javascript\">\n    function login() {\n        var loginName = $(\"#loginName\").val();\n        if (!validPhoneNumber(loginName)) {\n            Swal.fire({\n                text: \"请输入正确的登录名(即手机号)\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return false;\n        }\n        var password = $(\"#password\").val();\n        if (!validPassword(password)) {\n            Swal.fire({\n                text:\"请输入正确的密码格式(6-20位字符和数字组合)\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return false;\n        }\n        var verifyCode = $(\"#verifyCode\").val();\n        if (!validLength(verifyCode, 5)) {\n            Swal.fire({\n                text: \"请输入正确的验证码\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return false;\n        }\n        //验证\n        var params = $(\"#loginForm\").serialize();\n        var url = '/login';\n        $.ajax({\n            type: 'POST',//方法类型\n            url: url,\n            data: params,\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    window.location.href = '/index';\n                } else {\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n                ;\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n</script>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/my-orders.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-订单列表','my-orders')\">\n</head>\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n<!-- nav -->\n<nav th:replace=\"mall/header::nav-fragment\"></nav>\n\n<!-- personal -->\n<div id=\"personal\">\n    <div class=\"self-info center\">\n\n        <!-- sidebar -->\n        <div th:replace=\"mall/personal-sidebar::sidebar-fragment\"></div>\n\n        <div class=\"intro fr\">\n            <div class=\"uc-box uc-main-box\">\n                <div class=\"uc-content-box order-list-box\">\n                    <div class=\"box-hd\">\n                        <h1 class=\"title\">我的订单\n                            <small>请谨防钓鱼链接或诈骗电话，<a href=\"##\">了解更多&gt;</a>\n                            </small>\n                        </h1>\n                    </div>\n                    <div class=\"box-bd\">\n                        <div id=\"J_orderList\">\n                            <ul class=\"order-list\">\n                                <th:block th:if=\"${#lists.isEmpty(orderPageResult.list)}\">\n                                    <img style=\"margin-top: 16px;\"\n                                         th:src=\"@{/mall/image/null-content.png}\">\n                                    <small><a th:href=\"@{/index}\">&nbsp;&nbsp;&nbsp;&nbsp;去购物&gt;</a>\n                                    </small>\n                                </th:block>\n                                <th:block th:unless=\"${#lists.isEmpty(orderPageResult.list)}\">\n                                    <th:block th:each=\"order : ${orderPageResult.list}\">\n\n                                        <li class=\"uc-order-item uc-order-item-list\">\n                                            <div class=\"order-detail\">\n                                                <div class=\"order-summary\">\n                                                    <th:block th:if=\"${order.orderStatus<0}\">\n                                                        <div class=\"order-status-closed\">\n                                                    </th:block>\n                                                    <th:block th:if=\"${order.orderStatus==0}\">\n                                                        <div class=\"order-status-need-pay\">\n                                                    </th:block>\n                                                    <th:block th:if=\"${order.orderStatus>0}\">\n                                                        <div class=\"order-status-success\">\n                                                    </th:block>\n                                                    <th:block th:text=\"${' '+order.orderStatusString}\"></th:block>\n                                                </div>\n                                            </div>\n                                            <table class=\"order-detail-table\">\n                                                <thead>\n                                                <tr>\n                                                    <th class=\"col-main\"><p class=\"caption-info\">\n                                                        下单时间：<th:block th:text=\"${#dates.format(order.createTime, 'yyyy-MM-dd HH:mm:ss')}\">02月07日</th:block>\n                                                        <span class=\"sep\">|</span>订单号：<a\n                                                            th:href=\"@{${'/orders/'+order.orderNo}}\"\n                                                            th:text=\"${order.orderNo}\">201908121807</a></p></th>\n                                                    <th class=\"col-sub\"><p class=\"caption-price\">应付金额：<span\n                                                            class=\"num\"\n                                                            th:text=\"${order.totalPrice+'.00'}\">1299.00</span>元\n                                                    </p></th>\n                                                </tr>\n                                                </thead>\n                                                <tbody>\n                                                <tr>\n                                                    <td class=\"order-items\">\n                                                        <ul class=\"goods-list\">\n                                                            <th:block\n                                                                    th:each=\"item : ${order.newBeeMallOrderItemVOS}\">\n                                                                <li>\n                                                                    <div class=\"figure figure-thumb\">\n                                                                        <a target=\"_blank\"\n                                                                           th:href=\"@{'/goods/detail/'+${item.goodsId}}\">\n                                                                            <img th:src=\"@{${item.goodsCoverImg}}\"\n                                                                                 width=\"80\" height=\"80\" alt=\"\">\n                                                                        </a>\n                                                                    </div>\n                                                                    <p class=\"name\"><a target=\"_blank\"\n                                                                                       th:href=\"@{'/goods/detail/'+${item.goodsId}}\"\n                                                                                       th:text=\"${item.goodsName}\">newbee</a>\n                                                                    </p>\n                                                                    <p class=\"price\"\n                                                                       th:text=\"${item.sellingPrice+'元 x '+item.goodsCount}\">\n                                                                        13元 × 1</p></li>\n                                                            </th:block>\n                                                        </ul>\n                                                    </td>\n                                                    <td class=\"order-actions\"><a class=\"btn btn-small btn-line-gray\"\n                                                                                 th:href=\"@{${'/orders/'+order.orderNo}}\">订单详情</a>\n                                                    </td>\n                                                </tr>\n                                                </tbody>\n                                            </table>\n                        </div>\n                        </li>\n                        </th:block>\n                        </th:block>\n                        </ul>\n                    </div>\n                    <th:block th:unless=\"${#lists.isEmpty(orderPageResult.list)}\">\n                        <div id=\"J_orderListPages\">\n                            <div class=\"newbee-pagenavi\">\n                                <th:block th:if=\"${orderPageResult.currPage-2 >=1}\"><a\n                                        class=\"numbers\"\n                                        th:href=\"@{'/orders?page=' + ${orderPageResult.currPage-2}}\"\n                                        th:text=\"${orderPageResult.currPage -2}\">1</a>\n                                </th:block>\n                                <th:block th:if=\"${orderPageResult.currPage-1 >=1}\"><a\n                                        class=\"numbers\"\n                                        th:href=\"@{'/orders?page=' + ${orderPageResult.currPage-1}}\"\n                                        th:text=\"${orderPageResult.currPage -1}\">1</a>\n                                </th:block>\n                                <a href=\"##\" class=\"numbers current\" th:text=\"${orderPageResult.currPage}\">1</a>\n                                <th:block th:if=\"${orderPageResult.currPage+1<=orderPageResult.totalPage}\"><a\n                                        class=\"numbers\"\n                                        th:href=\"@{'/orders?page=' + ${orderPageResult.currPage+1}}\"\n                                        th:text=\"${orderPageResult.currPage +1}\">1</a></th:block>\n                                <th:block th:if=\"${orderPageResult.currPage+2<=orderPageResult.totalPage}\"><a\n                                        class=\"numbers\"\n                                        th:href=\"@{'/orders?page=' + ${orderPageResult.currPage+2}}\"\n                                        th:text=\"${orderPageResult.currPage +2}\">1</a></th:block>\n                            </div>\n                        </div>\n                    </th:block>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div class=\"clear\"></div>\n</div>\n</div>\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/mall/js/search.js}\" type=\"text/javascript\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/order-detail.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-订单详情','order-detail')\">\n</head>\n<link rel=\"stylesheet\" th:href=\"@{/admin/plugins/sweetalert2/sweetalert2.min.css}\"/>\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n<!-- nav -->\n<nav th:replace=\"mall/header::nav-fragment\"></nav>\n\n<!-- personal -->\n<div id=\"personal\">\n    <div class=\"self-info center\">\n\n        <!-- sidebar -->\n        <div th:replace=\"mall/personal-sidebar::sidebar-fragment\"></div>\n\n        <div class=\"intro fr\">\n            <div class=\"uc-box uc-main-box\">\n                <div class=\"uc-content-box order-view-box\">\n                    <div class=\"box-hd\">\n                        <h1 class=\"title\">订单详情\n                            <small>请谨防钓鱼链接或诈骗电话，<a href=\"##\">了解更多&gt;</a>\n                            </small>\n                        </h1>\n                        <div class=\"more clearfix\">\n                            <h2 class=\"subtitle\">订单号：\n                                <th:block th:text=\"${orderDetailVO.orderNo}\"></th:block>\n                                <span class=\"tag tag-subsidy\"></span>\n                            </h2>\n                            <div class=\"actions\">\n                                <input type=\"hidden\" id=\"orderNoValue\" th:value=\"${orderDetailVO.orderNo}\">\n                                <th:block th:if=\"${orderDetailVO.orderStatus>0 and orderDetailVO.orderStatus<3}\">\n                                    <a onclick=\"cancelOrder()\"\n                                       class=\"btn btn-small btn-line-gray\" title=\"取消订单\">取消订单</a>\n                                </th:block>\n                                <th:block th:if=\"${orderDetailVO.orderStatus==0}\">\n                                    <a onclick=\"payOrder()\"\n                                       class=\"btn btn-small btn-primary\" title=\"去支付\">去支付</a>\n                                </th:block>\n                                <th:block th:if=\"${orderDetailVO.orderStatus==3}\">\n                                    <a onclick=\"finishOrder()\"\n                                       class=\"btn btn-small btn-primary\" title=\"确认收货\">确认收货</a>\n                                </th:block>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"box-bd\">\n                        <div class=\"uc-order-item uc-order-item-pay\">\n                            <div class=\"order-detail\">\n\n                                <div class=\"order-summary\">\n                                    <div class=\"order-status\" th:text=\"${orderDetailVO.orderStatusString}\">\n                                        newbee\n                                    </div>\n                                    <div class=\"order-desc\">\n                                        <th:block th:if=\"${orderDetailVO.orderStatus==0}\">请尽快完成支付哦~</th:block>\n                                        <th:block th:if=\"${orderDetailVO.orderStatus==1}\">newbee商城订单确认中~</th:block>\n                                        <th:block th:if=\"${orderDetailVO.orderStatus==2}\">newbee仓库正在紧急配货中~</th:block>\n                                        <th:block th:if=\"${orderDetailVO.orderStatus==3}\">订单已出库正在快马加鞭向您奔来~</th:block>\n                                        <th:block th:if=\"${orderDetailVO.orderStatus==4}\">交易成功，感谢您对newbee商城的支持~\n                                        </th:block>\n                                        <th:block th:if=\"${orderDetailVO.orderStatus<0}\">交易已关闭~</th:block>\n\n                                    </div>\n                                    <th:block th:if=\"${orderDetailVO.orderStatus>=0}\">\n                                        <div class=\"order-progress\">\n                                            <ol class=\"progress-list clearfix progress-list-5\">\n                                                <th:block th:if=\"${orderDetailVO.orderStatus==0}\">\n                                                    <li class=\"step step-active\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus>0}\">\n                                                    <li class=\"step step-first\">\n                                                </th:block>\n                                                <div class=\"progress\"><span class=\"text\">下单</span></div>\n                                                <div class=\"info\"\n                                                     th:text=\"${#dates.format(orderDetailVO.createTime, 'yyyy-MM-dd HH:mm:ss')}\">\n                                                    02月07日\n                                                </div>\n                                                </li>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus<1}\">\n                                                    <li class=\"step\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus==1}\">\n                                                    <li class=\"step step-active\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus>1}\">\n                                                    <li class=\"step step-done\">\n                                                </th:block>\n                                                <div class=\"progress\"><span class=\"text\">付款</span></div>\n                                                <div class=\"info\"></div>\n                                                </li>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus<2}\">\n                                                    <li class=\"step\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus==2}\">\n                                                    <li class=\"step step-active\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus>2}\">\n                                                    <li class=\"step step-done\">\n                                                </th:block>\n                                                <div class=\"progress\"><span class=\"text\">配货</span></div>\n                                                <div class=\"info\"></div>\n                                                </li>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus<3}\">\n                                                    <li class=\"step\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus==3}\">\n                                                    <li class=\"step step-active\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus>3}\">\n                                                    <li class=\"step step-done\">\n                                                </th:block>\n                                                <div class=\"progress\"><span class=\"text\">出库</span></div>\n                                                <div class=\"info\"></div>\n                                                </li>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus<4}\">\n                                                    <li class=\"step\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus==4}\">\n                                                    <li class=\"step step-active\">\n                                                </th:block>\n                                                <th:block th:if=\"${orderDetailVO.orderStatus>4}\">\n                                                    <li class=\"step step-last\">\n                                                </th:block>\n                                                <div class=\"progress\"><span class=\"text\">交易成功</span></div>\n                                                <div class=\"info\"></div>\n                                                </li>\n                                            </ol>\n                                        </div>\n                                    </th:block>\n                                </div>\n                                <table class=\"order-items-table\">\n                                    <tbody>\n                                    <th:block th:each=\"item : ${orderDetailVO.newBeeMallOrderItemVOS}\">\n                                        <tr>\n                                            <td class=\"col col-thumb\">\n                                                <div class=\"figure figure-thumb\">\n                                                    <a target=\"_blank\" th:href=\"@{'/goods/detail/'+${item.goodsId}}\">\n                                                        <img th:src=\"@{${item.goodsCoverImg}}\"\n                                                             width=\"80\" height=\"80\" alt=\"\">\n                                                    </a>\n                                                </div>\n                                            </td>\n                                            <td class=\"col col-name\">\n                                                <p class=\"name\">\n                                                    <a target=\"_blank\" th:href=\"@{'/goods/detail/'+${item.goodsId}}\"\n                                                       th:text=\"${item.goodsName}\">newbee</a>\n                                                </p>\n                                            </td>\n                                            <td class=\"col col-price\"><p class=\"price\"\n                                                                         th:text=\"${item.sellingPrice+'元 x '+item.goodsCount}\">\n                                                1299元 × 1</p></td>\n                                            <td class=\"col col-actions\">\n                                            </td>\n                                        </tr>\n                                    </th:block>\n                                    </tbody>\n                                </table>\n                            </div>\n                            <div id=\"editAddr\" class=\"order-detail-info\">\n                                <h3>收货信息</h3>\n                                <table class=\"info-table\">\n                                    <tbody>\n                                    <tr>\n                                        <td th:text=\"${orderDetailVO.userAddress}\">newbee</td>\n                                    </tr>\n                                    </tbody>\n                                </table>\n                                <div class=\"actions\">\n                                </div>\n                            </div>\n                            <div id=\"editTime\" class=\"order-detail-info\">\n                                <h3>支付方式</h3>\n                                <table class=\"info-table\">\n                                    <tbody>\n                                    <tr>\n                                        <th>支付方式：</th>\n                                        <td th:text=\"${orderDetailVO.payTypeString==null?'在线支付':orderDetailVO.payTypeString}\">\n                                            在线支付\n                                        </td>\n                                    </tr>\n                                    </tbody>\n                                </table>\n                                <div class=\"actions\">\n                                </div>\n                            </div>\n                            <div class=\"order-detail-total\">\n                                <table class=\"total-table\">\n                                    <tbody>\n                                    <tr>\n                                        <th>运费：</th>\n                                        <td><span class=\"num\">0</span>元</td>\n                                    </tr>\n                                    <tr>\n                                        <th class=\"total\">商品总价：</th>\n                                        <td class=\"total\"><span class=\"num\"\n                                                                th:text=\"${orderDetailVO.totalPrice+'.00'}\">1299.00</span>元\n                                        </td>\n                                    </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"clear\"></div>\n    </div>\n</div>\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script type=\"text/javascript\">\n\n    function cancelOrder() {\n        var orderNo = $(\"#orderNoValue\").val();\n        Swal.fire({\n            title: \"客官请注意\",\n            text: \"确认要取消订单吗?\",\n            icon: \"warning\",iconColor:\"#dea32c\",\n            showCancelButton: true,\n            confirmButtonText: '确认',\n            cancelButtonText: '取消'\n        }).then((flag) => {\n                if (flag.value) {\n                    $.ajax({\n                        type: 'PUT',\n                        url: '/orders/' + orderNo + '/cancel',\n                        success: function (result) {\n                            if (result.resultCode == 200) {\n                                window.location.reload();\n                            } else {\n                                Swal.fire({\n                                    text: result.message,\n                                    icon: \"error\",iconColor:\"#f05b72\",\n                                });\n                            }\n                        },\n                        error: function () {\n                            Swal.fire({\n                                text: \"操作失败\",\n                                icon: \"error\",iconColor:\"#f05b72\",\n                            });\n                        }\n                    });\n                }\n            }\n        )\n        ;\n    }\n\n    function payOrder() {\n        var orderNo = $(\"#orderNoValue\").val();\n        window.location.href = '/selectPayType?orderNo=' + orderNo;\n    }\n\n    function finishOrder() {\n        var orderNo = $(\"#orderNoValue\").val();\n        $.ajax({\n            type: 'PUT',\n            url: '/orders/' + orderNo + '/finish',\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    window.location.reload();\n                } else {\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n            },\n            error: function () {\n                Swal.fire({\n                    text: \"操作失败\",\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/order-settle.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-订单结算','order-detail')\">\n</head>\n<link th:href=\"@{/mall/css/bootstrap-modal.css}\" rel=\"stylesheet\">\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n<!-- nav -->\n<nav th:replace=\"mall/header::nav-fragment\"></nav>\n\n<!-- personal -->\n<div id=\"personal\">\n    <div class=\"self-info center\">\n\n        <!-- sidebar -->\n        <div th:replace=\"mall/personal-sidebar::sidebar-fragment\"></div>\n\n        <div class=\"intro fr\">\n            <div class=\"uc-box uc-main-box\">\n                <div class=\"uc-content-box order-view-box\">\n                    <div class=\"box-hd\">\n                        <h1 class=\"title\">填写并核对订单信息</h1>\n                        <div class=\"more clearfix\">\n                            <div class=\"actions\">\n                                <a id=\"saveOrder\" class=\"btn btn-small btn-primary\" title=\"提交订单\">提交订单</a>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"box-bd\">\n                        <div class=\"uc-order-item uc-order-item-pay\">\n                            <div class=\"order-detail\">\n\n                                <div class=\"order-summary\">\n                                    <div class=\"order-progress\">\n                                        <ol class=\"progress-list clearfix progress-list-5\">\n                                            <li class=\"step step-done\">\n                                                <div class=\"progress\"><span class=\"text\">购物车</span></div>\n                                                <div class=\"info\"></div>\n                                            </li>\n                                            <li class=\"step step-active\">\n                                                <div class=\"progress\"><span class=\"text\">下单</span></div>\n                                                <div class=\"info\"></div>\n                                            </li>\n                                            <li class=\"step\">\n                                                <div class=\"progress\"><span class=\"text\">付款</span></div>\n                                                <div class=\"info\"></div>\n                                            </li>\n                                            <li class=\"step\">\n                                                <div class=\"progress\"><span class=\"text\">出库</span></div>\n                                                <div class=\"info\"></div>\n                                            </li>\n                                            <li class=\"step\">\n                                                <div class=\"progress\"><span class=\"text\">交易成功</span></div>\n                                                <div class=\"info\"></div>\n                                            </li>\n                                        </ol>\n                                    </div>\n                                </div>\n                                <table class=\"order-items-table\">\n                                    <tbody>\n\n                                    <th:block th:each=\"item : ${myShoppingCartItems}\">\n                                        <tr>\n                                            <td class=\"col col-thumb\">\n                                                <div class=\"figure figure-thumb\">\n                                                    <a target=\"_blank\" th:href=\"@{'/goods/detail/'+${item.goodsId}}\">\n                                                        <img th:src=\"@{${item.goodsCoverImg}}\"\n                                                             width=\"80\" height=\"80\" alt=\"\">\n                                                    </a>\n                                                </div>\n                                            </td>\n                                            <td class=\"col col-name\">\n                                                <p class=\"name\">\n                                                    <a target=\"_blank\" th:href=\"@{'/goods/detail/'+${item.goodsId}}\"\n                                                       th:text=\"${item.goodsName}\">newbee</a>\n                                                </p>\n                                            </td>\n                                            <td class=\"col col-price\"><p class=\"price\"\n                                                                         th:text=\"${item.sellingPrice+'元 x '+item.goodsCount}\">\n                                                1299元 × 1</p></td>\n                                            <td class=\"col col-actions\">\n                                            </td>\n                                        </tr>\n                                    </th:block>\n                                    </tbody>\n                                </table>\n                            </div>\n                            <div id=\"editAddr\" class=\"order-detail-info\">\n                                <h3>收货信息</h3>\n                                <table class=\"info-table\">\n                                    <tbody>\n                                    <tr>\n                                        <th>收货地址：</th>\n                                        <td class=\"user_address_label\"\n                                            th:text=\"${session.newBeeMallUser.address==''?'无':session.newBeeMallUser.address}\">\n                                            newbee\n                                        </td>\n                                    </tr>\n                                    </tbody>\n                                </table>\n                                <div class=\"actions\">\n                                    <a class=\"btn btn-small btn-line-gray J_editAddr\"\n                                       href=\"javascript:openUpdateModal();\">修改</a>\n                                </div>\n                            </div>\n                            <div id=\"editTime\" class=\"order-detail-info\">\n                                <h3>支付方式</h3>\n                                <table class=\"info-table\">\n                                    <tbody>\n                                    <tr>\n                                        <th>支付方式：</th>\n                                        <td>在线支付</td>\n                                    </tr>\n                                    </tbody>\n                                </table>\n                                <div class=\"actions\">\n                                </div>\n                            </div>\n                            <div class=\"order-detail-total\">\n                                <table class=\"total-table\">\n                                    <tbody>\n                                    <tr>\n                                        <th>商品总价：</th>\n                                        <td><span class=\"num\" th:text=\"${priceTotal+'.00'}\">1299.00</span>元</td>\n                                    </tr>\n                                    <tr>\n                                        <th>运费：</th>\n                                        <td><span class=\"num\">0</span>元</td>\n                                    </tr>\n                                    <tr>\n                                        <th class=\"total\">应付金额：</th>\n                                        <td class=\"total\"><span class=\"num\" th:text=\"${priceTotal+'.00'}\">1299.00</span>元\n                                        </td>\n                                    </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"modal fade\" id=\"personalInfoModal\" tabindex=\"-1\" role=\"dialog\"\n             aria-labelledby=\"personalInfoModalLabel\">\n            <div class=\"modal-dialog\" role=\"document\">\n                <div class=\"modal-content\">\n                    <div class=\"modal-header\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                aria-hidden=\"true\">&times;</span></button>\n                        <h6 class=\"modal-title\" id=\"personalInfoModalLabel\">地址修改</h6>\n                    </div>\n                    <div class=\"modal-body\">\n                        <form id=\"personalInfoForm\">\n                            <div class=\"form-group\">\n                                <input type=\"hidden\" id=\"userId\" th:value=\"${session.newBeeMallUser.userId}\">\n                                <label for=\"address\" class=\"control-label\">收货地址:</label>\n                                <input type=\"text\" class=\"form-control\" id=\"address\" name=\"address\"\n                                       placeholder=\"请输入收货地址\" th:value=\"${session.newBeeMallUser.address}\"\n                                       required=\"true\">\n                            </div>\n                        </form>\n                    </div>\n                    <div class=\"modal-footer\">\n                        <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                        <button type=\"button\" class=\"btn btn-primary\" id=\"saveButton\">确认</button>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"clear\"></div>\n    </div>\n</div>\n\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/mall/js/search.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script th:src=\"@{/mall/js/bootstrap3.js}\"></script>\n<script type=\"text/javascript\">\n    $('#saveOrder').click(function () {\n        var userAddress = $(\".user_address_label\").html();\n        if (userAddress == '' || userAddress == '无') {\n            Swal.fire({\n                text: \"请填写收货信息\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        if (userAddress.trim().length < 10) {\n            Swal.fire({\n                text: \"请输入正确的收货信息\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        window.location.href = '../saveOrder';\n    });\n\n    function openUpdateModal() {\n        $('#personalInfoModal').modal('show');\n    }\n\n    //绑定modal上的保存按钮\n    $('#saveButton').click(function () {\n        var address = $(\"#address\").val();\n        var userId = $(\"#userId\").val();\n        var data = {\n            \"userId\": userId,\n            \"address\": address\n        };\n        $.ajax({\n            type: 'POST',//方法类型\n            url: '/personal/updateInfo',\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    $('#personalInfoModal').modal('hide');\n                    window.location.reload();\n                } else {\n                    $('#personalInfoModal').modal('hide');\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n                ;\n            },\n            error: function () {\n                Swal.fire({\n                    text: '操作失败',\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/pay-select.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-选择支付方式','pay-select')\">\n</head>\n<body>\n<div class=\"page-main\">\n    <div class=\"container confirm-box\">\n        <form target=\"_blank\" action=\"#\" id=\"J_payForm\" method=\"post\">\n            <div class=\"section section-order\">\n                <div class=\"order-info clearfix\">\n                    <div class=\"fl\">\n                        <h2 class=\"title\">订单提交成功！去付款咯～</h2>\n                        <input type=\"hidden\" id=\"orderNoValue\" th:value=\"${orderNo}\">\n                        <p class=\"order-time\" id=\"J_deliverDesc\">订单号：\n                            <th:block th:text=\"${orderNo}\"></th:block>\n                        </p>\n                    </div>\n                    <div class=\"fr\">\n                        <p class=\"total\">\n                            应付总额：<span class=\"money\"><em><th:block\n                                th:text=\"${totalPrice+'.00'}\"></th:block></em>元</span>\n                        </p>\n                    </div>\n                </div>\n            </div>\n            <div class=\"section section-payment\">\n                <div class=\"cash-title\" id=\"J_cashTitle\">\n                    选择以下支付方式付款\n                </div>\n\n                <div class=\"payment-box \">\n                    <div class=\"payment-header clearfix\">\n                        <h3 class=\"title\">支付平台</h3>\n                        <span class=\"desc\"></span>\n                    </div>\n                    <div class=\"payment-body\">\n                        <ul class=\"clearfix payment-list J_paymentList J_linksign-customize\">\n                            <li class=\"J_alipay\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"alipay\" value=\"alipay\">\n                                <img onclick=\"payOrder(1)\" th:src=\"@{/mall/image/pay/payOnline_zfb.png}\" alt=\"支付宝\"\n                                     style=\"margin-left: 0;\"></li>\n                            <li id=\"J_weixin\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"alipay\" value=\"alipay\">\n                                <img onclick=\"payOrder(2)\" th:src=\"@{/mall/image/pay/weixinpay.png}\" alt=\"微信支付\"\n                                     style=\"margin-left: 0;\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"unionpay\" value=\"unionpay\">\n                                <img th:src=\"@{/mall/image/pay/unionpay.png}\" alt=\"银联\"\n                                     style=\"margin-left: 0;\">\n                            </li>\n                        </ul>\n                    </div>\n                </div>\n\n                <div class=\"payment-box\">\n                    <div class=\"payment-header clearfix\">\n                        <h3 class=\"title\">银行借记卡及信用卡</h3>\n                    </div>\n                    <div class=\"payment-body\">\n                        <ul class=\"clearfix payment-list payment-list-much J_paymentList J_linksign-customize\">\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CMB\" value=\"CMB\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_zsyh.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"ICBCB2C\" value=\"ICBCB2C\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_gsyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CCB\" value=\"CCB\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_jsyh.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"COMM\" value=\"COMM\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_jtyh.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"ABC\" value=\"ABC\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_nyyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"BOCB2C\" value=\"BOCB2C\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_zgyh.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"PSBC-DEBIT\" value=\"PSBC-DEBIT\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_youzheng.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"GDB\" value=\"GDB\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_gfyh.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"SPDB\" value=\"SPDB\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_pufa.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CEBBANK\" value=\"CEBBANK\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_gdyh.png}\" alt=\"\">\n                            </li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CIB\" value=\"CIB\">\n                                <img th:src=\"@{/mall/image/pay/payOnline_xyyh.png}\" alt=\"\">\n                            </li>\n                        </ul>\n                    </div>\n                </div>\n\n                <div class=\"payment-box payment-box-last \">\n                    <div class=\"payment-header clearfix\">\n                        <h3 class=\"title\">快捷支付</h3>\n                        <span class=\"desc\">（支持以下各银行信用卡以及部分银行借记卡）</span>\n                    </div>\n                    <div class=\"payment-body\">\n                        <ul class=\"clearfix payment-list  J_paymentList J_linksign-customize\">\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CMB-KQ\" value=\"CMB-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_zsyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"COMM-KQ\" value=\"COMM-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_jtyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CCB-KQ\" value=\"CCB-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_jsyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"ICBCB2C-KQ\" value=\"ICBCB2C-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_gsyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CITIC-KQ\" value=\"CITIC-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_zxyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CEBBANK-KQ\" value=\"CEBBANK-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_gdyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"BOCB2C-KQ\" value=\"BOCB2C-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_zgyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"SRCB-KQ\" value=\"SRCB-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_shncsyyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"JSB-KQ\" value=\"JSB-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_jiangsshuyh.png}\" alt=\"\"></li>\n                            <li class=\"J_bank\">\n                                <input type=\"radio\" name=\"payOnlineBank\" id=\"CIB-KQ\" value=\"CIB-KQ\"> <img\n                                    th:src=\"@{/mall/image/pay/payOnline_xyyh.png}\" alt=\"\"></li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        </form>\n    </div>\n</div>\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script type=\"text/javascript\">\n    //给出提醒\n    $('.J_bank').click(function () {\n        alert('暂不支持，请耐心等候');\n    })\n\n    function payOrder(payType) {\n        var orderNo = $(\"#orderNoValue\").val();\n        window.location.href = '/payPage?orderNo=' + orderNo + \"&payType=\" + payType;\n    }\n</script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/personal-sidebar.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<div class=\"lfnav fl\" th:fragment=\"sidebar-fragment\">\n    <div class=\"nav_title\">个人中心</div>\n    <div class=\"title_list\">\n        <ul>\n            <li><a th:href=\"@{'/personal'}\" th:class=\"${path=='personal'?'active':''}\">个人信息</a></li>\n            <li><a th:href=\"@{'/orders'}\" th:class=\"${path=='orders'?'active':''}\">我的订单</a></li>\n            <li><a th:href=\"@{'/logout'}\">退出登录</a></li>\n        </ul>\n    </div>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/personal.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-个人中心','personal')\">\n</head>\n<link th:href=\"@{/mall/css/bootstrap-modal.css}\" rel=\"stylesheet\">\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n<!-- nav -->\n<nav th:replace=\"mall/header::nav-fragment\"></nav>\n\n<!-- personal -->\n<div id=\"personal\">\n    <div class=\"self-info center\">\n\n        <!-- sidebar -->\n        <div th:replace=\"mall/personal-sidebar::sidebar-fragment\"></div>\n\n        <div class=\"intro fr\">\n            <div class=\"grzlbt ml40\">我的资料 <a href=\"javascript:openUpdateModal();\"\n                                             style=\"color:#1baeae;margin-left: 600px;\">更改个人信息</a>\n            </div>\n            <div class=\"info_item ml40\"><span>昵称</span><span\n                    th:text=\"${session.newBeeMallUser.nickName}\">newbee-mall</span>\n            </div>\n            <div class=\"info_item ml40\"><span>手机号</span><span\n                    th:text=\"${session.newBeeMallUser.loginName}\">newbee-mall</span>\n            </div>\n            <div class=\"info_item ml40\"><span>密码</span><span>******</span>\n            </div>\n            <div class=\"info_item ml40\"><span>个性签名</span><span\n                    th:text=\"${session.newBeeMallUser.introduceSign==''?'无':session.newBeeMallUser.introduceSign}\">newbee-mall</span>\n            </div>\n            <div class=\"info_item ml40\"><span>收货信息</span><span\n                    th:text=\"${session.newBeeMallUser.address==''?'无':session.newBeeMallUser.address}\">newbee-mall</span></span>\n            </div>\n\n        </div>\n        <div class=\"clear\"></div>\n    </div>\n    <div class=\"content\">\n        <!-- 模态框（Modal） -->\n        <div class=\"modal fade\" id=\"personalInfoModal\" tabindex=\"-1\" role=\"dialog\"\n             aria-labelledby=\"personalInfoModalLabel\">\n            <div class=\"modal-dialog\" role=\"document\">\n                <div class=\"modal-content\">\n                    <div class=\"modal-header\">\n                        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span\n                                aria-hidden=\"true\">&times;</span></button>\n                        <h6 class=\"modal-title\" id=\"personalInfoModalLabel\">个人信息修改</h6>\n                    </div>\n                    <div class=\"modal-body\">\n                        <form id=\"personalInfoForm\">\n                            <div class=\"form-group\">\n                                <label for=\"nickName\" class=\"control-label\">昵称:</label>\n                                <input type=\"hidden\" id=\"userId\" th:value=\"${session.newBeeMallUser.userId}\">\n                                <input type=\"text\" class=\"form-control\" id=\"nickName\" name=\"nickName\"\n                                       placeholder=\"请输入昵称\" th:value=\"${session.newBeeMallUser.nickName}\"\n                                       required=\"true\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label for=\"introduceSign\" class=\"control-label\">个性签名:</label>\n                                <input type=\"text\" class=\"form-control\" id=\"introduceSign\" name=\"introduceSign\"\n                                       placeholder=\"请输入个性签名\" th:value=\"${session.newBeeMallUser.introduceSign}\"\n                                       required=\"true\">\n                            </div>\n                            <div class=\"form-group\">\n                                <label for=\"address\" class=\"control-label\">收货信息:</label>\n                                <input type=\"text\" class=\"form-control\" id=\"address\" name=\"address\"\n                                       placeholder=\"请输入收货信息\" th:value=\"${session.newBeeMallUser.address}\"\n                                       required=\"true\">\n                            </div>\n                        </form>\n                    </div>\n                    <div class=\"modal-footer\">\n                        <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                        <button type=\"button\" class=\"btn btn-primary\" id=\"saveButton\">确认</button>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <!-- /.modal -->\n    </div>\n</div>\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<!-- Bootstrap 3 -->\n<script th:src=\"@{/mall/js/bootstrap3.js}\"></script>\n<script th:src=\"@{/mall/js/search.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script type=\"text/javascript\">\n    function openUpdateModal() {\n        $('#personalInfoModal').modal('show');\n    }\n\n    //绑定modal上的保存按钮\n    $('#saveButton').click(function () {\n        var address = $(\"#address\").val();\n        if (address.trim().length < 10) {\n            Swal.fire({\n                text: \"请输入正确的收货信息\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        var introduceSign = $(\"#introduceSign\").val();\n        if (introduceSign.trim().length < 4) {\n            Swal.fire({\n                text: \"请输入正确的个性签名\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        var nickName = $(\"#nickName\").val();\n        if (nickName.trim().length < 2) {\n            Swal.fire({\n                text: \"请输入正确的昵称\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return;\n        }\n        var userId = $(\"#userId\").val();\n        var data = {\n            \"userId\": userId,\n            \"address\": address,\n            \"introduceSign\": introduceSign,\n            \"nickName\": nickName\n        };\n        $.ajax({\n            type: 'POST',//方法类型\n            url: '/personal/updateInfo',\n            contentType: 'application/json',\n            data: JSON.stringify(data),\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    $('#personalInfoModal').modal('hide');\n                    window.location.reload();\n                } else {\n                    $('#personalInfoModal').modal('hide');\n                    alert(result.message);\n                }\n                ;\n            },\n            error: function () {\n                Swal.fire({\n                    text: '操作失败',\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/register.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>NewBee商城-注册</title>\n    <link rel=\"stylesheet\" th:href=\"@{mall/css/common.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/styles/login.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{mall/styles/header.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/admin/plugins/sweetalert2/sweetalert2.min.css}\"/>\n</head>\n<body>\n<div class=\"top center\">\n    <div class=\"logo center\">\n        <a href=\"./index.html\" target=\"_blank\"><img src=\"mall/image/login-logo-2.png\" alt=\"\"></a>\n    </div>\n</div>\n\n<div class=\"form center\">\n    <div class=\"login\">\n        <div class=\"login_center\">\n            <div class=\"login_top\">\n                <div class=\"left fl\">会员注册</div>\n                <div class=\"right fr\">您已有账号？<a href=\"login.html\" target=\"_self\">请登录</a></div>\n                <div class=\"clear\"></div>\n                <div class=\"under-line center\"></div>\n            </div>\n            <form id=\"registerForm\" onsubmit=\"return false;\" action=\"##\">\n                <div class=\"login_main center\">\n                    <div class=\"login-info\">手机号:&nbsp;<input class=\"login-info-input\" type=\"text\" name=\"loginName\"\n                                                             placeholder=\"请输入你的手机号\" id=\"loginName\"/>\n                    </div>\n                    <div class=\"login-info\">密&nbsp;&nbsp;&nbsp;&nbsp;码:&nbsp;<input class=\"login-info-input\"\n                                                                                    type=\"password\"\n                                                                                    name=\"password\"\n                                                                                    id=\"password\"\n                                                                                    placeholder=\"请输入你的密码\"/>\n                    </div>\n                    <div class=\"login-info\">\n                        验证码:&nbsp;\n                        <input class=\"login-info-input verify-code\" type=\"text\" name=\"verifyCode\" id=\"verifyCode\"\n                               placeholder=\"请输入验证码\"/>\n                        <img alt=\"单击图片刷新！\" style=\"top: 16px;position: relative;\" th:src=\"@{/common/mall/kaptcha}\"\n                             onclick=\"this.src='/common/mall/kaptcha?d='+new Date()*1\">\n                    </div>\n                </div>\n                <div class=\"login_submit\">\n                    <input class=\"submit\" type=\"button\" onclick=\"register()\" value=\"立即注册\">\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n</body>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/admin/dist/js/public.js}\"></script>\n<script th:src=\"@{/admin/plugins/sweetalert2/sweetalert2.all.min.js}\"></script>\n<script type=\"text/javascript\">\n\n    //注册按钮onclick事件改为register()即可\n    function register() {\n        var loginName = $(\"#loginName\").val();\n        if (!validPhoneNumber(loginName)) {\n            Swal.fire({\n                text: \"请输入正确的登录名(即手机号)\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return false;\n        }\n        var password = $(\"#password\").val();\n        if (!validPassword(password)) {\n            Swal.fire({\n                text: \"请输入正确的密码格式(6-20位字符和数字组合)\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return false;\n        }\n        var verifyCode = $(\"#verifyCode\").val();\n        if (!validLength(verifyCode, 5)) {\n            Swal.fire({\n                text: \"请输入正确的验证码\",\n                icon: \"error\",iconColor:\"#f05b72\",\n            });\n            return false;\n        }\n        //验证\n        var params = $(\"#registerForm\").serialize();\n        var url = '/register';\n        $.ajax({\n            type: 'POST',//方法类型\n            url: url,\n            data: params,\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    Swal.fire({\n                        title: \"注册成功\",\n                        text: \"是否跳转至登录页?\",\n                        icon: \"success\",iconColor:\"#1d953f\",\n                        showCancelButton: true,\n                        confirmButtonText: '确认',\n                        cancelButtonText: '取消'\n                    }).then((flag) => {\n                            if (flag.value) {\n                                window.location.href = '/login';\n                            }\n                        }\n                    )\n                    ;\n                } else {\n                    Swal.fire({\n                        text: result.message,\n                        icon: \"error\",iconColor:\"#f05b72\",\n                    });\n                }\n                ;\n            },\n            error: function () {\n                Swal.fire({\n                    text: '操作失败',\n                    icon: \"error\",iconColor:\"#f05b72\",\n                });\n            }\n        });\n    }\n</script>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/search.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head th:replace=\"mall/header::head-fragment('NewBee商城-搜索','search')\">\n</head>\n<body>\n<header th:replace=\"mall/header::header-fragment\"></header>\n<!-- nav -->\n<nav th:replace=\"mall/header::nav-fragment\"></nav>\n\n<!--分类筛选-->\n<div class=\"classify\">\n    <div class=\"category\">\n        <div class=\"category_bar\">\n            <th:block th:if=\"${searchPageCategoryVO!=null}\">\n                <div class=\"fm c\">\n                    <a href=\"##\" class=\"qqq\" th:text=\"${searchPageCategoryVO.secondLevelCategoryName}\">newbee-mall</a>\n                    <div>\n                        <th:block th:each=\"thirdLevelCategory : ${searchPageCategoryVO.thirdLevelCategoryList}\">\n                            <a th:href=\"@{${'/search?goodsCategoryId='+thirdLevelCategory.categoryId}}\"\n                               th:text=\"${thirdLevelCategory.categoryName}\">newbee-mall</a>\n                        </th:block>\n                    </div>\n                </div>\n                <i><img src=\"mall/image/right-@1x.png\" alt=\"\"></i>\n                <div class=\"findword\">\"\n                    <th:block th:text=\"${searchPageCategoryVO.currentCategoryName}\"></th:block>\n                    \"\n                </div>\n            </th:block>\n            <th:block th:if=\"${searchPageCategoryVO==null}\">\n                <th:block th:if=\"${keyword!=null and keyword !=''}\">\n                    <div class=\"findword\">搜索 \"\n                        <th:block th:text=\"${keyword}\"></th:block>\n                        \"\n                    </div>\n                </th:block>\n            </th:block>\n        </div>\n    </div>\n</div>\n\n<!--排序-->\n<div class=\"sort\">\n    <div class=\"list\">\n        <a th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy=default'}\">\n            <div th:class=\"${orderBy==null || orderBy=='default'?'active':''}\">推荐</div>\n        </a>\n        <a th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy=new'}\">\n            <div th:class=\"${orderBy=='new'?'active':''}\">新品</div>\n        </a>\n        <a th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy=price'}\">\n            <div th:class=\"${orderBy=='price'?'active':''}\">价格</div>\n        </a>\n    </div>\n</div>\n\n<div class=\"goods_item center\">\n    <div class=\"main center\">\n        <th:block th:if=\"${#lists.isEmpty(pageResult.list)}\">\n            <img style=\"margin-top: 16px;padding: 16px 20px;\" th:src=\"@{/mall/image/null-content.png}\">\n        </th:block>\n        <th:block th:unless=\"${#lists.isEmpty(pageResult.list)}\">\n            <th:block th:each=\"goods : ${pageResult.list}\">\n                <div class=\"item_card_frame\">\n                    <div class=\"item_card\"><a th:href=\"@{'/goods/detail/'+${goods.goodsId}}\" target=\"_blank\"><img\n                            th:src=\"@{${goods.goodsCoverImg}}\" th:alt=\"${goods.goodsName}\"></a></div>\n                    <div class=\"item_brand\"><a th:href=\"@{'/goods/detail/'+${goods.goodsId}}\" target=\"_blank\"\n                                               th:text=\"${goods.goodsName}\">newbee.ltd</a></div>\n                    <div class=\"item_sub_intro\" th:text=\"${goods.goodsIntro}\">newbee.ltd</div>\n                    <div class=\"item_price\" th:text=\"${goods.sellingPrice+'.00元'}\">1299.00元</div>\n                </div>\n            </th:block>\n        </th:block>\n        <div class=\"clear\"></div>\n    </div>\n    <div class=\"pages\">\n        <div class=\"page_wrap\">\n            <th:block th:if=\"${null != pageResult and !#lists.isEmpty(pageResult.list)}\">\n            <span class=\"page_span1\">\n                 <a th:href=\"@{${pageResult.currPage==1}?'##':'/search?keyword='+${keyword==null?'':keyword}+'&page=' + ${pageResult.currPage-1}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy='+${orderBy==null?'':orderBy}}\">\n                                    < 上一页\n                                </a>\n                <th:block th:if=\"${pageResult.currPage-2 >=1}\"><a\n                        th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&page=' + ${pageResult.currPage-2}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy='+${orderBy==null?'':orderBy}}\"\n                        th:text=\"${pageResult.currPage -2}\">1</a></th:block>\n                <th:block th:if=\"${pageResult.currPage-1 >=1}\"><a\n                        th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&page=' + ${pageResult.currPage-1}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy='+${orderBy==null?'':orderBy}}\"\n                        th:text=\"${pageResult.currPage -1}\">1</a></th:block>\n                <a href=\"##\" class=\"active\" th:text=\"${pageResult.currPage}\">1</a>\n                <th:block th:if=\"${pageResult.currPage+1<=pageResult.totalPage}\"><a\n                        th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&page=' + ${pageResult.currPage+1}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy='+${orderBy==null?'':orderBy}}\"\n                        th:text=\"${pageResult.currPage +1}\">1</a></th:block>\n                <th:block th:if=\"${pageResult.currPage+2<=pageResult.totalPage}\"><a\n                        th:href=\"@{'/search?keyword='+${keyword==null?'':keyword}+'&page=' + ${pageResult.currPage+2}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy='+${orderBy==null?'':orderBy}}\"\n                        th:text=\"${pageResult.currPage +2}\">1</a></th:block>\n                 <a th:href=\"@{${pageResult.currPage>=pageResult.totalPage}?'##':'/search?keyword='+${keyword==null?'':keyword}+'&page=' + ${pageResult.currPage+1}+'&goodsCategoryId='+${goodsCategoryId==null?'':goodsCategoryId}+'&orderBy='+${orderBy==null?'':orderBy}}\">\n                                    下一页 >\n                                </a>\n\t\t\t\t\t</span>\n            </th:block>\n        </div>\n    </div>\n</div>\n\n<div th:replace=\"mall/footer::footer-fragment\"></div>\n<!-- jQuery -->\n<script th:src=\"@{/admin/plugins/jquery/jquery.min.js}\"></script>\n<script th:src=\"@{/mall/js/search.js}\" type=\"text/javascript\"></script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/mall/wxpay.html",
    "content": "<!-- Copyright (c) 2019-2020 十三 all rights reserved. -->\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <meta http-equiv=\"Content-Language\" content=\"zh-cn\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"no\"/>\n    <meta name=\"apple-touch-fullscreen\" content=\"yes\"/>\n    <meta name=\"format-detection\" content=\"telephone=no,email=no\"/>\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"white\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge,chrome=1\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Cache-control\" content=\"no-cache\">\n    <meta http-equiv=\"Cache\" content=\"no-cache\">\n    <meta name=\"viewport\"\n          content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <title>newbee-mall 支付</title>\n    <link th:href=\"@{/mall/styles/pay.css}\" rel=\"stylesheet\" media=\"screen\">\n    <script type=\"text/javascript\" src=\"https://cdn.staticfile.org/jquery/1.11.1/jquery.min.js\"></script>\n</head>\n\n<body>\n<div class=\"body\">\n    <h1 class=\"mod-title\">\n        <span class=\"ico_log icon-wx-pay\"></span>\n    </h1>\n\n    <div class=\"mod-ct\">\n        <div class=\"order\">\n        </div>\n        <div class=\"amount\" id=\"money\">￥\n            <th:block th:text=\"${totalPrice+'.00'}\"></th:block>\n        </div>\n        <div class=\"qrcode-img-wrapper\">\n            <div data-role=\"qrPayImg\" class=\"qrcode-img-area\">\n                <div class=\"ui-loading qrcode-loading\" data-role=\"qrPayImgLoading\"></div>\n                <div style=\"position: relative;display: inline-block;\">\n                    <img id=\"show_qrcode\" width=\"300\" height=\"300\"\n                         th:src=\"@{/mall/image/pay/wxpay_qrcode.png}\"\n                         title=\"请尽快支付\"\n                         style=\"display: block;\">\n                </div>\n            </div>\n        </div>\n\n        <div class=\"time-item\" style=\"padding-top: 10px\">\n            <div class=\"time-item\" id=\"msg\"><h1>支付完成后，将跳转至订单详情</h1></div>\n            <div class=\"time-item\">\n                <h1>订单:\n                    <th:block th:text=\"${orderNo}\"></th:block>\n                </h1>\n            </div>\n            <input type=\"hidden\" id=\"orderNoValue\" th:value=\"${orderNo}\">\n        </div>\n\n        <div class=\"tip\">\n            <div class=\"ico-scan-wx\"></div>\n            <div class=\"tip-text\">\n                <p id=\"showtext\">打开微信 [扫一扫]</p>\n            </div>\n            <div class=\"tip-text\">\n                <a onclick=\"payOrderSuccess()\"\n                   class=\"btn btn-small btn-success\" title=\"支付成功\">支付成功</a>\n            </div>\n        </div>\n\n        <div class=\"tip-text\">\n        </div>\n\n    </div>\n    <div class=\"foot\">\n    </div>\n</div>\n<script type=\"text/javascript\">\n    function payOrderSuccess() {\n        var orderNo = $(\"#orderNoValue\").val();\n        $.ajax({\n            type: 'GET',\n            url: '/paySuccess?payType=2&orderNo=' + orderNo,\n            success: function (result) {\n                if (result.resultCode == 200) {\n                    window.location.href = '/orders/' + orderNo;\n                } else {\n                    alert(result.message);\n                }\n            },\n            error: function () {\n                alert(\"操作失败\");\n            }\n        });\n    }\n</script>\n</body>\n</html>"
  }
]